Documentation Source Text

Hex Artifact Content
Login

Artifact 29e8c621cc8e4a676ee44f72875256648a36df04:


0000: 3c 74 69 74 6c 65 3e 53 51 4c 69 74 65 20 46 54  <title>SQLite FT
0010: 53 33 20 45 78 74 65 6e 73 69 6f 6e 3c 2f 74 69  S3 Extension</ti
0020: 74 6c 65 3e 0a 3c 74 63 6c 3e 0a 0a 68 64 5f 6b  tle>.<tcl>..hd_k
0030: 65 79 77 6f 72 64 73 20 2a 66 74 73 33 20 46 54  eywords *fts3 FT
0040: 53 33 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20  S3.source [file 
0050: 6a 6f 69 6e 20 24 3a 3a 44 4f 43 20 70 61 67 65  join $::DOC page
0060: 73 20 66 61 6e 63 79 66 6f 72 6d 61 74 2e 74 63  s fancyformat.tc
0070: 6c 5d 0a 66 61 6e 63 79 66 6f 72 6d 61 74 5f 64  l].fancyformat_d
0080: 6f 63 75 6d 65 6e 74 20 22 53 51 4c 69 74 65 20  ocument "SQLite 
0090: 46 54 53 33 20 45 78 74 65 6e 73 69 6f 6e 22 20  FTS3 Extension" 
00a0: 7b 7d 20 7b 0a 0a 3c 68 32 20 73 74 79 6c 65 3d  {} {..<h2 style=
00b0: 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 31 2e 30  "margin-left:1.0
00c0: 65 6d 22 3e 20 4f 76 65 72 76 69 65 77 3c 2f 68  em"> Overview</h
00d0: 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20 69  2>..<p>.  FTS3 i
00e0: 73 20 61 6e 20 53 51 4c 69 74 65 20 76 69 72 74  s an SQLite virt
00f0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
0100: 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 65   that allows use
0110: 72 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20  rs to perform . 
0120: 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63   full-text searc
0130: 68 65 73 20 6f 6e 20 61 20 73 65 74 20 6f 66 20  hes on a set of 
0140: 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65 20 6d  documents. The m
0150: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 28 61 6e 64 20  ost common (and 
0160: 65 66 66 65 63 74 69 76 65 29 20 0a 20 20 77 61  effective) .  wa
0170: 79 20 74 6f 20 64 65 73 63 72 69 62 65 20 66 75  y to describe fu
0180: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 65 73  ll-text searches
0190: 20 69 73 20 22 77 68 61 74 20 47 6f 6f 67 6c 65   is "what Google
01a0: 2c 20 59 61 68 6f 6f 20 61 6e 64 20 41 6c 74 61  , Yahoo and Alta
01b0: 76 69 73 74 61 20 64 6f 0a 20 20 77 69 74 68 20  vista do.  with 
01c0: 64 6f 63 75 6d 65 6e 74 73 20 70 6c 61 63 65 64  documents placed
01d0: 20 6f 6e 20 74 68 65 20 57 6f 72 6c 64 20 57 69   on the World Wi
01e0: 64 65 20 57 65 62 22 2e 20 55 73 65 72 73 20 69  de Web". Users i
01f0: 6e 70 75 74 20 61 20 74 65 72 6d 2c 20 6f 72 20  nput a term, or 
0200: 73 65 72 69 65 73 20 0a 20 20 6f 66 20 74 65 72  series .  of ter
0210: 6d 73 2c 20 70 65 72 68 61 70 73 20 63 6f 6e 6e  ms, perhaps conn
0220: 65 63 74 65 64 20 62 79 20 61 20 62 69 6e 61 72  ected by a binar
0230: 79 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 67 72  y operator or gr
0240: 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 69  ouped together i
0250: 6e 74 6f 20 61 20 0a 20 20 70 68 72 61 73 65 2c  nto a .  phrase,
0260: 20 61 6e 64 20 74 68 65 20 66 75 6c 6c 2d 74 65   and the full-te
0270: 78 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 20  xt query system 
0280: 66 69 6e 64 73 20 74 68 65 20 73 65 74 20 6f 66  finds the set of
0290: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
02a0: 62 65 73 74 20 0a 20 20 6d 61 74 63 68 65 73 20  best .  matches 
02b0: 74 68 6f 73 65 20 74 65 72 6d 73 20 63 6f 6e 73  those terms cons
02c0: 69 64 65 72 69 6e 67 20 74 68 65 20 6f 70 65 72  idering the oper
02d0: 61 74 6f 72 73 20 61 6e 64 20 67 72 6f 75 70 69  ators and groupi
02e0: 6e 67 73 20 74 68 65 20 75 73 65 72 20 68 61 73  ngs the user has
02f0: 20 0a 20 20 73 70 65 63 69 66 69 65 64 2e 20 54   .  specified. T
0300: 68 69 73 20 64 6f 63 75 6d 65 6e 74 20 64 65 73  his document des
0310: 63 72 69 62 65 73 20 74 68 65 20 64 65 70 6c 6f  cribes the deplo
0320: 79 6d 65 6e 74 20 61 6e 64 20 75 73 61 67 65 20  yment and usage 
0330: 6f 66 20 46 54 53 33 2e 0a 0a 3c 70 3e 0a 20 20  of FTS3...<p>.  
0340: 50 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  Portions of the 
0350: 6f 72 69 67 69 6e 61 6c 20 46 54 53 33 20 63 6f  original FTS3 co
0360: 64 65 20 77 65 72 65 20 63 6f 6e 74 72 69 62 75  de were contribu
0370: 74 65 64 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ted to the SQLit
0380: 65 20 70 72 6f 6a 65 63 74 20 0a 20 20 62 79 20  e project .  by 
0390: 53 63 6f 74 74 20 48 65 73 73 20 6f 66 20 3c 61  Scott Hess of <a
03a0: 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77   href="http://ww
03b0: 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 22 3e 47 6f  w.google.com">Go
03c0: 6f 67 6c 65 3c 2f 61 3e 2e 20 49 74 20 69 73 20  ogle</a>. It is 
03d0: 6e 6f 77 20 0a 20 20 64 65 76 65 6c 6f 70 65 64  now .  developed
03e0: 20 61 6e 64 20 6d 61 69 6e 74 61 69 6e 65 64 20   and maintained 
03f0: 61 73 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74  as part of SQLit
0400: 65 2e 0a 0a 5b 68 31 20 22 49 6e 74 72 6f 64 75  e...[h1 "Introdu
0410: 63 74 69 6f 6e 20 74 6f 20 46 54 53 33 22 5d 0a  ction to FTS3"].
0420: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
0430: 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c 65  extension module
0440: 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f   allows users to
0450: 20 63 72 65 61 74 65 20 73 70 65 63 69 61 6c 20   create special 
0460: 74 61 62 6c 65 73 20 77 69 74 68 20 61 20 0a 20  tables with a . 
0470: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74   built-in full-t
0480: 65 78 74 20 69 6e 64 65 78 20 28 68 65 72 65 61  ext index (herea
0490: 66 74 65 72 20 22 46 54 53 33 20 74 61 62 6c 65  fter "FTS3 table
04a0: 73 22 29 2e 20 54 68 65 20 66 75 6c 6c 2d 74 65  s"). The full-te
04b0: 78 74 20 69 6e 64 65 78 0a 20 20 61 6c 6c 6f 77  xt index.  allow
04c0: 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 65 66  s the user to ef
04d0: 66 69 63 69 65 6e 74 6c 79 20 71 75 65 72 79 20  ficiently query 
04e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
04f0: 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20 63   all rows that c
0500: 6f 6e 74 61 69 6e 0a 20 20 6f 6e 65 20 6f 72 20  ontain.  one or 
0510: 6d 6f 72 65 20 69 6e 73 74 61 6e 63 65 73 20 73  more instances s
0520: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 68  pecified word (h
0530: 65 72 65 61 66 74 65 72 20 61 20 22 74 6f 6b 65  ereafter a "toke
0540: 6e 22 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  n", even if the 
0550: 74 61 62 6c 65 0a 20 20 63 6f 6e 74 61 69 6e 73  table.  contains
0560: 20 6d 61 6e 79 20 6c 61 72 67 65 20 64 6f 63 75   many large docu
0570: 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f  ments...<p>.  Fo
0580: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 65 61  r example, if ea
0590: 63 68 20 6f 66 20 74 68 65 20 35 31 37 34 33 30  ch of the 517430
05a0: 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68   documents in th
05b0: 65 20 0a 20 20 22 3c 61 20 68 72 65 66 3d 22 68  e .  "<a href="h
05c0: 74 74 70 3a 2f 2f 77 77 77 2e 63 73 2e 63 6d 75  ttp://www.cs.cmu
05d0: 2e 65 64 75 2f 7e 65 6e 72 6f 6e 2f 22 3e 45 6e  .edu/~enron/">En
05e0: 72 6f 6e 20 45 2d 4d 61 69 6c 20 44 61 74 61 73  ron E-Mail Datas
05f0: 65 74 3c 2f 61 3e 22 0a 20 20 69 73 20 69 6e 73  et</a>".  is ins
0600: 65 72 74 65 64 20 69 6e 74 6f 20 62 6f 74 68 20  erted into both 
0610: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 61  the FTS3 table a
0620: 6e 64 20 74 68 65 20 6f 72 64 69 6e 61 72 79 20  nd the ordinary 
0630: 53 51 4c 69 74 65 20 74 61 62 6c 65 0a 20 20 63  SQLite table.  c
0640: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 73   following SQL s
0660: 63 72 69 70 74 3a 0a 0a 5b 43 6f 64 65 20 7b 0a  cript:..[Code {.
0670: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
0680: 20 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61   TABLE enrondata
0690: 31 20 55 53 49 4e 47 20 66 74 73 33 28 63 6f 6e  1 USING fts3(con
06a0: 74 65 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20  tent TEXT);     
06b0: 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f  /* FTS3 table */
06c0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
06d0: 65 6e 72 6f 6e 64 61 74 61 32 28 63 6f 6e 74 65  enrondata2(conte
06e0: 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20 20 20  nt TEXT);       
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 74 61 62   /* Ordinary tab
0710: 6c 65 20 2a 2f 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  le */.}]..<p>.  
0720: 54 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74  Then either of t
0730: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 62  he two queries b
0740: 65 6c 6f 77 20 6d 61 79 20 62 65 20 65 78 65 63  elow may be exec
0750: 75 74 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  uted to find the
0760: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 64 6f 63   number of.  doc
0770: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
0780: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
0790: 61 69 6e 20 74 68 65 20 77 6f 72 64 20 22 6c 69  ain the word "li
07a0: 6e 75 78 22 20 28 33 35 31 29 2e 20 55 73 69 6e  nux" (351). Usin
07b0: 67 20 6f 6e 65 0a 20 20 64 65 73 6b 74 6f 70 20  g one.  desktop 
07c0: 50 43 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  PC hardware conf
07d0: 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20 71  iguration, the q
07e0: 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33  uery on the FTS3
07f0: 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 69   table returns i
0800: 6e 0a 20 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  n.  approximatel
0810: 79 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 2c 20  y 0.03 seconds, 
0820: 76 65 72 73 75 73 20 32 32 2e 35 20 66 6f 72 20  versus 22.5 for 
0830: 71 75 65 72 79 69 6e 67 20 74 68 65 20 6f 72 64  querying the ord
0840: 69 6e 61 72 79 20 74 61 62 6c 65 2e 0a 0a 5b 43  inary table...[C
0850: 6f 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20 63  ode {.  SELECT c
0860: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 65 6e 72  ount(*) FROM enr
0870: 6f 6e 64 61 74 61 31 20 57 48 45 52 45 20 63 6f  ondata1 WHERE co
0880: 6e 74 65 6e 74 20 4d 41 54 43 48 20 27 6c 69 6e  ntent MATCH 'lin
0890: 75 78 27 3b 20 20 2f 2a 20 30 2e 30 33 20 73 65  ux';  /* 0.03 se
08a0: 63 6f 6e 64 73 20 2a 2f 0a 20 20 53 45 4c 45 43  conds */.  SELEC
08b0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
08c0: 65 6e 72 6f 6e 64 61 74 61 32 20 57 48 45 52 45  enrondata2 WHERE
08d0: 20 63 6f 6e 74 65 6e 74 20 4c 49 4b 45 20 27 25   content LIKE '%
08e0: 6c 69 6e 75 78 25 27 3b 20 2f 2a 20 32 32 2e 35  linux%'; /* 22.5
08f0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 7d 5d 0a 0a   seconds */.}]..
0900: 3c 70 3e 0a 20 20 4f 66 20 63 6f 75 72 73 65 2c  <p>.  Of course,
0910: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
0920: 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 65   above are not e
0930: 6e 74 69 72 65 6c 79 20 65 71 75 69 76 61 6c 65  ntirely equivale
0940: 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a  nt. For example.
0950: 20 20 74 68 65 20 4c 49 4b 45 20 71 75 65 72 79    the LIKE query
0960: 20 6d 61 74 63 68 65 73 20 72 6f 77 73 20 74 68   matches rows th
0970: 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73  at contain terms
0980: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 75 78 6f   such as "linuxo
0990: 70 68 6f 62 65 22 0a 20 20 6f 72 20 22 45 6e 74  phobe".  or "Ent
09a0: 65 72 70 72 69 73 65 4c 69 6e 75 78 22 20 28 61  erpriseLinux" (a
09b0: 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
09c0: 65 20 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20 44  e Enron E-Mail D
09d0: 61 74 61 73 65 74 20 64 6f 65 73 20 6e 6f 74 0a  ataset does not.
09e0: 20 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61    actually conta
09f0: 69 6e 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d  in any such term
0a00: 73 29 2c 20 77 68 65 72 65 61 73 20 74 68 65 20  s), whereas the 
0a10: 4d 41 54 43 48 20 71 75 65 72 79 20 6f 6e 20 74  MATCH query on t
0a20: 68 65 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20  he FTS3 table.  
0a30: 73 65 6c 65 63 74 73 20 6f 6e 6c 79 20 74 68 6f  selects only tho
0a40: 73 65 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e  se rows that con
0a50: 74 61 69 6e 20 22 6c 69 6e 75 78 22 20 61 73 20  tain "linux" as 
0a60: 61 20 64 69 73 63 72 65 74 65 20 74 6f 6b 65 6e  a discrete token
0a70: 2e 20 42 6f 74 68 20 0a 20 20 73 65 61 72 63 68  . Both .  search
0a80: 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65  es are case-inse
0a90: 6e 73 69 74 69 76 65 2e 20 54 68 65 20 46 54 53  nsitive. The FTS
0aa0: 33 20 74 61 62 6c 65 20 63 6f 6e 73 75 6d 65 73  3 table consumes
0ab0: 20 61 72 6f 75 6e 64 20 32 30 30 36 20 4d 42 20   around 2006 MB 
0ac0: 6f 6e 0a 20 20 64 69 73 6b 20 63 6f 6d 70 61 72  on.  disk compar
0ad0: 65 64 20 74 6f 20 6a 75 73 74 20 31 34 35 33 20  ed to just 1453 
0ae0: 4d 42 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e  MB for the ordin
0af0: 61 72 79 20 74 61 62 6c 65 2e 20 55 73 69 6e 67  ary table. Using
0b00: 20 74 68 65 20 73 61 6d 65 0a 20 20 68 61 72 64   the same.  hard
0b10: 77 61 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ware configurati
0b20: 6f 6e 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  on used to perfo
0b30: 72 6d 20 74 68 65 20 53 45 4c 45 43 54 20 71 75  rm the SELECT qu
0b40: 65 72 69 65 73 20 61 62 6f 76 65 2c 20 74 68 65  eries above, the
0b50: 20 46 54 53 33 0a 20 20 74 61 62 6c 65 20 74 6f   FTS3.  table to
0b60: 6f 6b 20 6a 75 73 74 20 75 6e 64 65 72 20 33 31  ok just under 31
0b70: 20 6d 69 6e 75 74 65 73 20 74 6f 20 70 6f 70 75   minutes to popu
0b80: 6c 61 74 65 2c 20 76 65 72 73 75 73 20 32 35 20  late, versus 25 
0b90: 66 6f 72 20 74 68 65 20 6f 72 64 69 6e 61 72 79  for the ordinary
0ba0: 0a 20 20 74 61 62 6c 65 2e 0a 0a 5b 68 32 20 22  .  table...[h2 "
0bb0: 43 72 65 61 74 69 6e 67 20 61 6e 64 20 44 65 73  Creating and Des
0bc0: 74 72 6f 79 69 6e 67 20 46 54 53 33 20 54 61 62  troying FTS3 Tab
0bd0: 6c 65 73 22 5d 0a 0a 3c 70 3e 0a 20 20 4c 69 6b  les"]..<p>.  Lik
0be0: 65 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c 20  e other virtual 
0bf0: 74 61 62 6c 65 20 74 79 70 65 73 2c 20 6e 65 77  table types, new
0c00: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
0c10: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 61   created using a
0c20: 20 0a 20 20 5c 5b 43 52 45 41 54 45 20 56 49 52   .  \[CREATE VIR
0c30: 54 55 41 4c 20 54 41 42 4c 45 5c 5d 20 73 74 61  TUAL TABLE\] sta
0c40: 74 65 6d 65 6e 74 2e 20 54 68 65 20 6d 6f 64 75  tement. The modu
0c50: 6c 65 20 6e 61 6d 65 2c 20 77 68 69 63 68 20 66  le name, which f
0c60: 6f 6c 6c 6f 77 73 0a 20 20 74 68 65 20 55 53 49  ollows.  the USI
0c70: 4e 47 20 6b 65 79 77 6f 72 64 2c 20 69 73 20 22  NG keyword, is "
0c80: 66 74 73 33 22 2e 20 54 68 65 20 76 69 72 74 75  fts3". The virtu
0c90: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
0ca0: 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 0a 20 20  arguments may.  
0cb0: 62 65 20 6c 65 66 74 20 65 6d 70 74 79 2c 20 69  be left empty, i
0cc0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 61 6e 20  n which case an 
0cd0: 46 54 53 33 20 74 61 62 6c 65 20 77 69 74 68 20  FTS3 table with 
0ce0: 61 20 73 69 6e 67 6c 65 20 75 73 65 72 2d 64 65  a single user-de
0cf0: 66 69 6e 65 64 20 0a 20 20 63 6f 6c 75 6d 6e 20  fined .  column 
0d00: 6e 61 6d 65 64 20 22 63 6f 6e 74 65 6e 74 22 20  named "content" 
0d10: 69 73 20 63 72 65 61 74 65 64 2e 20 41 6c 74 65  is created. Alte
0d20: 72 6e 61 74 69 76 65 6c 79 2c 20 74 68 65 20 6d  rnatively, the m
0d30: 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73 0a  odule arguments.
0d40: 20 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20    may be passed 
0d50: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 20  a list of comma 
0d60: 73 65 70 61 72 61 74 65 64 20 63 6f 6c 75 6d 6e  separated column
0d70: 20 6e 61 6d 65 73 2e 20 0a 0a 3c 70 3e 0a 20 20   names. ..<p>.  
0d80: 49 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  If column names 
0d90: 61 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20 70  are explicitly p
0da0: 72 6f 76 69 64 65 64 20 66 6f 72 20 74 68 65 20  rovided for the 
0db0: 46 54 53 33 20 74 61 62 6c 65 20 61 73 20 70 61  FTS3 table as pa
0dc0: 72 74 20 6f 66 0a 20 20 74 68 65 20 43 52 45 41  rt of.  the CREA
0dd0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0de0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
0df0: 20 61 20 64 61 74 61 74 79 70 65 20 6e 61 6d 65   a datatype name
0e00: 20 6d 61 79 20 62 65 20 6f 70 74 69 6f 6e 61 6c   may be optional
0e10: 6c 79 20 0a 20 20 73 70 65 63 69 66 69 65 64 20  ly .  specified 
0e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
0e30: 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 69   However, this i
0e40: 73 20 70 75 72 65 20 73 79 6e 74 61 63 74 69 63  s pure syntactic
0e50: 20 73 75 67 61 72 2c 20 74 68 65 0a 20 20 73 75   sugar, the.  su
0e60: 70 70 6c 69 65 64 20 74 79 70 65 6e 61 6d 65 73  pplied typenames
0e70: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
0e80: 20 46 54 53 33 20 6f 72 20 74 68 65 20 53 51 4c   FTS3 or the SQL
0e90: 69 74 65 20 63 6f 72 65 20 66 6f 72 20 61 6e 79  ite core for any
0ea0: 0a 20 20 70 75 72 70 6f 73 65 2e 20 54 68 65 20  .  purpose. The 
0eb0: 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  same applies to 
0ec0: 61 6e 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  any constraints 
0ed0: 73 70 65 63 69 66 69 65 64 20 61 6c 6f 6e 67 20  specified along 
0ee0: 77 69 74 68 20 61 6e 0a 20 20 46 54 53 33 20 63  with an.  FTS3 c
0ef0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2d 20 74 68 65  olumn name - the
0f00: 79 20 61 72 65 20 70 61 72 73 65 64 20 62 75 74  y are parsed but
0f10: 20 6e 6f 74 20 75 73 65 64 20 6f 72 20 72 65 63   not used or rec
0f20: 6f 72 64 65 64 20 62 79 20 74 68 65 20 73 79 73  orded by the sys
0f30: 74 65 6d 0a 20 20 69 6e 20 61 6e 79 20 77 61 79  tem.  in any way
0f40: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  ...[Code {.  <i>
0f50: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
0f60: 33 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 64  3 table named "d
0f70: 61 74 61 22 20 77 69 74 68 20 6f 6e 65 20 63 6f  ata" with one co
0f80: 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22  lumn - "content"
0f90: 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  :</i>.  CREATE V
0fa0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61 74  IRTUAL TABLE dat
0fb0: 61 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a  a USING fts3();.
0fc0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
0fd0: 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e 61  an FTS3 table na
0fe0: 6d 65 64 20 22 70 61 67 65 73 22 20 77 69 74 68  med "pages" with
0ff0: 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e 73 3a 3c   three columns:<
1000: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1010: 54 55 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73  TUAL TABLE pages
1020: 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c   USING fts3(titl
1030: 65 2c 20 6b 65 79 77 6f 72 64 73 2c 20 62 6f 64  e, keywords, bod
1040: 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  y);..  <i>-- Cre
1050: 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c  ate an FTS3 tabl
1060: 65 20 6e 61 6d 65 64 20 22 6d 61 69 6c 22 20 77  e named "mail" w
1070: 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e  ith two columns.
1080: 20 44 61 74 61 74 79 70 65 73 0a 20 20 2d 2d 20   Datatypes.  -- 
1090: 61 6e 64 20 63 6f 6c 75 6d 6e 20 63 6f 6e 73 74  and column const
10a0: 72 61 69 6e 74 73 20 61 72 65 20 73 70 65 63 69  raints are speci
10b0: 66 69 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  fied along with 
10c0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  each column. The
10d0: 73 65 0a 20 20 2d 2d 20 61 72 65 20 63 6f 6d 70  se.  -- are comp
10e0: 6c 65 74 65 6c 79 20 69 67 6e 6f 72 65 64 20 62  letely ignored b
10f0: 79 20 46 54 53 33 20 61 6e 64 20 53 51 4c 69 74  y FTS3 and SQLit
1100: 65 2e 20 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  e. </i>.  CREATE
1110: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d   VIRTUAL TABLE m
1120: 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28 0a  ail USING fts3(.
1130: 20 20 20 20 73 75 62 6a 65 63 74 20 56 41 52 43      subject VARC
1140: 48 41 52 28 32 35 36 29 20 4e 4f 54 20 4e 55 4c  HAR(256) NOT NUL
1150: 4c 2c 0a 20 20 20 20 62 6f 64 79 20 54 45 58 54  L,.    body TEXT
1160: 20 43 48 45 43 4b 28 6c 65 6e 67 74 68 28 62 6f   CHECK(length(bo
1170: 64 79 29 3c 31 30 32 34 30 29 0a 20 20 29 3b 0a  dy)<10240).  );.
1180: 7d 5d 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c  }]..<p>.  As wel
1190: 6c 20 61 73 20 61 20 6c 69 73 74 20 6f 66 20 63  l as a list of c
11a0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 20 6d 6f 64 75  olumns, the modu
11b0: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  le arguments pas
11c0: 73 65 64 20 74 6f 20 61 20 43 52 45 41 54 45 0a  sed to a CREATE.
11d0: 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20    VIRTUAL TABLE 
11e0: 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
11f0: 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 33  o create an FTS3
1200: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 75 73   table may be us
1210: 65 64 20 74 6f 20 73 70 65 63 69 66 79 0a 20 20  ed to specify.  
1220: 61 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 5c 5d 2e  a \[tokenizer\].
1230: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   This is done by
1240: 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 73 74   specifying a st
1250: 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d  ring of the form
1260: 0a 20 20 22 74 6f 6b 65 6e 69 7a 65 3d 26 6c 74  .  "tokenize=&lt
1270: 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 26  ;tokenizer name&
1280: 67 74 3b 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  gt; &lt;tokenize
1290: 72 20 61 72 67 73 26 6c 74 3b 22 20 69 6e 20 70  r args&lt;" in p
12a0: 6c 61 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  lace of a column
12b0: 0a 20 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 26  .  name, where &
12c0: 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d  lt;tokenizer nam
12d0: 65 26 67 74 3b 20 69 73 20 74 68 65 20 6e 61 6d  e&gt; is the nam
12e0: 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a  e of the tokeniz
12f0: 65 72 20 74 6f 20 75 73 65 20 61 6e 64 0a 20 20  er to use and.  
1300: 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 61 72  &lt;tokenizer ar
1310: 67 73 26 67 74 3b 20 69 73 20 61 6e 20 6f 70 74  gs&gt; is an opt
1320: 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 77 68  ional list of wh
1330: 69 74 65 73 70 61 63 65 20 73 65 70 61 72 61 74  itespace separat
1340: 65 64 20 71 75 61 6c 69 66 69 65 72 73 0a 20 20  ed qualifiers.  
1350: 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 74  to pass to the t
1360: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
1370: 6e 74 61 74 69 6f 6e 2e 20 41 20 74 6f 6b 65 6e  ntation. A token
1380: 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74 69  izer specificati
1390: 6f 6e 20 6d 61 79 20 62 65 0a 20 20 70 6c 61 63  on may be.  plac
13a0: 65 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  ed anywhere in t
13b0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
13c0: 62 75 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  but at most one 
13d0: 74 6f 6b 65 6e 69 7a 65 72 20 64 65 63 6c 61 72  tokenizer declar
13e0: 61 74 69 6f 6e 20 69 73 0a 20 20 61 6c 6c 6f 77  ation is.  allow
13f0: 65 64 20 66 6f 72 20 65 61 63 68 20 43 52 45 41  ed for each CREA
1400: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1410: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
1420: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
1430: 65 71 75 65 6e 74 0a 20 20 74 6f 6b 65 6e 69 7a  equent.  tokeniz
1440: 65 72 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  er declaration a
1450: 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  re interpreted a
1460: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  s column names. 
1470: 0a 20 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 7c 53  .  \[tokenizer|S
1480: 65 65 20 62 65 6c 6f 77 5c 5d 20 66 6f 72 20 61  ee below\] for a
1490: 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72 69   detailed descri
14a0: 70 74 69 6f 6e 20 6f 66 20 75 73 69 6e 67 20 28  ption of using (
14b0: 61 6e 64 2c 20 69 66 0a 20 20 6e 65 63 65 73 73  and, if.  necess
14c0: 61 72 79 2c 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  ary, implementin
14d0: 67 29 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a  g) a tokenizer..
14e0: 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d  .[Code {.  <i>--
14f0: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33 20   Create an FTS3 
1500: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61 70  table named "pap
1510: 65 72 73 22 20 77 69 74 68 20 74 77 6f 20 63 6f  ers" with two co
1520: 6c 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73 3c  lumns that uses<
1530: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1540: 74 6f 6b 65 6e 69 7a 65 72 20 22 70 6f 72 74 65  tokenizer "porte
1550: 72 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  r".</i>.  CREATE
1560: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
1570: 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33  apers USING fts3
1580: 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e  (author, documen
1590: 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74  t, tokenize=port
15a0: 65 72 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  er);..  <i>-- Cr
15b0: 65 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62  eate an FTS3 tab
15c0: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
15d0: 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65   column - "conte
15e0: 6e 74 22 20 2d 20 74 68 61 74 20 75 73 65 73 3c  nt" - that uses<
15f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1600: 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a  "simple" tokeniz
1610: 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  er.</i>.  CREATE
1620: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
1630: 61 74 61 20 55 53 49 4e 47 20 66 74 73 33 28 74  ata USING fts3(t
1640: 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b  okenize=simple);
1650: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
1660: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77   an FTS3 table w
1670: 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20  ith two columns 
1680: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 22 69  that uses the "i
1690: 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f  cu" tokenizer.</
16a0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 71  i>.  <i>-- The q
16b0: 75 61 6c 69 66 69 65 72 20 22 65 6e 5f 41 55 22  ualifier "en_AU"
16c0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
16d0: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c  e tokenizer impl
16e0: 65 6d 65 6e 74 61 74 69 6f 6e 3c 2f 69 3e 0a 20  ementation</i>. 
16f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1700: 54 41 42 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e  TABLE names USIN
1710: 47 20 66 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b  G fts3(a, b, tok
1720: 65 6e 69 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29  enize=icu en_AU)
1730: 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  ;.}]..<p>.  FTS3
1740: 20 74 61 62 6c 65 73 20 6d 61 79 20 62 65 20 64   tables may be d
1750: 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
1760: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 61  database using a
1770: 6e 20 6f 72 64 69 6e 61 72 79 20 5c 5b 44 52 4f  n ordinary \[DRO
1780: 50 20 54 41 42 4c 45 5c 5d 0a 20 20 73 74 61 74  P TABLE\].  stat
1790: 65 6d 65 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70  ement. For examp
17a0: 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  le:..[Code {.  <
17b0: 69 3e 2d 2d 20 43 72 65 61 74 65 2c 20 74 68 65  i>-- Create, the
17c0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 64 72  n immediately dr
17d0: 6f 70 2c 20 61 6e 20 46 54 53 33 20 74 61 62 6c  op, an FTS3 tabl
17e0: 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  e.</i>.  CREATE 
17f0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61  VIRTUAL TABLE da
1800: 74 61 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b  ta USING fts3();
1810: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 61  .  DROP TABLE da
1820: 74 61 3b 0a 7d 5d 0a 0a 5b 68 32 20 22 50 6f 70  ta;.}]..[h2 "Pop
1830: 75 6c 61 74 69 6e 67 20 46 54 53 33 20 54 61 62  ulating FTS3 Tab
1840: 6c 65 73 22 5d 0a 0a 20 20 3c 70 3e 0a 20 20 20  les"]..  <p>.   
1850: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
1860: 20 70 6f 70 75 6c 61 74 65 64 20 75 73 69 6e 67   populated using
1870: 20 5c 5b 49 4e 53 45 52 54 5c 5d 2c 20 5c 5b 55   \[INSERT\], \[U
1880: 50 44 41 54 45 5c 5d 20 61 6e 64 20 5c 5b 44 45  PDATE\] and \[DE
1890: 4c 45 54 45 5c 5d 0a 20 20 20 20 73 74 61 74 65  LETE\].    state
18a0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d  ments in the sam
18b0: 65 20 77 61 79 20 61 73 20 6f 72 64 69 6e 61 72  e way as ordinar
18c0: 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20  y SQLite tables 
18d0: 61 72 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  are...  <p>.    
18e0: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 63  As well as the c
18f0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 62 79 20  olumns named by 
1900: 74 68 65 20 75 73 65 72 20 28 6f 72 20 74 68 65  the user (or the
1910: 20 22 63 6f 6e 74 65 6e 74 22 20 63 6f 6c 75 6d   "content" colum
1920: 6e 20 69 66 20 6e 6f 0a 20 20 20 20 6d 6f 64 75  n if no.    modu
1930: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 77 68 65  le arguments whe
1940: 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  re specified as 
1950: 70 61 72 74 20 6f 66 20 74 68 65 20 5c 5b 43 52  part of the \[CR
1960: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1970: 4c 45 5c 5d 20 0a 20 20 20 20 73 74 61 74 65 6d  LE\] .    statem
1980: 65 6e 74 29 2c 20 65 61 63 68 20 46 54 53 33 20  ent), each FTS3 
1990: 74 61 62 6c 65 20 68 61 73 20 61 20 22 72 6f 77  table has a "row
19a0: 69 64 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20  id" column. The 
19b0: 72 6f 77 69 64 20 6f 66 20 61 6e 20 46 54 53 33  rowid of an FTS3
19c0: 0a 20 20 20 20 74 61 62 6c 65 20 62 65 68 61 76  .    table behav
19d0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  es in the same w
19e0: 61 79 20 61 73 20 74 68 65 20 72 6f 77 69 64 20  ay as the rowid 
19f0: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 6f 72 64  column of an ord
1a00: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 0a 20 20  inary SQLite .  
1a10: 20 20 74 61 62 6c 65 2c 20 65 78 63 65 70 74 20    table, except 
1a20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
1a30: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
1a40: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  wid column of an
1a50: 20 46 54 53 33 20 74 61 62 6c 65 20 0a 20 20 20   FTS3 table .   
1a60: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
1a70: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
1a80: 65 20 69 73 20 72 65 62 75 69 6c 74 20 75 73 69  e is rebuilt usi
1a90: 6e 67 20 74 68 65 20 5c 5b 56 41 43 55 55 4d 5c  ng the \[VACUUM\
1aa0: 5d 20 63 6f 6d 6d 61 6e 64 2e 20 0a 20 20 20 20  ] command. .    
1ab0: 46 6f 72 20 46 54 53 33 20 74 61 62 6c 65 73 2c  For FTS3 tables,
1ac0: 20 22 64 6f 63 69 64 22 20 69 73 20 61 6c 6c 6f   "docid" is allo
1ad0: 77 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73 20  wed as an alias 
1ae0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 75  along with the u
1af0: 73 75 61 6c 20 22 72 6f 77 69 64 22 2c 0a 20 20  sual "rowid",.  
1b00: 20 20 22 6f 69 64 22 20 61 6e 64 20 22 5f 6f 69    "oid" and "_oi
1b10: 64 5f 22 20 69 64 65 6e 74 69 66 69 65 72 73 2e  d_" identifiers.
1b20: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69   Attempting to i
1b30: 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65 20  nsert or update 
1b40: 61 20 72 6f 77 20 77 69 74 68 20 61 20 0a 20 20  a row with a .  
1b50: 20 20 64 6f 63 69 64 20 76 61 6c 75 65 20 74 68    docid value th
1b60: 61 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  at already exist
1b70: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  s in the table i
1b80: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6a 75 73 74  s an error, just
1b90: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 0a 20 20   as it would .  
1ba0: 20 20 62 65 20 77 69 74 68 20 61 6e 20 6f 72 64    be with an ord
1bb0: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61 62  inary SQLite tab
1bc0: 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54  le...  <p>.    T
1bd0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 74 68 65  here is one othe
1be0: 72 20 73 75 62 74 6c 65 20 64 69 66 66 65 72 65  r subtle differe
1bf0: 6e 63 65 20 62 65 74 77 65 65 6e 20 22 64 6f 63  nce between "doc
1c00: 69 64 22 20 61 6e 64 20 74 68 65 20 6e 6f 72 6d  id" and the norm
1c10: 61 6c 20 53 51 4c 69 74 65 0a 20 20 20 20 61 6c  al SQLite.    al
1c20: 69 61 73 65 73 20 66 6f 72 20 74 68 65 20 72 6f  iases for the ro
1c30: 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 4e 6f 72 6d  wid column. Norm
1c40: 61 6c 6c 79 2c 20 69 66 20 61 6e 20 49 4e 53 45  ally, if an INSE
1c50: 52 54 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  RT or UPDATE sta
1c60: 74 65 6d 65 6e 74 20 0a 20 20 20 20 61 73 73 69  tement .    assi
1c70: 67 6e 73 20 64 69 73 63 72 65 65 74 20 76 61 6c  gns discreet val
1c80: 75 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  ues to two or mo
1c90: 72 65 20 61 6c 69 61 73 65 73 20 6f 66 20 74 68  re aliases of th
1ca0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2c 20  e rowid column, 
1cb0: 53 51 4c 69 74 65 20 0a 20 20 20 20 77 72 69 74  SQLite .    writ
1cc0: 65 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  es the rightmost
1cd0: 20 6f 66 20 73 75 63 68 20 76 61 6c 75 65 73 20   of such values 
1ce0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1cf0: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
1d00: 45 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20  E.    statement 
1d10: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1d20: 20 48 6f 77 65 76 65 72 2c 20 61 73 73 69 67 6e   However, assign
1d30: 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ing a non-NULL v
1d40: 61 6c 75 65 20 74 6f 20 62 6f 74 68 0a 20 20 20  alue to both.   
1d50: 20 74 68 65 20 22 64 6f 63 69 64 22 20 61 6e 64   the "docid" and
1d60: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
1d70: 74 68 65 20 53 51 4c 69 74 65 20 72 6f 77 69 64  the SQLite rowid
1d80: 20 61 6c 69 61 73 65 73 20 77 68 65 6e 20 69 6e   aliases when in
1d90: 73 65 72 74 69 6e 67 20 6f 72 0a 20 20 20 20 75  serting or.    u
1da0: 70 64 61 74 69 6e 67 20 61 6e 20 46 54 53 33 20  pdating an FTS3 
1db0: 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69 64 65  table is conside
1dc0: 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 53 65  red an error. Se
1dd0: 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e 20 65  e below for an e
1de0: 78 61 6d 70 6c 65 2e 0a 0a 5b 43 6f 64 65 20 7b  xample...[Code {
1df0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
1e00: 61 6e 20 46 54 53 33 20 74 61 62 6c 65 3c 2f 69  an FTS3 table</i
1e10: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
1e20: 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20 55  AL TABLE pages U
1e30: 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c  SING fts3(title,
1e40: 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d   body);..  <i>--
1e50: 20 49 6e 73 65 72 74 20 61 20 72 6f 77 20 77 69   Insert a row wi
1e60: 74 68 20 61 20 73 70 65 63 69 66 69 63 20 64 6f  th a specific do
1e70: 63 69 64 20 76 61 6c 75 65 2e 3c 2f 69 3e 0a 20  cid value.</i>. 
1e80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
1e90: 65 73 28 64 6f 63 69 64 2c 20 74 69 74 6c 65 2c  es(docid, title,
1ea0: 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 35 33   body) VALUES(53
1eb0: 2c 20 27 48 6f 6d 65 20 50 61 67 65 27 2c 20 27  , 'Home Page', '
1ec0: 53 51 4c 69 74 65 20 69 73 20 61 20 73 6f 66 74  SQLite is a soft
1ed0: 77 61 72 65 2e 2e 2e 27 29 3b 0a 0a 20 20 3c 69  ware...');..  <i
1ee0: 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20 72 6f 77  >-- Insert a row
1ef0: 20 61 6e 64 20 61 6c 6c 6f 77 20 46 54 53 33 20   and allow FTS3 
1f00: 74 6f 20 61 73 73 69 67 6e 20 61 20 64 6f 63 69  to assign a doci
1f10: 64 20 76 61 6c 75 65 20 75 73 69 6e 67 20 74 68  d value using th
1f20: 65 20 73 61 6d 65 20 61 6c 67 6f 72 69 74 68 6d  e same algorithm
1f30: 20 61 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   as</i>.  <i>-- 
1f40: 53 51 4c 69 74 65 20 75 73 65 73 20 66 6f 72 20  SQLite uses for 
1f50: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e  ordinary tables.
1f60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1f70: 65 20 6e 65 77 20 64 6f 63 69 64 20 77 69 6c 6c  e new docid will
1f80: 20 62 65 20 35 34 2c 3c 2f 69 3e 0a 20 20 3c 69   be 54,</i>.  <i
1f90: 3e 2d 2d 20 6f 6e 65 20 67 72 65 61 74 65 72 20  >-- one greater 
1fa0: 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
1fb0: 20 64 6f 63 69 64 20 63 75 72 72 65 6e 74 6c 79   docid currently
1fc0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1fd0: 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 49 4e 53  table.</i>.  INS
1fe0: 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73 28 74  ERT INTO pages(t
1ff0: 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c 55  itle, body) VALU
2000: 45 53 28 27 44 6f 77 6e 6c 6f 61 64 27 2c 20 27  ES('Download', '
2010: 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f 75 72 63  All SQLite sourc
2020: 65 20 63 6f 64 65 2e 2e 2e 27 29 3b 0a 0a 20 20  e code...');..  
2030: 3c 69 3e 2d 2d 20 43 68 61 6e 67 65 20 74 68 65  <i>-- Change the
2040: 20 74 69 74 6c 65 20 6f 66 20 74 68 65 20 72 6f   title of the ro
2050: 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 2e  w just inserted.
2060: 3c 2f 69 3e 0a 20 20 55 50 44 41 54 45 20 70 61  </i>.  UPDATE pa
2070: 67 65 73 20 53 45 54 20 74 69 74 6c 65 20 3d 20  ges SET title = 
2080: 27 44 6f 77 6e 6c 6f 61 64 20 53 51 4c 69 74 65  'Download SQLite
2090: 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  ' WHERE rowid = 
20a0: 35 34 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 44 65 6c  54;..  <i>-- Del
20b0: 65 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 74  ete the entire t
20c0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 3c 2f  able contents.</
20d0: 69 3e 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  i>.  DELETE FROM
20e0: 20 70 61 67 65 73 3b 0a 0a 20 20 3c 69 3e 2d 2d   pages;..  <i>--
20f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
2100: 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20 69  s an error. It i
2110: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2120: 6f 20 61 73 73 69 67 6e 20 6e 6f 6e 2d 4e 55 4c  o assign non-NUL
2130: 4c 20 76 61 6c 75 65 73 20 74 6f 20 62 6f 74 68  L values to both
2140: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
2150: 20 72 6f 77 69 64 20 61 6e 64 20 64 6f 63 69 64   rowid and docid
2160: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46   columns of an F
2170: 54 53 33 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  TS3 table.</i>. 
2180: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
2190: 65 73 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 2c  es(rowid, docid,
21a0: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
21b0: 4c 55 45 53 28 31 2c 20 32 2c 20 27 41 20 74 69  LUES(1, 2, 'A ti
21c0: 74 6c 65 27 2c 20 27 41 20 64 6f 63 75 6d 65 6e  tle', 'A documen
21d0: 74 20 62 6f 64 79 27 29 3b 0a 7d 5d 0a 0a 20 20  t body');.}]..  
21e0: 3c 70 3e 0a 20 20 20 20 54 6f 20 73 75 70 70 6f  <p>.    To suppo
21f0: 72 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  rt full-text que
2200: 72 69 65 73 2c 20 46 54 53 33 20 6d 61 69 6e 74  ries, FTS3 maint
2210: 61 69 6e 73 20 61 6e 20 69 6e 76 65 72 74 65 64  ains an inverted
2220: 20 69 6e 64 65 78 20 74 68 61 74 20 6d 61 70 73   index that maps
2230: 0a 20 20 20 20 66 72 6f 6d 20 65 61 63 68 20 75  .    from each u
2240: 6e 69 71 75 65 20 74 65 72 6d 20 6f 72 20 77 6f  nique term or wo
2250: 72 64 20 74 68 61 74 20 61 70 70 65 61 72 73 20  rd that appears 
2260: 69 6e 20 74 68 65 20 64 61 74 61 73 65 74 20 74  in the dataset t
2270: 6f 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 0a  o the locations.
2280: 20 20 20 20 69 6e 20 77 68 69 63 68 20 69 74 20      in which it 
2290: 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74  appears within t
22a0: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  he table content
22b0: 73 2e 20 46 6f 72 20 74 68 65 20 63 75 72 69 6f  s. For the curio
22c0: 75 73 2c 20 61 20 0a 20 20 20 20 63 6f 6d 70 6c  us, a .    compl
22d0: 65 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ete description 
22e0: 6f 66 20 74 68 65 20 5c 5b 73 65 67 6d 65 6e 74  of the \[segment
22f0: 20 62 74 72 65 65 7c 64 61 74 61 20 73 74 72 75   btree|data stru
2300: 63 74 75 72 65 5c 5d 20 75 73 65 64 20 74 6f 20  cture\] used to 
2310: 73 74 6f 72 65 0a 20 20 20 20 74 68 69 73 20 69  store.    this i
2320: 6e 64 65 78 20 77 69 74 68 69 6e 20 74 68 65 20  ndex within the 
2330: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2340: 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77   described below
2350: 2e 20 41 20 66 65 61 74 75 72 65 20 6f 66 0a 20  . A feature of. 
2360: 20 20 20 74 68 69 73 20 64 61 74 61 20 73 74 72     this data str
2370: 75 63 74 75 72 65 20 69 73 20 74 68 61 74 20 61  ucture is that a
2380: 74 20 61 6e 79 20 74 69 6d 65 20 74 68 65 20 64  t any time the d
2390: 61 74 61 62 61 73 65 20 6d 61 79 20 63 6f 6e 74  atabase may cont
23a0: 61 69 6e 20 6e 6f 74 0a 20 20 20 20 6f 6e 65 20  ain not.    one 
23b0: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
23c0: 74 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  t several differ
23d0: 65 6e 74 20 62 2d 74 72 65 65 73 20 74 68 61 74  ent b-trees that
23e0: 20 61 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   are incremental
23f0: 6c 79 0a 20 20 20 20 6d 65 72 67 65 64 20 61 73  ly.    merged as
2400: 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74   rows are insert
2410: 65 64 2c 20 75 70 64 61 74 65 64 20 61 6e 64 20  ed, updated and 
2420: 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 74 65  deleted. This te
2430: 63 68 6e 69 71 75 65 20 69 6d 70 72 6f 76 65 73  chnique improves
2440: 20 0a 20 20 20 20 70 65 72 66 6f 72 6d 61 6e 63   .    performanc
2450: 65 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  e when writing t
2460: 6f 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 2c  o an FTS3 table,
2470: 20 62 75 74 20 63 61 75 73 65 73 20 73 6f 6d 65   but causes some
2480: 20 6f 76 65 72 68 65 61 64 20 66 6f 72 0a 20 20   overhead for.  
2490: 20 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72    full-text quer
24a0: 69 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ies that use the
24b0: 20 69 6e 64 65 78 2e 20 45 78 65 63 75 74 69 6e   index. Executin
24c0: 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  g an SQL stateme
24d0: 6e 74 20 6f 66 20 74 68 65 0a 20 20 20 20 66 6f  nt of the.    fo
24e0: 72 6d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  rm "INSERT INTO 
24f0: 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c 65 26 67  &lt;fts3-table&g
2500: 74 3b 28 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c  t;(&lt;fts3-tabl
2510: 65 26 67 74 3b 29 20 56 41 4c 55 45 53 28 27 6f  e&gt;) VALUES('o
2520: 70 74 69 6d 69 7a 65 27 29 22 0a 20 20 20 20 63  ptimize')".    c
2530: 61 75 73 65 73 20 46 54 53 33 20 74 6f 20 6d 65  auses FTS3 to me
2540: 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69 6e 67  rge all existing
2550: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20 69   index b-trees i
2560: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72  nto a single lar
2570: 67 65 0a 20 20 20 20 62 2d 74 72 65 65 20 63 6f  ge.    b-tree co
2580: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
2590: 69 72 65 20 69 6e 64 65 78 2e 20 54 68 69 73 20  ire index. This 
25a0: 63 61 6e 20 62 65 20 61 6e 20 65 78 70 65 6e 73  can be an expens
25b0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 20  ive operation,. 
25c0: 20 20 20 62 75 74 20 6d 61 79 20 73 70 65 65 64     but may speed
25d0: 20 75 70 20 66 75 74 75 72 65 20 71 75 65 72 69   up future queri
25e0: 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  es. ..  <p>.    
25f0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
2600: 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 66 75 6c  optimize the ful
2610: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f 72  l-text index for
2620: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e   an FTS3 table n
2630: 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73 22 3a  amed.    "docs":
2640: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
2650: 2d 20 4f 70 74 69 6d 69 7a 65 20 74 68 65 20 69  - Optimize the i
2660: 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 74 75 72  nternal structur
2670: 65 20 6f 66 20 46 54 53 33 20 74 61 62 6c 65 20  e of FTS3 table 
2680: 22 64 6f 63 73 22 2e 3c 2f 69 3e 0a 20 20 49 4e  "docs".</i>.  IN
2690: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64  SERT INTO docs(d
26a0: 6f 63 73 29 20 56 41 4c 55 45 53 28 27 6f 70 74  ocs) VALUES('opt
26b0: 69 6d 69 7a 65 27 29 3b 0a 7d 5d 0a 0a 20 20 3c  imize');.}]..  <
26c0: 70 3e 0a 20 20 20 20 54 68 65 20 73 74 61 74 65  p>.    The state
26d0: 6d 65 6e 74 20 61 62 6f 76 65 20 6d 61 79 20 61  ment above may a
26e0: 70 70 65 61 72 20 73 79 6e 74 61 63 74 69 63 6c  ppear syntacticl
26f0: 79 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20 73  y incorrect to s
2700: 6f 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20 20  ome. Refer to.  
2710: 20 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64 65    the section de
2720: 73 63 72 69 62 69 6e 67 20 74 68 65 20 5c 5b 73  scribing the \[s
2730: 69 6d 70 6c 65 20 66 74 73 33 20 71 75 65 72 69  imple fts3 queri
2740: 65 73 5c 5d 20 66 6f 72 20 61 6e 20 65 78 70 6c  es\] for an expl
2750: 61 6e 61 74 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a  anation...  <p>.
2760: 20 20 20 20 54 68 65 72 65 20 69 73 20 61 6e 6f      There is ano
2770: 74 68 65 72 2c 20 64 65 70 72 65 63 61 74 65 64  ther, deprecated
2780: 2c 20 6d 65 74 68 6f 64 20 66 6f 72 20 69 6e 76  , method for inv
2790: 6f 6b 69 6e 67 20 74 68 65 20 6f 70 74 69 6d 69  oking the optimi
27a0: 7a 65 20 0a 20 20 20 20 6f 70 65 72 61 74 69 6f  ze .    operatio
27b0: 6e 20 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54  n using a SELECT
27c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 4e 65 77 20   statement. New 
27d0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 75 73 65 20  code should use 
27e0: 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 73  statements.    s
27f0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 49 4e  imilar to the IN
2800: 53 45 52 54 20 61 62 6f 76 65 20 74 6f 20 6f 70  SERT above to op
2810: 74 69 6d 69 7a 65 20 46 54 53 33 20 73 74 72 75  timize FTS3 stru
2820: 63 74 75 72 65 73 2e 0a 0a 5b 68 32 20 22 51 75  ctures...[h2 "Qu
2830: 65 72 79 69 6e 67 20 46 54 53 33 20 54 61 62 6c  erying FTS3 Tabl
2840: 65 73 22 20 7b 7d 20 7b 73 69 6d 70 6c 65 20 66  es" {} {simple f
2850: 74 73 33 20 71 75 65 72 69 65 73 7d 5d 0a 0a 3c  ts3 queries}]..<
2860: 70 3e 0a 20 20 41 73 20 66 6f 72 20 61 6c 6c 20  p>.  As for all 
2870: 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62  other SQLite tab
2880: 6c 65 73 2c 20 76 69 72 74 75 61 6c 20 6f 72 20  les, virtual or 
2890: 6f 74 68 65 72 77 69 73 65 2c 20 64 61 74 61 20  otherwise, data 
28a0: 69 73 20 72 65 74 72 69 65 76 65 64 0a 20 20 66  is retrieved.  f
28b0: 72 6f 6d 20 46 54 53 33 20 74 61 62 6c 65 73 20  rom FTS3 tables 
28c0: 75 73 69 6e 67 20 61 20 5c 5b 53 45 4c 45 43 54  using a \[SELECT
28d0: 5c 5d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 3c  \] statement...<
28e0: 70 3e 0a 20 20 46 54 53 33 20 74 61 62 6c 65 73  p>.  FTS3 tables
28f0: 20 63 61 6e 20 62 65 20 71 75 65 72 69 65 64 20   can be queried 
2900: 65 66 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e  efficiently usin
2910: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
2920: 6e 74 73 20 6f 66 20 74 77 6f 0a 20 20 64 69 66  nts of two.  dif
2930: 66 65 72 65 6e 74 20 66 6f 72 6d 73 3a 0a 0a 3c  ferent forms:..<
2940: 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20  ul>.  <li><p>.  
2950: 20 20 3c 62 3e 51 75 65 72 79 20 62 79 20 72 6f    <b>Query by ro
2960: 77 69 64 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20  wid</b>. If the 
2970: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
2980: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2990: 6d 65 6e 74 0a 20 20 20 20 63 6f 6e 74 61 69 6e  ment.    contain
29a0: 73 20 61 20 73 75 62 2d 63 6c 61 75 73 65 20 6f  s a sub-clause o
29b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 72 6f 77 69  f the form "rowi
29c0: 64 20 3d 20 3f 22 2c 20 77 68 65 72 65 20 3f 20  d = ?", where ? 
29d0: 69 73 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  is an SQL expres
29e0: 73 69 6f 6e 2c 0a 20 20 20 20 46 54 53 33 20 69  sion,.    FTS3 i
29f0: 73 20 61 62 6c 65 20 74 6f 20 72 65 74 72 65 69  s able to retrei
2a00: 76 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ve the requested
2a10: 20 72 6f 77 20 64 69 72 65 63 74 6c 79 20 75 73   row directly us
2a20: 69 6e 67 20 74 68 65 20 65 71 75 69 76 61 6c 65  ing the equivale
2a30: 6e 74 20 0a 20 20 20 20 6f 66 20 61 6e 20 53 51  nt .    of an SQ
2a40: 4c 69 74 65 20 5c 5b 49 4e 54 45 47 45 52 20 50  Lite \[INTEGER P
2a50: 52 49 4d 41 52 59 20 4b 45 59 5c 5d 20 69 6e 64  RIMARY KEY\] ind
2a60: 65 78 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20  ex...  <li><p>. 
2a70: 20 20 20 3c 62 3e 46 75 6c 6c 2d 74 65 78 74 20     <b>Full-text 
2a80: 71 75 65 72 79 3c 2f 62 3e 2e 20 49 66 20 74 68  query</b>. If th
2a90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
2aa0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2ab0: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 0a  tement contains.
2ac0: 20 20 20 20 61 20 73 75 62 2d 63 6c 61 75 73 65      a sub-clause
2ad0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 26 6c   of the form "&l
2ae0: 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54  t;column&gt; MAT
2af0: 43 48 20 3f 22 2c 20 46 54 53 33 20 69 73 20 61  CH ?", FTS3 is a
2b00: 62 6c 65 20 74 6f 20 75 73 65 20 0a 20 20 20 20  ble to use .    
2b10: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c  the built-in ful
2b20: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74 6f 20  l-text index to 
2b30: 72 65 73 74 72 69 63 74 20 74 68 65 20 73 65 61  restrict the sea
2b40: 72 63 68 20 74 6f 20 74 68 6f 73 65 20 64 6f 63  rch to those doc
2b50: 75 6d 65 6e 74 73 20 0a 20 20 20 20 74 68 61 74  uments .    that
2b60: 20 6d 61 74 63 68 20 74 68 65 20 66 75 6c 6c 2d   match the full-
2b70: 74 65 78 74 20 71 75 65 72 79 20 73 74 72 69 6e  text query strin
2b80: 67 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  g specified as t
2b90: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  he right-hand op
2ba0: 65 72 61 6e 64 0a 20 20 20 20 6f 66 20 74 68 65  erand.    of the
2bb0: 20 4d 41 54 43 48 20 63 6c 61 75 73 65 2e 0a 3c   MATCH clause..<
2bc0: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 6e  /ul>..<p>.  If n
2bd0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2be0: 6f 20 71 75 65 72 79 20 73 74 72 61 74 65 67 69  o query strategi
2bf0: 65 73 20 65 6e 75 6d 65 72 61 74 65 64 20 61 62  es enumerated ab
2c00: 6f 76 65 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ove can be used,
2c10: 20 61 6c 6c 0a 20 20 71 75 65 72 69 65 73 20 6f   all.  queries o
2c20: 6e 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72  n FTS3 tables ar
2c30: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
2c40: 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
2c50: 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 0a  n of the entire.
2c60: 20 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20    table. If the 
2c70: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c  table contains l
2c80: 61 72 67 65 20 61 6d 6f 75 6e 74 73 20 6f 66 20  arge amounts of 
2c90: 64 61 74 61 2c 20 74 68 69 73 20 6d 61 79 20 62  data, this may b
2ca0: 65 20 61 6e 20 0a 20 20 69 6d 70 72 61 63 74 69  e an .  impracti
2cb0: 63 61 6c 6c 79 20 61 70 70 72 6f 61 63 68 20 28  cally approach (
2cc0: 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
2cd0: 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 73  e on this page s
2ce0: 68 6f 77 73 20 74 68 61 74 20 61 20 6c 69 6e 65  hows that a line
2cf0: 61 72 0a 20 20 73 63 61 6e 20 6f 66 20 31 2e 35  ar.  scan of 1.5
2d00: 20 47 42 20 6f 66 20 64 61 74 61 20 74 61 6b 65   GB of data take
2d10: 73 20 61 72 6f 75 6e 64 20 33 30 20 73 65 63 6f  s around 30 seco
2d20: 6e 64 73 20 75 73 69 6e 67 20 61 20 6d 6f 64 65  nds using a mode
2d30: 72 6e 20 50 43 29 2e 0a 0a 5b 43 6f 64 65 20 7b  rn PC)...[Code {
2d40: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 65 78 61  .  <i>-- The exa
2d50: 6d 70 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  mples in this bl
2d60: 6f 63 6b 20 61 73 73 75 6d 65 20 74 68 65 20 66  ock assume the f
2d70: 6f 6c 6c 6f 77 69 6e 67 20 46 54 53 33 20 74 61  ollowing FTS3 ta
2d80: 62 6c 65 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  ble:</i>.  CREAT
2d90: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2da0: 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28  mail USING fts3(
2db0: 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a  subject, body);.
2dc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2dd0: 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f 77 69   mail WHERE rowi
2de0: 64 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  d = 15;         
2df0: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73         <i>-- Fas
2e00: 74 2e 20 52 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e  t. Rowid lookup.
2e10: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
2e20: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
2e30: 62 6f 64 79 20 4d 41 54 43 48 20 27 73 71 6c 69  body MATCH 'sqli
2e40: 74 65 27 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d  te';       <i>--
2e50: 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74   Fast. Full-text
2e60: 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45   query.</i>.  SE
2e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
2e80: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
2e90: 48 20 27 73 65 61 72 63 68 27 3b 20 20 20 20 20  H 'search';     
2ea0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
2eb0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
2ec0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
2ed0: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f  OM mail WHERE ro
2ee0: 77 69 64 20 42 45 54 57 45 45 4e 20 31 35 20 41  wid BETWEEN 15 A
2ef0: 4e 44 20 32 30 3b 20 20 20 3c 69 3e 2d 2d 20 53  ND 20;   <i>-- S
2f00: 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e  low. Linear scan
2f10: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
2f20: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
2f30: 20 73 75 62 6a 65 63 74 20 3d 20 27 64 61 74 61   subject = 'data
2f40: 62 61 73 65 27 3b 20 20 20 20 20 20 3c 69 3e 2d  base';      <i>-
2f50: 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73  - Slow. Linear s
2f60: 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  can.</i>.  SELEC
2f70: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
2f80: 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43  ERE subject MATC
2f90: 48 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 3c  H 'database';  <
2fa0: 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d  i>-- Fast. Full-
2fb0: 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  text query.</i>.
2fc0: 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c  }]..<p>.  In all
2fd0: 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   of the full-tex
2fe0: 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c  t queries above,
2ff0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
3000: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d  operand of the M
3010: 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72 20  ATCH.  operator 
3020: 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  is a string cons
3030: 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
3040: 6c 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  le term. In this
3050: 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43 48   case, the MATCH
3060: 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  .  expression ev
3070: 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 20  aluates to true 
3080: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
3090: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f  s that contain o
30a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e  ne or more .  in
30b0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
30c0: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 22  pecified word ("
30d0: 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63 68  sqlite", "search
30e0: 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2c  " or "database",
30f0: 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e   depending .  on
3100: 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20 79   which example y
3110: 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65  ou look at). Spe
3120: 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c 65  cifying a single
3130: 20 74 65 72 6d 20 61 73 20 74 68 65 20 72 69 67   term as the rig
3140: 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e  ht-hand.  operan
3150: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
3160: 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73 20  perator results 
3170: 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20  in the simplest 
3180: 28 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  (and most common
3190: 29 20 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c  ) type .  of ful
31a0: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 70 6f 73  l-text query pos
31b0: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d  sible. However m
31c0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
31d0: 71 75 65 72 69 65 73 20 61 72 65 20 70 6f 73 73  queries are poss
31e0: 69 62 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e  ible,.  includin
31f0: 67 20 70 68 72 61 73 65 20 73 65 61 72 63 68 65  g phrase searche
3200: 73 2c 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73  s, term-prefix s
3210: 65 61 72 63 68 65 73 20 61 6e 64 20 73 65 61 72  earches and sear
3220: 63 68 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e  ches for documen
3230: 74 73 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67  ts .  containing
3240: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
3250: 20 74 65 72 6d 73 20 6f 63 63 75 72 69 6e 67 20   terms occuring 
3260: 77 69 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64  within a defined
3270: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
3280: 63 68 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20  ch.  other. The 
3290: 76 61 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20  various ways in 
32a0: 77 68 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74  which the full-t
32b0: 65 78 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65  ext index may be
32c0: 20 71 75 65 72 69 65 64 20 61 72 65 0a 20 20 5c   queried are.  \
32d0: 5b 46 54 53 33 20 4d 41 54 43 48 7c 64 65 73 63  [FTS3 MATCH|desc
32e0: 72 69 62 65 64 20 62 65 6c 6f 77 5c 5d 2e 0a 0a  ribed below\]...
32f0: 3c 70 3e 0a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  <p>.  Normally, 
3300: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
3310: 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65 6e  s are case-insen
3320: 73 69 74 69 76 65 2e 20 48 6f 77 65 76 65 72 2c  sitive. However,
3330: 20 74 68 69 73 20 69 73 0a 20 20 69 73 20 64 65   this is.  is de
3340: 70 65 6e 64 65 6e 74 20 6f 6e 20 74 68 65 20 73  pendent on the s
3350: 70 65 63 69 66 69 63 20 5c 5b 74 6f 6b 65 6e 69  pecific \[tokeni
3360: 7a 65 72 5c 5d 20 75 73 65 64 20 62 79 20 74 68  zer\] used by th
3370: 65 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20 62  e FTS3 table.  b
3380: 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 52 65  eing queried. Re
3390: 66 65 72 20 74 6f 20 74 68 65 20 73 65 63 74 69  fer to the secti
33a0: 6f 6e 20 6f 6e 20 5c 5b 74 6f 6b 65 6e 69 7a 65  on on \[tokenize
33b0: 72 7c 74 6f 6b 65 6e 69 7a 65 72 73 5c 5d 20 66  r|tokenizers\] f
33c0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 3c 70 3e  or details...<p>
33d0: 0a 20 20 54 68 65 20 70 61 72 61 67 72 61 70 68  .  The paragraph
33e0: 20 61 62 6f 76 65 20 6e 6f 74 65 73 20 74 68 61   above notes tha
33f0: 74 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74  t a MATCH operat
3400: 6f 72 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65  or with a simple
3410: 20 74 65 72 6d 20 61 73 20 74 68 65 0a 20 20 72   term as the.  r
3420: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
3430: 64 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  d evaluates to t
3440: 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  rue for all docu
3450: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
3460: 69 6e 20 74 68 65 0a 20 20 73 70 65 63 69 66 69  in the.  specifi
3470: 65 64 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  ed term. In this
3480: 20 63 6f 6e 74 65 78 74 2c 20 74 68 65 20 22 64   context, the "d
3490: 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20 72 65 66  ocument" may ref
34a0: 65 72 20 74 6f 20 65 69 74 68 65 72 20 74 68 65  er to either the
34b0: 20 0a 20 20 64 61 74 61 20 73 74 6f 72 65 64 20   .  data stored 
34c0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  in a single colu
34d0: 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f 66 20 61  mn of a row of a
34e0: 6e 20 46 54 53 33 20 74 61 62 6c 65 2c 20 6f 72  n FTS3 table, or
34f0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   to the contents
3500: 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  of all column
3510: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  s in a single ro
3520: 77 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  w, depending on 
3530: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 75  the identifier u
3540: 73 65 64 20 61 73 20 74 68 65 0a 20 20 6c 65 66  sed as the.  lef
3550: 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 74  t-hand operand t
3560: 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  o the MATCH oper
3570: 61 74 6f 72 2e 20 49 66 20 74 68 65 20 69 64 65  ator. If the ide
3580: 6e 74 69 66 69 65 72 20 73 70 65 63 69 66 69 65  ntifier specifie
3590: 64 20 61 73 0a 20 20 74 68 65 20 6c 65 66 74 2d  d as.  the left-
35a0: 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20  hand operand of 
35b0: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
35c0: 6f 72 20 69 73 20 61 6e 20 46 54 53 33 20 74 61  or is an FTS3 ta
35d0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  ble column name,
35e0: 0a 20 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75  .  then the docu
35f0: 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65  ment that the se
3600: 61 72 63 68 20 74 65 72 6d 20 6d 75 73 74 20 62  arch term must b
3610: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69  e contained in i
3620: 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 73 74  s the value.  st
3630: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  ored in the spec
3640: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 48 6f  ified column. Ho
3650: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 69 64  wever, if the id
3660: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
3670: 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46 54  name.  of the FT
3680: 53 33 20 3c 69 3e 74 61 62 6c 65 3c 2f 69 3e 20  S3 <i>table</i> 
3690: 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74 68 65  itself, then the
36a0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
36b0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
36c0: 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
36d0: 20 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62   of the FTS3 tab
36e0: 6c 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e 79  le for which any
36f0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
3700: 20 74 68 65 20 73 65 61 72 63 68 20 0a 20 20 74   the search .  t
3710: 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  erm. The followi
3720: 6e 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e  ng example demon
3730: 73 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a 5b  strates this:..[
3740: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 45  Code {.  <i>-- E
3750: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 3c 2f 69  xample schema</i
3760: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
3770: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
3780: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
3790: 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d  , body);..  <i>-
37a0: 2d 20 45 78 61 6d 70 6c 65 20 74 61 62 6c 65 20  - Example table 
37b0: 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69 3e 0a 20  population</i>. 
37c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
37d0: 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74  l(docid, subject
37e0: 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 31  , body) VALUES(1
37f0: 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65 64  , 'software feed
3800: 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64 20 69 74  back', 'found it
3810: 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a 20 20 49   too slow');.  I
3820: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28  NSERT INTO mail(
3830: 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20  docid, subject, 
3840: 62 6f 64 79 29 20 56 41 4c 55 45 53 28 32 2c 20  body) VALUES(2, 
3850: 27 73 6f 66 74 77 61 72 65 20 66 65 65 64 62 61  'software feedba
3860: 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64 62 61 63  ck', 'no feedbac
3870: 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  k');.  INSERT IN
3880: 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73  TO mail(docid, s
3890: 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41  ubject, body) VA
38a0: 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77 20 6c 75  LUES(3, 'slow lu
38b0: 6e 63 68 20 6f 72 64 65 72 27 2c 20 20 27 77 61  nch order',  'wa
38c0: 73 20 61 20 73 6f 66 74 77 61 72 65 20 70 72 6f  s a software pro
38d0: 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  blem');..  <i>--
38e0: 20 45 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73   Example queries
38f0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
3900: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
3910: 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27 73  subject MATCH 's
3920: 6f 66 74 77 61 72 65 27 3b 20 20 20 20 3c 69 3e  oftware';    <i>
3930: 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73 20  -- Selects rows 
3940: 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20 20 53 45  1 and 2</i>.  SE
3950: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
3960: 20 57 48 45 52 45 20 62 6f 64 79 20 20 20 20 4d   WHERE body    M
3970: 41 54 43 48 20 27 66 65 65 64 62 61 63 6b 27 3b  ATCH 'feedback';
3980: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
3990: 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20 20 53 45  s row 2</i>.  SE
39a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
39b0: 20 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20 4d   WHERE mail    M
39c0: 41 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b  ATCH 'software';
39d0: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
39e0: 73 20 72 6f 77 73 20 31 2c 20 32 20 61 6e 64 20  s rows 1, 2 and 
39f0: 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  3</i>.  SELECT *
3a00: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
3a10: 20 6d 61 69 6c 20 20 20 20 4d 41 54 43 48 20 27   mail    MATCH '
3a20: 73 6c 6f 77 27 3b 20 20 20 20 20 20 20 20 3c 69  slow';        <i
3a30: 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73  >-- Selects rows
3a40: 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a 7d 5d 0a   1 and 3</i>.}].
3a50: 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72 73    .<p>.  At firs
3a60: 74 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66 69  t glance, the fi
3a70: 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78  nal two full-tex
3a80: 74 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  t queries in the
3a90: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73   example above s
3aa0: 65 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e 74  eem.  to be synt
3ab0: 61 63 74 69 63 6c 79 20 69 6e 63 6f 72 72 65 63  acticly incorrec
3ac0: 74 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61  t, as there is a
3ad0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d 61   table name ("ma
3ae0: 69 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20 61  il") used as.  a
3af0: 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  n SQL expression
3b00: 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69  . The reason thi
3b10: 73 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20  s is acceptable 
3b20: 69 73 20 74 68 61 74 20 65 61 63 68 20 46 54 53  is that each FTS
3b30: 33 20 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c  3 table.  actual
3b40: 6c 79 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74  ly has a \[sqlit
3b50: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 7c  e3_declare_vtab|
3b60: 48 49 44 44 45 4e 5c 5d 20 63 6f 6c 75 6d 6e 20  HIDDEN\] column 
3b70: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
3b80: 6d 65 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c  me.  as the tabl
3b90: 65 20 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69  e itself (in thi
3ba0: 73 20 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e  s case, "mail").
3bb0: 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
3bc0: 64 20 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75  d in this.  colu
3bd0: 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e  mn is not meanin
3be0: 67 66 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c  gful to the appl
3bf0: 69 63 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e  ication, but can
3c00: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
3c10: 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65  .  left-hand ope
3c20: 72 61 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20  rand to a MATCH 
3c30: 6f 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73  operator. This s
3c40: 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61  pecial column ma
3c50: 79 20 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73  y also be.  pass
3c60: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
3c70: 74 20 74 6f 20 74 68 65 20 5c 5b 73 6e 69 70 70  t to the \[snipp
3c80: 65 74 28 29 7c 46 54 53 33 20 61 75 78 69 6c 6c  et()|FTS3 auxill
3c90: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 5c 5d 2e  ary functions\].
3ca0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
3cb0: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
3cc0: 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 61 62  lustrates the ab
3cd0: 6f 76 65 2e 20 54 68 65 20 65 78 70 72 65 73 73  ove. The express
3ce0: 69 6f 6e 73 20 22 64 6f 63 73 22 2c 20 0a 20 20  ions "docs", .  
3cf0: 22 64 6f 63 73 2e 64 6f 63 73 22 20 61 6e 64 20  "docs.docs" and 
3d00: 22 6d 61 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 22  "main.docs.docs"
3d10: 20 61 6c 6c 20 72 65 66 65 72 20 74 6f 20 63 6f   all refer to co
3d20: 6c 75 6d 6e 20 22 64 6f 63 73 22 2e 20 48 6f 77  lumn "docs". How
3d30: 65 76 65 72 2c 20 74 68 65 20 0a 20 20 65 78 70  ever, the .  exp
3d40: 72 65 73 73 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f  ression "main.do
3d50: 63 73 22 20 64 6f 65 73 20 6e 6f 74 20 72 65 66  cs" does not ref
3d60: 65 72 20 74 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e  er to any column
3d70: 2e 20 49 74 20 63 6f 75 6c 64 20 62 65 20 75 73  . It could be us
3d80: 65 64 20 74 6f 20 0a 20 20 72 65 66 65 72 20 74  ed to .  refer t
3d90: 6f 20 61 20 74 61 62 6c 65 2c 20 62 75 74 20 61  o a table, but a
3da0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
3db0: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  ot allowed in th
3dc0: 65 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  e context in whi
3dd0: 63 68 0a 20 20 69 74 20 69 73 20 75 73 65 64 20  ch.  it is used 
3de0: 62 65 6c 6f 77 2e 0a 0a 5b 43 6f 64 65 20 7b 0a  below...[Code {.
3df0: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
3e00: 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45  schema</i>.  CRE
3e10: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3e20: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
3e30: 33 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c  3(content);..  <
3e40: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65  i>-- Example que
3e50: 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ries</i>.  SELEC
3e60: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
3e70: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
3e80: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
3e90: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c        <i>-- OK.<
3ea0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
3eb0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
3ec0: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
3ed0: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
3ee0: 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20   <i>-- OK.</i>. 
3ef0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
3f00: 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64  ocs WHERE main.d
3f10: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
3f20: 73 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d  sqlite';    <i>-
3f30: 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  - OK.</i>.  SELE
3f40: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
3f50: 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d  HERE main.docs M
3f60: 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20  ATCH 'sqlite';  
3f70: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72         <i>-- Err
3f80: 6f 72 2e 3c 2f 69 3e 0a 7d 5d 0a 20 0a 5b 68 32  or.</i>.}]. .[h2
3f90: 20 22 53 75 6d 6d 61 72 79 22 5d 0a 0a 3c 70 3e   "Summary"]..<p>
3fa0: 0a 20 20 46 72 6f 6d 20 74 68 65 20 75 73 65 72  .  From the user
3fb0: 73 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c  s point of view,
3fc0: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
3fd0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 72 64 69   similar to ordi
3fe0: 6e 61 72 79 20 53 51 4c 69 74 65 0a 20 20 74 61  nary SQLite.  ta
3ff0: 62 6c 65 73 20 69 6e 20 6d 61 6e 79 20 77 61 79  bles in many way
4000: 73 2e 20 44 61 74 61 20 6d 61 79 20 62 65 20 61  s. Data may be a
4010: 64 64 65 64 20 74 6f 2c 20 6d 6f 64 69 66 69 65  dded to, modifie
4020: 64 20 77 69 74 68 69 6e 20 61 6e 64 20 72 65 6d  d within and rem
4030: 6f 76 65 64 20 0a 20 20 66 72 6f 6d 20 46 54 53  oved .  from FTS
4040: 33 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74  3 tables using t
4050: 68 65 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  he INSERT, UPDAT
4060: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 63 6f 6d  E and DELETE com
4070: 6d 61 6e 64 73 20 6a 75 73 74 20 61 73 20 0a 20  mands just as . 
4080: 20 69 74 20 6d 61 79 20 62 65 20 77 69 74 68 20   it may be with 
4090: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e  ordinary tables.
40a0: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
40b0: 53 45 4c 45 43 54 20 63 6f 6d 6d 61 6e 64 20 6d  SELECT command m
40c0: 61 79 20 62 65 20 75 73 65 64 20 0a 20 20 74 6f  ay be used .  to
40d0: 20 71 75 65 72 79 20 64 61 74 61 2e 20 54 68 65   query data. The
40e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20   following list 
40f0: 73 75 6d 6d 61 72 69 7a 65 73 20 74 68 65 20 64  summarizes the d
4100: 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65  ifferences betwe
4110: 65 6e 20 46 54 53 33 0a 20 20 61 6e 64 20 6f 72  en FTS3.  and or
4120: 64 69 6e 61 72 79 20 74 61 62 6c 65 73 3a 0a 0a  dinary tables:..
4130: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a  <ol>.  <li><p> .
4140: 20 20 20 20 41 73 20 77 69 74 68 20 61 6c 6c 20      As with all 
4150: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 79  virtual table ty
4160: 70 65 73 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  pes, it is not p
4170: 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
4180: 65 20 69 6e 64 69 63 65 73 20 6f 72 0a 20 20 20  e indices or.   
4190: 20 74 72 69 67 67 65 72 73 20 61 74 74 61 63 68   triggers attach
41a0: 65 64 20 74 6f 20 46 54 53 33 20 74 61 62 6c 65  ed to FTS3 table
41b0: 73 2e 20 4e 6f 72 20 69 73 20 69 74 20 70 6f 73  s. Nor is it pos
41c0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65  sible to use the
41d0: 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 20 20 20   ALTER TABLE.   
41e0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 64 64 20   command to add 
41f0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4200: 20 46 54 53 33 20 74 61 62 6c 65 73 20 28 61 6c   FTS3 tables (al
4210: 74 68 6f 75 67 68 20 69 74 20 69 73 20 70 6f 73  though it is pos
4220: 73 69 62 6c 65 20 74 6f 20 75 73 65 0a 20 20 20  sible to use.   
4230: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 6f 20   ALTER TABLE to 
4240: 72 65 6e 61 6d 65 20 61 6e 20 46 54 53 33 20 74  rename an FTS3 t
4250: 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  able)...  <li><p
4260: 3e 20 0a 20 20 20 20 44 61 74 61 2d 74 79 70 65  > .    Data-type
4270: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
4280: 61 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41  art of the "CREA
4290: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
42a0: 22 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  " statement.    
42b0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
42c0: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 61 72 65  n FTS3 table are
42d0: 20 69 67 6e 6f 72 65 64 20 63 6f 6d 70 6c 65 74   ignored complet
42e0: 65 6c 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ely. Instead of 
42f0: 74 68 65 0a 20 20 20 20 6e 6f 72 6d 61 6c 20 72  the.    normal r
4300: 75 6c 65 73 20 66 6f 72 20 61 70 70 6c 79 69 6e  ules for applyin
4310: 67 20 74 79 70 65 20 5c 5b 61 66 66 69 6e 69 74  g type \[affinit
4320: 79 5c 5d 20 74 6f 20 69 6e 73 65 72 74 65 64 20  y\] to inserted 
4330: 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20 20 20  values, all.    
4340: 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20  values inserted 
4350: 69 6e 74 6f 20 46 54 53 33 20 74 61 62 6c 65 20  into FTS3 table 
4360: 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74 20  columns (except 
4370: 74 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77 69  the special rowi
4380: 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61 72  d.    column) ar
4390: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74  e converted to t
43a0: 79 70 65 20 54 45 58 54 20 62 65 66 6f 72 65 20  ype TEXT before 
43b0: 62 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a 20  being stored... 
43c0: 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46 54   <li><p> .    FT
43d0: 53 33 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74  S3 tables permit
43e0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69   the special ali
43f0: 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65  as "docid" to be
4400: 20 75 73 65 64 20 74 6f 20 72 65 66 65 72 20 74   used to refer t
4410: 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20  o the.    rowid 
4420: 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64  column supported
4430: 20 62 79 20 61 6c 6c 20 5c 5b 76 69 72 74 75 61   by all \[virtua
4440: 6c 20 74 61 62 6c 65 73 5c 5d 2e 0a 0a 20 20 3c  l tables\]...  <
4450: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20  li><p> .    The 
4460: 5c 5b 46 54 53 33 20 4d 41 54 43 48 5c 5d 20 6f  \[FTS3 MATCH\] o
4470: 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f  perator is suppo
4480: 72 74 65 64 20 66 6f 72 20 71 75 65 72 69 65 73  rted for queries
4490: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
44a0: 69 6c 74 2d 69 6e 0a 20 20 20 20 66 75 6c 6c 2d  ilt-in.    full-
44b0: 74 65 78 74 20 69 6e 64 65 78 2e 20 0a 0a 20 20  text index. ..  
44c0: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65  <li><p> .    The
44d0: 20 46 54 53 33 20 61 75 78 69 6c 6c 61 72 79 20   FTS3 auxillary 
44e0: 66 75 6e 63 74 69 6f 6e 73 2c 20 5c 5b 73 6e 69  functions, \[sni
44f0: 70 70 65 74 7c 73 6e 69 70 70 65 74 28 29 20 61  ppet|snippet() a
4500: 6e 64 20 6f 66 66 73 65 74 73 28 29 5c 5d 2c 20  nd offsets()\], 
4510: 61 72 65 20 0a 20 20 20 20 61 76 61 69 6c 61 62  are .    availab
4520: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  le to support fu
4530: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 2e  ll-text queries.
4540: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
4550: 20 45 61 63 68 20 46 54 53 33 20 74 61 62 6c 65   Each FTS3 table
4560: 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74 65 33   has a \[sqlite3
4570: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 7c  _declare_vtab()|
4580: 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 5c 5d 20  HIDDEN column\] 
4590: 77 69 74 68 20 74 68 65 20 0a 20 20 20 20 73 61  with the .    sa
45a0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  me name as the t
45b0: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54 68 65  able itself. The
45c0: 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 65 64   value contained
45d0: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66 6f 72   in each row for
45e0: 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 61 6c   the.    special
45f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 6c 79 20   column is only 
4600: 75 73 65 66 75 6c 20 77 68 65 6e 20 75 73 65 64  useful when used
4610: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   on the left-han
4620: 64 20 73 69 64 65 20 6f 66 20 61 20 0a 20 20 20  d side of a .   
4630: 20 5c 5b 46 54 53 33 20 4d 41 54 43 48 7c 4d 41   \[FTS3 MATCH|MA
4640: 54 43 48 5c 5d 20 6f 70 65 72 61 74 6f 72 2c 20  TCH\] operator, 
4650: 6f 72 20 77 68 65 6e 20 73 70 65 63 69 66 69 65  or when specifie
4660: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
4670: 20 74 6f 20 6f 6e 65 20 0a 20 20 20 20 6f 66 20   to one .    of 
4680: 74 68 65 20 5c 5b 73 6e 69 70 70 65 74 7c 46 54  the \[snippet|FT
4690: 53 33 20 61 75 78 69 6c 6c 61 72 79 20 66 75 6e  S3 auxillary fun
46a0: 63 74 69 6f 6e 73 5c 5d 2e 0a 20 20 20 20 0a 0a  ctions\]..    ..
46b0: 3c 2f 6f 6c 3e 0a 0a 0a 5b 68 31 20 22 43 6f 6d  </ol>...[h1 "Com
46c0: 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61 62 6c  piling and Enabl
46d0: 69 6e 67 20 46 54 53 33 22 20 7b 7d 20 7b 63 6f  ing FTS3" {} {co
46e0: 6d 70 69 6c 65 20 66 74 73 33 7d 5d 0a 0a 3c 70  mpile fts3}]..<p
46f0: 3e 0a 20 20 41 6c 74 68 6f 75 67 68 20 46 54 53  >.  Although FTS
4700: 33 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  3 is distributed
4710: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
4720: 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 63 6f  SQLite source co
4730: 64 65 2c 20 69 74 20 69 73 20 6e 6f 74 0a 20 20  de, it is not.  
4740: 65 6e 61 62 6c 65 64 20 62 79 20 64 65 66 61 75  enabled by defau
4750: 6c 74 2e 20 54 6f 20 62 75 69 6c 64 20 53 51 4c  lt. To build SQL
4760: 69 74 65 20 77 69 74 68 20 46 54 53 33 20 66 75  ite with FTS3 fu
4770: 6e 63 74 69 6f 6e 61 6c 69 74 79 20 65 6e 61 62  nctionality enab
4780: 6c 65 64 2c 20 64 65 66 69 6e 65 0a 20 20 74 68  led, define.  th
4790: 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  e preprocessor m
47a0: 61 63 72 6f 20 5c 5b 53 51 4c 49 54 45 5f 45 4e  acro \[SQLITE_EN
47b0: 41 42 4c 45 5f 46 54 53 33 5c 5d 20 77 68 65 6e  ABLE_FTS3\] when
47c0: 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65 77 20   compiling. New 
47d0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 73  applications.  s
47e0: 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66 69 6e  hould also defin
47f0: 65 20 74 68 65 20 5c 5b 53 51 4c 49 54 45 5f 45  e the \[SQLITE_E
4800: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
4810: 54 48 45 53 49 53 5c 5d 20 6d 61 63 72 6f 20 74  THESIS\] macro t
4820: 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5c  o enable the.  \
4830: 5b 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20  [enhanced query 
4840: 73 79 6e 74 61 78 5c 5d 20 28 73 65 65 20 62 65  syntax\] (see be
4850: 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74  low). Usually, t
4860: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61  his is done by a
4870: 64 64 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c  dding the .  fol
4880: 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63  lowing two switc
4890: 68 65 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  hes to the compi
48a0: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
48b0: 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53  :..[Code {.  -DS
48c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
48d0: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
48e0: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
48f0: 45 53 49 53 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49  ESIS.}]..<p>.  I
4900: 66 20 75 73 69 6e 67 20 74 68 65 20 61 6d 61 6c  f using the amal
4910: 67 61 6d 61 74 69 6f 6e 20 61 75 74 6f 63 6f 6e  gamation autocon
4920: 66 20 62 61 73 65 64 20 62 75 69 6c 64 20 73 79  f based build sy
4930: 73 74 65 6d 2c 20 73 65 74 74 69 6e 67 20 74 68  stem, setting th
4940: 65 20 43 50 50 46 4c 41 47 53 0a 20 20 65 6e 76  e CPPFLAGS.  env
4950: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
4960: 65 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  e while running 
4970: 74 68 65 20 27 63 6f 6e 66 69 67 75 72 65 27 20  the 'configure' 
4980: 73 63 72 69 70 74 20 69 73 20 61 6e 20 65 61 73  script is an eas
4990: 79 0a 20 20 77 61 79 20 74 6f 20 73 65 74 20 74  y.  way to set t
49a0: 68 65 73 65 20 6d 61 63 72 6f 73 2e 20 46 6f 72  hese macros. For
49b0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f   example, the fo
49c0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
49d0: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43 50 50 46  ..[Code {.  CPPF
49e0: 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45  LAGS="-DSQLITE_E
49f0: 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c  NABLE_FTS3 -DSQL
4a00: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
4a10: 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63  PARENTHESIS" ./c
4a20: 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e  onfigure &lt;con
4a30: 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67  figure options&g
4a40: 74 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 77 68 65  t;.}]..<p>.  whe
4a50: 72 65 20 3c 69 3e 26 6c 74 3b 63 6f 6e 66 69 67  re <i>&lt;config
4a60: 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 3c  ure options&gt;<
4a70: 2f 69 3e 20 61 72 65 20 74 68 6f 73 65 20 6f 70  /i> are those op
4a80: 74 69 6f 6e 73 20 6e 6f 72 6d 61 6c 6c 79 20 70  tions normally p
4a90: 61 73 73 65 64 20 74 6f 0a 20 20 74 68 65 20 63  assed to.  the c
4aa0: 6f 6e 66 69 67 75 72 65 20 73 63 72 69 70 74 2c  onfigure script,
4ab0: 20 69 66 20 61 6e 79 2e 0a 0a 3c 70 3e 0a 20 20   if any...<p>.  
4ac0: 42 65 63 61 75 73 65 20 46 54 53 33 20 69 73 20  Because FTS3 is 
4ad0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
4ae0: 20 69 74 20 69 73 20 69 6e 63 6f 6d 70 61 74 69   it is incompati
4af0: 62 6c 65 20 77 69 74 68 20 74 68 65 0a 20 20 5c  ble with the.  \
4b00: 5b 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  [SQLITE_OMIT_VIR
4b10: 54 55 41 4c 54 41 42 4c 45 5c 5d 20 6f 70 74 69  TUALTABLE\] opti
4b20: 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 6e  on...<p>.  If an
4b30: 20 53 51 4c 69 74 65 20 62 75 69 6c 64 20 64 6f   SQLite build do
4b40: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 46  es not include F
4b50: 54 53 33 2c 20 74 68 65 6e 20 61 6e 79 20 61 74  TS3, then any at
4b60: 74 65 6d 70 74 20 74 6f 20 70 72 65 70 61 72 65  tempt to prepare
4b70: 20 61 6e 0a 20 20 53 51 4c 20 73 74 61 74 65 6d   an.  SQL statem
4b80: 65 6e 74 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ent to create an
4b90: 20 46 54 53 33 20 74 61 62 6c 65 20 6f 72 20 74   FTS3 table or t
4ba0: 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73  o drop or access
4bb0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20   an existing .  
4bc0: 46 54 53 33 20 74 61 62 6c 65 20 69 6e 20 61 6e  FTS3 table in an
4bd0: 79 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e  y way will fail.
4be0: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
4bf0: 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
4c00: 20 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74   be similar .  t
4c10: 6f 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  o "no such modul
4c20: 65 3a 20 66 74 73 33 22 2e 0a 0a 3c 70 3e 0a 20  e: fts3"...<p>. 
4c30: 20 49 66 20 74 68 65 20 43 20 76 65 72 73 69 6f   If the C versio
4c40: 6e 20 6f 66 20 74 68 65 20 3c 61 20 68 72 65 66  n of the <a href
4c50: 3d 68 74 74 70 3a 2f 2f 73 69 74 65 2e 69 63 75  =http://site.icu
4c60: 2d 70 72 6f 6a 65 63 74 2e 6f 72 67 2f 3e 49 43  -project.org/>IC
4c70: 55 20 6c 69 62 72 61 72 79 3c 2f 61 3e 0a 20 20  U library</a>.  
4c80: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  is available, th
4c90: 65 6e 20 46 54 53 33 20 6d 61 79 20 61 6c 73 6f  en FTS3 may also
4ca0: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   be compiled wit
4cb0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
4cc0: 42 4c 45 5f 49 43 55 0a 20 20 70 72 65 2d 70 72  BLE_ICU.  pre-pr
4cd0: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 64 65  ocessor macro de
4ce0: 66 69 6e 65 64 2e 20 43 6f 6d 70 69 6c 69 6e 67  fined. Compiling
4cf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 63 72 6f   with this macro
4d00: 20 65 6e 61 62 6c 65 73 20 61 6e 20 46 54 53 33   enables an FTS3
4d10: 0a 20 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 5c 5d  .  \[tokenizer\]
4d20: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 49   that uses the I
4d30: 43 55 20 6c 69 62 72 61 72 79 20 74 6f 20 73 70  CU library to sp
4d40: 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  lit a document i
4d50: 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28 77 6f 72  nto terms.  (wor
4d60: 64 73 29 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ds) using the co
4d70: 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72 20 61 20  nventions for a 
4d80: 73 70 65 63 69 66 69 65 64 20 6c 61 6e 67 75 61  specified langua
4d90: 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65 2e 0a 0a  ge and locale...
4da0: 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53 51 4c 49  [Code {.  -DSQLI
4db0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 7d 5d  TE_ENABLE_ICU.}]
4dc0: 0a 20 20 0a 0a 5b 68 31 20 22 46 75 6c 6c 2d 74  .  ..[h1 "Full-t
4dd0: 65 78 74 20 49 6e 64 65 78 20 51 75 65 72 69 65  ext Index Querie
4de0: 73 22 20 7b 7d 20 7b 46 54 53 33 20 4d 41 54 43  s" {} {FTS3 MATC
4df0: 48 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  H}]..<p>.  The m
4e00: 6f 73 74 20 75 73 65 66 75 6c 20 74 68 69 6e 67  ost useful thing
4e10: 20 61 62 6f 75 74 20 46 54 53 33 20 74 61 62 6c   about FTS3 tabl
4e20: 65 73 20 69 73 20 74 68 65 20 71 75 65 72 69 65  es is the querie
4e30: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 0a 20  s that may be . 
4e40: 20 70 65 72 66 6f 72 6d 65 64 20 75 73 69 6e 67   performed using
4e50: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
4e60: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 46  ll-text index. F
4e70: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
4e80: 20 61 72 65 20 0a 20 20 70 65 72 66 6f 72 6d 65   are .  performe
4e90: 64 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20  d by specifying 
4ea0: 61 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  a clause of the 
4eb0: 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b 63 6f 6c  form .  "&lt;col
4ec0: 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20 26 6c  umn&gt; MATCH &l
4ed0: 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  t;full-text quer
4ee0: 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b  y expression&gt;
4ef0: 22 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 0a  " to the WHERE .
4f00: 20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45    clause of a SE
4f10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
4f20: 68 61 74 20 72 65 61 64 73 20 64 61 74 61 20 66  hat reads data f
4f30: 72 6f 6d 20 61 6e 20 46 54 53 33 20 74 61 62 6c  rom an FTS3 tabl
4f40: 65 2e 20 0a 20 20 5c 5b 73 69 6d 70 6c 65 20 66  e. .  \[simple f
4f50: 74 73 33 20 71 75 65 72 69 65 73 7c 53 69 6d 70  ts3 queries|Simp
4f60: 6c 65 20 46 54 53 33 20 71 75 65 72 69 65 73 5c  le FTS3 queries\
4f70: 5d 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 6c  ] that return al
4f80: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
4f90: 20 0a 20 20 63 6f 6e 74 61 69 6e 20 61 20 67 69   .  contain a gi
4fa0: 76 65 6e 20 74 65 72 6d 20 61 72 65 20 64 65 73  ven term are des
4fb0: 63 72 69 62 65 64 20 61 62 6f 76 65 2e 20 49 6e  cribed above. In
4fc0: 20 74 68 61 74 20 64 69 73 63 75 73 73 69 6f 6e   that discussion
4fd0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a   the right-hand.
4fe0: 20 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65    operand of the
4ff0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
5000: 77 61 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62  was assumed to b
5010: 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  e a string consi
5020: 73 74 69 6e 67 20 6f 66 20 61 0a 20 20 73 69 6e  sting of a.  sin
5030: 67 6c 65 20 74 65 72 6d 2e 20 54 68 69 73 20 73  gle term. This s
5040: 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73  ection describes
5050: 20 74 68 65 20 6d 6f 72 65 20 63 6f 6d 70 6c 65   the more comple
5060: 78 20 71 75 65 72 79 20 74 79 70 65 73 20 73 75  x query types su
5070: 70 70 6f 72 74 65 64 20 0a 20 20 62 79 20 46 54  pported .  by FT
5080: 53 33 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 68  S3 tables, and h
5090: 6f 77 20 74 68 65 79 20 6d 61 79 20 62 65 20 75  ow they may be u
50a0: 74 69 6c 69 7a 65 64 20 62 79 20 73 70 65 63 69  tilized by speci
50b0: 66 79 69 6e 67 20 61 20 6d 6f 72 65 0a 20 20 63  fying a more.  c
50c0: 6f 6d 70 6c 65 78 20 71 75 65 72 79 20 65 78 70  omplex query exp
50d0: 72 65 73 73 69 6f 6e 20 61 73 20 74 68 65 20 72  ression as the r
50e0: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
50f0: 64 20 6f 66 20 61 20 4d 41 54 43 48 20 6f 70 65  d of a MATCH ope
5100: 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 46 54  rator...<p>.  FT
5110: 53 33 20 74 61 62 6c 65 73 20 73 75 70 70 6f 72  S3 tables suppor
5120: 74 20 74 68 72 65 65 20 62 61 73 69 63 20 71 75  t three basic qu
5130: 65 72 79 20 74 79 70 65 73 3a 0a 0a 3c 75 6c 3e  ery types:..<ul>
5140: 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 54 6f 6b  .  <li><p><b>Tok
5150: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
5160: 69 78 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 20  ix queries</b>. 
5170: 0a 20 20 20 20 41 6e 20 46 54 53 33 20 74 61 62  .    An FTS3 tab
5180: 6c 65 20 6d 61 79 20 62 65 20 71 75 65 72 69 65  le may be querie
5190: 64 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  d for all docume
51a0: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
51b0: 20 61 20 73 70 65 63 69 66 69 65 64 0a 20 20 20   a specified.   
51c0: 20 74 65 72 6d 20 28 74 68 65 20 5c 5b 73 69 6d   term (the \[sim
51d0: 70 6c 65 20 66 74 73 33 20 71 75 65 72 69 65 73  ple fts3 queries
51e0: 7c 73 69 6d 70 6c 65 20 63 61 73 65 5c 5d 20 64  |simple case\] d
51f0: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2c  escribed above),
5200: 20 6f 72 20 66 6f 72 0a 20 20 20 20 61 6c 6c 20   or for.    all 
5210: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
5220: 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 77 69  ontain a term wi
5230: 74 68 20 61 20 73 70 65 63 69 66 69 65 64 20 70  th a specified p
5240: 72 65 66 69 78 2e 20 41 73 20 77 65 20 68 61 76  refix. As we hav
5250: 65 0a 20 20 20 20 73 65 65 6e 2c 20 74 68 65 20  e.    seen, the 
5260: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
5270: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
5280: 74 65 72 6d 20 69 73 20 73 69 6d 70 6c 79 20 74  term is simply t
5290: 68 65 20 74 65 72 6d 20 69 74 73 65 6c 66 2e 0a  he term itself..
52a0: 20 20 20 20 54 68 65 20 71 75 65 72 79 20 65 78      The query ex
52b0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f  pression used to
52c0: 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   search for a te
52d0: 72 6d 20 70 72 65 66 69 78 20 69 73 20 74 68 65  rm prefix is the
52e0: 20 70 72 65 66 69 78 0a 20 20 20 20 69 74 73 65   prefix.    itse
52f0: 6c 66 20 77 69 74 68 20 61 20 27 2a 27 20 63 68  lf with a '*' ch
5300: 61 72 61 63 74 65 72 20 61 70 70 65 6e 64 65 64  aracter appended
5310: 20 74 6f 20 69 74 2e 20 46 6f 72 20 65 78 61 6d   to it. For exam
5320: 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64  ple:.</ul>..[Cod
5330: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74  e {.  <i>-- Virt
5340: 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
5350: 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41  ation</i>.  CREA
5360: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
5370: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
5380: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a  (title, body);..
5390: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
53a0: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
53b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
53c0: 65 72 6d 20 22 6c 69 6e 75 78 22 3a 3c 2f 69 3e  erm "linux":</i>
53d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
53e0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
53f0: 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 3b 0a   MATCH 'linux';.
5400: 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66  .  <i>-- Query f
5410: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
5420: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65   containing a te
5430: 72 6d 20 77 69 74 68 20 74 68 65 20 70 72 65 66  rm with the pref
5440: 69 78 20 22 6c 69 6e 22 2e 20 54 68 69 73 20 77  ix "lin". This w
5450: 69 6c 6c 20 6d 61 74 63 68 3c 2f 69 3e 0a 20 20  ill match</i>.  
5460: 3c 69 3e 2d 2d 20 61 6c 6c 20 64 6f 63 75 6d 65  <i>-- all docume
5470: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
5480: 20 22 6c 69 6e 75 78 22 2c 20 62 75 74 20 61 6c   "linux", but al
5490: 73 6f 20 74 68 6f 73 65 20 74 68 61 74 20 63 6f  so those that co
54a0: 6e 74 61 69 6e 20 74 65 72 6d 73 20 22 6c 69 6e  ntain terms "lin
54b0: 65 61 72 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ear",</i>.  <i>-
54c0: 2d 22 6c 69 6e 6b 65 72 22 2c 20 22 6c 69 6e 67  -"linker", "ling
54d0: 75 69 73 74 69 63 22 20 61 6e 64 20 73 6f 20 6f  uistic" and so o
54e0: 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  n.</i>.  SELECT 
54f0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
5500: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69  E docs MATCH 'li
5510: 6e 2a 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20  n*';.}]..<ul>.  
5520: 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d  <li style="list-
5530: 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a  style:none"><p>.
5540: 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20      Normally, a 
5550: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
5560: 72 65 66 69 78 20 71 75 65 72 79 20 69 73 20 6d  refix query is m
5570: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
5580: 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 0a 20  he FTS3 table . 
5590: 20 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66     column specif
55a0: 69 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ied as the right
55b0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
55c0: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
55d0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20  . Or, if the.   
55e0: 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20   special column 
55f0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
5600: 6d 65 20 61 73 20 74 68 65 20 46 54 53 33 20 74  me as the FTS3 t
5610: 61 62 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73  able itself is s
5620: 70 65 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67  pecified,.    ag
5630: 61 69 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ainst all column
5640: 73 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f  s. This may be o
5650: 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 70 65  verridden by spe
5660: 63 69 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e  cifying a column
5670: 2d 6e 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77  -name.    follow
5680: 65 64 20 62 79 20 61 20 22 3a 22 20 63 68 61 72  ed by a ":" char
5690: 61 63 74 65 72 20 62 65 66 6f 72 65 20 61 20 62  acter before a b
56a0: 61 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e  asic term query.
56b0: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 73 70   There may be sp
56c0: 61 63 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20  ace.    between 
56d0: 74 68 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20  the ":" and the 
56e0: 74 65 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f  term to query fo
56f0: 72 2c 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65  r, but not betwe
5700: 65 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61  en the column-na
5710: 6d 65 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22  me.    and the "
5720: 3a 22 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f  :" character. Fo
5730: 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e  r example:.</ul>
5740: 0a 20 20 20 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  .   .[Code {.  <
5750: 69 3e 2d 2d 20 51 75 65 72 79 20 74 68 65 20 64  i>-- Query the d
5760: 61 74 61 62 61 73 65 20 66 6f 72 20 64 6f 63 75  atabase for docu
5770: 6d 65 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20  ments for which 
5780: 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22  the term "linux"
5790: 20 61 70 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a   appears in</i>.
57a0: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75    <i>-- the docu
57b0: 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e 64 20  ment title, and 
57c0: 74 68 65 20 74 65 72 6d 20 22 70 72 6f 62 6c 65  the term "proble
57d0: 6d 73 22 20 61 70 70 65 61 72 73 20 69 6e 20 65  ms" appears in e
57e0: 69 74 68 65 72 20 74 68 65 20 74 69 74 6c 65 3c  ither the title<
57f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 62  /i>.  <i>-- or b
5800: 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d  ody of the docum
5810: 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ent.</i>.  SELEC
5820: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
5830: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
5840: 74 69 74 6c 65 3a 6c 69 6e 75 78 20 70 72 6f 62  title:linux prob
5850: 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lems';..  <i>-- 
5860: 51 75 65 72 79 20 74 68 65 20 64 61 74 61 62 61  Query the databa
5870: 73 65 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73  se for documents
5880: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74   for which the t
5890: 65 72 6d 20 22 6c 69 6e 75 78 22 20 61 70 70 65  erm "linux" appe
58a0: 61 72 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  ars in</i>.  <i>
58b0: 2d 2d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  -- the document 
58c0: 74 69 74 6c 65 2c 20 61 6e 64 20 74 68 65 20 74  title, and the t
58d0: 65 72 6d 20 22 64 72 69 76 65 72 22 20 61 70 70  erm "driver" app
58e0: 65 61 72 73 20 69 6e 20 74 68 65 20 62 6f 64 79  ears in the body
58f0: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
5900: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 28 22 64  </i>.  <i>-- ("d
5910: 72 69 76 65 72 22 20 6d 61 79 20 61 6c 73 6f 20  river" may also 
5920: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 69  appear in the ti
5930: 74 6c 65 2c 20 62 75 74 20 74 68 69 73 20 61 6c  tle, but this al
5940: 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 73 61 74  one will not sat
5950: 69 73 66 79 20 74 68 65 3c 2f 69 3e 2e 0a 20 20  isfy the</i>..  
5960: 3c 69 3e 2d 2d 20 71 75 65 72 79 20 63 72 69 74  <i>-- query crit
5970: 65 72 69 61 29 2e 3c 2f 69 3e 0a 20 20 53 45 4c  eria).</i>.  SEL
5980: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
5990: 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48  WHERE body MATCH
59a0: 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 64 72   'title:linux dr
59b0: 69 76 65 72 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a  iver';.}]..<ul>.
59c0: 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 50 68 72 61    <li><p><b>Phra
59d0: 73 65 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 0a  se queries</b>..
59e0: 20 20 20 20 41 20 70 68 72 61 73 65 20 71 75 65      A phrase que
59f0: 72 79 20 69 73 20 61 20 71 75 65 72 79 20 74 68  ry is a query th
5a00: 61 74 20 72 65 74 72 69 65 76 65 73 20 61 6c 6c  at retrieves all
5a10: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
5a20: 63 6f 6e 74 61 69 6e 20 61 0a 20 20 20 20 6e 6f  contain a.    no
5a30: 6d 69 6e 61 74 65 64 20 73 65 74 20 6f 66 20 74  minated set of t
5a40: 65 72 6d 73 20 6f 72 20 74 65 72 6d 20 70 72 65  erms or term pre
5a50: 66 69 78 65 73 20 69 6e 20 61 20 73 70 65 63 69  fixes in a speci
5a60: 66 69 65 64 20 6f 72 64 65 72 20 77 69 74 68 20  fied order with 
5a70: 6e 6f 0a 20 20 20 20 69 6e 74 65 72 76 65 6e 69  no.    interveni
5a80: 6e 67 20 74 6f 6b 65 6e 73 2e 20 50 68 72 61 73  ng tokens. Phras
5a90: 65 20 71 75 65 72 69 65 73 20 61 72 65 20 73 70  e queries are sp
5aa0: 65 63 69 66 69 65 64 20 62 79 20 65 6e 63 6c 6f  ecified by enclo
5ab0: 73 69 6e 67 20 61 20 73 70 61 63 65 0a 20 20 20  sing a space.   
5ac0: 20 73 65 70 61 72 61 74 65 64 20 73 65 71 75 65   separated seque
5ad0: 6e 63 65 20 6f 66 20 74 65 72 6d 73 20 6f 72 20  nce of terms or 
5ae0: 74 65 72 6d 20 70 72 65 66 69 78 65 73 20 69 6e  term prefixes in
5af0: 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 20 28   double quotes (
5b00: 22 29 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d  ")..    For exam
5b10: 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64  ple:.</ul>..[Cod
5b20: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  e {.  <i>-- Quer
5b30: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
5b40: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
5b50: 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69 6e   the phrase "lin
5b60: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
5b70: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
5b80: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
5b90: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
5ba0: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
5bb0: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  "';..  <i>-- Que
5bc0: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
5bd0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
5be0: 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74 20  n a phrase that 
5bf0: 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61 70  matches "lin* ap
5c00: 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c  p*". As well as<
5c10: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e  /i>.  <i>-- "lin
5c20: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
5c30: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  , this will matc
5c40: 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73  h common phrases
5c50: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65   such as "linole
5c60: 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f  um appliances"</
5c70: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c  i>.  <i>-- or "l
5c80: 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22 2e  ink apprentice".
5c90: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
5ca0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
5cb0: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e  docs MATCH '"lin
5cc0: 2a 20 61 70 70 2a 22 27 3b 0a 7d 5d 0a 0a 3c 75  * app*"';.}]..<u
5cd0: 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 4e  l>.  <li><p><b>N
5ce0: 45 41 52 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e  EAR queries</b>.
5cf0: 20 0a 20 20 20 20 41 20 4e 45 41 52 20 71 75 65   .    A NEAR que
5d00: 72 79 20 69 73 20 61 20 71 75 65 72 79 20 74 68  ry is a query th
5d10: 61 74 20 72 65 74 75 72 6e 73 20 64 6f 63 75 6d  at returns docum
5d20: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
5d30: 6e 20 61 20 74 77 6f 20 6f 72 0a 20 20 20 20 6d  n a two or.    m
5d40: 6f 72 65 20 6e 6f 6d 69 6e 61 74 65 64 20 74 65  ore nominated te
5d50: 72 6d 73 20 6f 72 20 70 68 72 61 73 65 73 20 77  rms or phrases w
5d60: 69 74 68 69 6e 20 61 20 73 70 65 63 69 66 69 65  ithin a specifie
5d70: 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65  d proximity of e
5d80: 61 63 68 20 0a 20 20 20 20 6f 74 68 65 72 20 28  ach .    other (
5d90: 62 79 20 64 65 66 61 75 6c 74 20 77 69 74 68 20  by default with 
5da0: 31 30 20 6f 72 20 6c 65 73 73 20 69 6e 74 65 72  10 or less inter
5db0: 76 65 6e 69 6e 67 20 74 65 72 6d 73 29 2e 20 41  vening terms). A
5dc0: 20 4e 45 41 52 20 71 75 65 72 79 20 69 73 20 0a   NEAR query is .
5dd0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 62 79      specified by
5de0: 20 70 75 74 74 69 6e 67 20 74 68 65 20 6b 65 79   putting the key
5df0: 77 6f 72 64 20 22 4e 45 41 52 22 20 62 65 74 77  word "NEAR" betw
5e00: 65 65 6e 20 74 77 6f 20 70 68 72 61 73 65 2c 20  een two phrase, 
5e10: 74 65 72 6d 20 6f 72 20 0a 20 20 20 20 74 65 72  term or .    ter
5e20: 6d 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73  m prefix queries
5e30: 2e 20 54 6f 20 73 70 65 63 69 66 79 20 61 20 70  . To specify a p
5e40: 72 6f 78 69 6d 69 74 79 20 6f 74 68 65 72 20 74  roximity other t
5e50: 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74 2c  han the default,
5e60: 0a 20 20 20 20 61 6e 20 6f 70 65 72 61 74 6f 72  .    an operator
5e70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4e 45   of the form "NE
5e80: 41 52 2f 3c 69 3e 26 6c 74 3b 4e 26 67 74 3b 3c  AR/<i>&lt;N&gt;<
5e90: 2f 69 3e 22 20 6d 61 79 20 62 65 20 75 73 65 64  /i>" may be used
5ea0: 2c 20 77 68 65 72 65 0a 20 20 20 20 3c 69 3e 26  , where.    <i>&
5eb0: 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 20 69 73 20  lt;N&gt;</i> is 
5ec0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
5ed0: 65 72 20 6f 66 20 69 6e 74 65 72 76 65 6e 69 6e  er of intervenin
5ee0: 67 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65 64 2e  g terms allowed.
5ef0: 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  .    For example
5f00: 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64 65 20 7b  :.</ul>..[Code {
5f10: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
5f20: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
5f30: 6f 6e 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  on.</i>.  CREATE
5f40: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
5f50: 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33 28 29  ocs USING fts3()
5f60: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75  ;..  <i>-- Virtu
5f70: 61 6c 20 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f  al table data.</
5f80: 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  i>.  INSERT INTO
5f90: 20 64 6f 63 73 20 56 41 4c 55 45 53 28 27 53 51   docs VALUES('SQ
5fa0: 4c 69 74 65 20 69 73 20 61 6e 20 41 43 49 44 20  Lite is an ACID 
5fb0: 63 6f 6d 70 6c 69 61 6e 74 20 65 6d 62 65 64 64  compliant embedd
5fc0: 65 64 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61  ed relational da
5fd0: 74 61 62 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e  tabase managemen
5fe0: 74 20 73 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c  t system');..  <
5ff0: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
6000: 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20  a document that 
6010: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72  contains the ter
6020: 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20  ms "sqlite" and 
6030: 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68 3c  "database" with<
6040: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20  /i>.  <i>-- not 
6050: 6d 6f 72 65 20 74 68 61 6e 20 31 30 20 69 6e 74  more than 10 int
6060: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20  ervening terms. 
6070: 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
6080: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69   only document i
6090: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
60a0: 62 6c 65 20 64 6f 63 73 20 28 73 69 6e 63 65 20  ble docs (since 
60b0: 74 68 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 73  there are only s
60c0: 69 78 20 74 65 72 6d 73 20 62 65 74 77 65 65 6e  ix terms between
60d0: 20 22 53 51 4c 69 74 65 22 20 61 6e 64 20 22 64   "SQLite" and "d
60e0: 61 74 61 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20  atabase"</i> .  
60f0: 3c 69 3e 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63  <i>-- in the doc
6100: 75 6d 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45  ument)</i>..  SE
6110: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
6120: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
6130: 48 20 27 73 71 6c 69 74 65 20 4e 45 41 52 20 64  H 'sqlite NEAR d
6140: 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e  atabase';..  <i>
6150: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
6160: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
6170: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73  ntains the terms
6180: 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64   "sqlite" and "d
6190: 61 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69  atabase" with</i
61a0: 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f  >.  <i>-- not mo
61b0: 72 65 20 74 68 61 6e 20 36 20 69 6e 74 65 72 76  re than 6 interv
61c0: 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69  ening terms. Thi
61d0: 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 74  s also matches t
61e0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
61f0: 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   in</i>.  <i>-- 
6200: 74 61 62 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65  table docs. Note
6210: 20 74 68 61 74 20 74 68 65 20 6f 72 64 65 72 20   that the order 
6220: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 65 72  in which the ter
6230: 6d 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ms appear in the
6240: 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20   document</i>.  
6250: 3c 69 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68  <i>-- does not h
6260: 61 76 65 20 74 6f 20 62 65 20 74 68 65 20 73 61  ave to be the sa
6270: 6d 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20  me as the order 
6280: 69 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 70  in which they ap
6290: 70 65 61 72 20 69 6e 20 74 68 65 20 71 75 65 72  pear in the quer
62a0: 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
62b0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
62c0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61  E docs MATCH 'da
62d0: 74 61 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71  tabase NEAR/6 sq
62e0: 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lite';..  <i>-- 
62f0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
6300: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
6310: 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73  ins the terms "s
6320: 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  qlite" and "data
6330: 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  base" with</i>. 
6340: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20   <i>-- not more 
6350: 74 68 61 6e 20 35 20 69 6e 74 65 72 76 65 6e 69  than 5 interveni
6360: 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20 71  ng terms. This q
6370: 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20  uery matches no 
6380: 64 6f 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20  documents.</i>. 
6390: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
63a0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
63b0: 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20 4e  ATCH 'database N
63c0: 45 41 52 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a  EAR/5 sqlite';..
63d0: 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66    <i>-- Search f
63e0: 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68  or a document th
63f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
6400: 70 68 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d  phrase "ACID com
6410: 70 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20  pliant" and the 
6420: 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  term</i>.  <i>--
6430: 20 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68   "database" with
6440: 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32   not more than 2
6450: 20 74 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e   terms separatin
6460: 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20  g the two. This 
6470: 6d 61 74 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a  matches the</i>.
6480: 20 20 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74    <i>-- document
6490: 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65   stored in table
64a0: 20 64 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c   docs.</i>.  SEL
64b0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
64c0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
64d0: 20 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f   'database NEAR/
64e0: 32 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  2 "ACID complian
64f0: 74 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  t"';..  <i>-- Se
6500: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
6510: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
6520: 73 20 74 68 65 20 70 68 72 61 73 65 20 22 41 43  s the phrase "AC
6530: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e  ID compliant" an
6540: 64 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20  d the term</i>. 
6550: 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20   <i>-- "sqlite" 
6560: 77 69 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68  with not more th
6570: 61 6e 20 32 20 74 65 72 6d 73 20 73 65 70 61 72  an 2 terms separ
6580: 61 74 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54  ating the two. T
6590: 68 69 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73  his also matches
65a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
65b0: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73   only document s
65c0: 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64  tored in table d
65d0: 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ocs.</i>.  SELEC
65e0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
65f0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
6600: 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22  "ACID compliant"
6610: 20 4e 45 41 52 2f 32 20 73 71 6c 69 74 65 27 3b   NEAR/2 sqlite';
6620: 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 20  .}]..<ul>.  <li 
6630: 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c  style="list-styl
6640: 65 3a 20 6e 6f 6e 65 22 3e 3c 70 3e 0a 20 20 20  e: none"><p>.   
6650: 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4e   More than one N
6660: 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 61 79  EAR operator may
6670: 20 61 70 70 65 61 72 20 69 6e 20 61 20 73 69 6e   appear in a sin
6680: 67 6c 65 20 71 75 65 72 79 2e 20 49 6e 20 74 68  gle query. In th
6690: 69 73 20 63 61 73 65 20 65 61 63 68 0a 20 20 20  is case each.   
66a0: 20 70 61 69 72 20 6f 66 20 74 65 72 6d 73 20 6f   pair of terms o
66b0: 72 20 70 68 72 61 73 65 73 20 73 65 70 61 72 61  r phrases separa
66c0: 74 65 64 20 62 79 20 61 20 4e 45 41 52 20 6f 70  ted by a NEAR op
66d0: 65 72 61 74 6f 72 20 6d 75 73 74 20 61 70 70 65  erator must appe
66e0: 61 72 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20  ar within the.  
66f0: 20 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78    specified prox
6700: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 6f 74  imity of each ot
6710: 68 65 72 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  her in the docum
6720: 65 6e 74 2e 20 55 73 69 6e 67 20 74 68 65 20 73  ent. Using the s
6730: 61 6d 65 20 74 61 62 6c 65 20 61 6e 64 0a 20 20  ame table and.  
6740: 20 20 64 61 74 61 20 61 73 20 69 6e 20 74 68 65    data as in the
6750: 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c   block of exampl
6760: 65 73 20 61 62 6f 76 65 3a 0a 3c 2f 75 6c 3e 0a  es above:.</ul>.
6770: 0a 5b 43 6f 64 65 20 7b 20 3c 69 3e 2d 2d 20 54  .[Code { <i>-- T
6780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
6790: 72 79 20 73 65 6c 65 63 74 73 20 64 6f 63 75 6d  ry selects docum
67a0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
67b0: 6e 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ns an instance o
67c0: 66 20 74 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a  f the term </i>.
67d0: 20 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22    <i>-- "sqlite"
67e0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77   separated by tw
67f0: 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
6800: 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63   from an instanc
6810: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61  e of the term "a
6820: 63 69 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  cid",</i>.  <i>-
6830: 2d 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 75  - which is in tu
6840: 72 6e 20 73 65 70 61 72 61 74 65 64 20 62 79 20  rn separated by 
6850: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
6860: 6d 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61  ms from an insta
6870: 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 3c  nce of the term<
6880: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c  /i>.  <i>-- "rel
6890: 61 74 69 6f 6e 61 6c 22 2e 20 41 73 20 69 74 20  ational". As it 
68a0: 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 6e 6c  happens, the onl
68b0: 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 61  y document in ta
68c0: 62 6c 65 20 64 6f 63 73 20 73 61 74 69 73 66 69  ble docs satisfi
68d0: 65 73 20 74 68 69 73 20 63 72 69 74 65 72 69 61  es this criteria
68e0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
68f0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
6900: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
6910: 69 74 65 20 4e 45 41 52 2f 32 20 61 63 69 64 20  ite NEAR/2 acid 
6920: 4e 45 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61  NEAR/2 relationa
6930: 6c 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  l';..  <i>-- Thi
6940: 73 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  s query matches 
6950: 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68  no documents. Th
6960: 65 72 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ere is an instan
6970: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  ce of the term "
6980: 73 71 6c 69 74 65 22 20 77 69 74 68 3c 2f 69 3e  sqlite" with</i>
6990: 0a 20 20 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69  .  <i>-- suffici
69a0: 65 6e 74 20 70 72 6f 78 69 6d 69 74 79 20 74 6f  ent proximity to
69b0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
69c0: 22 61 63 69 64 22 20 62 75 74 20 69 74 20 69 73  "acid" but it is
69d0: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 6c   not sufficientl
69e0: 79 20 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69  y close</i>.  <i
69f0: 3e 2d 2d 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  >-- to an instan
6a00: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  ce of the term "
6a10: 72 65 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e  relational".</i>
6a20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6a30: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
6a40: 20 4d 41 54 43 48 20 27 61 63 69 64 20 4e 45 41   MATCH 'acid NEA
6a50: 52 2f 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f  R/2 sqlite NEAR/
6a60: 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 7d  2 relational';.}
6a70: 5d 0a 0a 3c 70 3e 0a 20 20 50 68 72 61 73 65 20  ]..<p>.  Phrase 
6a80: 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65 73  and NEAR queries
6a90: 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d 75   may not span mu
6aa0: 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 77  ltiple columns w
6ab0: 69 74 68 69 6e 20 61 20 72 6f 77 2e 0a 0a 3c 70  ithin a row...<p
6ac0: 3e 0a 20 20 54 68 65 20 74 68 72 65 65 20 62 61  >.  The three ba
6ad0: 73 69 63 20 71 75 65 72 79 20 74 79 70 65 73 20  sic query types 
6ae0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
6af0: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 71  may be used to q
6b00: 75 65 72 79 20 74 68 65 20 66 75 6c 6c 2d 74 65  uery the full-te
6b10: 78 74 0a 20 20 69 6e 64 65 78 20 66 6f 72 20 74  xt.  index for t
6b20: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
6b30: 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  nts that match t
6b40: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 72 69  he specified cri
6b50: 74 65 72 69 61 2e 20 55 73 69 6e 67 20 74 68 65  teria. Using the
6b60: 0a 20 20 46 54 53 33 20 71 75 65 72 79 20 65 78  .  FTS3 query ex
6b70: 70 72 65 73 73 69 6f 6e 20 6c 61 6e 67 75 61 67  pression languag
6b80: 65 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  e it is possible
6b90: 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69   to perform vari
6ba0: 6f 75 73 20 73 65 74 20 0a 20 20 6f 70 65 72 61  ous set .  opera
6bb0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 72 65 73  tions on the res
6bc0: 75 6c 74 73 20 6f 66 20 62 61 73 69 63 20 71 75  ults of basic qu
6bd0: 65 72 69 65 73 2e 20 54 68 65 72 65 20 61 72 65  eries. There are
6be0: 20 63 75 72 72 65 6e 74 6c 79 20 74 68 72 65 65   currently three
6bf0: 20 0a 20 20 73 75 70 70 6f 72 74 65 64 20 6f 70   .  supported op
6c00: 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a  erations:..<ul>.
6c10: 20 20 3c 6c 69 3e 20 54 68 65 20 41 4e 44 20 6f    <li> The AND o
6c20: 70 65 72 61 74 6f 72 20 64 65 74 65 72 6d 69 6e  perator determin
6c30: 65 73 20 74 68 65 20 3c 62 3e 69 6e 74 65 72 73  es the <b>inters
6c40: 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77  ection</b> of tw
6c50: 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65  o sets of docume
6c60: 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65  nts...  <li> The
6c70: 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 63 61 6c   OR operator cal
6c80: 63 75 6c 61 74 65 73 20 74 68 65 20 3c 62 3e 75  culates the <b>u
6c90: 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77 6f 20  nion</b> of two 
6ca0: 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74  sets of document
6cb0: 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65 20 4e  s...  <li> The N
6cc0: 4f 54 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 2c  OT operator (or,
6cd0: 20 69 66 20 75 73 69 6e 67 20 74 68 65 20 73 74   if using the st
6ce0: 61 6e 64 61 72 64 20 73 79 6e 74 61 78 2c 20 61  andard syntax, a
6cf0: 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72 61   unary "-" opera
6d00: 74 6f 72 29 0a 20 20 20 20 20 20 20 6d 61 79 20  tor).       may 
6d10: 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
6d20: 74 65 20 74 68 65 20 3c 62 3e 72 65 6c 61 74 69  te the <b>relati
6d30: 76 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 3c 2f 62  ve complement</b
6d40: 3e 20 6f 66 20 6f 6e 65 20 73 65 74 20 6f 66 0a  > of one set of.
6d50: 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 73         documents
6d60: 20 77 69 74 68 20 72 65 73 70 65 63 74 20 74 6f   with respect to
6d70: 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f 75 6c 3e 0a   another..</ul>.
6d80: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
6d90: 6d 6f 64 75 6c 65 20 6d 61 79 20 62 65 20 63 6f  module may be co
6da0: 6d 70 69 6c 65 64 20 74 6f 20 75 73 65 20 6f 6e  mpiled to use on
6db0: 65 20 6f 66 20 74 77 6f 20 73 6c 69 67 68 74 6c  e of two slightl
6dc0: 79 20 64 69 66 66 65 72 65 6e 74 20 76 65 72 73  y different vers
6dd0: 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65 20 66 75  ions.  of the fu
6de0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 79  ll-text query sy
6df0: 6e 74 61 78 2c 20 74 68 65 20 22 73 74 61 6e 64  ntax, the "stand
6e00: 61 72 64 22 20 71 75 65 72 79 20 73 79 6e 74 61  ard" query synta
6e10: 78 20 61 6e 64 20 74 68 65 20 22 65 6e 68 61 6e  x and the "enhan
6e20: 63 65 64 22 20 0a 20 20 71 75 65 72 79 20 73 79  ced" .  query sy
6e30: 6e 74 61 78 2e 20 54 68 65 20 62 61 73 69 63 20  ntax. The basic 
6e40: 74 65 72 6d 2c 20 74 65 72 6d 2d 70 72 65 66 69  term, term-prefi
6e50: 78 2c 20 70 68 72 61 73 65 20 61 6e 64 20 4e 45  x, phrase and NE
6e60: 41 52 20 71 75 65 72 69 65 73 20 64 65 73 63 72  AR queries descr
6e70: 69 62 65 64 20 0a 20 20 61 62 6f 76 65 20 61 72  ibed .  above ar
6e80: 65 20 74 68 65 20 73 61 6d 65 20 69 6e 20 62 6f  e the same in bo
6e90: 74 68 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  th versions of t
6ea0: 68 65 20 73 79 6e 74 61 78 2e 20 54 68 65 20 77  he syntax. The w
6eb0: 61 79 20 69 6e 20 77 68 69 63 68 20 73 65 74 20  ay in which set 
6ec0: 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  .  operations ar
6ed0: 65 20 73 70 65 63 69 66 69 65 64 20 69 73 20 73  e specified is s
6ee0: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
6ef0: 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
6f00: 20 74 77 6f 20 73 75 62 2d 73 65 63 74 69 6f 6e   two sub-section
6f10: 73 20 0a 20 20 64 65 73 63 72 69 62 65 20 74 68  s .  describe th
6f20: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 77  e part of the tw
6f30: 6f 20 71 75 65 72 79 20 73 79 6e 74 61 78 65 73  o query syntaxes
6f40: 20 74 68 61 74 20 70 65 72 74 61 69 6e 73 20 74   that pertains t
6f50: 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  o set operations
6f60: 2e 20 0a 20 20 52 65 66 65 72 20 74 6f 20 74 68  . .  Refer to th
6f70: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
6f80: 20 68 6f 77 20 74 6f 20 5c 5b 63 6f 6d 70 69 6c   how to \[compil
6f90: 65 20 66 74 73 33 5c 5d 20 66 6f 72 20 63 6f 6d  e fts3\] for com
6fa0: 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65 73 2e 0a  pilation notes..
6fb0: 0a 5b 68 32 20 22 53 65 74 20 4f 70 65 72 61 74  .[h2 "Set Operat
6fc0: 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65 20 45  ions Using The E
6fd0: 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79  nhanced Query Sy
6fe0: 6e 74 61 78 22 20 7b 7d 20 7b 65 6e 68 61 6e 63  ntax" {} {enhanc
6ff0: 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 7d  ed query syntax}
7000: 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 65 6e 68  ]..<p>.  The enh
7010: 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74  anced query synt
7020: 61 78 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  ax supports the 
7030: 41 4e 44 2c 20 4f 52 20 61 6e 64 20 4e 4f 54 20  AND, OR and NOT 
7040: 62 69 6e 61 72 79 20 73 65 74 20 6f 70 65 72 61  binary set opera
7050: 74 6f 72 73 2e 0a 20 20 45 61 63 68 20 6f 66 20  tors..  Each of 
7060: 74 68 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73  the two operands
7070: 20 74 6f 20 61 6e 20 6f 70 65 72 61 74 6f 72 20   to an operator 
7080: 6d 61 79 20 62 65 20 61 20 62 61 73 69 63 20 46  may be a basic F
7090: 54 53 33 20 71 75 65 72 79 2c 20 6f 72 20 74 68  TS3 query, or th
70a0: 65 0a 20 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  e.  result of an
70b0: 6f 74 68 65 72 20 41 4e 44 2c 20 4f 52 20 6f 72  other AND, OR or
70c0: 20 4e 4f 54 20 73 65 74 20 6f 70 65 72 61 74 69   NOT set operati
70d0: 6f 6e 2e 20 4f 70 65 72 61 74 6f 72 73 20 6d 75  on. Operators mu
70e0: 73 74 20 62 65 20 65 6e 74 65 72 65 64 0a 20 20  st be entered.  
70f0: 75 73 69 6e 67 20 63 61 70 69 74 61 6c 20 6c 65  using capital le
7100: 74 74 65 72 73 2e 20 4f 74 68 65 72 77 69 73 65  tters. Otherwise
7110: 2c 20 74 68 65 79 20 61 72 65 20 69 6e 74 65 72  , they are inter
7120: 70 72 65 74 65 64 20 61 73 20 62 61 73 69 63 20  preted as basic 
7130: 74 65 72 6d 20 71 75 65 72 69 65 73 0a 20 20 69  term queries.  i
7140: 6e 73 74 65 61 64 20 6f 66 20 73 65 74 20 6f 70  nstead of set op
7150: 65 72 61 74 6f 72 73 2e 0a 0a 3c 70 3e 0a 20 20  erators...<p>.  
7160: 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
7170: 20 6d 61 79 20 62 65 20 69 6d 70 6c 69 63 69 74   may be implicit
7180: 6c 79 20 73 70 65 63 69 66 69 65 64 2e 20 49 66  ly specified. If
7190: 20 74 77 6f 20 62 61 73 69 63 20 71 75 65 72 69   two basic queri
71a0: 65 73 20 61 70 70 65 61 72 20 0a 20 20 77 69 74  es appear .  wit
71b0: 68 20 6e 6f 20 6f 70 65 72 61 74 6f 72 20 73 65  h no operator se
71c0: 70 61 72 61 74 69 6e 67 20 74 68 65 6d 20 69 6e  parating them in
71d0: 20 61 6e 20 46 54 53 33 20 71 75 65 72 79 20 73   an FTS3 query s
71e0: 74 72 69 6e 67 2c 20 74 68 65 20 72 65 73 75 6c  tring, the resul
71f0: 74 73 20 61 72 65 0a 20 20 74 68 65 20 73 61 6d  ts are.  the sam
7200: 65 20 61 73 20 69 66 20 74 68 65 20 74 77 6f 20  e as if the two 
7210: 62 61 73 69 63 20 71 75 65 72 69 65 73 20 77 65  basic queries we
7220: 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
7230: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
7240: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
7250: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
7260: 73 69 6f 6e 20 22 69 6d 70 6c 69 63 69 74 20 6f  sion "implicit o
7270: 70 65 72 61 74 6f 72 22 20 69 73 20 61 20 6d 6f  perator" is a mo
7280: 72 65 20 73 75 63 63 69 6e 63 74 0a 20 20 76 65  re succinct.  ve
7290: 72 73 69 6f 6e 20 6f 66 20 22 69 6d 70 6c 69 63  rsion of "implic
72a0: 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 22  it AND operator"
72b0: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  ...[Code {.  <i>
72c0: 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  -- Virtual table
72d0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e   declaration</i>
72e0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
72f0: 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49  L TABLE docs USI
7300: 4e 47 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69  NG fts3();..  <i
7310: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
7320: 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 49 4e 53  e data</i>.  INS
7330: 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f  ERT INTO docs(do
7340: 63 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41  cid, content) VA
7350: 4c 55 45 53 28 31 2c 20 27 61 20 64 61 74 61 62  LUES(1, 'a datab
7360: 61 73 65 20 69 73 20 61 20 73 6f 66 74 77 61 72  ase is a softwar
7370: 65 20 73 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e  e system');.  IN
7380: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64  SERT INTO docs(d
7390: 6f 63 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56  ocid, content) V
73a0: 41 4c 55 45 53 28 32 2c 20 27 73 71 6c 69 74 65  ALUES(2, 'sqlite
73b0: 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73   is a software s
73c0: 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52  ystem');.  INSER
73d0: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
73e0: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
73f0: 45 53 28 33 2c 20 27 73 71 6c 69 74 65 20 69 73  ES(3, 'sqlite is
7400: 20 61 20 64 61 74 61 62 61 73 65 27 29 3b 0a 0a   a database');..
7410: 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74    <i>-- Return t
7420: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
7430: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7440: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
7450: 65 22 2c 20 61 6e 64 20 74 68 65 3c 2f 69 3e 0a  e", and the</i>.
7460: 20 20 3c 69 3e 2d 2d 20 74 65 72 6d 20 22 64 61    <i>-- term "da
7470: 74 61 62 61 73 65 22 2e 20 54 68 69 73 20 71 75  tabase". This qu
7480: 65 72 79 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ery will return 
7490: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
74a0: 68 20 64 6f 63 69 64 20 33 20 6f 6e 6c 79 2e 3c  h docid 3 only.<
74b0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
74c0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
74d0: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
74e0: 65 20 41 4e 44 20 64 61 74 61 62 61 73 65 27 3b  e AND database';
74f0: 0a 0a 20 20 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c  ..  <i>-- Again,
7500: 20 72 65 74 75 72 6e 20 74 68 65 20 73 65 74 20   return the set 
7510: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7520: 74 20 63 6f 6e 74 61 69 6e 20 62 6f 74 68 20 22  t contain both "
7530: 73 71 6c 69 74 65 22 20 61 6e 64 3c 2f 69 3e 0a  sqlite" and</i>.
7540: 20 20 3c 69 3e 2d 2d 20 22 64 61 74 61 62 61 73    <i>-- "databas
7550: 65 22 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 75  e". This time, u
7560: 73 65 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41  se an implicit A
7570: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 41 67 61  ND operator. Aga
7580: 69 6e 2c 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e  in, document</i>
7590: 0a 20 20 3c 69 3e 2d 2d 20 33 20 69 73 20 74 68  .  <i>-- 3 is th
75a0: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20  e only document 
75b0: 6d 61 74 63 68 65 64 20 62 79 20 74 68 69 73 20  matched by this 
75c0: 71 75 65 72 79 2e 20 3c 2f 69 3e 0a 20 20 53 45  query. </i>.  SE
75d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
75e0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
75f0: 48 20 27 64 61 74 61 62 61 73 65 20 73 71 6c 69  H 'database sqli
7600: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  te';..  <i>-- Qu
7610: 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20  ery for the set 
7620: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7630: 74 20 63 6f 6e 74 61 69 6e 73 20 65 69 74 68 65  t contains eithe
7640: 72 20 22 73 71 6c 69 74 65 22 20 6f 72 20 22 64  r "sqlite" or "d
7650: 61 74 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20  atabase".</i>.  
7660: 3c 69 3e 2d 2d 20 41 6c 6c 20 74 68 72 65 65 20  <i>-- All three 
7670: 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65  documents in the
7680: 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
7690: 74 63 68 65 64 20 62 79 20 74 68 69 73 20 71 75  tched by this qu
76a0: 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ery.</i>.  SELEC
76b0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
76c0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
76d0: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
76e0: 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  se';..  <i>-- Qu
76f0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
7700: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
7710: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74  in the term "dat
7720: 61 62 61 73 65 22 2c 20 62 75 74 20 64 6f 20 6e  abase", but do n
7730: 6f 74 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20  ot contain</i>. 
7740: 20 3c 69 3e 2d 2d 20 74 68 65 20 74 65 72 6d 20   <i>-- the term 
7750: 22 73 71 6c 69 74 65 22 2e 20 44 6f 63 75 6d 65  "sqlite". Docume
7760: 6e 74 20 31 20 69 73 20 74 68 65 20 6f 6e 6c 79  nt 1 is the only
7770: 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 6d   document that m
7780: 61 74 63 68 65 73 20 74 68 69 73 20 63 72 69 74  atches this crit
7790: 65 72 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  eria.</i>.  SELE
77a0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
77b0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
77c0: 27 64 61 74 61 62 61 73 65 20 4e 4f 54 20 73 71  'database NOT sq
77d0: 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lite';..  <i>-- 
77e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
77f0: 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64  ery matches no d
7800: 6f 63 75 6d 65 6e 74 73 2e 20 42 65 63 61 75 73  ocuments. Becaus
7810: 65 20 22 61 6e 64 22 20 69 73 20 69 6e 20 6c 6f  e "and" is in lo
7820: 77 65 72 63 61 73 65 20 6c 65 74 74 65 72 73 2c  wercase letters,
7830: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 74 20  </i>.  <i>-- it 
7840: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
7850: 73 20 61 20 62 61 73 69 63 20 74 65 72 6d 20 71  s a basic term q
7860: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
7870: 61 6e 20 6f 70 65 72 61 74 6f 72 2e 20 4f 70 65  an operator. Ope
7880: 72 61 74 6f 72 73 20 6d 75 73 74 3c 2f 69 3e 0a  rators must</i>.
7890: 20 20 3c 69 3e 2d 2d 20 62 65 20 73 70 65 63 69    <i>-- be speci
78a0: 66 69 65 64 20 75 73 69 6e 67 20 63 61 70 69 74  fied using capit
78b0: 61 6c 20 6c 65 74 74 65 72 73 2e 20 49 6e 20 70  al letters. In p
78c0: 72 61 63 74 69 63 65 2c 20 74 68 69 73 20 71 75  ractice, this qu
78d0: 65 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 20 61  ery will match a
78e0: 6e 79 20 64 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e  ny documents</i>
78f0: 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 63 6f  .  <i>-- that co
7900: 6e 74 61 69 6e 20 65 61 63 68 20 6f 66 20 74 68  ntain each of th
7910: 65 20 74 68 72 65 65 20 74 65 72 6d 73 20 22 64  e three terms "d
7920: 61 74 61 62 61 73 65 22 2c 20 22 61 6e 64 22 20  atabase", "and" 
7930: 61 6e 64 20 22 73 71 6c 69 74 65 22 20 61 74 20  and "sqlite" at 
7940: 6c 65 61 73 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a  least once.</i>.
7950: 20 20 3c 69 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d    <i>-- No docum
7960: 65 6e 74 73 20 69 6e 20 74 68 65 20 65 78 61 6d  ents in the exam
7970: 70 6c 65 20 64 61 74 61 20 61 62 6f 76 65 20 6d  ple data above m
7980: 61 74 63 68 20 74 68 69 73 20 63 72 69 74 65 72  atch this criter
7990: 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ia.</i>.  SELECT
79a0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
79b0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
79c0: 61 74 61 62 61 73 65 20 61 6e 64 20 73 71 6c 69  atabase and sqli
79d0: 74 65 27 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54  te';.}]..<p>.  T
79e0: 68 65 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76  he examples abov
79f0: 65 20 61 6c 6c 20 75 73 65 20 62 61 73 69 63 20  e all use basic 
7a00: 66 75 6c 6c 2d 74 65 78 74 20 74 65 72 6d 20 71  full-text term q
7a10: 75 65 72 69 65 73 20 61 73 20 62 6f 74 68 20 6f  ueries as both o
7a20: 70 65 72 61 6e 64 73 20 6f 66 20 0a 20 20 74 68  perands of .  th
7a30: 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  e set operations
7a40: 20 64 65 6d 6f 6e 73 74 72 61 74 65 64 2e 20 50   demonstrated. P
7a50: 68 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20 71  hrase and NEAR q
7a60: 75 65 72 69 65 73 20 6d 61 79 20 61 6c 73 6f 20  ueries may also 
7a70: 62 65 20 75 73 65 64 2c 0a 20 20 61 73 20 6d 61  be used,.  as ma
7a80: 79 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  y the results of
7a90: 20 6f 74 68 65 72 20 73 65 74 20 6f 70 65 72 61   other set opera
7aa0: 74 69 6f 6e 73 2e 20 57 68 65 6e 20 6d 6f 72 65  tions. When more
7ab0: 20 74 68 61 6e 20 6f 6e 65 20 73 65 74 20 6f 70   than one set op
7ac0: 65 72 61 74 69 6f 6e 0a 20 20 69 73 20 70 72 65  eration.  is pre
7ad0: 73 65 6e 74 20 69 6e 20 61 6e 20 46 54 53 33 20  sent in an FTS3 
7ae0: 71 75 65 72 79 2c 20 74 68 65 20 70 72 65 63 65  query, the prece
7af0: 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f  dence of operato
7b00: 72 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  rs is as follows
7b10: 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
7b20: 5d 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68  ]<th>Operator<th
7b30: 3e 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20  >Enhanced Query 
7b40: 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e 63  Syntax Precedenc
7b50: 65 0a 20 20 5b 54 72 5d 3c 74 64 3e 4e 4f 54 20  e.  [Tr]<td>NOT 
7b60: 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65  <td> Highest pre
7b70: 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73  cedence (tightes
7b80: 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 5b  t grouping)..  [
7b90: 54 72 5d 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a  Tr]<td>AND <td>.
7ba0: 20 20 5b 54 72 5d 3c 74 64 3e 4f 52 20 20 3c 74    [Tr]<td>OR  <t
7bb0: 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64  d> Lowest preced
7bc0: 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72  ence (loosest gr
7bd0: 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65  ouping)..</table
7be0: 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73  >..<p>.  When us
7bf0: 69 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65 64  ing the enhanced
7c00: 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 70   query syntax, p
7c10: 61 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20 62  arenthesis may b
7c20: 65 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72 69  e used to overri
7c30: 64 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c 74  de.  the default
7c40: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74   precedence of t
7c50: 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61  he various opera
7c60: 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
7c70: 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 0a 20 20 3c  e:..[Code {..  <
7c80: 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65 20  i>-- Return the 
7c90: 64 6f 63 69 64 20 76 61 6c 75 65 73 20 61 73 73  docid values ass
7ca0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6c 6c  ociated with all
7cb0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
7cc0: 63 6f 6e 74 61 69 6e 20 74 68 65 3c 2f 69 3e 0a  contain the</i>.
7cd0: 20 20 3c 69 3e 2d 2d 20 74 77 6f 20 74 65 72 6d    <i>-- two term
7ce0: 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22  s "sqlite" and "
7cf0: 64 61 74 61 62 61 73 65 22 2c 20 61 6e 64 2f 6f  database", and/o
7d00: 72 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  r contain the te
7d10: 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 3c 2f 69  rm "library".</i
7d20: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
7d30: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7d40: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
7d50: 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73 65  ite AND database
7d60: 20 4f 52 20 6c 69 62 72 61 72 79 27 3b 0a 0a 20   OR library';.. 
7d70: 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65 72   <i>-- This quer
7d80: 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  y is equivalent 
7d90: 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c 2f 69  to the above.</i
7da0: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
7db0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7dc0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
7dd0: 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73 65  ite AND database
7de0: 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 53 45  '.    UNION.  SE
7df0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
7e00: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7e10: 4d 41 54 43 48 20 27 6c 69 62 72 61 72 79 27 3b  MATCH 'library';
7e20: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
7e30: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
7e40: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
7e50: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 20  ntains the term 
7e60: 22 6c 69 6e 75 78 22 2c 20 61 6e 64 20 61 74 20  "linux", and at 
7e70: 6c 65 61 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  least</i>.  <i>-
7e80: 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 68 72  - one of the phr
7e90: 61 73 65 73 20 22 73 71 6c 69 74 65 20 64 61 74  ases "sqlite dat
7ea0: 61 62 61 73 65 22 20 61 6e 64 20 22 73 71 6c 69  abase" and "sqli
7eb0: 74 65 20 6c 69 62 72 61 72 79 22 2e 3c 2f 69 3e  te library".</i>
7ec0: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
7ed0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7ee0: 64 6f 63 73 20 4d 41 54 43 48 20 27 28 22 73 71  docs MATCH '("sq
7ef0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20 4f  lite database" O
7f00: 52 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72  R "sqlite librar
7f10: 79 22 29 20 41 4e 44 20 6c 69 6e 75 78 27 3b 0a  y") AND linux';.
7f20: 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75  .  <i>-- This qu
7f30: 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ery is equivalen
7f40: 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c  t to the above.<
7f50: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  /i>.  SELECT doc
7f60: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45  id FROM docs WHE
7f70: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c  RE docs MATCH 'l
7f80: 69 6e 75 78 27 0a 20 20 20 20 49 4e 54 45 52 53  inux'.    INTERS
7f90: 45 43 54 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  ECT.  SELECT doc
7fa0: 69 64 20 46 52 4f 4d 20 28 0a 20 20 20 20 53 45  id FROM (.    SE
7fb0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
7fc0: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7fd0: 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20 6c  MATCH '"sqlite l
7fe0: 69 62 72 61 72 79 22 27 0a 20 20 20 20 20 20 55  ibrary"'.      U
7ff0: 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54 20  NION.    SELECT 
8000: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8010: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8020: 20 27 22 73 71 6c 69 74 65 20 64 61 74 61 62 61   '"sqlite databa
8030: 73 65 22 27 0a 20 20 29 3b 0a 7d 5d 0a 0a 0a 5b  se"'.  );.}]...[
8040: 68 32 20 22 53 65 74 20 4f 70 65 72 61 74 69 6f  h2 "Set Operatio
8050: 6e 73 20 55 73 69 6e 67 20 54 68 65 20 53 74 61  ns Using The Sta
8060: 6e 64 61 72 64 20 51 75 65 72 79 20 53 79 6e 74  ndard Query Synt
8070: 61 78 22 5d 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  ax"]..<p>.  FTS3
8080: 20 71 75 65 72 79 20 73 65 74 20 6f 70 65 72 61   query set opera
8090: 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20  tions using the 
80a0: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
80b0: 79 6e 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61  yntax are simila
80c0: 72 2c 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65  r, but.  not ide
80d0: 6e 74 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f  ntical, to set o
80e0: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74  perations with t
80f0: 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72  he enhanced quer
8100: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a  y syntax. There.
8110: 20 20 61 72 65 20 66 6f 75 72 20 64 69 66 66 65    are four diffe
8120: 72 65 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f  rences, as follo
8130: 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ws:..<ol>.  <li 
8140: 76 61 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79  value=1><p> Only
8150: 20 74 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65   the implicit ve
8160: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44  rsion of the AND
8170: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 75 70   operator is sup
8180: 70 6f 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63  ported..    Spec
8190: 69 66 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e  ifying the strin
81a0: 67 20 22 41 4e 44 22 20 61 73 20 70 61 72 74 20  g "AND" as part 
81b0: 6f 66 20 61 6e 20 73 74 61 6e 64 61 72 64 20 71  of an standard q
81c0: 75 65 72 79 20 73 79 6e 74 61 78 20 71 75 65 72  uery syntax quer
81d0: 79 20 69 73 0a 20 20 20 20 69 6e 74 65 72 70 72  y is.    interpr
81e0: 65 74 65 64 20 61 73 20 61 20 74 65 72 6d 20 71  eted as a term q
81f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74  uery for the set
8200: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f   of documents co
8210: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
8220: 6d 20 0a 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f  m .    "and"..</
8230: 6f 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ol>..<ol>.  <li 
8240: 76 61 6c 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65  value=2><p> Pare
8250: 6e 74 68 65 73 69 73 20 61 72 65 20 6e 6f 74 20  nthesis are not 
8260: 73 75 70 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e  supported..</ol>
8270: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
8280: 75 65 3d 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54  ue=3><p> The NOT
8290: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   operator is not
82a0: 20 73 75 70 70 6f 72 74 65 64 2e 20 49 6e 73 74   supported. Inst
82b0: 65 61 64 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a  ead of the NOT .
82c0: 20 20 20 20 6f 70 65 72 61 74 6f 72 2c 20 74 68      operator, th
82d0: 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79  e standard query
82e0: 20 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73   syntax supports
82f0: 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65   a unary "-" ope
8300: 72 61 74 6f 72 20 74 68 61 74 0a 20 20 20 20 6d  rator that.    m
8310: 61 79 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ay be applied to
8320: 20 62 61 73 69 63 20 74 65 72 6d 20 61 6e 64 20   basic term and 
8330: 74 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65 72  term-prefix quer
8340: 69 65 73 20 28 62 75 74 20 6e 6f 74 20 74 6f 20  ies (but not to 
8350: 70 68 72 61 73 65 0a 20 20 20 20 6f 72 20 4e 45  phrase.    or NE
8360: 41 52 20 71 75 65 72 69 65 73 29 2e 20 41 20 74  AR queries). A t
8370: 65 72 6d 20 6f 72 20 74 65 72 6d 2d 70 72 65 66  erm or term-pref
8380: 69 78 20 74 68 61 74 20 68 61 73 20 61 20 75 6e  ix that has a un
8390: 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72  ary "-" operator
83a0: 0a 20 20 20 20 61 74 74 61 63 68 65 64 20 74 6f  .    attached to
83b0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 61 70 70 65   it may not appe
83c0: 61 72 20 61 73 20 61 6e 20 6f 70 65 72 61 6e 64  ar as an operand
83d0: 20 74 6f 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   to an OR operat
83e0: 6f 72 2e 20 41 6e 20 46 54 53 33 0a 20 20 20 20  or. An FTS3.    
83f0: 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f  query may not co
8400: 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f  nsist entirely o
8410: 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 2d  f terms or term-
8420: 70 72 65 66 69 78 20 71 75 65 72 69 65 73 20 77  prefix queries w
8430: 69 74 68 20 75 6e 61 72 79 0a 20 20 20 20 22 2d  ith unary.    "-
8440: 22 20 6f 70 65 72 61 74 6f 72 73 20 61 74 74 61  " operators atta
8450: 63 68 65 64 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f  ched to them..</
8460: 6f 6c 3e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  ol>..[Code {.  <
8470: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
8480: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
8490: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
84a0: 6e 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69  n the term "sqli
84b0: 74 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e 0a 20  te" but do</i>. 
84c0: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e 74 61   <i>-- not conta
84d0: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74  in the term "dat
84e0: 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 53 45  abase".</i>.  SE
84f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
8500: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
8510: 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62  H 'sqlite -datab
8520: 61 73 65 27 3b 0a 7d 5d 0a 0a 3c 6f 6c 3e 0a 20  ase';.}]..<ol>. 
8530: 20 3c 6c 69 20 76 61 6c 75 65 3d 34 3e 3c 70 3e   <li value=4><p>
8540: 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 72   The relative pr
8550: 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65 20  ecedence of the 
8560: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  set operations i
8570: 73 20 64 69 66 66 65 72 65 6e 74 2e 20 0a 20 20  s different. .  
8580: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
8590: 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61  using the standa
85a0: 72 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20  rd query syntax 
85b0: 74 68 65 20 22 4f 52 22 20 6f 70 65 72 61 74 6f  the "OR" operato
85c0: 72 20 68 61 73 20 61 0a 20 20 20 68 69 67 68 65  r has a.   highe
85d0: 72 20 70 72 65 63 65 64 65 6e 63 65 20 74 68 61  r precedence tha
85e0: 6e 20 22 41 4e 44 22 2e 20 54 68 65 20 70 72 65  n "AND". The pre
85f0: 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61  cedence of opera
8600: 74 6f 72 73 20 77 68 65 6e 20 75 73 69 6e 67 20  tors when using 
8610: 74 68 65 0a 20 20 20 73 74 61 6e 64 61 72 64 20  the.   standard 
8620: 71 75 65 72 79 20 73 79 6e 74 61 78 20 69 73 3a  query syntax is:
8630: 20 0a 3c 2f 6f 6c 3e 0a 0a 5b 54 61 62 6c 65 5d   .</ol>..[Table]
8640: 0a 20 20 5b 54 72 5d 3c 74 68 3e 4f 70 65 72 61  .  [Tr]<th>Opera
8650: 74 6f 72 3c 74 68 3e 53 74 61 6e 64 61 72 64 20  tor<th>Standard 
8660: 51 75 65 72 79 20 53 79 6e 74 61 78 20 50 72 65  Query Syntax Pre
8670: 63 65 64 65 6e 63 65 0a 20 20 5b 54 72 5d 3c 74  cedence.  [Tr]<t
8680: 64 3e 55 6e 61 72 79 20 22 2d 22 20 3c 74 64 3e  d>Unary "-" <td>
8690: 20 48 69 67 68 65 73 74 20 70 72 65 63 65 64 65   Highest precede
86a0: 6e 63 65 20 28 74 69 67 68 74 65 73 74 20 67 72  nce (tightest gr
86b0: 6f 75 70 69 6e 67 29 2e 0a 20 20 5b 54 72 5d 3c  ouping)..  [Tr]<
86c0: 74 64 3e 4f 52 20 20 3c 74 64 3e 0a 20 20 5b 54  td>OR  <td>.  [T
86d0: 72 5d 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 20 4c  r]<td>AND <td> L
86e0: 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e 63 65  owest precedence
86f0: 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f 75 70 69   (loosest groupi
8700: 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c  ng)..</table>..<
8710: 6f 6c 3e 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69  ol><li style="li
8720: 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 0a  st-style:none">.
8730: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8740: 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61  example illustra
8750: 74 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f  tes precedence o
8760: 66 20 6f 70 65 72 61 74 6f 72 73 20 75 73 69 6e  f operators usin
8770: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 0a  g the standard .
8780: 20 20 71 75 65 72 79 20 73 79 6e 74 61 78 3a 0a    query syntax:.
8790: 3c 2f 6f 6c 3e 0a 0a 5b 43 6f 64 65 20 7b 0a 20  </ol>..[Code {. 
87a0: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
87b0: 72 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  r documents that
87c0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
87d0: 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  st one of the te
87e0: 72 6d 73 20 22 64 61 74 61 62 61 73 65 22 3c 2f  rms "database"</
87f0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6e 64 20 22  i>.  <i>-- and "
8800: 73 71 6c 69 74 65 22 2c 20 61 6e 64 20 61 6c 73  sqlite", and als
8810: 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  o contains the t
8820: 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 20 42  erm "library". B
8830: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 64 69  ecause of the di
8840: 66 66 65 72 65 6e 63 65 73 3c 2f 69 3e 0a 20 20  fferences</i>.  
8850: 3c 69 3e 2d 2d 20 69 6e 20 6f 70 65 72 61 74 6f  <i>-- in operato
8860: 72 20 70 72 65 63 65 64 65 6e 63 65 73 2c 20 74  r precedences, t
8870: 68 69 73 20 71 75 65 72 79 20 77 6f 75 6c 64 20  his query would 
8880: 68 61 76 65 20 61 20 64 69 66 66 65 72 65 6e 74  have a different
8890: 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
88a0: 75 73 69 6e 67 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  using</i>.  <i>-
88b0: 2d 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 71  - the enhanced q
88c0: 75 65 72 79 20 73 79 6e 74 61 78 2e 3c 2f 69 3e  uery syntax.</i>
88d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
88e0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
88f0: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f   MATCH 'sqlite O
8900: 52 20 64 61 74 61 62 61 73 65 20 6c 69 62 72 61  R database libra
8910: 72 79 27 3b 0a 7d 5d 0a 0a 5b 68 31 20 22 41 75  ry';.}]..[h1 "Au
8920: 78 69 6c 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e  xillary function
8930: 73 20 2d 20 53 6e 69 70 70 65 74 2c 20 4f 66 66  s - Snippet, Off
8940: 73 65 74 73 20 61 6e 64 20 4d 61 74 63 68 69 6e  sets and Matchin
8950: 66 6f 22 20 7b 7d 20 73 6e 69 70 70 65 74 20 6f  fo" {} snippet o
8960: 66 66 73 65 74 73 5d 0a 0a 3c 70 3e 0a 20 20 54  ffsets]..<p>.  T
8970: 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65 20 70  he FTS3 module p
8980: 72 6f 76 69 64 65 73 20 74 68 72 65 65 20 73 70  rovides three sp
8990: 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72  ecial SQL scalar
89a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
89b0: 6d 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20 20  may be useful.  
89c0: 74 6f 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  to the developer
89d0: 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71  s of full-text q
89e0: 75 65 72 79 20 73 79 73 74 65 6d 73 3a 20 22 73  uery systems: "s
89f0: 6e 69 70 70 65 74 22 2c 20 22 6f 66 66 73 65 74  nippet", "offset
8a00: 73 22 20 61 6e 64 0a 20 20 22 6d 61 74 63 68 69  s" and.  "matchi
8a10: 6e 66 6f 22 2e 20 54 68 65 20 70 75 72 70 6f 73  nfo". The purpos
8a20: 65 20 6f 66 20 74 68 65 20 22 73 6e 69 70 70 65  e of the "snippe
8a30: 74 22 20 61 6e 64 20 22 6f 66 66 73 65 74 73 22  t" and "offsets"
8a40: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 6f   functions is to
8a50: 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20 75 73 65   allow.  the use
8a60: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  r to identify th
8a70: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 71 75  e location of qu
8a80: 65 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20 74  eried terms in t
8a90: 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 75  he returned docu
8aa0: 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20 22 6d 61  ments..  The "ma
8ab0: 74 63 68 69 6e 66 6f 22 20 66 75 6e 63 74 69 6f  tchinfo" functio
8ac0: 6e 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 75  n provides the u
8ad0: 73 65 72 20 77 69 74 68 20 6d 65 74 72 69 63 73  ser with metrics
8ae0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
8af0: 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c 74 65 72  ful.  for filter
8b00: 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e 67 20 71  ing or sorting q
8b10: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 63 63  uery results acc
8b20: 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c 65 76 61  ording to releva
8b30: 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  nce...<p>.  The 
8b40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
8b50: 6f 20 61 6c 6c 20 74 68 72 65 65 20 73 70 65 63  o all three spec
8b60: 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20 66  ial SQL scalar f
8b70: 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75 73 74 20  unctions.  must 
8b80: 62 65 20 74 68 65 20 74 68 65 20 73 70 65 63 69  be the the speci
8b90: 61 6c 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  al hidden column
8ba0: 20 6f 66 20 61 6e 20 46 54 53 33 20 74 61 62 6c   of an FTS3 tabl
8bb0: 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 73  e that has the s
8bc0: 61 6d 65 0a 20 20 6e 61 6d 65 20 61 73 20 74 68  ame.  name as th
8bd0: 65 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f  e table (see abo
8be0: 76 65 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ve). For example
8bf0: 2c 20 67 69 76 65 6e 20 61 6e 20 46 54 53 33 20  , given an FTS3 
8c00: 74 61 62 6c 65 20 6e 61 6d 65 64 20 0a 20 20 22  table named .  "
8c10: 6d 61 69 6c 22 3a 0a 0a 5b 43 6f 64 65 20 7b 0a  mail":..[Code {.
8c20: 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73    SELECT offsets
8c30: 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c  (mail) FROM mail
8c40: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
8c50: 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20  H &lt;full-text 
8c60: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
8c70: 26 67 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20 73  &gt;;.  SELECT s
8c80: 6e 69 70 70 65 74 28 6d 61 69 6c 29 20 46 52 4f  nippet(mail) FRO
8c90: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
8ca0: 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c  l MATCH &lt;full
8cb0: 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72  -text query expr
8cc0: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45  ession&gt;;.  SE
8cd0: 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 6d  LECT matchinfo(m
8ce0: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
8cf0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
8d00: 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75  &lt;full-text qu
8d10: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67  ery expression&g
8d20: 74 3b 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68  t;;.}]..<p>.  Th
8d30: 65 20 74 68 72 65 65 20 61 75 78 69 6c 6c 61 72  e three auxillar
8d40: 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  y functions are 
8d50: 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 69 74 68  only useful with
8d60: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
8d70: 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 75 73 65  ement that.  use
8d80: 73 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  s the FTS3 table
8d90: 27 73 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  's full-text ind
8da0: 65 78 2e 20 49 66 20 75 73 65 64 20 77 69 74 68  ex. If used with
8db0: 69 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61 74  in a SELECT that
8dc0: 20 75 73 65 73 0a 20 20 74 68 65 20 22 71 75 65   uses.  the "que
8dd0: 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f 72 20  ry by rowid" or 
8de0: 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 20 73 74  "linear scan" st
8df0: 72 61 74 65 67 69 65 73 2c 20 74 68 65 6e 20 74  rategies, then t
8e00: 68 65 20 73 6e 69 70 70 65 74 20 61 6e 64 0a 20  he snippet and. 
8e10: 20 6f 66 66 73 65 74 73 20 62 6f 74 68 20 72 65   offsets both re
8e20: 74 75 72 6e 20 61 6e 20 61 6e 20 65 6d 70 74 79  turn an an empty
8e30: 20 73 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 65   string, and the
8e40: 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74   matchinfo funct
8e50: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 20 20 61 20  ion returns.  a 
8e60: 62 6c 6f 62 20 76 61 6c 75 65 20 7a 65 72 6f 20  blob value zero 
8e70: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 0a  bytes in size...
8e80: 3c 70 20 69 64 3d 6d 61 74 63 68 61 62 6c 65 3e  <p id=matchable>
8e90: 0a 20 20 41 6c 6c 20 74 68 72 65 65 20 61 75 78  .  All three aux
8ea0: 69 6c 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e 73  illary functions
8eb0: 20 65 78 74 72 61 63 74 20 61 20 73 65 74 20 6f   extract a set o
8ec0: 66 20 22 6d 61 74 63 68 61 62 6c 65 20 70 68 72  f "matchable phr
8ed0: 61 73 65 73 22 20 66 72 6f 6d 0a 20 20 74 68 65  ases" from.  the
8ee0: 20 46 54 53 33 20 71 75 65 72 79 20 65 78 70 72   FTS3 query expr
8ef0: 65 73 73 69 6f 6e 20 74 6f 20 77 6f 72 6b 20 77  ession to work w
8f00: 69 74 68 2e 20 54 68 65 20 73 65 74 20 6f 66 20  ith. The set of 
8f10: 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65  matchable phrase
8f20: 73 20 66 6f 72 0a 20 20 61 20 67 69 76 65 6e 20  s for.  a given 
8f30: 71 75 65 72 79 20 63 6f 6e 73 69 73 74 73 20 6f  query consists o
8f40: 66 20 61 6c 6c 20 70 68 72 61 73 65 73 20 28 69  f all phrases (i
8f50: 6e 63 6c 75 64 69 6e 67 20 75 6e 71 75 6f 74 65  ncluding unquote
8f60: 64 20 74 6f 6b 65 6e 73 20 61 6e 64 0a 20 20 74  d tokens and.  t
8f70: 6f 6b 65 6e 20 70 72 65 66 69 78 65 73 29 20 69  oken prefixes) i
8f80: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8f90: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
8fa0: 61 74 20 61 72 65 20 70 72 65 66 69 78 65 64 20  at are prefixed 
8fb0: 77 69 74 68 0a 20 20 61 20 75 6e 61 72 79 20 22  with.  a unary "
8fc0: 2d 22 20 6f 70 65 72 61 74 6f 72 20 28 73 74 61  -" operator (sta
8fd0: 6e 64 61 72 64 20 73 79 6e 74 61 78 29 20 6f 72  ndard syntax) or
8fe0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 20 73   are part of a s
8ff0: 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  ub-expression . 
9000: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 61 73   that is used as
9010: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
9020: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4e 4f 54  operand of a NOT
9030: 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a   operator...<p>.
9040: 20 20 57 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f    With the follo
9050: 77 69 6e 67 20 70 72 6f 76 69 73 6f 73 2c 20 65  wing provisos, e
9060: 61 63 68 20 73 65 72 69 65 73 20 6f 66 20 74 6f  ach series of to
9070: 6b 65 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33  kens in the FTS3
9080: 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 6d 61   table that.  ma
9090: 74 63 68 65 73 20 6f 6e 65 20 6f 66 20 74 68 65  tches one of the
90a0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
90b0: 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  es in the query 
90c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6b 6e  expression is kn
90d0: 6f 77 6e 20 61 73 20 61 0a 20 20 22 70 68 72 61  own as a.  "phra
90e0: 73 65 20 6d 61 74 63 68 22 3a 0a 0a 3c 6f 6c 3e  se match":..<ol>
90f0: 0a 20 20 3c 6c 69 3e 20 49 66 20 61 20 6d 61 74  .  <li> If a mat
9100: 63 68 61 62 6c 65 20 70 68 72 61 73 65 20 69 73  chable phrase is
9110: 20 70 61 72 74 20 6f 66 20 61 20 73 65 72 69 65   part of a serie
9120: 73 20 6f 66 20 70 68 72 61 73 65 73 20 63 6f 6e  s of phrases con
9130: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 20 20  nected by.      
9140: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 73 20   NEAR operators 
9150: 69 6e 20 74 68 65 20 46 54 53 33 20 71 75 65 72  in the FTS3 quer
9160: 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  y expression, th
9170: 65 6e 20 65 61 63 68 20 70 68 72 61 73 65 20 6d  en each phrase m
9180: 61 74 63 68 0a 20 20 20 20 20 20 20 6d 75 73 74  atch.       must
9190: 20 62 65 20 73 75 66 66 69 63 69 65 6e 74 6c 79   be sufficiently
91a0: 20 63 6c 6f 73 65 20 74 6f 20 6f 74 68 65 72 20   close to other 
91b0: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 6f  phrase matches o
91c0: 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 0a 20  f the relevant. 
91d0: 20 20 20 20 20 20 74 79 70 65 73 20 74 6f 20 73        types to s
91e0: 61 74 69 73 66 79 20 74 68 65 20 4e 45 41 52 20  atisfy the NEAR 
91f0: 63 6f 6e 64 69 74 69 6f 6e 2e 0a 0a 20 20 3c 6c  condition...  <l
9200: 69 3e 20 49 66 20 74 68 65 20 6d 61 74 63 68 61  i> If the matcha
9210: 62 6c 65 20 70 68 72 61 73 65 20 69 6e 20 74 68  ble phrase in th
9220: 65 20 46 54 53 33 20 71 75 65 72 79 20 69 73 20  e FTS3 query is 
9230: 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 6d 61  restricted to ma
9240: 74 63 68 69 6e 67 0a 20 20 20 20 20 20 20 64 61  tching.       da
9250: 74 61 20 69 6e 20 61 20 73 70 65 63 69 66 69 65  ta in a specifie
9260: 64 20 46 54 53 33 20 74 61 62 6c 65 20 63 6f 6c  d FTS3 table col
9270: 75 6d 6e 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70  umn, then only p
9280: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74 68  hrase matches th
9290: 61 74 20 0a 20 20 20 20 20 20 20 6f 63 63 75 72  at .       occur
92a0: 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c   within that col
92b0: 75 6d 6e 20 61 72 65 20 63 6f 6e 73 69 64 65 72  umn are consider
92c0: 65 64 2e 0a 3c 2f 6f 6c 3e 0a 20 0a 0a 5b 68 32  ed..</ol>. ..[h2
92d0: 20 22 54 68 65 20 4f 66 66 73 65 74 73 20 46 75   "The Offsets Fu
92e0: 6e 63 74 69 6f 6e 22 5d 0a 0a 3c 70 3e 0a 20 20  nction"]..<p>.  
92f0: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 71 75 65  For a SELECT que
9300: 72 79 20 74 68 61 74 20 75 73 65 73 20 74 68 65  ry that uses the
9310: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
9320: 2c 20 74 68 65 20 6f 66 66 73 65 74 73 28 29 20  , the offsets() 
9330: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74 75  function .  retu
9340: 72 6e 73 20 61 20 74 65 78 74 20 76 61 6c 75 65  rns a text value
9350: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 65   containing a se
9360: 72 69 65 73 20 6f 66 20 73 70 61 63 65 2d 73 65  ries of space-se
9370: 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72 73  parated integers
9380: 2e 20 46 6f 72 0a 20 20 65 61 63 68 20 74 65 72  . For.  each ter
9390: 6d 20 69 6e 20 65 61 63 68 20 3c 61 20 68 72 65  m in each <a hre
93a0: 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70 68 72  f=#matchable>phr
93b0: 61 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f 66  ase match</a> of
93c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
93d0: 2c 20 0a 20 20 74 68 65 72 65 20 61 72 65 20 66  , .  there are f
93e0: 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20  our integers in 
93f0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69 73  the returned lis
9400: 74 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20 66  t. Each set of f
9410: 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 73 20  our integers is 
9420: 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  .  interpreted a
9430: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62  s follows:..[Tab
9440: 6c 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 49 6e  le].  [Tr]<th>In
9450: 74 65 67 65 72 20 3c 74 68 3e 49 6e 74 65 72 70  teger <th>Interp
9460: 72 65 74 61 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c  retation.  [Tr]<
9470: 74 64 3e 30 20 0a 20 20 20 20 20 20 3c 74 64 3e  td>0 .      <td>
9480: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  The column numbe
9490: 72 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20  r that the term 
94a0: 69 6e 73 74 61 6e 63 65 20 6f 63 63 75 72 73 20  instance occurs 
94b0: 69 6e 20 28 30 20 66 6f 72 20 74 68 65 0a 20 20  in (0 for the.  
94c0: 20 20 20 20 20 20 20 20 6c 65 66 74 6d 6f 73 74          leftmost
94d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
94e0: 54 53 33 20 74 61 62 6c 65 2c 20 31 20 66 6f 72  TS3 table, 1 for
94f0: 20 74 68 65 20 6e 65 78 74 20 6c 65 66 74 6d 6f   the next leftmo
9500: 73 74 2c 20 65 74 63 2e 29 2e 0a 20 20 5b 54 72  st, etc.)..  [Tr
9510: 5d 3c 74 64 3e 31 0a 20 20 20 20 20 20 3c 74 64  ]<td>1.      <td
9520: 3e 54 68 65 20 74 65 72 6d 20 6e 75 6d 62 65 72  >The term number
9530: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
9540: 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
9550: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
9560: 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 65  .          expre
9570: 73 73 69 6f 6e 2e 20 54 65 72 6d 73 20 77 69 74  ssion. Terms wit
9580: 68 69 6e 20 61 20 71 75 65 72 79 20 65 78 70 72  hin a query expr
9590: 65 73 73 69 6f 6e 20 61 72 65 20 6e 75 6d 62 65  ession are numbe
95a0: 72 65 64 20 73 74 61 72 74 69 6e 67 0a 20 20 20  red starting.   
95b0: 20 20 20 20 20 20 20 66 72 6f 6d 20 30 20 69 6e         from 0 in
95c0: 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20   the order that 
95d0: 74 68 65 79 20 6f 63 63 75 72 2e 0a 20 20 5b 54  they occur..  [T
95e0: 72 5d 3c 74 64 3e 32 0a 20 20 20 20 20 20 3c 74  r]<td>2.      <t
95f0: 64 3e 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  d>The byte offse
9600: 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  t of the matchin
9610: 67 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  g term within th
9620: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 5b 54 72 5d  e column..  [Tr]
9630: 3c 74 64 3e 33 0a 20 20 20 20 20 20 3c 74 64 3e  <td>3.      <td>
9640: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
9650: 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20 69 6e  matching term in
9660: 20 62 79 74 65 73 2e 0a 3c 2f 74 61 62 6c 65 3e   bytes..</table>
9670: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
9680: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
9690: 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 20 74 68  ains examples th
96a0: 61 74 20 75 73 65 20 74 68 65 20 6f 66 66 73 65  at use the offse
96b0: 74 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a 5b 43  ts function...[C
96c0: 6f 64 65 20 7b 0a 20 20 43 52 45 41 54 45 20 56  ode {.  CREATE V
96d0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69  IRTUAL TABLE mai
96e0: 6c 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62  l USING fts3(sub
96f0: 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49  ject, body);.  I
9700: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20  NSERT INTO mail 
9710: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f  VALUES('hello wo
9720: 72 6c 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73  rld', 'This mess
9730: 61 67 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77  age is a hello w
9740: 6f 72 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b  orld message.');
9750: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  .  INSERT INTO m
9760: 61 69 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65  ail VALUES('urge
9770: 6e 74 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54  nt: serious', 'T
9780: 68 69 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e  his mail is seen
9790: 20 61 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f   as a more serio
97a0: 75 73 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69  us mail');..  <i
97b0: 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
97c0: 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  g query returns 
97d0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73  a single row (as
97e0: 20 69 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79   it matches only
97f0: 20 74 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20   the first</i>. 
9800: 20 3c 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20   <i>-- entry in 
9810: 74 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68  table "mail". Th
9820: 65 20 74 65 78 74 20 72 65 74 75 72 6e 65 64 20  e text returned 
9830: 62 79 20 74 68 65 20 6f 66 66 73 65 74 73 20 66  by the offsets f
9840: 75 6e 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20  unction is</i>. 
9850: 20 3c 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20   <i>-- "0 0 6 5 
9860: 31 20 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20  1 0 24 5".</i>. 
9870: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
9880: 2d 2d 20 54 68 65 20 66 69 72 73 74 20 73 65 74  -- The first set
9890: 20 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72   of four integer
98a0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
98b0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 63 6f  indicate that co
98c0: 6c 75 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e  lumn 0</i>.  <i>
98d0: 2d 2d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  -- contains an i
98e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20  nstance of term 
98f0: 30 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62  0 ("world") at b
9900: 79 74 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68  yte offset 6. Th
9910: 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c  e term instance<
9920: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35  /i>.  <i>-- is 5
9930: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
9940: 54 68 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f  The second set o
9950: 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20  f four integers 
9960: 73 68 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d  shows that colum
9970: 6e 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  n 1</i>.  <i>-- 
9980: 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 72  of the matched r
9990: 6f 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ow contains an i
99a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20  nstance of term 
99b0: 30 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62  0 ("world") at b
99c0: 79 74 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20  yte offset</i>. 
99d0: 20 3c 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e   <i>-- 24. Again
99e0: 2c 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61  , the term insta
99f0: 6e 63 65 20 69 73 20 35 20 62 79 74 65 73 20 69  nce is 5 bytes i
9a00: 6e 20 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45  n size.</i>.  SE
9a10: 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69  LECT offsets(mai
9a20: 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45  l) FROM mail WHE
9a30: 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77  RE mail MATCH 'w
9a40: 6f 72 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  orld';..  <i>-- 
9a50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
9a60: 65 72 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f  ery returns also
9a70: 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68   matches only th
9a80: 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74  e first row in t
9a90: 61 62 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e  able "mail".</i>
9aa0: 0a 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73  .  <i>-- In this
9ab0: 20 63 61 73 65 20 74 68 65 20 72 65 74 75 72 6e   case the return
9ac0: 65 64 20 74 65 78 74 20 69 73 20 22 31 20 30 20  ed text is "1 0 
9ad0: 35 20 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f  5 7 1 0 30 7".</
9ae0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73  i>.  SELECT offs
9af0: 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  ets(mail) FROM m
9b00: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
9b10: 41 54 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a  ATCH 'message';.
9b20: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
9b30: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74  lowing query mat
9b40: 63 68 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ches the second 
9b50: 72 6f 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61  row in table "ma
9b60: 69 6c 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20  il". It returns 
9b70: 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  the</i>.  <i>-- 
9b80: 74 65 78 74 20 22 31 20 30 20 32 38 20 37 20 31  text "1 0 28 7 1
9b90: 20 31 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74   1 36 4". Only t
9ba0: 68 6f 73 65 20 6f 63 63 75 72 65 6e 63 65 73 20  hose occurences 
9bb0: 6f 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75  of terms "seriou
9bc0: 73 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69  s" and "mail"</i
9bd0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61  >.  <i>-- that a
9be0: 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  re part of an in
9bf0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68  stance of the ph
9c00: 72 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61  rase "serious ma
9c10: 69 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69  il" are identifi
9c20: 65 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69  ed; the</i>.  <i
9c30: 3e 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 65  >-- other occure
9c40: 6e 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73  nces of "serious
9c50: 22 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65  " and "mail" are
9c60: 20 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20   ignored.</i>.  
9c70: 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d  SELECT offsets(m
9c80: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
9c90: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
9ca0: 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27  '"serious mail"'
9cb0: 3b 0a 7d 5d 0a 0a 5b 68 32 20 22 54 68 65 20 53  ;.}]..[h2 "The S
9cc0: 6e 69 70 70 65 74 20 46 75 6e 63 74 69 6f 6e 22  nippet Function"
9cd0: 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69  ]..<p>.  The sni
9ce0: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  ppet function is
9cf0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
9d00: 66 6f 72 6d 61 74 74 65 64 20 66 72 61 67 6d 65  formatted fragme
9d10: 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20  nts of document 
9d20: 74 65 78 74 0a 20 20 66 6f 72 20 64 69 73 70 6c  text.  for displ
9d30: 61 79 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ay as part of a 
9d40: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
9d50: 72 65 73 75 6c 74 73 20 72 65 70 6f 72 74 2e 20  results report. 
9d60: 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  The snippet func
9d70: 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65 20 70  tion .  may be p
9d80: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 6f 6e  assed between on
9d90: 65 20 61 6e 64 20 66 6f 75 72 20 61 72 67 75 6d  e and four argum
9da0: 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  ents, as follows
9db0: 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
9dc0: 5d 3c 74 68 3e 41 72 67 75 6d 65 6e 74 20 3c 74  ]<th>Argument <t
9dd0: 68 3e 44 65 66 61 75 6c 74 20 56 61 6c 75 65 20  h>Default Value 
9de0: 3c 74 68 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a  <th>Description.
9df0: 20 20 5b 54 72 5d 3c 74 64 3e 30 20 3c 74 64 3e    [Tr]<td>0 <td>
9e00: 4e 2f 41 0a 20 20 20 20 20 20 3c 74 64 3e 20 54  N/A.      <td> T
9e10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9e20: 74 20 74 6f 20 74 68 65 20 73 6e 69 70 70 65 74  t to the snippet
9e30: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
9e40: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 70 65  lways be the spe
9e50: 63 69 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  cial.           
9e60: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 6f 66  hidden column of
9e70: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
9e80: 74 68 61 74 20 74 61 6b 65 73 20 74 68 65 20 73  that takes the s
9e90: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
9ea0: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
9eb0: 20 69 74 73 65 6c 66 2e 0a 20 20 5b 54 72 5d 3c   itself..  [Tr]<
9ec0: 74 64 3e 31 20 3c 74 64 3e 22 26 6c 74 3b 62 26  td>1 <td>"&lt;b&
9ed0: 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20  gt;".      <td> 
9ee0: 54 68 65 20 22 73 74 61 72 74 20 6d 61 74 63 68  The "start match
9ef0: 22 20 74 65 78 74 2e 0a 20 20 5b 54 72 5d 3c 74  " text..  [Tr]<t
9f00: 64 3e 32 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67  d>2 <td>"&lt;b&g
9f10: 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20 54  t;".      <td> T
9f20: 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22 20 74  he "end match" t
9f30: 65 78 74 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 33  ext..  [Tr]<td>3
9f40: 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67 74 3b 2e   <td>"&lt;b&gt;.
9f50: 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20  ..&lt;/b&gt;".  
9f60: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6c      <td> The "el
9f70: 6c 69 70 73 65 73 22 20 74 65 78 74 2e 0a 20 20  lipses" text..  
9f80: 5b 54 72 5d 3c 74 64 3e 34 20 3c 74 64 3e 2d 31  [Tr]<td>4 <td>-1
9f90: 0a 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20  .      <td> The 
9fa0: 46 54 53 33 20 74 61 62 6c 65 20 63 6f 6c 75 6d  FTS3 table colum
9fb0: 6e 20 6e 75 6d 62 65 72 20 74 6f 20 65 78 74 72  n number to extr
9fc0: 61 63 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  act the returned
9fd0: 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 0a 20 20   fragments of.  
9fe0: 20 20 20 20 20 20 20 20 20 74 65 78 74 20 66 72           text fr
9ff0: 6f 6d 2e 20 43 6f 6c 75 6d 6e 73 20 61 72 65 20  om. Columns are 
a000: 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65  numbered from le
a010: 66 74 20 74 6f 20 72 69 67 68 74 20 73 74 61 72  ft to right star
a020: 74 69 6e 67 20 77 69 74 68 0a 20 20 20 20 20 20  ting with.      
a030: 20 20 20 20 20 7a 65 72 6f 2e 20 41 20 6e 65 67       zero. A neg
a040: 61 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64 69  ative value indi
a050: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
a060: 65 78 74 20 6d 61 79 20 62 65 20 65 78 74 72 61  ext may be extra
a070: 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  cted.           
a080: 66 72 6f 6d 20 61 6e 79 20 63 6f 6c 75 6d 6e 2e  from any column.
a090: 0a 20 20 5b 54 72 5d 3c 74 64 3e 35 20 3c 74 64  .  [Tr]<td>5 <td
a0a0: 3e 2d 31 35 0a 20 20 20 20 20 20 3c 74 64 3e 20  >-15.      <td> 
a0b0: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
a0c0: 75 65 20 6f 66 20 74 68 69 73 20 69 6e 74 65 67  ue of this integ
a0d0: 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  er argument is u
a0e0: 73 65 64 20 61 73 20 74 68 65 20 0a 20 20 20 20  sed as the .    
a0f0: 20 20 20 20 20 20 20 28 61 70 70 72 6f 78 69 6d         (approxim
a100: 61 74 65 29 20 6e 75 6d 62 65 72 20 6f 66 20 74  ate) number of t
a110: 6f 6b 65 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  okens to include
a120: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
a130: 20 74 65 78 74 20 0a 20 20 20 20 20 20 20 20 20   text .         
a140: 20 20 76 61 6c 75 65 2e 20 54 68 65 20 6d 61 78    value. The max
a150: 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 61  imum allowable a
a160: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69 73  bsolute value is
a170: 20 36 34 2e 20 54 68 65 20 76 61 6c 75 65 20 6f   64. The value o
a180: 66 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 69  f.           thi
a190: 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65  s argument is re
a1a0: 66 65 72 65 64 20 74 6f 20 61 73 20 3c 69 3e 4e  fered to as <i>N
a1b0: 3c 2f 69 3e 20 69 6e 20 74 68 65 20 64 69 73 63  </i> in the disc
a1c0: 75 73 73 69 6f 6e 20 62 65 6c 6f 77 2e 0a 3c 2f  ussion below..</
a1d0: 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 54 68  table>..<p>.  Th
a1e0: 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69  e snippet functi
a1f0: 6f 6e 20 66 69 72 73 74 20 61 74 74 65 6d 70 74  on first attempt
a200: 73 20 74 6f 20 66 69 6e 64 20 61 20 66 72 61 67  s to find a frag
a210: 6d 65 6e 74 20 6f 66 20 74 65 78 74 20 63 6f 6e  ment of text con
a220: 73 69 73 74 69 6e 67 0a 20 20 6f 66 20 3c 69 3e  sisting.  of <i>
a230: 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 20 77  |N|</i> tokens w
a240: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
a250: 74 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 74 61  t row that conta
a260: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
a270: 20 70 68 72 61 73 65 20 0a 20 20 6d 61 74 63 68   phrase .  match
a280: 20 66 6f 72 20 65 61 63 68 20 6d 61 74 63 68 61   for each matcha
a290: 62 6c 65 20 70 68 72 61 73 65 20 6d 61 74 63 68  ble phrase match
a2a0: 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
a2b0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c  the current row,
a2c0: 20 0a 20 20 77 68 65 72 65 20 3c 69 3e 7c 4e 7c   .  where <i>|N|
a2d0: 3c 2f 69 3e 20 69 73 20 74 68 65 20 61 62 73 6f  </i> is the abso
a2e0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
a2f0: 65 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74  e sixth argument
a300: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20   passed to the. 
a310: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
a320: 6e 2e 20 49 66 20 74 68 65 20 74 65 78 74 20 73  n. If the text s
a330: 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  tored in a singl
a340: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
a350: 73 20 6c 65 73 73 20 74 68 61 6e 0a 20 20 3c 69  s less than.  <i
a360: 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 2c  >|N|</i> tokens,
a370: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
a380: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
a390: 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 54 65 78   considered. Tex
a3a0: 74 20 66 72 61 67 6d 65 6e 74 73 20 0a 20 20 6d  t fragments .  m
a3b0: 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d 75 6c 74  ay not span mult
a3c0: 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 0a 0a 3c  iple columns...<
a3d0: 70 3e 0a 20 20 49 66 20 73 75 63 68 20 61 20 74  p>.  If such a t
a3e0: 65 78 74 20 66 72 61 67 6d 65 6e 74 20 63 61 6e  ext fragment can
a3f0: 20 62 65 20 66 6f 75 6e 64 2c 20 69 74 20 69 73   be found, it is
a400: 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74   returned with t
a410: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 6d  he following.  m
a420: 6f 64 69 66 69 63 61 74 69 6f 6e 73 3a 0a 0a 3c  odifications:..<
a430: 75 6c 3e 0a 20 20 3c 6c 69 3e 20 49 66 20 74 68  ul>.  <li> If th
a440: 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74 20  e text fragment 
a450: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 61  does not begin a
a460: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
a470: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 0a 20   column value,. 
a480: 20 20 20 20 20 20 74 68 65 20 22 65 6c 6c 69 70        the "ellip
a490: 73 65 73 22 20 74 65 78 74 20 69 73 20 70 72 65  ses" text is pre
a4a0: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 20 20  pended to it..  
a4b0: 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65 78 74  <li> If the text
a4c0: 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e   fragment does n
a4d0: 6f 74 20 66 69 6e 69 73 68 20 61 74 20 74 68 65  ot finish at the
a4e0: 20 65 6e 64 20 6f 66 20 61 20 63 6f 6c 75 6d 6e   end of a column
a4f0: 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 74   value,.       t
a500: 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65  he "ellipses" te
a510: 78 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  xt is appended t
a520: 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 46 6f 72  o it..  <li> For
a530: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
a540: 68 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74  he text fragment
a550: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
a560: 20 61 20 70 68 72 61 73 65 20 6d 61 74 63 68 2c   a phrase match,
a570: 0a 20 20 20 20 20 20 20 74 68 65 20 22 73 74 61  .       the "sta
a580: 72 74 20 6d 61 74 63 68 22 20 74 65 78 74 20 69  rt match" text i
a590: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
a5a0: 74 68 65 20 66 72 61 67 6d 65 6e 74 20 62 65 66  the fragment bef
a5b0: 6f 72 65 20 74 68 65 20 74 6f 6b 65 6e 2c 0a 20  ore the token,. 
a5c0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 22 65        and the "e
a5d0: 6e 64 20 6d 61 74 63 68 22 20 74 65 78 74 20 69  nd match" text i
a5e0: 73 20 69 6e 73 65 72 74 65 64 20 69 6d 6d 65 64  s inserted immed
a5f0: 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 74 2e  iately after it.
a600: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66  .</ul>..<p>.  If
a610: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
a620: 75 63 68 20 66 72 61 67 6d 65 6e 74 20 63 61 6e  uch fragment can
a630: 20 62 65 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   be found, then 
a640: 66 72 61 67 6d 65 6e 74 73 20 74 68 61 74 20 63  fragments that c
a650: 6f 6e 74 61 69 6e 0a 20 20 61 20 6c 61 72 67 65  ontain.  a large
a660: 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 65 78 74  r number of "ext
a670: 72 61 22 20 70 68 72 61 73 65 20 6d 61 74 63 68  ra" phrase match
a680: 65 73 20 61 72 65 20 66 61 76 6f 75 72 65 64 2e  es are favoured.
a690: 20 54 68 65 20 73 74 61 72 74 20 6f 66 0a 20 20   The start of.  
a6a0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 74 65 78  the selected tex
a6b0: 74 20 66 72 61 67 6d 65 6e 74 20 6d 61 79 20 62  t fragment may b
a6c0: 65 20 6d 6f 76 65 64 20 61 20 66 65 77 20 74 6f  e moved a few to
a6d0: 6b 65 6e 73 20 66 6f 72 77 61 72 64 20 6f 72 20  kens forward or 
a6e0: 62 61 63 6b 77 61 72 64 0a 20 20 74 6f 20 61 74  backward.  to at
a6f0: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 63 65 6e 74  tempt to concent
a700: 72 61 74 65 20 74 68 65 20 70 68 72 61 73 65 20  rate the phrase 
a710: 6d 61 74 63 68 65 73 20 74 6f 77 61 72 64 20 74  matches toward t
a720: 68 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68 65  he center of the
a730: 0a 20 20 66 72 61 67 6d 65 6e 74 2e 0a 0a 3c 70  .  fragment...<p
a740: 3e 0a 20 20 41 73 73 75 6d 69 6e 67 20 3c 69 3e  >.  Assuming <i>
a750: 4e 3c 2f 69 3e 20 69 73 20 61 20 70 6f 73 69 74  N</i> is a posit
a760: 69 76 65 20 76 61 6c 75 65 2c 20 69 66 20 6e 6f  ive value, if no
a770: 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 20 62   fragments can b
a780: 65 20 66 6f 75 6e 64 20 74 68 61 74 0a 20 20 63  e found that.  c
a790: 6f 6e 74 61 69 6e 20 61 6e 20 70 68 72 61 73 65  ontain an phrase
a7a0: 20 6d 61 74 63 68 20 63 6f 72 72 65 73 70 6f 6e   match correspon
a7b0: 64 69 6e 67 20 74 6f 20 65 61 63 68 20 6d 61 74  ding to each mat
a7c0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 2c 20 74  chable phrase, t
a7d0: 68 65 20 73 6e 69 70 70 65 74 0a 20 20 66 75 6e  he snippet.  fun
a7e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
a7f0: 6f 20 66 69 6e 64 20 74 77 6f 20 66 72 61 67 6d  o find two fragm
a800: 65 6e 74 73 20 6f 66 20 61 70 70 72 6f 78 69 6d  ents of approxim
a810: 61 74 65 6c 79 20 3c 69 3e 4e 3c 2f 69 3e 2f 32  ately <i>N</i>/2
a820: 20 74 6f 6b 65 6e 73 0a 20 20 74 68 61 74 20 62   tokens.  that b
a830: 65 74 77 65 65 6e 20 74 68 65 6d 20 63 6f 6e 74  etween them cont
a840: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
a850: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 66 6f   phrase match fo
a860: 72 20 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65  r each matchable
a870: 20 70 68 72 61 73 65 0a 20 20 6d 61 74 63 68 65   phrase.  matche
a880: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
a890: 20 72 6f 77 2e 20 49 66 20 74 68 69 73 20 66 61   row. If this fa
a8a0: 69 6c 73 2c 20 61 74 74 65 6d 70 74 73 20 61 72  ils, attempts ar
a8b0: 65 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 74  e made to find t
a8c0: 68 72 65 65 0a 20 20 66 72 61 67 6d 65 6e 74 73  hree.  fragments
a8d0: 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 33 20 74   of <i>N</i>/3 t
a8e0: 6f 6b 65 6e 73 20 65 61 63 68 20 61 6e 64 20 66  okens each and f
a8f0: 69 6e 61 6c 6c 79 20 66 6f 75 72 20 3c 69 3e 4e  inally four <i>N
a900: 3c 2f 69 3e 2f 34 20 74 6f 6b 65 6e 0a 20 20 66  </i>/4 token.  f
a910: 72 61 67 6d 65 6e 74 73 2e 20 49 66 20 61 20 73  ragments. If a s
a920: 65 74 20 6f 66 20 66 6f 75 72 20 66 72 61 67 6d  et of four fragm
a930: 65 6e 74 73 20 63 61 6e 6e 6f 74 20 62 65 20 66  ents cannot be f
a940: 6f 75 6e 64 20 74 68 61 74 20 65 6e 63 6f 6d 70  ound that encomp
a950: 61 73 73 65 73 20 74 68 65 0a 20 20 72 65 71 75  asses the.  requ
a960: 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74 63  ired phrase matc
a970: 68 65 73 2c 20 74 68 65 20 66 6f 75 72 20 66 72  hes, the four fr
a980: 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c  agments of <i>N<
a990: 2f 69 3e 2f 34 20 74 6f 6b 65 6e 73 20 74 68 61  /i>/4 tokens tha
a9a0: 74 20 70 72 6f 76 69 64 65 0a 20 20 74 68 65 20  t provide.  the 
a9b0: 62 65 73 74 20 63 6f 76 65 72 61 67 65 20 61 72  best coverage ar
a9c0: 65 20 73 65 6c 65 63 74 65 64 2e 0a 0a 3c 70 3e  e selected...<p>
a9d0: 0a 20 20 49 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69  .  If <i>N</i> i
a9e0: 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  s a negative val
a9f0: 75 65 2c 20 61 6e 64 20 6e 6f 20 73 69 6e 67 6c  ue, and no singl
aa00: 65 20 66 72 61 67 6d 65 6e 74 20 63 61 6e 20 62  e fragment can b
aa10: 65 20 66 6f 75 6e 64 20 0a 20 20 63 6f 6e 74 61  e found .  conta
aa20: 69 6e 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  ining the requir
aa30: 65 64 20 70 68 72 61 73 65 20 6d 61 74 63 68 65  ed phrase matche
aa40: 73 2c 20 74 68 65 20 73 6e 69 70 70 65 74 20 66  s, the snippet f
aa50: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
aa60: 0a 20 20 66 6f 72 20 74 77 6f 20 66 72 61 67 6d  .  for two fragm
aa70: 65 6e 74 73 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f  ents of <i>|N|</
aa80: 69 3e 20 74 6f 6b 65 6e 73 20 65 61 63 68 2c 20  i> tokens each, 
aa90: 74 68 65 6e 20 74 68 72 65 65 2c 20 74 68 65 6e  then three, then
aaa0: 20 66 6f 75 72 2e 20 49 6e 0a 20 20 6f 74 68 65   four. In.  othe
aab0: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
aac0: 73 70 65 63 69 66 69 65 64 20 76 61 6c 75 65 20  specified value 
aad0: 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 6e  of <i>N</i> is n
aae0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 73 69 7a  egative, the siz
aaf0: 65 73 0a 20 20 6f 66 20 74 68 65 20 66 72 61 67  es.  of the frag
ab00: 6d 65 6e 74 73 20 69 73 20 6e 6f 74 20 64 65 63  ments is not dec
ab10: 72 65 61 73 65 64 20 69 66 20 6d 6f 72 65 20 74  reased if more t
ab20: 68 61 6e 20 6f 6e 65 20 66 72 61 67 6d 65 6e 74  han one fragment
ab30: 20 69 73 20 72 65 71 75 69 72 65 64 0a 20 20 74   is required.  t
ab40: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 64 65  o provide the de
ab50: 73 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74  sired phrase mat
ab60: 63 68 20 63 6f 76 65 72 61 67 65 2e 0a 0a 3c 70  ch coverage...<p
ab70: 3e 0a 20 20 41 66 74 65 72 20 74 68 65 20 3c 69  >.  After the <i
ab80: 3e 4d 3c 2f 69 3e 20 66 72 61 67 6d 65 6e 74 73  >M</i> fragments
ab90: 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 63 61 74   have been locat
aba0: 65 64 2c 20 77 68 65 72 65 20 3c 69 3e 4d 3c 2f  ed, where <i>M</
abb0: 69 3e 20 69 73 20 62 65 74 77 65 65 6e 0a 20 20  i> is between.  
abc0: 74 77 6f 20 61 6e 64 20 66 6f 75 72 20 61 73 20  two and four as 
abd0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
abe0: 20 70 61 72 61 67 72 61 70 68 73 20 61 62 6f 76   paragraphs abov
abf0: 65 2c 20 74 68 65 79 20 61 72 65 20 6a 6f 69 6e  e, they are join
ac00: 65 64 20 74 6f 67 65 74 68 65 72 0a 20 20 69 6e  ed together.  in
ac10: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 77 69   sorted order wi
ac20: 74 68 20 74 68 65 20 22 65 6c 6c 69 70 73 65 73  th the "ellipses
ac30: 22 20 74 65 78 74 20 73 65 70 61 72 61 74 69 6e  " text separatin
ac40: 67 20 74 68 65 6d 2e 20 54 68 65 20 74 68 72 65  g them. The thre
ac50: 65 20 0a 20 20 6d 6f 64 69 66 69 63 61 74 69 6f  e .  modificatio
ac60: 6e 73 20 65 6e 75 6d 65 72 61 74 65 64 20 65 61  ns enumerated ea
ac70: 72 6c 69 65 72 20 61 72 65 20 70 65 72 66 6f 72  rlier are perfor
ac80: 6d 65 64 20 6f 6e 20 74 68 65 20 74 65 78 74 20  med on the text 
ac90: 62 65 66 6f 72 65 20 69 74 20 69 73 20 0a 20 20  before it is .  
aca0: 72 65 74 75 72 6e 65 64 2e 0a 0a 5b 43 6f 64 65  returned...[Code
acb0: 20 7b 0a 20 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e   {.  <b>Note: In
acc0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 65   this block of e
acd0: 78 61 6d 70 6c 65 73 2c 20 6e 65 77 6c 69 6e 65  xamples, newline
ace0: 73 20 61 6e 64 20 77 68 69 74 65 73 70 61 63 65  s and whitespace
acf0: 20 63 68 61 72 61 63 74 65 72 73 20 68 61 76 65   characters have
ad00: 0a 20 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  .  been inserted
ad10: 20 69 6e 74 6f 20 74 68 65 20 64 6f 63 75 6d 65   into the docume
ad20: 6e 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  nt inserted into
ad30: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2c   the FTS3 table,
ad40: 20 61 6e 64 20 74 68 65 20 65 78 70 65 63 74 65   and the expecte
ad50: 64 0a 20 20 72 65 73 75 6c 74 73 20 64 65 73 63  d.  results desc
ad60: 72 69 62 65 64 20 69 6e 20 53 51 4c 20 63 6f 6d  ribed in SQL com
ad70: 6d 65 6e 74 73 2e 20 54 68 69 73 20 69 73 20 64  ments. This is d
ad80: 6f 6e 65 20 74 6f 20 65 6e 68 61 6e 63 65 20 72  one to enhance r
ad90: 65 61 64 61 62 69 6c 69 74 79 20 6f 6e 6c 79 2c  eadability only,
ada0: 0a 20 20 74 68 65 79 20 77 6f 75 6c 64 20 6e 6f  .  they would no
adb0: 74 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20  t be present in 
adc0: 61 63 74 75 61 6c 20 53 51 4c 69 74 65 20 63 6f  actual SQLite co
add0: 6d 6d 61 6e 64 73 20 6f 72 20 6f 75 74 70 75 74  mmands or output
ade0: 2e 3c 2f 62 3e 0a 0a 20 20 3c 69 3e 2d 2d 20 43  .</b>..  <i>-- C
adf0: 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  reate and popula
ae00: 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65  te an FTS3 table
ae10: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
ae20: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 78  IRTUAL TABLE tex
ae30: 74 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a  t USING fts3();.
ae40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
ae50: 78 74 20 56 41 4c 55 45 53 28 27 0a 20 20 20 20  xt VALUES('.    
ae60: 44 75 72 69 6e 67 20 33 30 20 4e 6f 76 2d 31 20  During 30 Nov-1 
ae70: 44 65 63 2c 20 32 2d 33 6f 43 20 64 72 6f 70 73  Dec, 2-3oC drops
ae80: 2e 20 43 6f 6f 6c 20 69 6e 20 74 68 65 20 75 70  . Cool in the up
ae90: 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e  per portion, min
aea0: 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65  imum temperature
aeb0: 20 31 34 2d 31 36 6f 43 20 0a 20 20 20 20 61 6e   14-16oC .    an
aec0: 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65  d cool elsewhere
aed0: 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72  , minimum temper
aee0: 61 74 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 43  ature 17-20oC. C
aef0: 6f 6c 64 20 74 6f 20 76 65 72 79 20 63 6f 6c 64  old to very cold
af00: 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73   on mountaintops
af10: 2c 20 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 20 74  , .    minimum t
af20: 65 6d 70 65 72 61 74 75 72 65 20 36 2d 31 32 6f  emperature 6-12o
af30: 43 2e 20 4e 6f 72 74 68 65 61 73 74 65 72 6c 79  C. Northeasterly
af40: 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d 2f   winds 15-30 km/
af50: 68 72 2e 20 41 66 74 65 72 20 74 68 61 74 2c 20  hr. After that, 
af60: 74 65 6d 70 65 72 61 74 75 72 65 20 0a 20 20 20  temperature .   
af70: 20 69 6e 63 72 65 61 73 65 73 2e 20 4e 6f 72 74   increases. Nort
af80: 68 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20  heasterly winds 
af90: 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 20 20 20  15-30 km/hr.    
afa0: 20 0a 20 20 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d   .  ');..  <i>--
afb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
afc0: 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65  uery returns the
afd0: 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e   text value:</i>
afe0: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c  .  <i>--</i>.  <
aff0: 69 3e 2d 2d 20 20 20 22 26 6c 74 3b 62 26 67 74  i>--   "&lt;b&gt
b000: 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 63 6f  ;...&lt;/b&gt;co
b010: 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20 6d 69  ol elsewhere, mi
b020: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
b030: 65 20 31 37 2d 32 30 6f 43 2e 20 26 6c 74 3b 62  e 17-20oC. &lt;b
b040: 26 67 74 3b 43 6f 6c 64 26 6c 74 3b 2f 62 26 67  &gt;Cold&lt;/b&g
b050: 74 3b 20 74 6f 20 76 65 72 79 20 3c 2f 69 3e 0a  t; to very </i>.
b060: 20 20 3c 69 3e 2d 2d 20 20 20 20 26 6c 74 3b 62    <i>--    &lt;b
b070: 26 67 74 3b 63 6f 6c 64 26 6c 74 3b 2f 62 26 67  &gt;cold&lt;/b&g
b080: 74 3b 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f  t; on mountainto
b090: 70 73 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70  ps, minimum temp
b0a0: 65 72 61 74 75 72 65 20 36 26 6c 74 3b 62 26 67  erature 6&lt;b&g
b0b0: 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22  t;...&lt;/b&gt;"
b0c0: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  .</i>.  <i>--</i
b0d0: 3e 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70  >.  SELECT snipp
b0e0: 65 74 28 74 65 78 74 29 20 46 52 4f 4d 20 74 65  et(text) FROM te
b0f0: 78 74 20 57 48 45 52 45 20 74 65 78 74 20 4d 41  xt WHERE text MA
b100: 54 43 48 20 27 63 6f 6c 64 27 3b 0a 0a 20 20 3c  TCH 'cold';..  <
b110: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
b120: 6e 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73  ng query returns
b130: 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 3a   the text value:
b140: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
b150: 0a 20 20 3c 69 3e 2d 2d 20 20 20 22 2e 2e 2e 74  .  <i>--   "...t
b160: 68 65 20 75 70 70 65 72 20 70 6f 72 74 69 6f 6e  he upper portion
b170: 2c 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23  , &#91;minimum&#
b180: 39 33 3b 20 26 23 39 31 3b 74 65 6d 70 65 72 61  93; &#91;tempera
b190: 74 75 72 65 26 23 39 33 3b 20 31 34 2d 31 36 6f  ture&#93; 14-16o
b1a0: 43 20 61 6e 64 20 63 6f 6f 6c 20 65 6c 73 65 77  C and cool elsew
b1b0: 68 65 72 65 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  here,</i>.  <i>-
b1c0: 2d 20 20 20 20 26 23 39 31 3b 6d 69 6e 69 6d 75  -    &#91;minimu
b1d0: 6d 26 23 39 33 3b 20 26 23 39 31 3b 74 65 6d 70  m&#93; &#91;temp
b1e0: 65 72 61 74 75 72 65 26 23 39 33 3b 20 31 37 2d  erature&#93; 17-
b1f0: 32 30 6f 43 2e 20 43 6f 6c 64 2e 2e 2e 22 3c 2f  20oC. Cold..."</
b200: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
b210: 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28   SELECT snippet(
b220: 74 65 78 74 2c 20 27 26 23 39 31 3b 20 27 26 23  text, '&#91; '&#
b230: 39 33 3b 27 2c 20 27 2e 2e 2e 27 29 20 46 52 4f  93;', '...') FRO
b240: 4d 20 74 65 78 74 20 57 48 45 52 45 20 74 65 78  M text WHERE tex
b250: 74 20 4d 41 54 43 48 20 27 22 6d 69 6e 2a 20 74  t MATCH '"min* t
b260: 65 6d 2a 22 27 0a 7d 5d 0a 0a 5b 68 32 20 22 54  em*"'.}]..[h2 "T
b270: 68 65 20 4d 61 74 63 68 69 6e 66 6f 20 46 75 6e  he Matchinfo Fun
b280: 63 74 69 6f 6e 22 5d 0a 0a 3c 70 3e 0a 20 20 54  ction"]..<p>.  T
b290: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e  he matchinfo fun
b2a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
b2b0: 62 6c 6f 62 20 76 61 6c 75 65 2e 20 49 66 20 75  blob value. If u
b2c0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 71 75 65  sed within a que
b2d0: 72 79 20 74 68 61 74 0a 20 20 75 73 65 73 20 74  ry that.  uses t
b2e0: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
b2f0: 65 78 20 28 6e 6f 74 20 61 20 22 71 75 65 72 79  ex (not a "query
b300: 20 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c   by rowid" or "l
b310: 69 6e 65 61 72 20 73 63 61 6e 22 29 2c 20 74 68  inear scan"), th
b320: 65 6e 0a 20 20 74 68 65 20 62 6c 6f 62 20 63 6f  en.  the blob co
b330: 6e 73 69 73 74 73 20 6f 66 20 28 32 20 2b 20 3c  nsists of (2 + <
b340: 69 3e 43 3c 2f 69 3e 20 2a 20 3c 69 3e 50 3c 2f  i>C</i> * <i>P</
b350: 69 3e 20 2a 20 33 29 20 33 32 2d 62 69 74 20 75  i> * 3) 32-bit u
b360: 6e 73 69 67 6e 65 64 20 0a 20 20 69 6e 74 65 67  nsigned .  integ
b370: 65 72 73 20 69 6e 20 6d 61 63 68 69 6e 65 20 62  ers in machine b
b380: 79 74 65 2d 6f 72 64 65 72 2c 20 77 68 65 72 65  yte-order, where
b390: 20 3c 69 3e 43 3c 2f 69 3e 20 69 73 20 74 68 65   <i>C</i> is the
b3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
b3b0: 6e 73 20 0a 20 20 69 6e 20 74 68 65 20 46 54 53  ns .  in the FTS
b3c0: 33 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75  3 table being qu
b3d0: 65 72 69 65 64 2c 20 61 6e 64 20 3c 69 3e 50 3c  eried, and <i>P<
b3e0: 2f 69 3e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  /i> is the numbe
b3f0: 72 20 6f 66 20 0a 20 20 3c 61 20 68 72 65 66 3d  r of .  <a href=
b400: 23 6d 61 74 63 68 61 62 6c 65 3e 6d 61 74 63 68  #matchable>match
b410: 61 62 6c 65 20 70 68 72 61 73 65 73 3c 2f 61 3e  able phrases</a>
b420: 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 0a   in the query. .
b430: 0a 20 20 3c 70 3e 0a 20 20 20 20 50 68 72 61 73  .  <p>.    Phras
b440: 65 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 61  es and columns a
b450: 72 65 20 62 6f 74 68 20 6e 75 6d 62 65 72 65 64  re both numbered
b460: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
b470: 67 68 74 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ght starting fro
b480: 6d 20 0a 20 20 20 20 7a 65 72 6f 2e 0a 0a 5b 54  m .    zero...[T
b490: 61 62 6c 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e  able].  [Tr]<th>
b4a0: 41 72 72 61 79 20 45 6c 65 6d 65 6e 74 20 3c 74  Array Element <t
b4b0: 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  h>Interpretation
b4c0: 0a 20 20 5b 54 72 5d 3c 74 64 3e 30 20 3c 74 64  .  [Tr]<td>0 <td
b4d0: 3e 20 0a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66  > .    Number of
b4e0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
b4f0: 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  es in the query 
b500: 65 78 70 72 65 73 73 69 6f 6e 20 28 76 61 6c 75  expression (valu
b510: 65 20 3c 69 3e 50 3c 2f 69 3e 20 69 6e 20 0a 20  e <i>P</i> in . 
b520: 20 20 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 62     the formula b
b530: 65 6c 6f 77 29 2e 0a 20 20 5b 54 72 5d 3c 74 64  elow)..  [Tr]<td
b540: 3e 31 20 3c 74 64 3e 0a 20 20 20 20 4e 75 6d 62  >1 <td>.    Numb
b550: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
b560: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
b570: 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 28 76  being queried (v
b580: 61 6c 75 65 20 3c 69 3e 43 3c 2f 69 3e 20 69 6e  alue <i>C</i> in
b590: 20 0a 20 20 20 20 74 68 65 20 66 6f 72 6d 75 6c   .    the formul
b5a0: 61 20 62 65 6c 6f 77 29 2e 0a 0a 20 20 5b 54 72  a below)...  [Tr
b5b0: 5d 3c 74 64 20 73 74 79 6c 65 3d 22 77 68 69 74  ]<td style="whit
b5c0: 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61 70 22 3e  e-space:nowrap">
b5d0: 32 20 2b 20 33 20 2a 20 28 3c 69 3e 63 3c 2f 69  2 + 3 * (<i>c</i
b5e0: 3e 20 2b 20 3c 69 3e 43 3c 2f 69 3e 2a 3c 69 3e  > + <i>C</i>*<i>
b5f0: 70 3c 2f 69 3e 29 20 2b 20 30 3c 74 64 3e 0a 20  p</i>) + 0<td>. 
b600: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72     Number of phr
b610: 61 73 65 20 6d 61 74 63 68 65 73 20 66 6f 72 20  ase matches for 
b620: 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65  matchable phrase
b630: 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 20 63 6f 6c   <i>p</i> in col
b640: 75 6d 6e 20 0a 20 20 20 20 3c 69 3e 63 3c 2f 69  umn .    <i>c</i
b650: 3e 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  > of the current
b660: 20 46 54 53 33 20 74 61 62 6c 65 20 72 6f 77 2e   FTS3 table row.
b670: 0a 20 20 5b 54 72 5d 3c 74 64 20 73 74 79 6c 65  .  [Tr]<td style
b680: 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f  ="white-space:no
b690: 77 72 61 70 22 3e 32 20 2b 20 33 20 2a 20 28 3c  wrap">2 + 3 * (<
b6a0: 69 3e 63 3c 2f 69 3e 20 2b 20 3c 69 3e 43 3c 2f  i>c</i> + <i>C</
b6b0: 69 3e 2a 3c 69 3e 70 3c 2f 69 3e 29 20 2b 20 31  i>*<i>p</i>) + 1
b6c0: 3c 74 64 3e 0a 20 20 20 20 53 75 6d 20 6f 66 20  <td>.    Sum of 
b6d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 68  the number of ph
b6e0: 72 61 73 65 20 6d 61 74 63 68 65 73 20 66 6f 72  rase matches for
b6f0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
b700: 65 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 20 0a 20  e <i>p</i> in . 
b710: 20 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63 3c 2f     column <i>c</
b720: 69 3e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20  i> for all rows 
b730: 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  of the FTS3 tabl
b740: 65 2e 0a 20 20 5b 54 72 5d 3c 74 64 20 73 74 79  e..  [Tr]<td sty
b750: 6c 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a  le="white-space:
b760: 6e 6f 77 72 61 70 22 3e 32 20 2b 20 33 20 2a 20  nowrap">2 + 3 * 
b770: 28 3c 69 3e 63 3c 2f 69 3e 20 2b 20 3c 69 3e 43  (<i>c</i> + <i>C
b780: 3c 2f 69 3e 2a 3c 69 3e 70 3c 2f 69 3e 29 20 2b  </i>*<i>p</i>) +
b790: 20 32 3c 74 64 3e 0a 20 20 20 20 4e 75 6d 62 65   2<td>.    Numbe
b7a0: 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 74 68 65  r of rows of the
b7b0: 20 46 54 53 33 20 74 61 62 6c 65 20 66 6f 72 20   FTS3 table for 
b7c0: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 20 3c 69 3e  which column <i>
b7d0: 63 3c 2f 69 3e 20 63 6f 6e 74 61 69 6e 73 20 61  c</i> contains a
b7e0: 74 20 0a 20 20 20 20 6c 65 61 73 74 20 6f 6e 65  t .    least one
b7f0: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 66 6f   phrase match fo
b800: 72 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  r matchable phra
b810: 73 65 20 3c 69 3e 70 3c 2f 69 3e 2e 0a 3c 2f 74  se <i>p</i>..</t
b820: 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72  able>..<p>.  For
b830: 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65   example:..[Code
b840: 20 7b 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74   {.  <i>-- Creat
b850: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
b860: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77 69 74  n FTS3 table wit
b870: 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 3a 3c 2f  h two columns:</
b880: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
b890: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
b8a0: 4e 47 20 66 74 73 33 28 61 2c 20 62 29 3b 0a 20  NG fts3(a, b);. 
b8b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b8c0: 56 41 4c 55 45 53 28 27 74 72 61 6e 73 61 63 74  VALUES('transact
b8d0: 69 6f 6e 20 64 65 66 61 75 6c 74 20 6d 6f 64 65  ion default mode
b8e0: 6c 73 20 64 65 66 61 75 6c 74 27 2c 20 27 4e 6f  ls default', 'No
b8f0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  n transaction re
b900: 61 64 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ads');.  INSERT 
b910: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
b920: 74 68 65 20 64 65 66 61 75 6c 74 20 74 72 61 6e  the default tran
b930: 73 61 63 74 69 6f 6e 27 2c 20 27 74 68 65 73 65  saction', 'these
b940: 20 73 65 6d 61 6e 74 69 63 73 20 70 72 65 73 65   semantics prese
b950: 6e 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  nt');.  INSERT I
b960: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 73  NTO t1 VALUES('s
b970: 69 6e 67 6c 65 20 72 65 71 75 65 73 74 27 2c 20  ingle request', 
b980: 27 64 65 66 61 75 6c 74 20 64 61 74 61 27 29 3b  'default data');
b990: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
b9a0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
b9b0: 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  turns a single r
b9c0: 6f 77 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ow consisting of
b9d0: 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 62 3c 2f   a single blob</
b9e0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 76 61 6c 75 65  i>.  <i>-- value
b9f0: 20 38 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a   80 bytes in siz
ba00: 65 20 28 32 30 20 33 32 2d 62 69 74 20 69 6e 74  e (20 32-bit int
ba10: 65 67 65 72 73 29 2e 20 49 66 20 65 61 63 68 20  egers). If each 
ba20: 62 6c 6f 63 6b 20 6f 66 20 34 20 62 79 74 65 73  block of 4 bytes
ba30: 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   in</i>.  <i>-- 
ba40: 74 68 65 20 62 6c 6f 62 20 69 73 20 69 6e 74 65  the blob is inte
ba50: 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 75 6e  rpreted as an un
ba60: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 69  signed integer i
ba70: 6e 20 6d 61 63 68 69 6e 65 20 62 79 74 65 2d 6f  n machine byte-o
ba80: 72 64 65 72 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  rder,</i>.  <i>-
ba90: 2d 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 77  - the integers w
baa0: 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20 3c 69  ill be:</i>.  <i
bab0: 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  >--</i>.  <i>-- 
bac0: 20 20 20 20 33 20 32 20 20 31 20 33 20 32 20 20      3 2  1 3 2  
bad0: 30 20 31 20 31 20 20 31 20 32 20 32 20 20 30 20  0 1 1  1 2 2  0 
bae0: 31 20 31 20 20 30 20 30 20 30 20 20 31 20 31 20  1 1  0 0 0  1 1 
baf0: 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  0</i>.  <i>--</i
bb00: 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 72 6f  >.  <i>-- The ro
bb10: 77 20 72 65 74 75 72 6e 65 64 20 63 6f 72 72 65  w returned corre
bb20: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 65  sponds to the se
bb30: 63 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73 65 72  cond entry inser
bb40: 74 65 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 74  ted into table t
bb50: 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54  1.</i>.  <i>-- T
bb60: 68 65 20 66 69 72 73 74 20 74 77 6f 20 69 6e 74  he first two int
bb70: 65 67 65 72 73 20 69 6e 20 74 68 65 20 62 6c 6f  egers in the blo
bb80: 62 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  b show that the 
bb90: 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 65 64 20  query contained 
bba0: 74 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  three</i>.  <i>-
bbb0: 2d 20 70 68 72 61 73 65 73 20 61 6e 64 20 74 68  - phrases and th
bbc0: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75  e table being qu
bbd0: 65 72 69 65 64 20 68 61 73 20 74 77 6f 20 63 6f  eried has two co
bbe0: 6c 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78 74 20  lumns. The next 
bbf0: 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20 20 3c  block of</i>.  <
bc00: 69 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74 65 67  i>-- three integ
bc10: 65 72 73 20 64 65 73 63 72 69 62 65 73 20 63 6f  ers describes co
bc20: 6c 75 6d 6e 20 30 20 28 69 6e 20 74 68 69 73 20  lumn 0 (in this 
bc30: 63 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61 22 29  case column "a")
bc40: 20 61 6e 64 20 70 68 72 61 73 65 3c 2f 69 3e 0a   and phrase</i>.
bc50: 20 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20 74 68    <i>-- 0 (in th
bc60: 69 73 20 63 61 73 65 20 22 64 65 66 61 75 6c 74  is case "default
bc70: 22 29 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  "). The current 
bc80: 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31 20 68  row contains 1 h
bc90: 69 74 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22  it for "default"
bca0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20  </i>.  <i>-- in 
bcb0: 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61 20 74  column 0, of a t
bcc0: 6f 74 61 6c 20 6f 66 20 33 20 68 69 74 73 20 66  otal of 3 hits f
bcd0: 6f 72 20 22 64 65 66 61 75 6c 74 22 20 74 68 61  or "default" tha
bce0: 74 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c 75 6d  t occur in colum
bcf0: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20  n</i>.  <i>-- 0 
bd00: 6f 66 20 61 6e 79 20 74 61 62 6c 65 20 72 6f 77  of any table row
bd10: 2e 20 54 68 65 20 33 20 68 69 74 73 20 61 72 65  . The 3 hits are
bd20: 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 32   spread across 2
bd30: 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 73 2e   different rows.
bd40: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
bd50: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e 65 78  .  <i>-- The nex
bd60: 74 20 73 65 74 20 6f 66 20 74 68 72 65 65 20 69  t set of three i
bd70: 6e 74 65 67 65 72 73 20 28 30 20 31 20 31 29 20  ntegers (0 1 1) 
bd80: 70 65 72 74 61 69 6e 20 74 6f 20 74 68 65 20 68  pertain to the h
bd90: 69 74 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74  its for "default
bda0: 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e  "</i>.  <i>-- in
bdb0: 20 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74 68 65   column 1 of the
bdc0: 20 74 61 62 6c 65 20 28 30 20 69 6e 20 74 68 69   table (0 in thi
bdd0: 73 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c 6c 20  s row, 1 in all 
bde0: 72 6f 77 73 2c 20 73 70 72 65 61 64 20 61 63 72  rows, spread acr
bdf0: 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  oss </i>.  <i>--
be00: 20 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a 20 20   1 rows).</i>.  
be10: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45  <i>--</i>.  SELE
be20: 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 29  CT matchinfo(t1)
be30: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
be40: 31 20 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74  1 MATCH 'default
be50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 74 68   transaction "th
be60: 65 73 65 20 73 65 6d 61 6e 74 69 63 73 22 27 3b  ese semantics"';
be70: 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  .}]..<p>.  The m
be80: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
be90: 6e 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72  n is much faster
bea0: 20 74 68 61 6e 20 65 69 74 68 65 72 20 74 68 65   than either the
beb0: 20 73 6e 69 70 70 65 74 20 6f 72 20 6f 66 66 73   snippet or offs
bec0: 65 74 73 0a 20 20 66 75 6e 63 74 69 6f 6e 73 2e  ets.  functions.
bed0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
bee0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
bef0: 69 6f 6e 20 6f 66 20 62 6f 74 68 20 73 6e 69 70  ion of both snip
bf00: 70 65 74 20 61 6e 64 20 6f 66 66 73 65 74 73 0a  pet and offsets.
bf10: 20 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f    is required to
bf20: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 64 6f   retrieve the do
bf30: 63 75 6d 65 6e 74 73 20 62 65 69 6e 67 20 61 6e  cuments being an
bf40: 61 6c 79 7a 65 64 20 66 72 6f 6d 20 64 69 73 6b  alyzed from disk
bf50: 2c 20 77 68 65 72 65 61 73 0a 20 20 61 6c 6c 20  , whereas.  all 
bf60: 64 61 74 61 20 72 65 71 75 69 72 65 64 20 62 79  data required by
bf70: 20 6d 61 74 63 68 69 6e 66 6f 20 69 73 20 61 76   matchinfo is av
bf80: 61 69 6c 61 62 6c 65 20 61 73 20 70 61 72 74 20  ailable as part 
bf90: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 6f 72 74  of the same port
bfa0: 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65 20 66 75  ions.  of the fu
bfb0: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74 68  ll-text index th
bfc0: 61 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  at are required 
bfd0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
bfe0: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
bff0: 0a 20 20 69 74 73 65 6c 66 2e 20 54 68 69 73 20  .  itself. This 
c000: 6d 65 61 6e 73 20 74 68 61 74 20 6f 66 20 74 68  means that of th
c010: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
c020: 71 75 65 72 69 65 73 2c 20 74 68 65 20 66 69 72  queries, the fir
c030: 73 74 20 6d 61 79 20 62 65 0a 20 20 61 6e 20 6f  st may be.  an o
c040: 72 64 65 72 20 6f 66 20 6d 61 67 6e 69 74 75 64  rder of magnitud
c050: 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 74 68  e faster than th
c060: 65 20 73 65 63 6f 6e 64 3a 0a 0a 5b 43 6f 64 65  e second:..[Code
c070: 20 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69   {.  SELECT doci
c080: 64 2c 20 6d 61 74 63 68 69 6e 66 6f 28 74 62 6c  d, matchinfo(tbl
c090: 29 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  ) FROM tbl WHERE
c0a0: 20 74 62 6c 20 4d 41 54 43 48 20 26 6c 74 3b 71   tbl MATCH &lt;q
c0b0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26  uery expression&
c0c0: 67 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20 64 6f  gt;;.  SELECT do
c0d0: 63 69 64 2c 20 6f 66 66 73 65 74 73 28 74 62 6c  cid, offsets(tbl
c0e0: 29 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  ) FROM tbl WHERE
c0f0: 20 74 62 6c 20 4d 41 54 43 48 20 26 6c 74 3b 71   tbl MATCH &lt;q
c100: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26  uery expression&
c110: 67 74 3b 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54  gt;;.}]..<p>.  T
c120: 68 65 20 54 4f 44 4f 20 70 61 67 65 20 63 6f 6e  he TODO page con
c130: 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c 65  tains an example
c140: 20 6f 66 20 68 6f 77 20 74 6f 20 74 61 6b 65 20   of how to take 
c150: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
c160: 73 20 69 6e 0a 20 20 61 20 66 75 6c 6c 2d 74 65  s in.  a full-te
c170: 78 74 20 73 65 61 72 63 68 20 61 70 70 6c 69 63  xt search applic
c180: 61 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68  ation...<p>.  Th
c190: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63  e matchinfo func
c1a0: 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 6d 75  tion provides mu
c1b0: 63 68 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  ch of the inform
c1c0: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 74  ation required t
c1d0: 6f 20 63 61 6c 63 75 6c 61 74 65 0a 20 20 70 72  o calculate.  pr
c1e0: 6f 62 61 62 61 6c 69 73 74 69 63 20 22 62 61 67  obabalistic "bag
c1f0: 2d 6f 66 2d 77 6f 72 64 73 22 20 72 65 6c 65 76  -of-words" relev
c200: 61 6e 63 79 20 73 63 6f 72 65 73 20 73 75 63 68  ancy scores such
c210: 20 61 73 20 0a 20 20 3c 61 20 68 72 65 66 3d 68   as .  <a href=h
c220: 74 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64  ttp://en.wikiped
c230: 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61 70  ia.org/wiki/Okap
c240: 69 5f 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d 32  i_BM25>Okapi BM2
c250: 35 2f 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61 74  5/BM25F</a> that
c260: 20 6d 61 79 0a 20 20 62 65 20 75 73 65 64 20 74   may.  be used t
c270: 6f 20 6f 72 64 65 72 20 72 65 73 75 6c 74 73 20  o order results 
c280: 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73  in a full-text s
c290: 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
c2a0: 6e 2e 20 41 6c 73 6f 20 6f 66 74 65 6e 0a 20 20  n. Also often.  
c2b0: 75 73 65 64 20 69 6e 20 73 75 63 68 20 66 75 6e  used in such fun
c2c0: 63 74 69 6f 6e 73 20 69 73 20 74 68 65 20 6c 65  ctions is the le
c2d0: 6e 67 74 68 20 6f 72 20 72 65 6c 61 74 69 76 65  ngth or relative
c2e0: 20 6c 65 6e 67 74 68 20 6f 66 20 65 61 63 68 20   length of each 
c2f0: 64 6f 63 75 6d 65 6e 74 0a 20 20 6f 72 20 64 6f  document.  or do
c300: 63 75 6d 65 6e 74 20 66 69 65 6c 64 2e 20 55 6e  cument field. Un
c310: 66 6f 72 74 75 6e 61 74 65 6c 79 2c 20 74 68 69  fortunately, thi
c320: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
c330: 20 6e 6f 74 20 6d 61 64 65 20 61 76 61 69 6c 61   not made availa
c340: 62 6c 65 0a 20 20 62 79 20 74 68 65 20 6d 61 74  ble.  by the mat
c350: 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20  chinfo function 
c360: 61 73 20 69 74 20 77 6f 75 6c 64 20 72 65 71 75  as it would requ
c370: 69 72 65 20 6c 6f 61 64 69 6e 67 20 65 78 74 72  ire loading extr
c380: 61 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 0a  a data from the.
c390: 20 20 64 61 74 61 62 61 73 65 2c 20 70 6f 74 65    database, pote
c3a0: 6e 74 69 61 6c 6c 79 20 73 6c 6f 77 69 6e 67 20  ntially slowing 
c3b0: 6d 61 74 63 68 69 6e 66 6f 28 29 20 64 6f 77 6e  matchinfo() down
c3c0: 20 62 79 20 61 6e 20 6f 72 64 65 72 20 6f 66 20   by an order of 
c3d0: 6d 61 67 6e 69 74 75 64 65 2e 0a 20 20 4f 6e 65  magnitude..  One
c3e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 66 6f 72   solution is for
c3f0: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c400: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 65   to store the le
c410: 6e 67 74 68 73 20 6f 66 20 65 61 63 68 20 64 6f  ngths of each do
c420: 63 75 6d 65 6e 74 0a 20 20 6f 72 20 64 6f 63 75  cument.  or docu
c430: 6d 65 6e 74 20 66 69 65 6c 64 20 69 6e 20 61 20  ment field in a 
c440: 73 65 70 61 72 61 74 65 20 74 61 62 6c 65 20 66  separate table f
c450: 6f 72 20 75 73 65 20 69 6e 20 63 61 6c 63 75 6c  or use in calcul
c460: 61 74 69 6e 67 20 72 65 6c 65 76 61 6e 63 79 0a  ating relevancy.
c470: 20 20 73 63 6f 72 65 73 2e 20 54 68 65 20 54 4f    scores. The TO
c480: 44 4f 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  DO page contains
c490: 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 74   an example of t
c4a0: 68 69 73 20 74 65 63 68 6e 69 71 75 65 2e 0a 0a  his technique...
c4b0: 5b 68 31 20 22 54 6f 6b 65 6e 69 7a 65 72 73 22  [h1 "Tokenizers"
c4c0: 20 74 6f 6b 65 6e 69 7a 65 72 20 7b 74 6f 6b 65   tokenizer {toke
c4d0: 6e 69 7a 65 72 7d 5d 0a 0a 3c 70 3e 0a 20 20 41  nizer}]..<p>.  A
c4e0: 6e 20 46 54 53 33 20 74 6f 6b 65 6e 69 7a 65 72  n FTS3 tokenizer
c4f0: 20 69 73 20 61 20 73 65 74 20 6f 66 20 72 75 6c   is a set of rul
c500: 65 73 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e  es for extractin
c510: 67 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 20 64  g terms from a d
c520: 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62 61  ocument .  or ba
c530: 73 69 63 20 46 54 53 33 20 66 75 6c 6c 2d 74 65  sic FTS3 full-te
c540: 78 74 20 71 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a  xt query. ..<p>.
c550: 20 20 55 6e 6c 65 73 73 20 61 20 73 70 65 63 69    Unless a speci
c560: 66 69 63 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  fic tokenizer is
c570: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
c580: 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  rt of the CREATE
c590: 20 0a 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c   .  VIRTUAL TABL
c5a0: 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  E statement used
c5b0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 46   to create the F
c5c0: 54 53 33 20 74 61 62 6c 65 2c 20 74 68 65 20 64  TS3 table, the d
c5d0: 65 66 61 75 6c 74 20 0a 20 20 74 6f 6b 65 6e 69  efault .  tokeni
c5e0: 7a 65 72 2c 20 22 73 69 6d 70 6c 65 22 2c 20 69  zer, "simple", i
c5f0: 73 20 75 73 65 64 2e 20 54 68 65 20 73 69 6d 70  s used. The simp
c600: 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 74  le tokenizer ext
c610: 72 61 63 74 73 20 74 6f 6b 65 6e 73 20 66 72 6f  racts tokens fro
c620: 6d 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 6f  m.  a document o
c630: 72 20 62 61 73 69 63 20 46 54 53 33 20 66 75 6c  r basic FTS3 ful
c640: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 61 63 63  l-text query acc
c650: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
c660: 6c 6c 6f 77 69 6e 67 20 0a 20 20 72 75 6c 65 73  llowing .  rules
c670: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70  :..<ul>.  <li><p
c680: 3e 20 41 20 74 65 72 6d 20 69 73 20 61 20 63 6f  > A term is a co
c690: 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63  ntiguous sequenc
c6a0: 65 20 6f 66 20 65 6c 69 67 69 62 6c 65 20 63 68  e of eligible ch
c6b0: 61 72 61 63 74 65 72 73 2c 20 77 68 65 72 65 20  aracters, where 
c6c0: 0a 20 20 20 20 65 6c 69 67 69 62 6c 65 20 63 68  .    eligible ch
c6d0: 61 72 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c  aracters are all
c6e0: 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68   alphanumeric ch
c6f0: 61 72 61 63 74 65 72 73 2c 20 74 68 65 20 22 5f  aracters, the "_
c700: 22 20 63 68 61 72 61 63 74 65 72 2c 0a 20 20 20  " character,.   
c710: 20 61 6e 64 20 61 6c 6c 20 63 68 61 72 61 63 74   and all charact
c720: 65 72 73 20 77 69 74 68 20 55 54 46 20 63 6f 64  ers with UTF cod
c730: 65 70 6f 69 6e 74 73 20 67 72 65 61 74 65 72 20  epoints greater 
c740: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
c750: 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c 20 6f 74   128..    All ot
c760: 68 65 72 20 63 68 61 72 61 63 74 65 72 73 20 61  her characters a
c770: 72 65 20 64 69 73 63 61 72 64 65 64 20 77 68 65  re discarded whe
c780: 6e 20 73 70 6c 69 74 74 69 6e 67 20 61 20 64 6f  n splitting a do
c790: 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d  cument into term
c7a0: 73 2e 0a 20 20 20 20 54 68 65 79 20 73 65 72 76  s..    They serv
c7b0: 65 20 6f 6e 6c 79 20 74 6f 20 73 65 70 61 72 61  e only to separa
c7c0: 74 65 20 61 64 6a 61 63 65 6e 74 20 74 65 72 6d  te adjacent term
c7d0: 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 6c  s...  <li><p> Al
c7e0: 6c 20 75 70 70 65 72 63 61 73 65 20 63 68 61 72  l uppercase char
c7f0: 61 63 74 65 72 73 20 77 69 74 68 69 6e 20 74 68  acters within th
c800: 65 20 41 53 43 49 49 20 72 61 6e 67 65 20 28 55  e ASCII range (U
c810: 54 46 20 63 6f 64 65 70 6f 69 6e 74 73 20 6c 65  TF codepoints le
c820: 73 73 20 0a 20 20 20 20 74 68 61 6e 20 31 32 38  ss .    than 128
c830: 29 2c 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d  ), are transform
c840: 65 64 20 74 6f 20 74 68 65 69 72 20 6c 6f 77 65  ed to their lowe
c850: 72 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rcase equivalent
c860: 73 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  s as part of the
c870: 0a 20 20 20 20 74 6f 6b 65 6e 69 7a 61 74 69 6f  .    tokenizatio
c880: 6e 20 70 72 6f 63 65 73 73 2e 20 54 68 75 73 2c  n process. Thus,
c890: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69   full-text queri
c8a0: 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65  es are case-inse
c8b0: 6e 73 69 74 69 76 65 20 77 68 65 6e 0a 20 20 20  nsitive when.   
c8c0: 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70 6c   using the simpl
c8d0: 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 3c 2f 75  e tokenizer..</u
c8e0: 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78  l>..<p>.  For ex
c8f0: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 64 6f  ample, when a do
c900: 63 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  cument containin
c910: 67 20 74 68 65 20 74 65 78 74 20 22 52 69 67 68  g the text "Righ
c920: 74 20 6e 6f 77 2c 20 74 68 65 79 27 72 65 20 76  t now, they're v
c930: 65 72 79 0a 20 20 66 72 75 73 74 72 61 74 65 64  ery.  frustrated
c940: 2e 22 2c 20 74 68 65 20 74 65 72 6d 73 20 65 78  .", the terms ex
c950: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
c960: 20 64 6f 63 75 6d 65 6e 74 20 61 6e 64 20 61 64   document and ad
c970: 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20 66 75  ded to the .  fu
c980: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 72  ll-text index ar
c990: 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 22 72 69  e, in order, "ri
c9a0: 67 68 74 20 6e 6f 77 20 74 68 65 79 20 72 65 20  ght now they re 
c9b0: 76 65 72 79 20 66 72 75 73 74 72 61 74 65 64 22  very frustrated"
c9c0: 2e 20 53 75 63 68 0a 20 20 61 20 64 6f 63 75 6d  . Such.  a docum
c9d0: 65 6e 74 20 77 6f 75 6c 64 20 6d 61 74 63 68 20  ent would match 
c9e0: 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  a full-text quer
c9f0: 79 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48  y such as "MATCH
ca00: 20 27 46 72 75 73 74 72 61 74 65 64 27 22 2c 20   'Frustrated'", 
ca10: 0a 20 20 61 73 20 74 68 65 20 73 69 6d 70 6c 65  .  as the simple
ca20: 20 74 6f 6b 65 6e 69 7a 65 72 20 74 72 61 6e 73   tokenizer trans
ca30: 66 6f 72 6d 73 20 74 68 65 20 74 65 72 6d 20 69  forms the term i
ca40: 6e 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 6c  n the query to l
ca50: 6f 77 65 72 63 61 73 65 0a 20 20 62 65 66 6f 72  owercase.  befor
ca60: 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20  e searching the 
ca70: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
ca80: 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20  ..<p>.  As well 
ca90: 61 73 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20  as the "simple" 
caa0: 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 46  tokenizer, the F
cab0: 54 53 33 20 73 6f 75 72 63 65 20 63 6f 64 65 20  TS3 source code 
cac0: 66 65 61 74 75 72 65 73 20 61 20 74 6f 6b 65 6e  features a token
cad0: 69 7a 65 72 20 0a 20 20 74 68 61 74 20 75 73 65  izer .  that use
cae0: 73 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22 68  s the <a href="h
caf0: 74 74 70 3a 2f 2f 74 61 72 74 61 72 75 73 2e 6f  ttp://tartarus.o
cb00: 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f 72 74 65  rg/~martin/Porte
cb10: 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f 72 74 65  rStemmer/">Porte
cb20: 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67 20 61 6c  r .  Stemming al
cb30: 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20 54 68 69  gorithm</a>. Thi
cb40: 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65 73  s tokenizer uses
cb50: 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65 73 20   the same rules 
cb60: 74 6f 20 73 65 70 61 72 61 74 65 0a 20 20 74 68  to separate.  th
cb70: 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74  e input document
cb80: 20 69 6e 74 6f 20 74 65 72 6d 73 2c 20 62 75 74   into terms, but
cb90: 20 61 73 20 77 65 6c 6c 20 61 73 20 66 6f 6c 64   as well as fold
cba0: 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 20 74 6f  ing all terms to
cbb0: 20 6c 6f 77 65 72 0a 20 20 63 61 73 65 20 69 74   lower.  case it
cbc0: 20 75 73 65 73 20 74 68 65 20 50 6f 72 74 65 72   uses the Porter
cbd0: 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72 69   Stemming algori
cbe0: 74 68 6d 20 74 6f 20 72 65 64 75 63 65 20 72 65  thm to reduce re
cbf0: 6c 61 74 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  lated English la
cc00: 6e 67 75 61 67 65 0a 20 20 77 6f 72 64 73 20 74  nguage.  words t
cc10: 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f 6f 74 2e  o a common root.
cc20: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73   For example, us
cc30: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e 70  ing the same inp
cc40: 75 74 20 64 6f 63 75 6d 65 6e 74 20 61 73 20 69  ut document as i
cc50: 6e 20 74 68 65 0a 20 20 70 61 72 61 67 72 61 70  n the.  paragrap
cc60: 68 20 61 62 6f 76 65 2c 20 74 68 65 20 70 6f 72  h above, the por
cc70: 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78  ter tokenizer ex
cc80: 74 72 61 63 74 73 20 74 68 65 20 66 6f 6c 6c 6f  tracts the follo
cc90: 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a 20 20 22  wing tokens:.  "
cca0: 72 69 67 68 74 20 6e 6f 77 20 74 68 65 69 20 76  right now thei v
ccb0: 65 72 69 20 66 72 75 73 74 72 61 74 22 2e 20 45  eri frustrat". E
ccc0: 76 65 6e 20 74 68 6f 75 67 68 20 73 6f 6d 65 20  ven though some 
ccd0: 6f 66 20 74 68 65 73 65 20 74 65 72 6d 73 20 61  of these terms a
cce0: 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20 20 45 6e  re not even.  En
ccf0: 67 6c 69 73 68 20 77 6f 72 64 73 2c 20 69 6e 20  glish words, in 
cd00: 73 6f 6d 65 20 63 61 73 65 73 20 75 73 69 6e 67  some cases using
cd10: 20 74 68 65 6d 20 74 6f 20 62 75 69 6c 64 20 74   them to build t
cd20: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
cd30: 65 78 20 69 73 20 6d 6f 72 65 0a 20 20 75 73 65  ex is more.  use
cd40: 66 75 6c 20 74 68 61 6e 20 74 68 65 20 6d 6f 72  ful than the mor
cd50: 65 20 69 6e 74 65 6c 6c 69 67 69 62 6c 65 20 6f  e intelligible o
cd60: 75 74 70 75 74 20 70 72 6f 64 75 63 65 64 20 62  utput produced b
cd70: 79 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b  y the simple tok
cd80: 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69 6e 67 20  enizer..  Using 
cd90: 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
cda0: 69 7a 65 72 2c 20 74 68 65 20 64 6f 63 75 6d 65  izer, the docume
cdb0: 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d 61 74 63  nt not only matc
cdc0: 68 65 73 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  hes full-text qu
cdd0: 65 72 69 65 73 0a 20 20 73 75 63 68 20 61 73 20  eries.  such as 
cde0: 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74  "MATCH 'Frustrat
cdf0: 65 64 27 22 2c 20 62 75 74 20 61 6c 73 6f 20 71  ed'", but also q
ce00: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 22  ueries such as "
ce10: 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69  MATCH 'Frustrati
ce20: 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68 65 20 74  on'",.  as the t
ce30: 65 72 6d 20 22 46 72 75 73 74 72 61 74 69 6f 6e  erm "Frustration
ce40: 22 20 69 73 20 72 65 64 75 63 65 64 20 62 79 20  " is reduced by 
ce50: 74 68 65 20 50 6f 72 74 65 72 20 73 74 65 6d 6d  the Porter stemm
ce60: 65 72 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  er algorithm to 
ce70: 0a 20 20 22 66 72 75 73 74 72 61 74 22 20 2d 20  .  "frustrat" - 
ce80: 6a 75 73 74 20 61 73 20 22 46 72 75 73 74 72 61  just as "Frustra
ce90: 74 65 64 22 20 69 73 2e 20 53 6f 2c 20 77 68 65  ted" is. So, whe
cea0: 6e 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74  n using the port
ceb0: 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20  er tokenizer,.  
cec0: 46 54 53 33 20 69 73 20 61 62 6c 65 20 74 6f 20  FTS3 is able to 
ced0: 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20 65 78  find not just ex
cee0: 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f 72 20  act matches for 
cef0: 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c 20 62  queried terms, b
cf00: 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61 67 61  ut matches.  aga
cf10: 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45 6e 67  inst similar Eng
cf20: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 74 65  lish language te
cf30: 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20 69 6e  rms. For more in
cf40: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
cf50: 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65 6d 6d   .  Porter Stemm
cf60: 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20 70 6c  er algorithm, pl
cf70: 65 61 73 65 20 72 65 66 65 72 20 74 6f 20 74 68  ease refer to th
cf80: 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20 61 62  e page linked ab
cf90: 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78 61 6d  ove...<p>.  Exam
cfa0: 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69 6e 67  ple illustrating
cfb0: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
cfc0: 62 65 74 77 65 65 6e 20 74 68 65 20 22 73 69 6d  between the "sim
cfd0: 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74 65 72  ple" and "porter
cfe0: 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 3a 0a  ".  tokenizers:.
cff0: 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d  .[Code {.  <i>--
d000: 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   Create a table 
d010: 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70 6c 65  using the simple
d020: 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65   tokenizer. Inse
d030: 72 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e  rt a document in
d040: 74 6f 20 69 74 2e 3c 2f 69 3e 0a 20 20 43 52 45  to it.</i>.  CRE
d050: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
d060: 45 20 73 69 6d 70 6c 65 20 55 53 49 4e 47 20 66  E simple USING f
d070: 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d  ts3(tokenize=sim
d080: 70 6c 65 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ple);.  INSERT I
d090: 4e 54 4f 20 73 69 6d 70 6c 65 20 56 41 4c 55 45  NTO simple VALUE
d0a0: 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65  S('Right now the
d0b0: 79 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74  y''re very frust
d0c0: 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d  rated');..  <i>-
d0d0: 2d 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  - The first of t
d0e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
d0f0: 20 71 75 65 72 69 65 73 20 6d 61 74 63 68 65 73   queries matches
d100: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 74   the document st
d110: 6f 72 65 64 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69  ored in</i>.  <i
d120: 3e 2d 2d 20 74 61 62 6c 65 20 22 73 69 6d 70 6c  >-- table "simpl
d130: 65 22 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 64  e". The second d
d140: 6f 65 73 20 6e 6f 74 2e 3c 2f 69 3e 0a 20 20 53  oes not.</i>.  S
d150: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d  ELECT * FROM sim
d160: 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65  ple WHERE simple
d170: 20 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74   MATCH 'Frustrat
d180: 65 64 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ed');.  SELECT *
d190: 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45   FROM simple WHE
d1a0: 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20  RE simple MATCH 
d1b0: 27 46 72 75 73 74 72 61 74 69 6f 6e 27 29 3b 0a  'Frustration');.
d1c0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
d1d0: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
d1e0: 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a  e porter tokeniz
d1f0: 65 72 2e 20 49 6e 73 65 72 74 20 74 68 65 20 73  er. Insert the s
d200: 61 6d 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74  ame document int
d210: 6f 20 69 74 3c 2f 69 3e 0a 20 20 43 52 45 41 54  o it</i>.  CREAT
d220: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
d230: 70 6f 72 74 65 72 20 55 53 49 4e 47 20 66 74 73  porter USING fts
d240: 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65  3(tokenize=porte
d250: 72 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  r);.  INSERT INT
d260: 4f 20 70 6f 72 74 65 72 20 56 41 4c 55 45 53 28  O porter VALUES(
d270: 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65 79 27  'Right now they'
d280: 27 72 65 20 76 65 72 79 20 66 72 75 73 74 72 61  're very frustra
d290: 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ted');..  <i>-- 
d2a0: 42 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c  Both of the foll
d2b0: 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20 6d 61  owing queries ma
d2c0: 74 63 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  tch the document
d2d0: 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65   stored in table
d2e0: 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e 0a 20   "porter".</i>. 
d2f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
d300: 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f 72 74  orter WHERE port
d310: 65 72 20 4d 41 54 43 48 20 27 46 72 75 73 74 72  er MATCH 'Frustr
d320: 61 74 65 64 27 29 3b 0a 20 20 53 45 4c 45 43 54  ated');.  SELECT
d330: 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20 57   * FROM porter W
d340: 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54 43  HERE porter MATC
d350: 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27 29  H 'Frustration')
d360: 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 66 20 74  ;.}]..<p>.  If t
d370: 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  his extension is
d380: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
d390: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
d3a0: 5f 49 43 55 20 70 72 65 2d 70 72 6f 63 65 73 73  _ICU pre-process
d3b0: 6f 72 0a 20 20 73 79 6d 62 6f 6c 20 64 65 66 69  or.  symbol defi
d3c0: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ned, then there 
d3d0: 65 78 69 73 74 73 20 61 20 62 75 69 6c 74 2d 69  exists a built-i
d3e0: 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65  n tokenizer name
d3f0: 64 20 22 69 63 75 22 0a 20 20 69 6d 70 6c 65 6d  d "icu".  implem
d400: 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  ented using the 
d410: 49 43 55 20 6c 69 62 72 61 72 79 2e 20 54 68 65  ICU library. The
d420: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
d430: 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20 20  passed to the.  
d440: 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f 64  xCreate() method
d450: 20 28 73 65 65 20 66 74 73 33 5f 74 6f 6b 65 6e   (see fts3_token
d460: 69 7a 65 72 2e 68 29 20 6f 66 20 74 68 69 73 20  izer.h) of this 
d470: 74 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20 62 65  tokenizer may be
d480: 0a 20 20 61 6e 20 49 43 55 20 6c 6f 63 61 6c 65  .  an ICU locale
d490: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 46 6f 72   identifier. For
d4a0: 20 65 78 61 6d 70 6c 65 20 22 74 72 5f 54 52 22   example "tr_TR"
d4b0: 20 66 6f 72 20 54 75 72 6b 69 73 68 20 61 73 20   for Turkish as 
d4c0: 75 73 65 64 0a 20 20 69 6e 20 54 75 72 6b 65 79  used.  in Turkey
d4d0: 2c 20 6f 72 20 22 65 6e 5f 41 55 22 20 66 6f 72  , or "en_AU" for
d4e0: 20 45 6e 67 6c 69 73 68 20 61 73 20 75 73 65 64   English as used
d4f0: 20 69 6e 20 41 75 73 74 72 61 6c 69 61 2e 20 46   in Australia. F
d500: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f  or example:..[Co
d510: 64 65 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  de {.    CREATE 
d520: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68  VIRTUAL TABLE th
d530: 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20 66 74  ai_text USING ft
d540: 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69 7a  s3(text, tokeniz
d550: 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 7d 5d 0a  e=icu th_TH).}].
d560: 0a 3c 70 3e 0a 20 20 54 68 65 20 49 43 55 20 74  .<p>.  The ICU t
d570: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
d580: 6e 74 61 74 69 6f 6e 20 69 73 20 76 65 72 79 20  ntation is very 
d590: 73 69 6d 70 6c 65 2e 20 49 74 20 73 70 6c 69 74  simple. It split
d5a0: 73 20 74 68 65 20 69 6e 70 75 74 0a 20 20 74 65  s the input.  te
d5b0: 78 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  xt according to 
d5c0: 74 68 65 20 49 43 55 20 72 75 6c 65 73 20 66 6f  the ICU rules fo
d5d0: 72 20 66 69 6e 64 69 6e 67 20 77 6f 72 64 20 62  r finding word b
d5e0: 6f 75 6e 64 61 72 69 65 73 20 61 6e 64 20 64 69  oundaries and di
d5f0: 73 63 61 72 64 73 0a 20 20 61 6e 79 20 74 6f 6b  scards.  any tok
d600: 65 6e 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ens that consist
d610: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77 68 69   entirely of whi
d620: 74 65 2d 73 70 61 63 65 2e 20 54 68 69 73 20 6d  te-space. This m
d630: 61 79 20 62 65 20 73 75 69 74 61 62 6c 65 0a 20  ay be suitable. 
d640: 20 66 6f 72 20 73 6f 6d 65 20 61 70 70 6c 69 63   for some applic
d650: 61 74 69 6f 6e 73 20 69 6e 20 73 6f 6d 65 20 6c  ations in some l
d660: 6f 63 61 6c 65 73 2c 20 62 75 74 20 6e 6f 74 20  ocales, but not 
d670: 61 6c 6c 2e 20 49 66 20 6d 6f 72 65 20 63 6f 6d  all. If more com
d680: 70 6c 65 78 0a 20 20 70 72 6f 63 65 73 73 69 6e  plex.  processin
d690: 67 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 66  g is required, f
d6a0: 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6d  or example to im
d6b0: 70 6c 65 6d 65 6e 74 20 73 74 65 6d 6d 69 6e 67  plement stemming
d6c0: 20 6f 72 0a 20 20 64 69 73 63 61 72 64 20 70 75   or.  discard pu
d6d0: 6e 63 74 75 61 74 69 6f 6e 2c 20 74 68 69 73 20  nctuation, this 
d6e0: 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 79 20 63  can be done by c
d6f0: 72 65 61 74 69 6e 67 20 61 20 74 6f 6b 65 6e 69  reating a tokeni
d700: 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61  zer.  implementa
d710: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 74  tion that uses t
d720: 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65 72  he ICU tokenizer
d730: 20 61 73 20 70 61 72 74 20 6f 66 20 69 74 73 20   as part of its 
d740: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
d750: 0a 5b 68 32 20 22 43 75 73 74 6f 6d 20 28 55 73  .[h2 "Custom (Us
d760: 65 72 20 49 6d 70 6c 65 6d 65 6e 74 65 64 29 20  er Implemented) 
d770: 54 6f 6b 65 6e 69 7a 65 72 73 22 5d 0a 0a 3c 70  Tokenizers"]..<p
d780: 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 74  >.  As well as t
d790: 68 65 20 62 75 69 6c 74 2d 69 6e 20 22 73 69 6d  he built-in "sim
d7a0: 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20 61  ple", "porter" a
d7b0: 6e 64 20 28 70 6f 73 73 69 62 6c 79 29 20 22 69  nd (possibly) "i
d7c0: 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a  cu" tokenizers,.
d7d0: 20 20 46 54 53 33 20 65 78 70 6f 72 74 73 20 61    FTS3 exports a
d7e0: 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74  n interface that
d7f0: 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f   allows users to
d800: 20 69 6d 70 6c 65 6d 65 6e 74 20 63 75 73 74 6f   implement custo
d810: 6d 20 74 6f 6b 65 6e 69 7a 65 72 73 0a 20 20 75  m tokenizers.  u
d820: 73 69 6e 67 20 43 2e 20 54 68 65 20 69 6e 74 65  sing C. The inte
d830: 72 66 61 63 65 20 75 73 65 64 20 74 6f 20 63 72  rface used to cr
d840: 65 61 74 65 20 61 20 6e 65 77 20 74 6f 6b 65 6e  eate a new token
d850: 69 7a 65 72 20 69 73 20 64 65 66 69 6e 65 64 20  izer is defined 
d860: 61 6e 64 20 0a 20 20 64 65 73 63 72 69 62 65 64  and .  described
d870: 20 69 6e 20 74 68 65 20 66 74 73 33 5f 74 6f 6b   in the fts3_tok
d880: 65 6e 69 7a 65 72 2e 68 20 73 6f 75 72 63 65 20  enizer.h source 
d890: 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 52 65 67  file...<p>.  Reg
d8a0: 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77 20 46  istering a new F
d8b0: 54 53 33 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  TS3 tokenizer is
d8c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 72 65 67 69   similar to regi
d8d0: 73 74 65 72 69 6e 67 20 61 20 6e 65 77 0a 20 20  stering a new.  
d8e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
d8f0: 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  dule with SQLite
d900: 2e 20 54 68 65 20 75 73 65 72 20 70 61 73 73 65  . The user passe
d910: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
d920: 0a 20 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  .  structure con
d930: 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65 72 73  taining pointers
d940: 20 74 6f 20 76 61 72 69 6f 75 73 20 63 61 6c 6c   to various call
d950: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20 74  back functions t
d960: 68 61 74 0a 20 20 6d 61 6b 65 20 75 70 20 74 68  hat.  make up th
d970: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
d980: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 6f 6b 65   of the new toke
d990: 6e 69 7a 65 72 20 74 79 70 65 2e 20 46 6f 72 20  nizer type. For 
d9a0: 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 74 68  tokenizers,.  th
d9b0: 65 20 73 74 72 75 63 74 75 72 65 20 28 64 65 66  e structure (def
d9c0: 69 6e 65 64 20 69 6e 20 66 74 73 33 5f 74 6f 6b  ined in fts3_tok
d9d0: 65 6e 69 7a 65 72 2e 68 29 20 69 73 20 63 61 6c  enizer.h) is cal
d9e0: 6c 65 64 0a 20 20 22 73 71 6c 69 74 65 33 5f 74  led.  "sqlite3_t
d9f0: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 22  okenizer_module"
da00: 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20 64 6f  ...<p>.  FTS3 do
da10: 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20 61 20  es not expose a 
da20: 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  C-function that 
da30: 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20 72 65  users call to re
da40: 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74 6f 6b  gister new.  tok
da50: 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77 69 74  enizer types wit
da60: 68 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  h a database han
da70: 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  dle. Instead, th
da80: 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74 0a 20  e pointer must. 
da90: 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61   be encoded as a
daa0: 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c 75 65  n SQL blob value
dab0: 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f 20 46   and passed to F
dac0: 54 53 33 20 74 68 72 6f 75 67 68 20 74 68 65 20  TS3 through the 
dad0: 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62 79 20  SQL.  engine by 
dae0: 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73 70 65  evaluating a spe
daf0: 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75 6e 63  cial scalar func
db00: 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f 6b 65  tion, "fts3_toke
db10: 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68 65 20  nizer()"..  The 
db20: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
db30: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
db40: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f 6e 65   called with one
db50: 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e 74   or two argument
db60: 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s,.  as follows:
db70: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 20 20 53 45  ..[Code {.    SE
db80: 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69  LECT fts3_tokeni
db90: 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  zer(&lt;tokenize
dba0: 72 2d 6e 61 6d 65 26 67 74 3b 29 3b 0a 20 20 20  r-name&gt;);.   
dbb0: 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b   SELECT fts3_tok
dbc0: 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e  enizer(&lt;token
dbd0: 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 2c 20 26  izer-name&gt;, &
dbe0: 6c 74 3b 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  lt;sqlite3_token
dbf0: 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72 26  izer_module ptr&
dc00: 67 74 3b 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  gt;);.}]..<p>.  
dc10: 57 68 65 72 65 20 3c 74 6f 6b 65 6e 69 7a 65 72  Where <tokenizer
dc20: 2d 6e 61 6d 65 3e 20 69 73 20 61 20 73 74 72 69  -name> is a stri
dc30: 6e 67 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  ng identifying t
dc40: 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61 6e 64  he tokenizer and
dc50: 0a 20 20 3c 73 71 6c 69 74 65 33 5f 74 6f 6b 65  .  <sqlite3_toke
dc60: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72  nizer_module ptr
dc70: 3e 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  > is a pointer t
dc80: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 74 6f 6b  o an sqlite3_tok
dc90: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 0a 20 20  enizer_module.  
dca0: 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65  structure encode
dcb0: 64 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62  d as an SQL blob
dcc0: 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
dcd0: 61 72 67 75 6d 65 6e 74 20 69 73 20 70 72 65 73  argument is pres
dce0: 65 6e 74 2c 0a 20 20 69 74 20 69 73 20 72 65 67  ent,.  it is reg
dcf0: 69 73 74 65 72 65 64 20 61 73 20 74 6f 6b 65 6e  istered as token
dd00: 69 7a 65 72 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d  izer <tokenizer-
dd10: 6e 61 6d 65 3e 20 61 6e 64 20 61 20 63 6f 70 79  name> and a copy
dd20: 20 6f 66 20 69 74 0a 20 20 72 65 74 75 72 6e 65   of it.  returne
dd30: 64 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65 20 61  d. If only one a
dd40: 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73 73 65  rgument is passe
dd50: 64 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  d, a pointer to 
dd60: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20  the tokenizer.  
dd70: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63  implementation c
dd80: 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65  urrently registe
dd90: 72 65 64 20 61 73 20 3c 74 6f 6b 65 6e 69 7a 65  red as <tokenize
dda0: 72 2d 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72  r-name> is retur
ddb0: 6e 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64 20 61  ned,.  encoded a
ddc0: 73 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20 69 66  s a blob. Or, if
ddd0: 20 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a   no such tokeniz
dde0: 65 72 20 65 78 69 73 74 73 2c 20 61 6e 20 53 51  er exists, an SQ
ddf0: 4c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 28 65  L exception.  (e
de00: 72 72 6f 72 29 20 69 73 20 72 61 69 73 65 64 2e  rror) is raised.
de10: 0a 0a 3c 70 3e 0a 20 20 3c 62 3e 53 45 43 55 52  ..<p>.  <b>SECUR
de20: 49 54 59 20 57 41 52 4e 49 4e 47 3c 2f 62 3e 3a  ITY WARNING</b>:
de30: 20 49 66 20 74 68 65 20 66 74 73 33 20 65 78 74   If the fts3 ext
de40: 65 6e 73 69 6f 6e 20 69 73 20 75 73 65 64 20 69  ension is used i
de50: 6e 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  n an environment
de60: 0a 20 20 77 68 65 72 65 20 70 6f 74 65 6e 74 69  .  where potenti
de70: 61 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73 20 75  ally malicious u
de80: 73 65 72 73 20 6d 61 79 20 65 78 65 63 75 74 65  sers may execute
de90: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 2c 20   arbitrary SQL, 
dea0: 74 68 65 79 20 73 68 6f 75 6c 64 20 0a 20 20 62  they should .  b
deb0: 65 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d  e prevented from
dec0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 66 74   invoking the ft
ded0: 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20 66  s3_tokenizer() f
dee0: 75 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69 62 6c  unction, possibl
def0: 79 20 75 73 69 6e 67 20 0a 20 20 74 68 65 20 5c  y using .  the \
df00: 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74  [sqlite3_set_aut
df10: 68 6f 72 69 7a 65 72 28 29 7c 61 75 74 68 6f 72  horizer()|author
df20: 69 73 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  isation callback
df30: 5c 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  \]...<p>.  The f
df40: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
df50: 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70  ontains an examp
df60: 6c 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68  le of calling th
df70: 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
df80: 28 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20 66 72  ().  function fr
df90: 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a 5b 43 6f 64  om C code:..[Cod
dfa0: 65 20 7b 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a  e {.  <i>/*.  **
dfb0: 20 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b 65   Register a toke
dfc0: 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
dfd0: 74 69 6f 6e 20 77 69 74 68 20 46 54 53 33 2e 0a  tion with FTS3..
dfe0: 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 72    */</i>.  int r
dff0: 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72  egisterTokenizer
e000: 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  (.    sqlite3 *d
e010: 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  b,.    char *zNa
e020: 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  me,.    const sq
e030: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
e040: 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b 0a 20  module *p.  ){. 
e050: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
e060: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
e070: 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  mt;.    const ch
e080: 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
e090: 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  CT fts3_tokenize
e0a0: 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20 20 72  r(?, ?)";..    r
e0b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
e0c0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
e0d0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
e0e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e0f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e100: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e110: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ..    sqlite3_bi
e120: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
e130: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
e140: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
e150: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
e160: 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26 70 2c  ob(pStmt, 2, &p,
e170: 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51 4c 49   sizeof(p), SQLI
e180: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
e190: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
e1a0: 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  mt);..    return
e1b0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
e1c0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  e(pStmt);.  }.. 
e1d0: 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75 65 72   <i>/*.  ** Quer
e1e0: 79 20 46 54 53 33 20 66 6f 72 20 74 68 65 20 74  y FTS3 for the t
e1f0: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
e200: 6e 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20 7a 4e  ntation named zN
e210: 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20  ame..  */</i>.  
e220: 69 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e 69 7a  int queryTokeniz
e230: 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20  er(.    sqlite3 
e240: 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a  *db,.    char *z
e250: 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20  Name,.    const 
e260: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
e270: 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 20 20  r_module **pp.  
e280: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
e290: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
e2a0: 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73  *pStmt;.    cons
e2b0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22  t char *zSql = "
e2c0: 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65  SELECT fts3_toke
e2d0: 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 20 20  nizer(?)";..    
e2e0: 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  *pp = 0;.    rc 
e2f0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
e300: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
e310: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
e320: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e330: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
e340: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
e350: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
e360: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
e370: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
e380: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69  E_STATIC);.    i
e390: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
e3a0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
e3b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
e3c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e3d0: 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53  ype(pStmt, 0)==S
e3e0: 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
e3f0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c        memcpy(pp,
e400: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e410: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 20  blob(pStmt, 0), 
e420: 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20 20  sizeof(*pp));.  
e430: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e440: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
e450: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
e460: 0a 20 20 7d 0a 7d 5d 0a 0a 20 20 0a 20 20 0a 0a  .  }.}]..  .  ..
e470: 5b 68 31 20 22 44 61 74 61 20 53 74 72 75 63 74  [h1 "Data Struct
e480: 75 72 65 73 22 20 7b 7d 20 7b 73 65 67 6d 65 6e  ures" {} {segmen
e490: 74 20 62 74 72 65 65 7d 5d 0a 0a 3c 70 3e 0a 20  t btree}]..<p>. 
e4a0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 64 65   This section de
e4b0: 73 63 72 69 62 65 73 20 61 74 20 61 20 68 69 67  scribes at a hig
e4c0: 68 2d 6c 65 76 65 6c 20 74 68 65 20 77 61 79 20  h-level the way 
e4d0: 74 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65 20  the FTS3 module 
e4e0: 73 74 6f 72 65 73 20 69 74 73 0a 20 20 69 6e 64  stores its.  ind
e4f0: 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69  ex and content i
e500: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
e510: 49 74 20 69 73 20 3c 62 3e 6e 6f 74 20 6e 65 63  It is <b>not nec
e520: 65 73 73 61 72 79 20 74 6f 20 72 65 61 64 20 6f  essary to read o
e530: 72 20 0a 20 20 75 6e 64 65 72 73 74 61 6e 64 20  r .  understand 
e540: 74 68 65 20 6d 61 74 65 72 69 61 6c 20 69 6e 20  the material in 
e550: 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 6e 20  this section in 
e560: 6f 72 64 65 72 20 74 6f 20 75 73 65 20 46 54 53  order to use FTS
e570: 33 3c 2f 62 3e 20 69 6e 20 61 6e 20 0a 20 20 61  3</b> in an .  a
e580: 70 70 6c 69 63 61 74 69 6f 6e 2e 20 48 6f 77 65  pplication. Howe
e590: 76 65 72 2c 20 69 74 20 6d 61 79 20 62 65 20 75  ver, it may be u
e5a0: 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69 63 61  seful to applica
e5b0: 74 69 6f 6e 20 64 65 76 65 6c 6f 70 65 72 73 20  tion developers 
e5c0: 61 74 74 65 6d 70 74 69 6e 67 20 0a 20 20 74 6f  attempting .  to
e5d0: 20 61 6e 61 6c 79 7a 65 20 61 6e 64 20 75 6e 64   analyze and und
e5e0: 65 72 73 74 61 6e 64 20 46 54 53 33 20 70 65 72  erstand FTS3 per
e5f0: 66 6f 72 6d 61 6e 63 65 20 63 68 61 72 61 63 74  formance charact
e600: 65 72 69 73 74 69 63 73 2c 20 6f 72 20 74 6f 20  eristics, or to 
e610: 64 65 76 65 6c 6f 70 65 72 73 20 0a 20 20 63 6f  developers .  co
e620: 6e 74 65 6d 70 6c 61 74 69 6e 67 20 65 6e 68 61  ntemplating enha
e630: 6e 63 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ncements to the 
e640: 65 78 69 73 74 69 6e 67 20 46 54 53 33 20 66 65  existing FTS3 fe
e650: 61 74 75 72 65 20 73 65 74 2e 0a 0a 3c 70 3e 0a  ature set...<p>.
e660: 20 20 46 6f 72 20 65 61 63 68 20 46 54 53 33 20    For each FTS3 
e670: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
e680: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 68 72   a database, thr
e690: 65 65 20 72 65 61 6c 20 28 6e 6f 6e 2d 76 69 72  ee real (non-vir
e6a0: 74 75 61 6c 29 20 74 61 62 6c 65 73 20 0a 20 20  tual) tables .  
e6b0: 61 72 65 20 63 72 65 61 74 65 64 20 74 6f 20 73  are created to s
e6c0: 74 6f 72 65 20 74 68 65 20 75 6e 64 65 72 6c 79  tore the underly
e6d0: 69 6e 67 20 64 61 74 61 2e 20 54 68 65 20 72 65  ing data. The re
e6e0: 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 6e 61  al tables are na
e6f0: 6d 65 64 20 22 25 5f 63 6f 6e 74 65 6e 74 22 2c  med "%_content",
e700: 0a 20 20 22 25 5f 73 65 67 64 69 72 22 20 61 6e  .  "%_segdir" an
e710: 64 20 22 25 5f 73 65 67 6d 65 6e 74 73 22 2c 20  d "%_segments", 
e720: 77 68 65 72 65 20 22 25 22 20 69 73 20 72 65 70  where "%" is rep
e730: 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 61 6d  laced by the nam
e740: 65 20 73 75 70 70 6c 69 65 64 20 62 79 0a 20 20  e supplied by.  
e750: 74 68 65 20 75 73 65 72 20 66 6f 72 20 74 68 65  the user for the
e760: 20 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61   FTS3 virtual ta
e770: 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ble...<p>.  The 
e780: 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  leftmost column 
e790: 6f 66 20 74 68 65 20 22 25 5f 63 6f 6e 74 65 6e  of the "%_conten
e7a0: 74 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 49  t" table is an I
e7b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
e7c0: 45 59 20 66 69 65 6c 64 0a 20 20 6e 61 6d 65 64  EY field.  named
e7d0: 20 22 64 6f 63 69 64 22 2e 20 46 6f 6c 6c 6f 77   "docid". Follow
e7e0: 69 6e 67 20 74 68 69 73 20 69 73 20 6f 6e 65 20  ing this is one 
e7f0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 65 61 63 68 20  column for each 
e800: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
e810: 53 33 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62  S3.  virtual tab
e820: 6c 65 20 61 73 20 64 65 63 6c 61 72 65 64 20 62  le as declared b
e830: 79 20 74 68 65 20 75 73 65 72 2c 20 6e 61 6d 65  y the user, name
e840: 64 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  d by prepending 
e850: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 0a  the column name.
e860: 20 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68    supplied by th
e870: 65 20 75 73 65 72 20 77 69 74 68 20 22 63 3c 69  e user with "c<i
e880: 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65 72 65 20 3c  >N</i>", where <
e890: 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20 69  i>N</i> is the i
e8a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 0a 20 20 63  ndex of the .  c
e8b0: 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 74 68 65  olumn within the
e8c0: 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65 72 65 64   table, numbered
e8d0: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
e8e0: 67 68 74 20 73 74 61 72 74 69 6e 67 20 77 69 74  ght starting wit
e8f0: 68 20 31 2e 20 44 61 74 61 0a 20 20 74 79 70 65  h 1. Data.  type
e900: 73 20 73 75 70 70 6c 69 65 64 20 61 73 20 70 61  s supplied as pa
e910: 72 74 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  rt of the virtua
e920: 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  l table declarat
e930: 69 6f 6e 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ion are not used
e940: 20 61 73 0a 20 20 70 61 72 74 20 6f 66 20 74 68   as.  part of th
e950: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
e960: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 46  e declaration. F
e970: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f  or example:..[Co
e980: 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72  de {.  <i>-- Vir
e990: 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61  tual table decla
e9a0: 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45  ration</i>.  CRE
e9b0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
e9c0: 45 20 61 62 63 20 55 53 49 4e 47 20 46 54 53 33  E abc USING FTS3
e9d0: 28 61 20 4e 55 4d 42 45 52 2c 20 62 20 54 45 58  (a NUMBER, b TEX
e9e0: 54 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  T, c);..  <i>-- 
e9f0: 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 25 5f  Corresponding %_
ea00: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64 65  content table de
ea10: 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20  claration</i>.  
ea20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
ea30: 5f 63 6f 6e 74 65 6e 74 28 64 6f 63 69 64 20 49  _content(docid I
ea40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
ea50: 45 59 2c 20 63 30 61 2c 20 63 31 62 2c 20 63 32  EY, c0a, c1b, c2
ea60: 63 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68  c);.}]..<p>.  Th
ea70: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
ea80: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 75  e contains the u
ea90: 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64 61 74  nadulterated dat
eaa0: 61 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  a inserted by th
eab0: 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f 20 74  e user .  into t
eac0: 68 65 20 46 54 53 33 20 76 69 72 74 75 61 6c 20  he FTS3 virtual 
ead0: 74 61 62 6c 65 20 62 79 20 74 68 65 20 75 73 65  table by the use
eae0: 72 2e 20 49 66 20 74 68 65 20 75 73 65 72 20 64  r. If the user d
eaf0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
eb00: 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20 22 64  ly.  supply a "d
eb10: 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68 65 6e  ocid" value when
eb20: 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72   inserting recor
eb30: 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c 65 63  ds, one is selec
eb40: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
eb50: 79 0a 20 20 62 79 20 74 68 65 20 73 79 73 74 65  y.  by the syste
eb60: 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74 77  m...<p>.  The tw
eb70: 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61 62 6c  o remaining tabl
eb80: 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  es, %_segments a
eb90: 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61 72 65  nd %_segdir, are
eba0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
ebb0: 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20  he .  full-text 
ebc0: 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74 75 61  index. Conceptua
ebd0: 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65 78 20  lly, this index 
ebe0: 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c  is a lookup tabl
ebf0: 65 20 74 68 61 74 20 6d 61 70 73 20 65 61 63 68  e that maps each
ec00: 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64 29 20   .  term (word) 
ec10: 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  to the set of do
ec20: 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72 72 65  cid values corre
ec30: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65 63 6f  sponding to reco
ec40: 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20 25 5f  rds in the .  %_
ec50: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74 68  content table th
ec60: 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20 6f  at contain one o
ec70: 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65 6e 63  r more occurrenc
ec80: 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  es of the term. 
ec90: 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20 61 6c  To.  retrieve al
eca0: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
ecb0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69   contain a speci
ecc0: 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65 20 46  fied term, the F
ecd0: 54 53 33 20 6d 6f 64 75 6c 65 0a 20 20 71 75 65  TS3 module.  que
ece0: 72 69 65 73 20 74 68 69 73 20 69 6e 64 65 78 20  ries this index 
ecf0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
ed00: 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61   set of docid va
ed10: 6c 75 65 73 20 66 6f 72 20 72 65 63 6f 72 64 73  lues for records
ed20: 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20   that.  contain 
ed30: 74 68 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 72  the term, then r
ed40: 65 74 72 69 65 76 65 73 20 74 68 65 20 72 65 71  etrieves the req
ed50: 75 69 72 65 64 20 64 6f 63 75 6d 65 6e 74 73 20  uired documents 
ed60: 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74 65  from the %_conte
ed70: 6e 74 0a 20 20 74 61 62 6c 65 2e 20 52 65 67 61  nt.  table. Rega
ed80: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 63  rdless of the sc
ed90: 68 65 6d 61 20 6f 66 20 74 68 65 20 46 54 53 33  hema of the FTS3
eda0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
edb0: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20  the %_segments. 
edc0: 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74 61   and %_segdir ta
edd0: 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  bles are always 
ede0: 63 72 65 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  created as follo
edf0: 77 73 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43  ws:..[Code {.  C
ee00: 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73 65  REATE TABLE %_se
ee10: 67 6d 65 6e 74 73 28 0a 20 20 20 20 62 6c 6f 63  gments(.    bloc
ee20: 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  kid INTEGER PRIM
ee30: 41 52 59 20 4b 45 59 2c 20 20 20 20 20 20 20 3c  ARY KEY,       <
ee40: 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f 64 65  i>-- B-tree node
ee50: 20 69 64 3c 2f 69 3e 0a 20 20 20 20 62 6c 6f 63   id</i>.    bloc
ee60: 6b 20 62 6c 6f 62 20 20 20 20 20 20 20 20 20 20  k blob          
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
ee80: 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f 64 65  i>-- B-tree node
ee90: 20 64 61 74 61 3c 2f 69 3e 0a 20 20 29 3b 0a 0a   data</i>.  );..
eea0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
eeb0: 5f 73 65 67 64 69 72 28 0a 20 20 20 20 6c 65 76  _segdir(.    lev
eec0: 65 6c 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  el INTEGER,.    
eed0: 69 64 78 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  idx INTEGER,.   
eee0: 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49 4e 54   start_block INT
eef0: 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 20  EGER,           
ef00: 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
ef10: 64 20 6f 66 20 66 69 72 73 74 20 6e 6f 64 65 20  d of first node 
ef20: 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69  in %_segments</i
ef30: 3e 0a 20 20 20 20 6c 65 61 76 65 73 5f 65 6e 64  >.    leaves_end
ef40: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20  _block INTEGER, 
ef50: 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42           <i>-- B
ef60: 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74 20 6c  lockid of last l
ef70: 65 61 66 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65  eaf node in %_se
ef80: 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 65  gments</i>.    e
ef90: 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52  nd_block INTEGER
efa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
efb0: 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20    <i>-- Blockid 
efc0: 6f 66 20 6c 61 73 74 20 6e 6f 64 65 20 69 6e 20  of last node in 
efd0: 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20  %_segments</i>. 
efe0: 20 20 20 72 6f 6f 74 20 42 4c 4f 42 2c 20 20 20     root BLOB,   
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72        <i>-- B-tr
f010: 65 65 20 72 6f 6f 74 20 6e 6f 64 65 3c 2f 69 3e  ee root node</i>
f020: 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59  .    PRIMARY KEY
f030: 28 6c 65 76 65 6c 2c 20 69 64 78 29 0a 20 20 29  (level, idx).  )
f040: 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ;.}]..<p>.  The 
f050: 73 63 68 65 6d 61 20 64 65 70 69 63 74 65 64 20  schema depicted 
f060: 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 64 65 73  above is not des
f070: 69 67 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74  igned to store t
f080: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
f090: 65 78 20 0a 20 20 64 69 72 65 63 74 6c 79 2e 20  ex .  directly. 
f0a0: 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 20 75  Instead, it is u
f0b0: 73 65 64 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  sed to one or mo
f0c0: 72 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  re b-tree struct
f0d0: 75 72 65 73 2e 20 54 68 65 72 65 0a 20 20 69 73  ures. There.  is
f0e0: 20 6f 6e 65 20 62 2d 74 72 65 65 20 66 6f 72 20   one b-tree for 
f0f0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
f100: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20  %_segdir table. 
f110: 54 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  The %_segdir tab
f120: 6c 65 0a 20 20 72 6f 77 20 63 6f 6e 74 61 69 6e  le.  row contain
f130: 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  s the root node 
f140: 61 6e 64 20 76 61 72 69 6f 75 73 20 6d 65 74 61  and various meta
f150: 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
f160: 20 77 69 74 68 20 74 68 65 0a 20 20 62 2d 74 72   with the.  b-tr
f170: 65 65 20 73 74 72 75 63 74 75 72 65 2c 20 61 6e  ee structure, an
f180: 64 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  d the %_segments
f190: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
f1a0: 61 6c 6c 20 6f 74 68 65 72 20 28 6e 6f 6e 2d 72  all other (non-r
f1b0: 6f 6f 74 29 0a 20 20 62 2d 74 72 65 65 20 6e 6f  oot).  b-tree no
f1c0: 64 65 73 2e 20 45 61 63 68 20 62 2d 74 72 65 65  des. Each b-tree
f1d0: 20 69 73 20 72 65 66 65 72 72 65 64 20 74 6f 20   is referred to 
f1e0: 61 73 20 61 20 22 73 65 67 6d 65 6e 74 22 2e 20  as a "segment". 
f1f0: 4f 6e 63 65 20 69 74 20 68 61 73 0a 20 20 62 65  Once it has.  be
f200: 65 6e 20 63 72 65 61 74 65 64 2c 20 61 20 73 65  en created, a se
f210: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20  gment b-tree is 
f220: 6e 65 76 65 72 20 75 70 64 61 74 65 64 20 28 61  never updated (a
f230: 6c 74 68 6f 75 67 68 20 69 74 20 6d 61 79 20 62  lthough it may b
f240: 65 0a 20 20 64 65 6c 65 74 65 64 20 61 6c 74 6f  e.  deleted alto
f250: 67 65 74 68 65 72 29 2e 0a 0a 3c 70 3e 0a 20 20  gether)...<p>.  
f260: 54 68 65 20 6b 65 79 73 20 75 73 65 64 20 62 79  The keys used by
f270: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d   each segment b-
f280: 74 72 65 65 20 61 72 65 20 74 65 72 6d 73 20 28  tree are terms (
f290: 77 6f 72 64 73 29 2e 20 41 73 20 77 65 6c 6c 20  words). As well 
f2a0: 61 73 20 74 68 65 0a 20 20 6b 65 79 2c 20 65 61  as the.  key, ea
f2b0: 63 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ch segment b-tre
f2c0: 65 20 65 6e 74 72 79 20 68 61 73 20 61 6e 20 61  e entry has an a
f2d0: 73 73 6f 63 69 61 74 65 64 20 22 64 6f 63 6c 69  ssociated "docli
f2e0: 73 74 22 20 28 64 6f 63 75 6d 65 6e 74 20 6c 69  st" (document li
f2f0: 73 74 29 2e 0a 20 20 41 20 64 6f 63 6c 69 73 74  st)..  A doclist
f300: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
f310: 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65  o or more entrie
f320: 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 65 6e  s, where each en
f330: 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 3a  try consists of:
f340: 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20  ..<ul>.  <li> A 
f350: 64 6f 63 69 64 20 28 64 6f 63 75 6d 65 6e 74 20  docid (document 
f360: 69 64 29 2c 20 61 6e 64 0a 20 20 3c 6c 69 3e 20  id), and.  <li> 
f370: 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 20 6f  A list of term o
f380: 66 66 73 65 74 73 2c 20 6f 6e 65 20 66 6f 72 20  ffsets, one for 
f390: 65 61 63 68 20 6f 63 63 75 72 72 65 6e 63 65 20  each occurrence 
f3a0: 6f 66 20 74 68 65 20 74 65 72 6d 20 77 69 74 68  of the term with
f3b0: 69 6e 0a 20 20 20 20 20 20 20 74 68 65 20 64 6f  in.       the do
f3c0: 63 75 6d 65 6e 74 2e 20 41 20 74 65 72 6d 20 6f  cument. A term o
f3d0: 66 66 73 65 74 20 69 6e 64 69 63 61 74 65 73 20  ffset indicates 
f3e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  the number of to
f3f0: 6b 65 6e 73 20 28 77 6f 72 64 73 29 0a 20 20 20  kens (words).   
f400: 20 20 20 20 74 68 61 74 20 6f 63 63 75 72 20 62      that occur b
f410: 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 20 69  efore the term i
f420: 6e 20 71 75 65 73 74 69 6f 6e 2c 20 6e 6f 74 20  n question, not 
f430: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
f440: 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 20  aracters.       
f450: 6f 72 20 62 79 74 65 73 2e 20 46 6f 72 20 65 78  or bytes. For ex
f460: 61 6d 70 6c 65 2c 20 74 68 65 20 74 65 72 6d 20  ample, the term 
f470: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 74 65  offset of the te
f480: 72 6d 20 22 77 61 72 22 20 69 6e 20 74 68 65 0a  rm "war" in the.
f490: 20 20 20 20 20 20 20 70 68 72 61 73 65 20 22 41         phrase "A
f4a0: 6e 63 65 73 74 72 61 6c 20 76 6f 69 63 65 73 20  ncestral voices 
f4b0: 70 72 6f 70 68 65 73 79 69 6e 67 20 77 61 72 21  prophesying war!
f4c0: 22 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  " is 3..</ul>..<
f4d0: 70 3e 0a 20 20 45 6e 74 72 69 65 73 20 77 69 74  p>.  Entries wit
f4e0: 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 61 72  hin a doclist ar
f4f0: 65 20 73 6f 72 74 65 64 20 62 79 20 64 6f 63 69  e sorted by doci
f500: 64 2e 20 50 6f 73 69 74 69 6f 6e 73 20 77 69 74  d. Positions wit
f510: 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 0a 20 20  hin a doclist.  
f520: 65 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65 64  entry are stored
f530: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f540: 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  der...<p>.  The 
f550: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
f560: 6c 6f 67 69 63 61 6c 20 66 75 6c 6c 2d 74 65 78  logical full-tex
f570: 74 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64  t index is found
f580: 20 62 79 20 6d 65 72 67 69 6e 67 20 74 68 65 0a   by merging the.
f590: 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c    contents of al
f5a0: 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  l segment b-tree
f5b0: 73 2e 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  s. If a term is 
f5c0: 70 72 65 73 65 6e 74 20 69 6e 20 6d 6f 72 65 20  present in more 
f5d0: 74 68 61 6e 20 6f 6e 65 0a 20 20 73 65 67 6d 65  than one.  segme
f5e0: 6e 74 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  nt b-tree, then 
f5f0: 69 74 20 6d 61 70 73 20 74 6f 20 74 68 65 20 75  it maps to the u
f600: 6e 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e 64  nion of each ind
f610: 69 76 69 64 75 61 6c 20 64 6f 63 6c 69 73 74 2e  ividual doclist.
f620: 20 49 66 2c 0a 20 20 66 6f 72 20 61 20 73 69 6e   If,.  for a sin
f630: 67 6c 65 20 74 65 72 6d 2c 20 74 68 65 20 73 61  gle term, the sa
f640: 6d 65 20 64 6f 63 69 64 20 6f 63 63 75 72 73 20  me docid occurs 
f650: 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  in more than one
f660: 20 64 6f 63 6c 69 73 74 2c 20 74 68 65 6e 20 6f   doclist, then o
f670: 6e 6c 79 0a 20 20 74 68 65 20 64 6f 63 6c 69 73  nly.  the doclis
f680: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
f690: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f6a0: 74 6c 79 20 63 72 65 61 74 65 64 20 73 65 67 6d  tly created segm
f6b0: 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20 0a 20  ent b-tree is . 
f6c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
f6d0: 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75 6c 74 69  d. ..<p>.  Multi
f6e0: 70 6c 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  ple b-tree struc
f6f0: 74 75 72 65 73 20 61 72 65 20 75 73 65 64 20 69  tures are used i
f700: 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67  nstead of a sing
f710: 6c 65 20 62 2d 74 72 65 65 20 74 6f 20 72 65 64  le b-tree to red
f720: 75 63 65 0a 20 20 74 68 65 20 63 6f 73 74 20 6f  uce.  the cost o
f730: 66 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f  f inserting reco
f740: 72 64 73 20 69 6e 74 6f 20 46 54 53 33 20 74 61  rds into FTS3 ta
f750: 62 6c 65 73 2e 20 57 68 65 6e 20 61 20 6e 65 77  bles. When a new
f760: 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 69 6e   record is .  in
f770: 73 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 46  serted into an F
f780: 54 53 33 20 74 61 62 6c 65 20 74 68 61 74 20 61  TS3 table that a
f790: 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
f7a0: 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c 20 69  a lot of data, i
f7b0: 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20 74 68  t is.  likely th
f7c0: 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 74  at many of the t
f7d0: 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65 77 20  erms in the new 
f7e0: 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72 65 61  record are alrea
f7f0: 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  dy present in.  
f800: 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f  a large number o
f810: 66 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f 72  f existing recor
f820: 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c 65 20  ds. If a single 
f830: 62 2d 74 72 65 65 20 77 65 72 65 20 75 73 65 64  b-tree were used
f840: 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65 20 64  , then.  large d
f850: 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  oclist structure
f860: 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  s would have to 
f870: 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74  be loaded from t
f880: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20 20 61  he database,.  a
f890: 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75 64  mended to includ
f8a0: 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20  e the new docid 
f8b0: 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  and term-offset 
f8c0: 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69 74 74  list, then writt
f8d0: 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74 68 65  en back.  to the
f8e0: 20 64 61 74 61 62 61 73 65 2e 20 55 73 69 6e 67   database. Using
f8f0: 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72 65 65   multiple b-tree
f900: 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73 20 74   tables allows t
f910: 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69 64 65  his to be avoide
f920: 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e 67 20  d.  by creating 
f930: 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77 68 69  a new b-tree whi
f940: 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67 65 64  ch can be merged
f950: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
f960: 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f 72 20  ng b-tree.  (or 
f970: 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72 20 6f  b-trees) later o
f980: 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20 62 2d  n. Merging of b-
f990: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20  tree structures 
f9a0: 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65 64  can be performed
f9b0: 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72 6f 75   as.  a backgrou
f9c0: 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e 63 65  nd task, or once
f9d0: 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d 62 65   a certain numbe
f9e0: 72 20 6f 66 20 73 65 70 61 72 61 74 65 20 62 2d  r of separate b-
f9f0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73 0a  tree structures.
fa00: 20 20 68 61 76 65 20 62 65 65 6e 20 61 63 63 75    have been accu
fa10: 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f 75 72  mulated. Of cour
fa20: 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d 65 20  se, this scheme 
fa30: 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20 6d 6f  makes queries mo
fa40: 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20 20 28  re expensive.  (
fa50: 61 73 20 74 68 65 20 46 54 53 33 20 63 6f 64 65  as the FTS3 code
fa60: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c 6f 6f   may have to loo
fa70: 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61 6c 20  k up individual 
fa80: 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74 68  terms in more th
fa90: 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65 20  an one.  b-tree 
faa0: 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
fab0: 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74 20 68  sults), but it h
fac0: 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 74 68  as been found th
fad0: 61 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 74  at in practice t
fae0: 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64 20 69  his.  overhead i
faf0: 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69 62  s often negligib
fb00: 6c 65 2e 0a 20 20 0a 5b 68 32 20 22 56 61 72 69  le..  .[h2 "Vari
fb10: 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74 65  able Length Inte
fb20: 67 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f 72  ger (varint) For
fb30: 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 49 6e 74  mat"]..<p>.  Int
fb40: 65 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72  eger values stor
fb50: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65  ed as part of se
fb60: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6e 6f 64  gment b-tree nod
fb70: 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20 75  es are encoded u
fb80: 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 33 20  sing the.  FTS3 
fb90: 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20 54  varint format. T
fba0: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
fbb0: 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c 62 3e  similar, but <b>
fbc0: 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c 2f 62  not identical</b
fbd0: 3e 2c 20 74 6f 20 74 68 65 0a 20 20 74 68 65 20  >, to the.  the 
fbe0: 3c 61 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72  <a href="filefor
fbf0: 6d 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74 5f  mat.html#varint_
fc00: 66 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65 20 76  format">SQLite v
fc10: 61 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61 3e  arint format</a>
fc20: 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63 6f  ...<p>.  An enco
fc30: 64 65 64 20 46 54 53 33 20 76 61 72 69 6e 74 20  ded FTS3 varint 
fc40: 63 6f 6e 73 75 6d 65 73 20 62 65 74 77 65 65 6e  consumes between
fc50: 20 6f 6e 65 20 61 6e 64 20 74 65 6e 20 62 79 74   one and ten byt
fc60: 65 73 20 6f 66 20 73 70 61 63 65 2e 20 54 68 65  es of space. The
fc70: 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  .  number of byt
fc80: 65 73 20 72 65 71 75 69 72 65 64 20 69 73 20 64  es required is d
fc90: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
fca0: 20 73 69 67 6e 20 61 6e 64 20 6d 61 67 6e 69 74   sign and magnit
fcb0: 75 64 65 20 6f 66 20 74 68 65 0a 20 20 69 6e 74  ude of the.  int
fcc0: 65 67 65 72 20 76 61 6c 75 65 20 65 6e 63 6f 64  eger value encod
fcd0: 65 64 2e 20 4d 6f 72 65 20 61 63 63 75 72 61 74  ed. More accurat
fce0: 65 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ely, the number 
fcf0: 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 74 6f  of bytes used to
fd00: 20 73 74 6f 72 65 0a 20 20 74 68 65 20 65 6e 63   store.  the enc
fd10: 6f 64 65 64 20 69 6e 74 65 67 65 72 20 64 65 70  oded integer dep
fd20: 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 6f 73 69  ends on the posi
fd30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
fd40: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73 65 74   significant set
fd50: 20 62 69 74 0a 20 20 69 6e 20 74 68 65 20 36 34   bit.  in the 64
fd60: 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 69  -bit twos-compli
fd70: 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  ment representat
fd80: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ion of the integ
fd90: 65 72 20 76 61 6c 75 65 2e 20 4e 65 67 61 74 69  er value. Negati
fda0: 76 65 0a 20 20 76 61 6c 75 65 73 20 61 6c 77 61  ve.  values alwa
fdb0: 79 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74  ys have the most
fdc0: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
fdd0: 20 73 65 74 20 28 74 68 65 20 73 69 67 6e 20 62   set (the sign b
fde0: 69 74 29 2c 20 61 6e 64 20 73 6f 20 61 72 65 0a  it), and so are.
fdf0: 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20    always stored 
fe00: 75 73 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74  using the full t
fe10: 65 6e 20 62 79 74 65 73 2e 20 50 6f 73 69 74 69  en bytes. Positi
fe20: 76 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ve integer value
fe30: 73 20 6d 61 79 20 62 65 0a 20 20 73 74 6f 72 65  s may be.  store
fe40: 64 20 75 73 69 6e 67 20 6c 65 73 73 20 73 70 61  d using less spa
fe50: 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  ce...<p>.  The f
fe60: 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 61 6e 20  inal byte of an 
fe70: 65 6e 63 6f 64 65 64 20 46 54 53 33 20 76 61 72  encoded FTS3 var
fe80: 69 6e 74 20 68 61 73 20 69 74 73 20 6d 6f 73 74  int has its most
fe90: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
fea0: 20 0a 20 20 63 6c 65 61 72 65 64 2e 20 41 6c 6c   .  cleared. All
feb0: 20 70 72 65 63 65 64 69 6e 67 20 62 79 74 65 73   preceding bytes
fec0: 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73   have the most s
fed0: 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73  ignificant bit s
fee0: 65 74 2e 20 44 61 74 61 0a 20 20 69 73 20 73 74  et. Data.  is st
fef0: 6f 72 65 64 20 69 6e 20 74 68 65 20 72 65 6d 61  ored in the rema
ff00: 69 6e 69 6e 67 20 73 65 76 65 6e 20 6c 65 61 73  ining seven leas
ff10: 74 20 73 69 67 6e 66 69 63 61 6e 74 20 62 69 74  t signficant bit
ff20: 73 20 6f 66 20 65 61 63 68 20 62 79 74 65 2e 0a  s of each byte..
ff30: 20 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65    The first byte
ff40: 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20   of the encoded 
ff50: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 63  representation c
ff60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 65 61 73  ontains the leas
ff70: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20 20  t significant.  
ff80: 73 65 76 65 6e 20 62 69 74 73 20 6f 66 20 74 68  seven bits of th
ff90: 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65  e encoded intege
ffa0: 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 65 63  r value. The sec
ffb0: 6f 6e 64 20 62 79 74 65 20 6f 66 20 74 68 65 20  ond byte of the 
ffc0: 65 6e 63 6f 64 65 64 0a 20 20 72 65 70 72 65 73  encoded.  repres
ffd0: 65 6e 74 61 74 69 6f 6e 2c 20 69 66 20 69 74 20  entation, if it 
ffe0: 69 73 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  is present, cont
fff0: 61 69 6e 73 20 74 68 65 20 73 65 76 65 6e 20 6e  ains the seven n
10000 65 78 74 20 6c 65 61 73 74 20 73 69 67 6e 69 66  ext least signif
10010 69 63 61 6e 74 0a 20 20 62 69 74 73 20 6f 66 20  icant.  bits of 
10020 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
10030 65 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 54 68  e, and so on. Th
10040 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
10050 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70  e contains examp
10060 6c 65 73 0a 20 20 6f 66 20 65 6e 63 6f 64 65 64  les.  of encoded
10070 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 3a   integer values:
10080 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72 5d  ..[Table].  [Tr]
10090 3c 74 68 3e 44 65 63 69 6d 61 6c 3c 74 68 3e 48  <th>Decimal<th>H
100a0 65 78 61 64 65 63 69 6d 61 6c 3c 74 68 20 77 69  exadecimal<th wi
100b0 64 74 68 3d 31 30 30 25 3e 45 6e 63 6f 64 65 64  dth=100%>Encoded
100c0 20 52 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   Representation.
100d0 20 20 5b 54 72 5d 3c 74 64 3e 34 33 3c 74 64 3e    [Tr]<td>43<td>
100e0 30 78 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0x00000000000000
100f0 32 42 3c 74 64 3e 30 78 32 42 20 0a 20 20 5b 54  2B<td>0x2B .  [T
10100 72 5d 3c 74 64 3e 32 30 30 38 31 35 3c 74 64 3e  r]<td>200815<td>
10110 30 78 30 30 30 30 30 30 30 30 30 30 30 33 31 30  0x00000000000310
10120 36 46 3c 74 64 3e 30 78 39 43 20 30 78 41 30 20  6F<td>0x9C 0xA0 
10130 30 78 30 43 0a 20 20 5b 54 72 5d 3c 74 64 3e 2d  0x0C.  [Tr]<td>-
10140 31 3c 74 64 3e 30 78 46 46 46 46 46 46 46 46 46  1<td>0xFFFFFFFFF
10150 46 46 46 46 46 46 46 3c 74 64 3e 30 78 46 46 20  FFFFFFF<td>0xFF 
10160 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
10170 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
10180 46 46 20 30 78 46 46 20 30 78 30 31 0a 3c 2f 74  FF 0xFF 0x01.</t
10190 61 62 6c 65 3e 0a 20 20 0a 0a 5b 68 32 20 22 53  able>.  ..[h2 "S
101a0 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 46 6f  egment B-Tree Fo
101b0 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 53 65  rmat"]..<p>.  Se
101c0 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61 72  gment b-trees ar
101d0 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  e prefix-compres
101e0 73 65 64 20 62 2b 2d 74 72 65 65 73 2e 20 54 68  sed b+-trees. Th
101f0 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d 65  ere is one segme
10200 6e 74 20 62 2d 74 72 65 65 0a 20 20 66 6f 72 20  nt b-tree.  for 
10210 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
10220 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 28  %_segdir table (
10230 73 65 65 20 61 62 6f 76 65 29 2e 20 54 68 65 20  see above). The 
10240 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65  root node of the
10250 20 73 65 67 6d 65 6e 74 0a 20 20 62 2d 74 72 65   segment.  b-tre
10260 65 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  e is stored as a
10270 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f   blob in the "ro
10280 6f 74 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ot" field of the
10290 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
102a0 6f 77 0a 20 20 6f 66 20 74 68 65 20 25 5f 73 65  ow.  of the %_se
102b0 67 64 69 72 20 74 61 62 6c 65 2e 20 41 6c 6c 20  gdir table. All 
102c0 6f 74 68 65 72 20 6e 6f 64 65 73 20 28 69 66 20  other nodes (if 
102d0 61 6e 79 20 65 78 69 73 74 29 20 61 72 65 20 73  any exist) are s
102e0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 20 20  tored in the .  
102f0 22 62 6c 6f 62 22 20 63 6f 6c 75 6d 6e 20 6f 66  "blob" column of
10300 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
10310 74 61 62 6c 65 2e 20 4e 6f 64 65 73 20 77 69 74  table. Nodes wit
10320 68 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  hin the %_segmen
10330 74 73 20 74 61 62 6c 65 20 61 72 65 0a 20 20 69  ts table are.  i
10340 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
10350 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
10360 6e 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 66 69  n the blockid fi
10370 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65  eld of the corre
10380 73 70 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 2e 20  sponding.  row. 
10390 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
103a0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
103b0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
103c0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a  %_segdir table:.
103d0 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72 5d 3c  .[Table].  [Tr]<
103e0 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  th>Column       
103f0 20 20 20 20 3c 74 68 20 77 69 64 74 68 3d 31 30      <th width=10
10400 30 25 3e 49 6e 74 65 72 70 72 65 74 69 6f 6e 0a  0%>Interpretion.
10410 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 76 65 6c 20    [Tr]<td>level 
10420 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e 20             <td> 
10430 0a 20 20 20 20 42 65 74 77 65 65 6e 20 74 68 65  .    Between the
10440 6d 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  m, the contents 
10450 6f 66 20 74 68 65 20 22 6c 65 76 65 6c 22 20 61  of the "level" a
10460 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64 73 20  nd "idx" fields 
10470 64 65 66 69 6e 65 20 74 68 65 0a 20 20 20 20 72  define the.    r
10480 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66 20 74  elative age of t
10490 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  he segment b-tre
104a0 65 2e 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 74  e. The smaller t
104b0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
104c0 69 6e 20 74 68 65 0a 20 20 20 20 22 6c 65 76 65  in the.    "leve
104d0 6c 22 20 66 69 65 6c 64 2c 20 74 68 65 20 6d 6f  l" field, the mo
104e0 72 65 20 72 65 63 65 6e 74 6c 79 20 74 68 65 20  re recently the 
104f0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 77  segment b-tree w
10500 61 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 74  as created. If t
10510 77 6f 0a 20 20 20 20 73 65 67 6d 65 6e 74 20 62  wo.    segment b
10520 2d 74 72 65 65 73 20 61 72 65 20 6f 66 20 74 68  -trees are of th
10530 65 20 73 61 6d 65 20 22 6c 65 76 65 6c 22 2c 20  e same "level", 
10540 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68  the segment with
10550 20 74 68 65 20 6c 61 72 67 65 72 0a 20 20 20 20   the larger.    
10560 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
10570 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75 6d 6e  the "idx" column
10580 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e 74 2e   is more recent.
10590 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   The PRIMARY KEY
105a0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20   constraint.    
105b0 6f 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  on the %_segdir 
105c0 74 61 62 6c 65 20 70 72 65 76 65 6e 74 73 20 61  table prevents a
105d0 6e 79 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 20  ny two segments 
105e0 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 68 65 20  from having the 
105f0 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20 20 66  same value.    f
10600 6f 72 20 62 6f 74 68 20 74 68 65 20 22 6c 65 76  or both the "lev
10610 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66 69  el" and "idx" fi
10620 65 6c 64 73 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e  elds..  [Tr]<td>
10630 69 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  idx             
10640 20 3c 74 64 3e 20 53 65 65 20 61 62 6f 76 65 2e   <td> See above.
10650 0a 20 20 5b 54 72 5d 3c 74 64 3e 73 74 61 72 74  .  [Tr]<td>start
10660 5f 62 6c 6f 63 6b 20 20 20 20 20 20 3c 74 64 3e  _block      <td>
10670 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64  .    The blockid
10680 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
10690 73 20 74 6f 20 74 68 65 20 6e 6f 64 65 20 77 69  s to the node wi
106a0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
106b0 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 0a 20 20  blockid that .  
106c0 20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69    belongs to thi
106d0 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  s segment b-tree
106e0 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68 65  . Or zero if the
106f0 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20   entire segment 
10700 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74 73 20  b-tree.    fits 
10710 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  on the root node
10720 2e 20 49 66 20 69 74 20 65 78 69 73 74 73 2c 20  . If it exists, 
10730 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c 77  this node is alw
10740 61 79 73 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e  ays a leaf node.
10750 0a 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 61 76 65  .  [Tr]<td>leave
10760 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e  s_end_block <td>
10770 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64  .    The blockid
10780 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
10790 73 20 74 6f 20 74 68 65 20 6c 65 61 66 20 6e 6f  s to the leaf no
107a0 64 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  de with the larg
107b0 65 73 74 20 62 6c 6f 63 6b 69 64 20 0a 20 20 20  est blockid .   
107c0 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20 74 6f   that belongs to
107d0 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62 2d   this segment b-
107e0 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66  tree. Or zero if
107f0 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d   the entire segm
10800 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20 66  ent b-tree.    f
10810 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
10820 6e 6f 64 65 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e  node..  [Tr]<td>
10830 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20  end_block <td>. 
10840 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64 20 74     The blockid t
10850 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
10860 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  to the interior 
10870 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c 61  node with the la
10880 72 67 65 73 74 20 0a 20 20 20 20 62 6c 6f 63 6b  rgest .    block
10890 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20  id that belongs 
108a0 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  to this segment 
108b0 62 2d 74 72 65 65 2e 20 20 4f 72 20 7a 65 72 6f  b-tree.  Or zero
108c0 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 73   if the entire s
108d0 65 67 6d 65 6e 74 0a 20 20 20 20 62 2d 74 72 65  egment.    b-tre
108e0 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f  e fits on the ro
108f0 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20 65  ot node. If it e
10900 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64 65  xists, this node
10910 20 69 73 20 61 6c 77 61 79 73 20 61 6e 0a 20 20   is always an.  
10920 20 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e    interior node.
10930 0a 20 20 5b 54 72 5d 3c 74 64 3e 72 6f 6f 74 20  .  [Tr]<td>root 
10940 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e              <td>
10950 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 61 69  .    Blob contai
10960 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ning the root no
10970 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
10980 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61 62 6c  t b-tree..</tabl
10990 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72 74 20  e>..<p>.  Apart 
109a0 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6e 6f  from the root no
109b0 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20 74 68  de, the nodes th
109c0 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69 6e  at make up a sin
109d0 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  gle segment b-tr
109e0 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79 73 20  ee are.  always 
109f0 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61 20 63  stored using a c
10a00 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
10a10 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 2e 20  ce of blockids. 
10a20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
10a30 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20 6d 61  .  nodes that ma
10a40 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20 6c  ke up a single l
10a50 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72  evel of the b-tr
10a60 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c 76 65  ee are themselve
10a70 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20 61 20  s stored as.  a 
10a80 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63 6b  contiguous block
10a90 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72 64 65  , in b-tree orde
10aa0 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f 75  r. The contiguou
10ab0 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 6c  s sequence of bl
10ac0 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20 74 6f  ockids.  used to
10ad0 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74 72 65   store the b-tre
10ae0 65 20 6c 65 61 76 65 73 20 61 72 65 20 61 6c 6c  e leaves are all
10af0 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e 67 20  ocated starting 
10b00 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 69 64  with the blockid
10b10 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  .  value stored 
10b20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f 62 6c  in the "start_bl
10b30 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ock" column of t
10b40 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
10b50 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c 0a 20   %_segdir row,. 
10b60 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67 20 61   and finishing a
10b70 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 76 61  t the blockid va
10b80 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
10b90 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  e "leaves_end_bl
10ba0 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f 66 20  ock".  field of 
10bb0 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 49 74  the same row. It
10bc0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 70 6f   is therefore po
10bd0 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
10be0 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  e through all th
10bf0 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20 61 20  e.  leaves of a 
10c00 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20  segment b-tree, 
10c10 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20 62 79  in key order, by
10c20 20 74 72 61 76 65 72 73 69 6e 67 20 74 68 65 20   traversing the 
10c30 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 74 61  %_segments .  ta
10c40 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64 20 6f  ble in blockid o
10c50 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61 72 74  rder from "start
10c60 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65 61 76  _block" to "leav
10c70 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20 20  es_end_block".  
10c80 0a 0a 5b 68 33 20 22 53 65 67 6d 65 6e 74 20 42  ..[h3 "Segment B
10c90 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 73  -Tree Leaf Nodes
10ca0 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f  "]..<p>.  The fo
10cb0 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d 20  llowing diagram 
10cc0 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72 6d  depicts the form
10cd0 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20  at of a segment 
10ce0 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65  b-tree leaf node
10cf0 2e 0a 0a 5b 46 69 67 20 66 74 73 33 5f 6c 65 61  ...[Fig fts3_lea
10d00 66 5f 6e 6f 64 65 2e 70 6e 67 20 22 53 65 67 6d  f_node.png "Segm
10d10 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20  ent B-Tree Leaf 
10d20 4e 6f 64 65 20 46 6f 72 6d 61 74 22 5d 0a 0a 3c  Node Format"]..<
10d30 70 3e 0a 20 20 54 68 65 20 66 69 72 73 74 20 74  p>.  The first t
10d40 65 72 6d 20 73 74 6f 72 65 64 20 6f 6e 20 65 61  erm stored on ea
10d50 63 68 20 6e 6f 64 65 20 28 22 54 65 72 6d 20 31  ch node ("Term 1
10d60 22 20 69 6e 20 74 68 65 20 66 69 67 75 72 65 20  " in the figure 
10d70 61 62 6f 76 65 29 20 69 73 0a 20 20 73 74 6f 72  above) is.  stor
10d80 65 64 20 76 65 72 62 61 74 69 6d 2e 20 45 61 63  ed verbatim. Eac
10d90 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 65 72  h subsequent ter
10da0 6d 20 69 73 20 70 72 65 66 69 78 2d 63 6f 6d 70  m is prefix-comp
10db0 72 65 73 73 65 64 20 77 69 74 68 20 72 65 73 70  ressed with resp
10dc0 65 63 74 0a 20 20 74 6f 20 69 74 73 20 70 72 65  ect.  to its pre
10dd0 64 65 63 65 73 73 6f 72 2e 20 54 65 72 6d 73 20  decessor. Terms 
10de0 61 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 69  are stored withi
10df0 6e 20 61 20 70 61 67 65 20 69 6e 20 73 6f 72 74  n a page in sort
10e00 65 64 20 28 6d 65 6d 63 6d 70 29 0a 20 20 6f 72  ed (memcmp).  or
10e10 64 65 72 2e 0a 0a 5b 68 33 20 22 53 65 67 6d 65  der...[h3 "Segme
10e20 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72 69  nt B-Tree Interi
10e30 6f 72 20 4e 6f 64 65 73 22 5d 0a 0a 3c 70 3e 0a  or Nodes"]..<p>.
10e40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
10e50 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73 20  diagram depicts 
10e60 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20  the format of a 
10e70 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
10e80 6e 74 65 72 69 6f 72 20 0a 20 20 28 6e 6f 6e 2d  nterior .  (non-
10e90 6c 65 61 66 29 20 6e 6f 64 65 2e 0a 0a 5b 46 69  leaf) node...[Fi
10ea0 67 20 66 74 73 33 5f 69 6e 74 65 72 69 6f 72 5f  g fts3_interior_
10eb0 6e 6f 64 65 2e 70 6e 67 20 22 53 65 67 6d 65 6e  node.png "Segmen
10ec0 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72 69 6f  t B-Tree Interio
10ed0 72 20 4e 6f 64 65 20 46 6f 72 6d 61 74 22 5d 0a  r Node Format"].
10ee0 0a 0a 5b 68 32 20 22 44 6f 63 6c 69 73 74 20 46  ..[h2 "Doclist F
10ef0 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 41  ormat"]..<p>.  A
10f00 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74   doclist consist
10f10 73 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66  s of an array of
10f20 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
10f30 6e 74 65 67 65 72 73 2c 20 73 65 72 69 61 6c 69  ntegers, seriali
10f40 7a 65 64 20 75 73 69 6e 67 0a 20 20 74 68 65 20  zed using.  the 
10f50 46 54 53 33 20 76 61 72 69 6e 74 20 66 6f 72 6d  FTS3 varint form
10f60 61 74 2e 20 45 61 63 68 20 64 6f 63 6c 69 73 74  at. Each doclist
10f70 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 75   entry is made u
10f80 70 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66  p of a series of
10f90 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65 20   two .  or more 
10fa0 69 6e 74 65 67 65 72 73 2c 20 61 73 20 66 6f 6c  integers, as fol
10fb0 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c  lows:..<ol>.  <l
10fc0 69 3e 20 54 68 65 20 64 6f 63 69 64 20 76 61 6c  i> The docid val
10fd0 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 65 6e  ue. The first en
10fe0 74 72 79 20 69 6e 20 61 20 64 6f 63 6c 69 73 74  try in a doclist
10ff0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 69   contains the li
11000 74 65 72 61 6c 20 64 6f 63 69 64 0a 20 20 20 20  teral docid.    
11010 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69     value. The fi
11020 72 73 74 20 66 69 65 6c 64 20 6f 66 20 65 61 63  rst field of eac
11030 68 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63  h subsequent doc
11040 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e 74 61  list entry conta
11050 69 6e 73 20 74 68 65 20 0a 20 20 20 20 20 20 20  ins the .       
11060 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
11070 65 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64  en the new docid
11080 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
11090 73 20 6f 6e 65 20 28 61 6c 77 61 79 73 20 61 20  s one (always a 
110a0 70 6f 73 69 74 69 76 65 20 0a 20 20 20 20 20 20  positive .      
110b0 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69 3e   number)..  <li>
110c0 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65   Zero or more te
110d0 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 2e  rm-offset lists.
110e0 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c   A term-offset l
110f0 69 73 74 20 69 73 20 70 72 65 73 65 6e 74 20 66  ist is present f
11100 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20 20 63  or each.       c
11110 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53  olumn of the FTS
11120 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  3 virtual table 
11130 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
11140 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d 2d 6f  e term. A term-o
11150 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c 69 73  ffset.       lis
11160 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
11170 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
11180 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20 3c 6c    <ol>.       <l
11190 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75  i> Constant valu
111a0 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c 64 20  e 1. This field 
111b0 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 61  is omitted for a
111c0 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  ny term-offset l
111d0 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
111e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
111f0 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20  column 0..      
11200 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75 6d 6e   <li> The column
11210 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72 20 74   number (1 for t
11220 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f  he second leftmo
11230 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29  st column, etc.)
11240 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
11250 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d 69 74     field is omit
11260 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72 6d  ted for any term
11270 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61 73 73  -offset list ass
11280 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c  ociated with col
11290 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c  umn 0..       <l
112a0 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72  i> A list of ter
112b0 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72 74 65  m-offsets, sorte
112c0 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73 74 20  d from smallest 
112d0 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e 73 74  to largest. Inst
112e0 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ead.            
112f0 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65 20 74  of storing the t
11300 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c 75 65  erm-offset value
11310 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61 63 68   literally, each
11320 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
11330 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20  .            is 
11340 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
11350 65 74 77 65 65 6e 20 74 68 65 20 63 75 72 72 65  etween the curre
11360 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 61  nt term-offset a
11370 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
11380 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65  .            one
11390 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 65   (or zero if the
113a0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66   current term-of
113b0 66 73 65 74 20 69 73 20 74 68 65 20 66 69 72 73  fset is the firs
113c0 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20 20 20  t), plus 2..    
113d0 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f   </ol>.  <li> Co
113e0 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30 2e 0a  nstant value 0..
113f0 3c 2f 6f 6c 3e 0a 0a 5b 46 69 67 20 66 74 73 33  </ol>..[Fig fts3
11400 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67 20 22 46  _doclist2.png "F
11410 54 53 33 20 44 6f 63 6c 69 73 74 20 46 6f 72 6d  TS3 Doclist Form
11420 61 74 22 5d 0a 0a 5b 46 69 67 20 66 74 73 33 5f  at"]..[Fig fts3_
11430 64 6f 63 6c 69 73 74 2e 70 6e 67 20 22 46 54 53  doclist.png "FTS
11440 33 20 44 6f 63 6c 69 73 74 20 45 6e 74 72 79 20  3 Doclist Entry 
11450 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20  Format"]..<p>.  
11460 46 6f 72 20 64 6f 63 6c 69 73 74 73 20 66 6f 72  For doclists for
11470 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d 20   which the term 
11480 61 70 70 65 61 72 73 20 69 6e 20 6d 6f 72 65 20  appears in more 
11490 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  than one column 
114a0 6f 66 20 74 68 65 20 46 54 53 33 0a 20 20 76 69  of the FTS3.  vi
114b0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 65 72  rtual table, ter
114c0 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 20 77  m-offset lists w
114d0 69 74 68 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ithin the doclis
114e0 74 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  t are stored in 
114f0 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d 62 65 72  column .  number
11500 20 6f 72 64 65 72 2e 20 54 68 69 73 20 65 6e 73   order. This ens
11510 75 72 65 73 20 74 68 61 74 20 74 68 65 20 74 65  ures that the te
11520 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61  rm-offset list a
11530 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
11540 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69 66 20 61    column 0 (if a
11550 6e 79 29 20 69 73 20 61 6c 77 61 79 73 20 66 69  ny) is always fi
11560 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67 20 74 68  rst, allowing th
11570 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
11580 64 73 20 6f 66 20 74 68 65 0a 20 20 74 65 72 6d  ds of the.  term
11590 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 74 6f 20  -offset list to 
115a0 62 65 20 6f 6d 69 74 74 65 64 20 69 6e 20 74 68  be omitted in th
115b0 69 73 20 63 61 73 65 2e 0a 0a 7d 0a              is case...}.