Documentation Source Text

Hex Artifact Content
Login

Artifact a562892db53c4ea8d12549fa05ccc35216625245:


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 73 20 61 6e 64  s - Snippets and
8940: 20 4f 66 66 73 65 74 73 22 20 7b 7d 20 73 6e 69   Offsets" {} sni
8950: 70 70 65 74 20 6f 66 66 73 65 74 73 5d 0a 0a 3c  ppet offsets]..<
8960: 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20 6d 6f  p>.  The FTS3 mo
8970: 64 75 6c 65 20 70 72 6f 76 69 64 65 73 20 74 77  dule provides tw
8980: 6f 20 73 70 65 63 69 61 6c 20 53 51 4c 20 73 63  o special SQL sc
8990: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  alar functions t
89a0: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 66 75  hat may be usefu
89b0: 6c 0a 20 20 74 6f 20 74 68 65 20 64 65 76 65 6c  l.  to the devel
89c0: 6f 70 65 72 73 20 6f 66 20 66 75 6c 6c 2d 74 65  opers of full-te
89d0: 78 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 73  xt query systems
89e0: 2c 20 22 73 6e 69 70 70 65 74 22 20 61 6e 64 20  , "snippet" and 
89f0: 22 6f 66 66 73 65 74 73 22 2e 20 54 68 65 0a 20  "offsets". The. 
8a00: 20 70 75 72 70 6f 73 65 20 6f 66 20 62 6f 74 68   purpose of both
8a10: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 6f   functions is to
8a20: 20 61 6c 6c 6f 77 20 74 68 65 20 75 73 65 72 20   allow the user 
8a30: 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
8a40: 6c 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 71 75  location of.  qu
8a50: 65 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20 74  eried terms in t
8a60: 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 75  he returned docu
8a70: 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68  ments...<p>.  Th
8a80: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8a90: 20 74 6f 20 62 6f 74 68 20 74 68 65 20 73 6e 69   to both the sni
8aa0: 70 70 65 74 20 61 6e 64 20 6f 66 66 73 65 74 73  ppet and offsets
8ab0: 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
8ac0: 74 69 6f 6e 73 0a 20 20 6d 75 73 74 20 62 65 20  tions.  must be 
8ad0: 74 68 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  the the special 
8ae0: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 6f 66  hidden column of
8af0: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 74   an FTS3 table t
8b00: 68 61 74 20 68 61 73 20 74 68 65 20 73 61 6d 65  hat has the same
8b10: 0a 20 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  .  name as the t
8b20: 61 62 6c 65 20 28 73 65 65 20 61 62 6f 76 65 29  able (see above)
8b30: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67  . For example, g
8b40: 69 76 65 6e 20 61 6e 20 46 54 53 33 20 74 61 62  iven an FTS3 tab
8b50: 6c 65 20 6e 61 6d 65 64 20 0a 20 20 22 6d 61 69  le named .  "mai
8b60: 6c 22 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 53  l":..[Code {.  S
8b70: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61  ELECT offsets(ma
8b80: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
8b90: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26  ERE mail MATCH &
8ba0: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
8bb0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
8bc0: 3b 3b 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70  ;;.  SELECT snip
8bd0: 70 65 74 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  pet(mail) FROM m
8be0: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
8bf0: 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65  ATCH &lt;full-te
8c00: 78 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73  xt query express
8c10: 69 6f 6e 26 67 74 3b 3b 0a 7d 5d 0a 0a 3c 70 3e  ion&gt;;.}]..<p>
8c20: 0a 20 20 54 68 65 20 74 77 6f 20 61 75 78 69 6c  .  The two auxil
8c30: 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 61  lary functions a
8c40: 72 65 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77  re only useful w
8c50: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73  ithin a SELECT s
8c60: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20  tatement that.  
8c70: 75 73 65 73 20 74 68 65 20 46 54 53 33 20 74 61  uses the FTS3 ta
8c80: 62 6c 65 27 73 20 66 75 6c 6c 2d 74 65 78 74 20  ble's full-text 
8c90: 69 6e 64 65 78 2e 20 49 66 20 75 73 65 64 20 77  index. If used w
8ca0: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 74  ithin a SELECT t
8cb0: 68 61 74 20 75 73 65 73 0a 20 20 74 68 65 20 22  hat uses.  the "
8cc0: 71 75 65 72 79 20 62 79 20 72 6f 77 69 64 22 20  query by rowid" 
8cd0: 6f 72 20 22 6c 69 6e 65 61 72 20 73 63 61 6e 22  or "linear scan"
8ce0: 20 73 74 72 61 74 65 67 69 65 73 2c 20 62 6f 74   strategies, bot
8cf0: 68 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  h functions retu
8d00: 72 6e 20 0a 20 20 61 6e 20 65 6d 70 74 79 20 73  rn .  an empty s
8d10: 74 72 69 6e 67 2e 0a 0a 3c 70 3e 0a 20 20 46 6f  tring...<p>.  Fo
8d20: 72 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79  r a SELECT query
8d30: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 66   that uses the f
8d40: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20  ull-text index, 
8d50: 74 68 65 20 6f 66 66 73 65 74 73 28 29 20 66 75  the offsets() fu
8d60: 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74 75 72 6e  nction .  return
8d70: 73 20 61 20 74 65 78 74 20 76 61 6c 75 65 20 63  s a text value c
8d80: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 65 72 69  ontaining a seri
8d90: 65 73 20 6f 66 20 73 70 61 63 65 2d 73 65 70 61  es of space-sepa
8da0: 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20  rated integers. 
8db0: 46 6f 72 0a 20 20 65 61 63 68 20 6f 63 63 75 72  For.  each occur
8dc0: 65 6e 63 65 20 6f 66 20 61 20 71 75 65 72 69 65  ence of a querie
8dd0: 64 20 74 65 72 6d 20 69 6e 20 74 68 65 20 64 6f  d term in the do
8de0: 63 75 6d 65 6e 74 2c 20 74 68 65 72 65 20 61 72  cument, there ar
8df0: 65 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 0a  e four integers.
8e00: 20 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65    in the returne
8e10: 64 20 6c 69 73 74 2e 20 45 61 63 68 20 73 65 74  d list. Each set
8e20: 20 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72   of four integer
8e30: 73 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  s is interpreted
8e40: 20 61 73 20 0a 20 20 66 6f 6c 6c 6f 77 73 3a 0a   as .  follows:.
8e50: 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72 5d 3c  .[Table].  [Tr]<
8e60: 74 68 3e 49 6e 74 65 67 65 72 20 3c 74 68 3e 49  th>Integer <th>I
8e70: 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 0a 20 20  nterpretation.  
8e80: 5b 54 72 5d 3c 74 64 3e 30 20 0a 20 20 20 20 20  [Tr]<td>0 .     
8e90: 20 3c 74 64 3e 54 68 65 20 63 6f 6c 75 6d 6e 20   <td>The column 
8ea0: 6e 75 6d 62 65 72 20 74 68 61 74 20 74 68 65 20  number that the 
8eb0: 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 20 6f 63  term instance oc
8ec0: 63 75 72 73 20 69 6e 20 28 30 20 66 6f 72 20 74  curs in (0 for t
8ed0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 6c 65 66  he.          lef
8ee0: 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  tmost column of 
8ef0: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20  the FTS3 table, 
8f00: 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 6c  1 for the next l
8f10: 65 66 74 6d 6f 73 74 2c 20 65 74 63 2e 29 2e 0a  eftmost, etc.)..
8f20: 20 20 5b 54 72 5d 3c 74 64 3e 31 0a 20 20 20 20    [Tr]<td>1.    
8f30: 20 20 3c 74 64 3e 54 68 65 20 74 65 72 6d 20 6e    <td>The term n
8f40: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6d 61 74  umber of the mat
8f50: 63 68 69 6e 67 20 74 65 72 6d 20 77 69 74 68 69  ching term withi
8f60: 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  n the full-text 
8f70: 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 20 20  query.          
8f80: 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 65 72 6d  expression. Term
8f90: 73 20 77 69 74 68 69 6e 20 61 20 71 75 65 72 79  s within a query
8fa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
8fb0: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
8fc0: 67 0a 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d  g.          from
8fd0: 20 30 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20   0 in the order 
8fe0: 74 68 61 74 20 74 68 65 79 20 6f 63 63 75 72 2e  that they occur.
8ff0: 0a 20 20 5b 54 72 5d 3c 74 64 3e 32 0a 20 20 20  .  [Tr]<td>2.   
9000: 20 20 20 3c 74 64 3e 54 68 65 20 62 79 74 65 20     <td>The byte 
9010: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 6d 61  offset of the ma
9020: 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69 74 68  tching term with
9030: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  in the column.. 
9040: 20 5b 54 72 5d 3c 74 64 3e 33 0a 20 20 20 20 20   [Tr]<td>3.     
9050: 20 3c 74 64 3e 54 68 65 20 73 69 7a 65 20 6f 66   <td>The size of
9060: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65   the matching te
9070: 72 6d 20 69 6e 20 62 79 74 65 73 2e 0a 3c 2f 74  rm in bytes..</t
9080: 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  able>..<p>.  The
9090: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
90a0: 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c   contains exampl
90b0: 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
90c0: 6f 66 66 73 65 74 73 20 66 75 6e 63 74 69 6f 6e  offsets function
90d0: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43 52 45  ...[Code {.  CRE
90e0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
90f0: 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73  E mail USING fts
9100: 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  3(subject, body)
9110: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
9120: 6d 61 69 6c 20 56 41 4c 55 45 53 28 27 68 65 6c  mail VALUES('hel
9130: 6c 6f 20 77 6f 72 6c 64 27 2c 20 27 54 68 69 73  lo world', 'This
9140: 20 6d 65 73 73 61 67 65 20 69 73 20 61 20 68 65   message is a he
9150: 6c 6c 6f 20 77 6f 72 6c 64 20 6d 65 73 73 61 67  llo world messag
9160: 65 2e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  e.');.  INSERT I
9170: 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55 45 53 28  NTO mail VALUES(
9180: 27 75 72 67 65 6e 74 3a 20 73 65 72 69 6f 75 73  'urgent: serious
9190: 27 2c 20 27 54 68 69 73 20 6d 61 69 6c 20 69 73  ', 'This mail is
91a0: 20 73 65 65 6e 20 61 73 20 61 20 6d 6f 72 65 20   seen as a more 
91b0: 73 65 72 69 6f 75 73 20 6d 61 69 6c 27 29 3b 0a  serious mail');.
91c0: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
91d0: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65 74  lowing query ret
91e0: 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  urns a single ro
91f0: 77 20 28 61 73 20 69 74 20 6d 61 74 63 68 65 73  w (as it matches
9200: 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 3c   only the first<
9210: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 65 6e 74 72  /i>.  <i>-- entr
9220: 79 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c  y in table "mail
9230: 22 2e 20 54 68 65 20 74 65 78 74 20 72 65 74 75  ". The text retu
9240: 72 6e 65 64 20 62 79 20 74 68 65 20 6f 66 66 73  rned by the offs
9250: 65 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 3c  ets function is<
9260: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 30 20 30  /i>.  <i>-- "0 0
9270: 20 36 20 35 20 31 20 30 20 32 34 20 35 22 2e 3c   6 5 1 0 24 5".<
9280: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
9290: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72 73    <i>-- The firs
92a0: 74 20 73 65 74 20 6f 66 20 66 6f 75 72 20 69 6e  t set of four in
92b0: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 72 65  tegers in the re
92c0: 73 75 6c 74 20 69 6e 64 69 63 61 74 65 20 74 68  sult indicate th
92d0: 61 74 20 63 6f 6c 75 6d 6e 20 30 3c 2f 69 3e 0a  at column 0</i>.
92e0: 20 20 3c 69 3e 2d 2d 20 63 6f 6e 74 61 69 6e 73    <i>-- contains
92f0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
9300: 74 65 72 6d 20 30 20 28 22 77 6f 72 6c 64 22 29  term 0 ("world")
9310: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
9320: 36 2e 20 54 68 65 20 74 65 72 6d 20 69 6e 73 74  6. The term inst
9330: 61 6e 63 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ance</i>.  <i>--
9340: 20 69 73 20 35 20 62 79 74 65 73 20 69 6e 20 73   is 5 bytes in s
9350: 69 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ize. The second 
9360: 73 65 74 20 6f 66 20 66 6f 75 72 20 69 6e 74 65  set of four inte
9370: 67 65 72 73 20 73 68 6f 77 73 20 74 68 61 74 20  gers shows that 
9380: 63 6f 6c 75 6d 6e 20 31 3c 2f 69 3e 0a 20 20 3c  column 1</i>.  <
9390: 69 3e 2d 2d 20 6f 66 20 74 68 65 20 6d 61 74 63  i>-- of the matc
93a0: 68 65 64 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73  hed row contains
93b0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
93c0: 74 65 72 6d 20 30 20 28 22 77 6f 72 6c 64 22 29  term 0 ("world")
93d0: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 3c   at byte offset<
93e0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 32 34 2e 20  /i>.  <i>-- 24. 
93f0: 41 67 61 69 6e 2c 20 74 68 65 20 74 65 72 6d 20  Again, the term 
9400: 69 6e 73 74 61 6e 63 65 20 69 73 20 35 20 62 79  instance is 5 by
9410: 74 65 73 20 69 6e 20 73 69 7a 65 2e 3c 2f 69 3e  tes in size.</i>
9420: 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74  .  SELECT offset
9430: 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69  s(mail) FROM mai
9440: 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54  l WHERE mail MAT
9450: 43 48 20 27 77 6f 72 6c 64 27 3b 0a 0a 20 20 3c  CH 'world';..  <
9460: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
9470: 6e 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73  ng query returns
9480: 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 6f 6e   also matches on
9490: 6c 79 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  ly the first row
94a0: 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c 22   in table "mail"
94b0: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 49 6e  .</i>.  <i>-- In
94c0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
94d0: 65 74 75 72 6e 65 64 20 74 65 78 74 20 69 73 20  eturned text is 
94e0: 22 31 20 30 20 35 20 37 20 31 20 30 20 33 30 20  "1 0 5 7 1 0 30 
94f0: 37 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  7".</i>.  SELECT
9500: 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46   offsets(mail) F
9510: 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d  ROM mail WHERE m
9520: 61 69 6c 20 4d 41 54 43 48 20 27 6d 65 73 73 61  ail MATCH 'messa
9530: 67 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ge';..  <i>-- Th
9540: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
9550: 79 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  y matches the se
9560: 63 6f 6e 64 20 72 6f 77 20 69 6e 20 74 61 62 6c  cond row in tabl
9570: 65 20 22 6d 61 69 6c 22 2e 20 49 74 20 72 65 74  e "mail". It ret
9580: 75 72 6e 73 20 74 68 65 3c 2f 69 3e 0a 20 20 3c  urns the</i>.  <
9590: 69 3e 2d 2d 20 74 65 78 74 20 22 31 20 30 20 32  i>-- text "1 0 2
95a0: 38 20 37 20 31 20 31 20 33 36 20 34 22 2e 20 4f  8 7 1 1 36 4". O
95b0: 6e 6c 79 20 74 68 6f 73 65 20 6f 63 63 75 72 65  nly those occure
95c0: 6e 63 65 73 20 6f 66 20 74 65 72 6d 73 20 22 73  nces of terms "s
95d0: 65 72 69 6f 75 73 22 20 61 6e 64 20 22 6d 61 69  erious" and "mai
95e0: 6c 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  l"</i>.  <i>-- t
95f0: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
9600: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
9610: 68 65 20 70 68 72 61 73 65 20 22 73 65 72 69 6f  he phrase "serio
9620: 75 73 20 6d 61 69 6c 22 20 61 72 65 20 69 64 65  us mail" are ide
9630: 6e 74 69 66 69 65 64 3b 20 74 68 65 3c 2f 69 3e  ntified; the</i>
9640: 0a 20 20 3c 69 3e 2d 2d 20 6f 74 68 65 72 20 6f  .  <i>-- other o
9650: 63 63 75 72 65 6e 63 65 73 20 6f 66 20 22 73 65  ccurences of "se
9660: 72 69 6f 75 73 22 20 61 6e 64 20 22 6d 61 69 6c  rious" and "mail
9670: 22 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 3c 2f  " are ignored.</
9680: 69 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73  i>.  SELECT offs
9690: 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  ets(mail) FROM m
96a0: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
96b0: 41 54 43 48 20 27 22 73 65 72 69 6f 75 73 20 6d  ATCH '"serious m
96c0: 61 69 6c 22 27 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20  ail"';.}]..<p>. 
96d0: 20 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e   The snippet fun
96e0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
96f0: 20 63 72 65 61 74 65 20 66 6f 72 6d 61 74 74 65   create formatte
9700: 64 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 64  d fragments of d
9710: 6f 63 75 6d 65 6e 74 20 74 65 78 74 0a 20 20 66  ocument text.  f
9720: 6f 72 20 64 69 73 70 6c 61 79 20 61 73 20 70 61  or display as pa
9730: 72 74 20 6f 66 20 61 20 66 75 6c 6c 2d 74 65 78  rt of a full-tex
9740: 74 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  t query results 
9750: 72 65 70 6f 72 74 2e 20 54 68 65 20 73 6e 69 70  report. The snip
9760: 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  pet function .  
9770: 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 62 65  may be passed be
9780: 74 77 65 65 6e 20 6f 6e 65 20 61 6e 64 20 66 6f  tween one and fo
9790: 75 72 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 73  ur arguments, as
97a0: 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62 6c   follows:..[Tabl
97b0: 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 41 72 67  e].  [Tr]<th>Arg
97c0: 75 6d 65 6e 74 20 3c 74 68 3e 44 65 66 61 75 6c  ument <th>Defaul
97d0: 74 20 56 61 6c 75 65 20 3c 74 68 3e 44 65 73 63  t Value <th>Desc
97e0: 72 69 70 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c 74  ription.  [Tr]<t
97f0: 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a 20 20 20 20  d>0 <td>N/A.    
9800: 20 20 3c 74 64 3e 20 54 68 65 20 66 69 72 73 74    <td> The first
9810: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
9820: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
9830: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
9840: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 20 20 20   the special.   
9850: 20 20 20 20 20 20 20 20 68 69 64 64 65 6e 20 63          hidden c
9860: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53  olumn of the FTS
9870: 33 20 74 61 62 6c 65 20 74 68 61 74 20 74 61 6b  3 table that tak
9880: 65 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  es the same name
9890: 20 61 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20   as the table.  
98a0: 20 20 20 20 20 20 20 20 20 69 74 73 65 6c 66 2e           itself.
98b0: 0a 20 20 5b 54 72 5d 3c 74 64 3e 31 20 3c 74 64  .  [Tr]<td>1 <td
98c0: 3e 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20 20  >"&lt;b&gt;".   
98d0: 20 20 20 3c 74 64 3e 20 54 68 65 20 22 73 74 61     <td> The "sta
98e0: 72 74 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a  rt match" text..
98f0: 20 20 5b 54 72 5d 3c 74 64 3e 32 20 3c 74 64 3e    [Tr]<td>2 <td>
9900: 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20 20 20  "&lt;b&gt;".    
9910: 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6e 64 20    <td> The "end 
9920: 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20 20 5b  match" text..  [
9930: 54 72 5d 3c 74 64 3e 33 20 3c 74 64 3e 22 26 6c  Tr]<td>3 <td>"&l
9940: 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62  t;b&gt;...&lt;/b
9950: 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e  &gt;".      <td>
9960: 20 54 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20   The "ellipses" 
9970: 74 65 78 74 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a  text..</table>..
9980: 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69 70 70 65  <p>.  The snippe
9990: 74 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  t function retur
99a0: 6e 73 20 61 20 66 72 61 67 6d 65 6e 74 20 6f 66  ns a fragment of
99b0: 20 74 65 78 74 20 66 72 6f 6d 20 74 68 65 20 6f   text from the o
99c0: 72 69 67 69 6e 61 6c 20 64 6f 63 75 6d 65 6e 74  riginal document
99d0: 20 0a 20 20 73 75 72 72 6f 75 6e 64 69 6e 67 20   .  surrounding 
99e0: 74 68 65 20 74 65 72 6d 20 69 64 65 6e 74 69 66  the term identif
99f0: 69 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ied by the first
9a00: 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 74   four integers t
9a10: 68 61 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 72  hat would be.  r
9a20: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6f  eturned by the o
9a30: 66 66 73 65 74 73 20 66 75 6e 63 74 69 6f 6e 20  ffsets function 
9a40: 69 66 20 69 74 20 77 65 72 65 20 75 73 65 64 20  if it were used 
9a50: 69 6e 20 61 20 73 69 6d 69 6c 61 72 20 63 6f 6e  in a similar con
9a60: 74 65 78 74 2e 20 49 6e 0a 20 20 6d 6f 73 74 20  text. In.  most 
9a70: 63 61 73 65 73 2c 20 74 68 65 20 73 65 6c 65 63  cases, the selec
9a80: 74 65 64 20 66 72 61 67 6d 65 6e 74 20 63 6f 6e  ted fragment con
9a90: 74 61 69 6e 73 20 34 30 20 6f 72 20 6c 65 73 73  tains 40 or less
9aa0: 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20 62   bytes of text b
9ab0: 65 66 6f 72 65 0a 20 20 74 68 65 20 69 64 65 6e  efore.  the iden
9ac0: 74 69 66 69 65 64 20 74 65 72 6d 2c 20 61 6e 64  tified term, and
9ad0: 20 34 30 20 6f 72 20 6d 6f 72 65 20 62 79 74 65   40 or more byte
9ae0: 73 20 6f 66 20 74 65 78 74 20 66 6f 6c 6c 6f 77  s of text follow
9af0: 69 6e 67 20 74 68 65 20 69 64 65 6e 74 69 66 69  ing the identifi
9b00: 65 64 0a 20 20 74 65 72 6d 2e 20 53 6c 69 67 68  ed.  term. Sligh
9b10: 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 34 30  tly less than 40
9b20: 20 62 79 74 65 73 20 6f 66 20 70 72 65 63 65 64   bytes of preced
9b30: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
9b40: 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65   text is provide
9b50: 64 0a 20 20 73 6f 20 74 68 61 74 20 74 68 65 20  d.  so that the 
9b60: 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  fragment does no
9b70: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 70 61  t contain any pa
9b80: 72 74 69 61 6c 20 74 65 72 6d 73 2e 20 49 66 20  rtial terms. If 
9b90: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 0a  the first term .
9ba0: 20 20 28 74 68 61 74 20 77 6f 75 6c 64 20 62 65    (that would be
9bb0: 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
9bc0: 74 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63  the offsets func
9bd0: 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61  tion is less tha
9be0: 6e 20 34 30 20 62 79 74 65 73 20 0a 20 20 66 72  n 40 bytes .  fr
9bf0: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
9c00: 20 6f 72 20 65 6e 64 20 6f 66 20 74 68 65 20 64   or end of the d
9c10: 6f 63 75 6d 65 6e 74 2c 20 74 68 65 6e 20 65 78  ocument, then ex
9c20: 74 72 61 20 74 65 78 74 20 6d 61 79 20 61 70 70  tra text may app
9c30: 65 61 72 20 62 65 66 6f 72 65 0a 20 20 6f 72 20  ear before.  or 
9c40: 61 66 74 65 72 20 74 68 65 20 69 64 65 6e 74 69  after the identi
9c50: 66 69 65 64 20 74 65 72 6d 20 77 69 74 68 69 6e  fied term within
9c60: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 20 74 6f   the fragment to
9c70: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
9c80: 66 65 72 65 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20  ference...<p>.  
9c90: 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
9ca0: 66 72 61 67 6d 65 6e 74 20 6f 66 20 74 65 78 74  fragment of text
9cb0: 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20   does not start 
9cc0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9cd0: 74 68 65 20 65 6e 74 69 72 65 0a 20 20 64 6f 63  the entire.  doc
9ce0: 75 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  ument, then the 
9cf0: 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74 20  "ellipses" text 
9d00: 28 73 65 65 20 74 61 62 6c 65 20 61 62 6f 76 65  (see table above
9d10: 29 20 69 73 20 70 72 65 70 65 6e 64 65 64 20 74  ) is prepended t
9d20: 6f 20 74 68 65 0a 20 20 66 72 61 67 6d 65 6e 74  o the.  fragment
9d30: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 72 65   before it is re
9d40: 74 75 72 6e 65 64 2e 20 53 69 6d 69 6c 61 72 6c  turned. Similarl
9d50: 79 2c 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66  y, if the end of
9d60: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 66 72   the returned fr
9d70: 61 67 6d 65 6e 74 0a 20 20 69 73 20 6e 6f 74 20  agment.  is not 
9d80: 61 6c 73 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  also the end of 
9d90: 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63 75 6d  the entire docum
9da0: 65 6e 74 2c 20 74 68 65 20 22 65 6c 6c 69 70 73  ent, the "ellips
9db0: 65 73 22 20 74 65 78 74 20 69 73 20 61 70 70 65  es" text is appe
9dc0: 6e 64 65 64 0a 20 20 74 6f 20 69 74 20 62 65 66  nded.  to it bef
9dd0: 6f 72 65 20 69 74 20 69 73 20 72 65 74 75 72 6e  ore it is return
9de0: 65 64 2e 0a 0a 3c 70 3e 0a 20 20 42 65 66 6f 72  ed...<p>.  Befor
9df0: 65 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  e it is returned
9e00: 2c 20 74 68 65 20 22 73 74 61 72 74 20 6d 61 74  , the "start mat
9e10: 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73 65  ch" text is inse
9e20: 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 66 72  rted into the fr
9e30: 61 67 6d 65 6e 74 0a 20 20 69 6d 6d 65 64 69 61  agment.  immedia
9e40: 74 65 6c 79 20 62 65 66 6f 72 65 20 61 6e 79 20  tely before any 
9e50: 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65  terms within the
9e60: 20 66 72 61 67 6d 65 6e 74 20 74 68 61 74 20 77   fragment that w
9e70: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 20  ould have been. 
9e80: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9e90: 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74  he offsets funct
9ea0: 69 6f 6e 20 28 6e 6f 74 20 6a 75 73 74 20 74 68  ion (not just th
9eb0: 65 20 66 69 72 73 74 20 6f 6e 65 29 20 77 65 72  e first one) wer
9ec0: 65 20 69 74 20 69 6e 76 6f 6b 65 64 0a 20 20 69  e it invoked.  i
9ed0: 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 74 65  n the same conte
9ee0: 78 74 2e 20 54 68 65 20 22 65 6e 64 20 6d 61 74  xt. The "end mat
9ef0: 63 68 22 20 69 73 20 69 6e 73 65 72 74 65 64 20  ch" is inserted 
9f00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
9f10: 6f 77 69 6e 67 20 61 6c 6c 0a 20 20 73 75 63 68  owing all.  such
9f20: 20 74 65 72 6d 73 2e 0a 0a 5b 43 6f 64 65 20 7b   terms...[Code {
9f30: 0a 20 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e 20 74  .  <b>Note: In t
9f40: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61  his block of exa
9f50: 6d 70 6c 65 73 2c 20 6e 65 77 6c 69 6e 65 73 20  mples, newlines 
9f60: 61 6e 64 20 77 68 69 74 65 73 70 61 63 65 20 63  and whitespace c
9f70: 68 61 72 61 63 74 65 72 73 20 68 61 76 65 0a 20  haracters have. 
9f80: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
9f90: 6e 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  nto the document
9fa0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
9fb0: 68 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20 61  he FTS3 table, a
9fc0: 6e 64 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  nd the expected.
9fd0: 20 20 72 65 73 75 6c 74 73 20 64 65 73 63 72 69    results descri
9fe0: 62 65 64 20 69 6e 20 53 51 4c 20 63 6f 6d 6d 65  bed in SQL comme
9ff0: 6e 74 73 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  nts. This is don
a000: 65 20 74 6f 20 65 6e 68 61 6e 63 65 20 72 65 61  e to enhance rea
a010: 64 61 62 69 6c 69 74 79 20 6f 6e 6c 79 2c 0a 20  dability only,. 
a020: 20 74 68 65 79 20 77 6f 75 6c 64 20 6e 6f 74 20   they would not 
a030: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 61 63  be present in ac
a040: 74 75 61 6c 20 53 51 4c 69 74 65 20 63 6f 6d 6d  tual SQLite comm
a050: 61 6e 64 73 20 6f 72 20 6f 75 74 70 75 74 2e 3c  ands or output.<
a060: 2f 62 3e 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  /b>..  <i>-- Cre
a070: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
a080: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 2e 3c   an FTS3 table.<
a090: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
a0a0: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 78 74 20  TUAL TABLE text 
a0b0: 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 20 20  USING fts3();.  
a0c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 78 74  INSERT INTO text
a0d0: 20 56 41 4c 55 45 53 28 27 0a 20 20 20 20 44 75   VALUES('.    Du
a0e0: 72 69 6e 67 20 33 30 20 4e 6f 76 2d 31 20 44 65  ring 30 Nov-1 De
a0f0: 63 2c 20 32 2d 33 6f 43 20 64 72 6f 70 73 2e 20  c, 2-3oC drops. 
a100: 43 6f 6f 6c 20 69 6e 20 74 68 65 20 75 70 70 65  Cool in the uppe
a110: 72 20 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e 69 6d  r portion, minim
a120: 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31  um temperature 1
a130: 34 2d 31 36 6f 43 20 0a 20 20 20 20 61 6e 64 20  4-16oC .    and 
a140: 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20  cool elsewhere, 
a150: 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74  minimum temperat
a160: 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c  ure 17-20oC. Col
a170: 64 20 74 6f 20 76 65 72 79 20 63 6f 6c 64 20 6f  d to very cold o
a180: 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20  n mountaintops, 
a190: 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 20 74 65 6d  .    minimum tem
a1a0: 70 65 72 61 74 75 72 65 20 36 2d 31 32 6f 43 2e  perature 6-12oC.
a1b0: 20 4e 6f 72 74 68 65 61 73 74 65 72 6c 79 20 77   Northeasterly w
a1c0: 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d 2f 68 72  inds 15-30 km/hr
a1d0: 2e 20 41 66 74 65 72 20 74 68 61 74 2c 20 74 65  . After that, te
a1e0: 6d 70 65 72 61 74 75 72 65 20 0a 20 20 20 20 69  mperature .    i
a1f0: 6e 63 72 65 61 73 65 73 2e 20 4e 6f 72 74 68 65  ncreases. Northe
a200: 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31 35  asterly winds 15
a210: 2d 33 30 20 6b 6d 2f 68 72 2e 20 20 20 20 20 0a  -30 km/hr.     .
a220: 20 20 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54    ');..  <i>-- T
a230: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
a240: 72 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  ry returns the t
a250: 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20  ext value:</i>. 
a260: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
a270: 2d 2d 20 20 20 22 26 6c 74 3b 62 26 67 74 3b 2e  --   "&lt;b&gt;.
a280: 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 20 65 6c 73  ..&lt;/b&gt; els
a290: 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20  ewhere, minimum 
a2a0: 74 65 6d 70 65 72 61 74 75 72 65 20 31 37 2d 32  temperature 17-2
a2b0: 30 6f 43 2e 20 26 6c 74 3b 62 26 67 74 3b 43 6f  0oC. &lt;b&gt;Co
a2c0: 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 74 6f 20  ld&lt;/b&gt; to 
a2d0: 76 65 72 79 20 26 6c 74 3b 62 26 67 74 3b 63 6f  very &lt;b&gt;co
a2e0: 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 6f 6e 3c  ld&lt;/b&gt; on<
a2f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 6d  /i>.  <i>--    m
a300: 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69 6e  ountaintops, min
a310: 69 6d 75 6d 20 26 6c 74 3b 62 26 67 74 3b 2e 2e  imum &lt;b&gt;..
a320: 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 2e 3c 2f 69  .&lt;/b&gt;".</i
a330: 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
a340: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
a350: 65 78 74 29 20 46 52 4f 4d 20 74 65 78 74 20 57  ext) FROM text W
a360: 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48 20  HERE text MATCH 
a370: 27 63 6f 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  'cold';..  <i>--
a380: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
a390: 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65  uery returns the
a3a0: 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e   text value:</i>
a3b0: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c  .  <i>--</i>.  <
a3c0: 69 3e 2d 2d 20 20 20 22 2e 2e 2e 20 32 2d 33 6f  i>--   "... 2-3o
a3d0: 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c 20 69 6e  C drops. Cool in
a3e0: 20 74 68 65 20 75 70 70 65 72 20 70 6f 72 74 69   the upper porti
a3f0: 6f 6e 2c 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d  on, &#91;minimum
a400: 26 23 39 33 3b 20 26 23 39 31 3b 74 65 6d 70 65  &#93; &#91;tempe
a410: 72 61 74 75 72 65 26 23 39 33 3b 20 31 34 2d 31  rature&#93; 14-1
a420: 36 6f 43 20 61 6e 64 20 63 6f 6f 6c 3c 2f 69 3e  6oC and cool</i>
a430: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 65 6c 73 65  .  <i>--    else
a440: 77 68 65 72 65 2c 20 26 23 39 31 3b 6d 69 6e 69  where, &#91;mini
a450: 6d 75 6d 26 23 39 33 3b 20 2e 2e 2e 22 3c 2f 69  mum&#93; ..."</i
a460: 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
a470: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
a480: 65 78 74 2c 20 27 26 23 39 31 3b 20 27 26 23 39  ext, '&#91; '&#9
a490: 33 3b 27 2c 20 27 2e 2e 2e 27 29 20 46 52 4f 4d  3;', '...') FROM
a4a0: 20 74 65 78 74 20 57 48 45 52 45 20 74 65 78 74   text WHERE text
a4b0: 20 4d 41 54 43 48 20 27 22 6d 69 6e 2a 20 74 65   MATCH '"min* te
a4c0: 6d 2a 22 27 0a 7d 5d 0a 0a 5b 68 31 20 22 54 6f  m*"'.}]..[h1 "To
a4d0: 6b 65 6e 69 7a 65 72 73 22 20 74 6f 6b 65 6e 69  kenizers" tokeni
a4e0: 7a 65 72 20 7b 74 6f 6b 65 6e 69 7a 65 72 7d 5d  zer {tokenizer}]
a4f0: 0a 0a 3c 70 3e 0a 20 20 41 6e 20 46 54 53 33 20  ..<p>.  An FTS3 
a500: 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 61 20 73  tokenizer is a s
a510: 65 74 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20  et of rules for 
a520: 65 78 74 72 61 63 74 69 6e 67 20 74 65 72 6d 73  extracting terms
a530: 20 66 72 6f 6d 20 61 20 64 6f 63 75 6d 65 6e 74   from a document
a540: 20 0a 20 20 6f 72 20 62 61 73 69 63 20 46 54 53   .  or basic FTS
a550: 33 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  3 full-text quer
a560: 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e 6c 65 73  y. ..<p>.  Unles
a570: 73 20 61 20 73 70 65 63 69 66 69 63 20 74 6f 6b  s a specific tok
a580: 65 6e 69 7a 65 72 20 69 73 20 73 70 65 63 69 66  enizer is specif
a590: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
a5a0: 68 65 20 43 52 45 41 54 45 20 0a 20 20 56 49 52  he CREATE .  VIR
a5b0: 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
a5c0: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 63 72 65  ment used to cre
a5d0: 61 74 65 20 74 68 65 20 46 54 53 33 20 74 61 62  ate the FTS3 tab
a5e0: 6c 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  le, the default 
a5f0: 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 22 73  .  tokenizer, "s
a600: 69 6d 70 6c 65 22 2c 20 69 73 20 75 73 65 64 2e  imple", is used.
a610: 20 54 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65   The simple toke
a620: 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73 20 74  nizer extracts t
a630: 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20 20 61 20 64  okens from.  a d
a640: 6f 63 75 6d 65 6e 74 20 6f 72 20 62 61 73 69 63  ocument or basic
a650: 20 46 54 53 33 20 66 75 6c 6c 2d 74 65 78 74 20   FTS3 full-text 
a660: 71 75 65 72 79 20 61 63 63 6f 72 64 69 6e 67 20  query according 
a670: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
a680: 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c 75 6c 3e   .  rules:..<ul>
a690: 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74 65 72  .  <li><p> A ter
a6a0: 6d 20 69 73 20 61 20 63 6f 6e 74 69 67 75 6f 75  m is a contiguou
a6b0: 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 6c  s sequence of el
a6c0: 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65 72  igible character
a6d0: 73 2c 20 77 68 65 72 65 20 0a 20 20 20 20 65 6c  s, where .    el
a6e0: 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65 72  igible character
a6f0: 73 20 61 72 65 20 61 6c 6c 20 61 6c 70 68 61 6e  s are all alphan
a700: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
a710: 73 2c 20 74 68 65 20 22 5f 22 20 63 68 61 72 61  s, the "_" chara
a720: 63 74 65 72 2c 0a 20 20 20 20 61 6e 64 20 61 6c  cter,.    and al
a730: 6c 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74  l characters wit
a740: 68 20 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73  h UTF codepoints
a750: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
a760: 20 65 71 75 61 6c 20 74 6f 20 31 32 38 2e 0a 20   equal to 128.. 
a770: 20 20 20 41 6c 6c 20 6f 74 68 65 72 20 63 68 61     All other cha
a780: 72 61 63 74 65 72 73 20 61 72 65 20 64 69 73 63  racters are disc
a790: 61 72 64 65 64 20 77 68 65 6e 20 73 70 6c 69 74  arded when split
a7a0: 74 69 6e 67 20 61 20 64 6f 63 75 6d 65 6e 74 20  ting a document 
a7b0: 69 6e 74 6f 20 74 65 72 6d 73 2e 0a 20 20 20 20  into terms..    
a7c0: 54 68 65 79 20 73 65 72 76 65 20 6f 6e 6c 79 20  They serve only 
a7d0: 74 6f 20 73 65 70 61 72 61 74 65 20 61 64 6a 61  to separate adja
a7e0: 63 65 6e 74 20 74 65 72 6d 73 2e 0a 0a 20 20 3c  cent terms...  <
a7f0: 6c 69 3e 3c 70 3e 20 41 6c 6c 20 75 70 70 65 72  li><p> All upper
a800: 63 61 73 65 20 63 68 61 72 61 63 74 65 72 73 20  case characters 
a810: 77 69 74 68 69 6e 20 74 68 65 20 41 53 43 49 49  within the ASCII
a820: 20 72 61 6e 67 65 20 28 55 54 46 20 63 6f 64 65   range (UTF code
a830: 70 6f 69 6e 74 73 20 6c 65 73 73 20 0a 20 20 20  points less .   
a840: 20 74 68 61 6e 20 31 32 38 29 2c 20 61 72 65 20   than 128), are 
a850: 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 74  transformed to t
a860: 68 65 69 72 20 6c 6f 77 65 72 63 61 73 65 20 65  heir lowercase e
a870: 71 75 69 76 61 6c 65 6e 74 73 20 61 73 20 70 61  quivalents as pa
a880: 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 74 6f  rt of the.    to
a890: 6b 65 6e 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  kenization proce
a8a0: 73 73 2e 20 54 68 75 73 2c 20 66 75 6c 6c 2d 74  ss. Thus, full-t
a8b0: 65 78 74 20 71 75 65 72 69 65 73 20 61 72 65 20  ext queries are 
a8c0: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
a8d0: 20 77 68 65 6e 0a 20 20 20 20 75 73 69 6e 67 20   when.    using 
a8e0: 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e  the simple token
a8f0: 69 7a 65 72 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e  izer..</ul>..<p>
a900: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
a910: 77 68 65 6e 20 61 20 64 6f 63 75 6d 65 6e 74 20  when a document 
a920: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
a930: 65 78 74 20 22 52 69 67 68 74 20 6e 6f 77 2c 20  ext "Right now, 
a940: 74 68 65 79 27 72 65 20 76 65 72 79 0a 20 20 66  they're very.  f
a950: 72 75 73 74 72 61 74 65 64 2e 22 2c 20 74 68 65  rustrated.", the
a960: 20 74 65 72 6d 73 20 65 78 74 72 61 63 74 65 64   terms extracted
a970: 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65   from the docume
a980: 6e 74 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  nt and added to 
a990: 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74  the .  full-text
a9a0: 20 69 6e 64 65 78 20 61 72 65 2c 20 69 6e 20 6f   index are, in o
a9b0: 72 64 65 72 2c 20 22 72 69 67 68 74 20 6e 6f 77  rder, "right now
a9c0: 20 74 68 65 79 20 72 65 20 76 65 72 79 20 66 72   they re very fr
a9d0: 75 73 74 72 61 74 65 64 22 2e 20 53 75 63 68 0a  ustrated". Such.
a9e0: 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 77 6f 75    a document wou
a9f0: 6c 64 20 6d 61 74 63 68 20 61 20 66 75 6c 6c 2d  ld match a full-
aa00: 74 65 78 74 20 71 75 65 72 79 20 73 75 63 68 20  text query such 
aa10: 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74  as "MATCH 'Frust
aa20: 72 61 74 65 64 27 22 2c 20 0a 20 20 61 73 20 74  rated'", .  as t
aa30: 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  he simple tokeni
aa40: 7a 65 72 20 74 72 61 6e 73 66 6f 72 6d 73 20 74  zer transforms t
aa50: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 71  he term in the q
aa60: 75 65 72 79 20 74 6f 20 6c 6f 77 65 72 63 61 73  uery to lowercas
aa70: 65 0a 20 20 62 65 66 6f 72 65 20 73 65 61 72 63  e.  before searc
aa80: 68 69 6e 67 20 74 68 65 20 66 75 6c 6c 2d 74 65  hing the full-te
aa90: 78 74 20 69 6e 64 65 78 2e 0a 0a 3c 70 3e 0a 20  xt index...<p>. 
aaa0: 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   As well as the 
aab0: 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a  "simple" tokeniz
aac0: 65 72 2c 20 74 68 65 20 46 54 53 33 20 73 6f 75  er, the FTS3 sou
aad0: 72 63 65 20 63 6f 64 65 20 66 65 61 74 75 72 65  rce code feature
aae0: 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 0a 20  s a tokenizer . 
aaf0: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 3c   that uses the <
ab00: 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f 74  a href="http://t
ab10: 61 72 74 61 72 75 73 2e 6f 72 67 2f 7e 6d 61 72  artarus.org/~mar
ab20: 74 69 6e 2f 50 6f 72 74 65 72 53 74 65 6d 6d 65  tin/PorterStemme
ab30: 72 2f 22 3e 50 6f 72 74 65 72 20 0a 20 20 53 74  r/">Porter .  St
ab40: 65 6d 6d 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d  emming algorithm
ab50: 3c 2f 61 3e 2e 20 54 68 69 73 20 74 6f 6b 65 6e  </a>. This token
ab60: 69 7a 65 72 20 75 73 65 73 20 74 68 65 20 73 61  izer uses the sa
ab70: 6d 65 20 72 75 6c 65 73 20 74 6f 20 73 65 70 61  me rules to sepa
ab80: 72 61 74 65 0a 20 20 74 68 65 20 69 6e 70 75 74  rate.  the input
ab90: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74   document into t
aba0: 65 72 6d 73 2c 20 62 75 74 20 61 73 20 77 65 6c  erms, but as wel
abb0: 6c 20 61 73 20 66 6f 6c 64 69 6e 67 20 61 6c 6c  l as folding all
abc0: 20 74 65 72 6d 73 20 74 6f 20 6c 6f 77 65 72 0a   terms to lower.
abd0: 20 20 63 61 73 65 20 69 74 20 75 73 65 73 20 74    case it uses t
abe0: 68 65 20 50 6f 72 74 65 72 20 53 74 65 6d 6d 69  he Porter Stemmi
abf0: 6e 67 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  ng algorithm to 
ac00: 72 65 64 75 63 65 20 72 65 6c 61 74 65 64 20 45  reduce related E
ac10: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 0a  nglish language.
ac20: 20 20 77 6f 72 64 73 20 74 6f 20 61 20 63 6f 6d    words to a com
ac30: 6d 6f 6e 20 72 6f 6f 74 2e 20 46 6f 72 20 65 78  mon root. For ex
ac40: 61 6d 70 6c 65 2c 20 75 73 69 6e 67 20 74 68 65  ample, using the
ac50: 20 73 61 6d 65 20 69 6e 70 75 74 20 64 6f 63 75   same input docu
ac60: 6d 65 6e 74 20 61 73 20 69 6e 20 74 68 65 0a 20  ment as in the. 
ac70: 20 70 61 72 61 67 72 61 70 68 20 61 62 6f 76 65   paragraph above
ac80: 2c 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b  , the porter tok
ac90: 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73 20  enizer extracts 
aca0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f  the following to
acb0: 6b 65 6e 73 3a 0a 20 20 22 72 69 67 68 74 20 6e  kens:.  "right n
acc0: 6f 77 20 74 68 65 69 20 76 65 72 69 20 66 72 75  ow thei veri fru
acd0: 73 74 72 61 74 22 2e 20 45 76 65 6e 20 74 68 6f  strat". Even tho
ace0: 75 67 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ugh some of thes
acf0: 65 20 74 65 72 6d 73 20 61 72 65 20 6e 6f 74 20  e terms are not 
ad00: 65 76 65 6e 0a 20 20 45 6e 67 6c 69 73 68 20 77  even.  English w
ad10: 6f 72 64 73 2c 20 69 6e 20 73 6f 6d 65 20 63 61  ords, in some ca
ad20: 73 65 73 20 75 73 69 6e 67 20 74 68 65 6d 20 74  ses using them t
ad30: 6f 20 62 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  o build the full
ad40: 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73 20 6d  -text index is m
ad50: 6f 72 65 0a 20 20 75 73 65 66 75 6c 20 74 68 61  ore.  useful tha
ad60: 6e 20 74 68 65 20 6d 6f 72 65 20 69 6e 74 65 6c  n the more intel
ad70: 6c 69 67 69 62 6c 65 20 6f 75 74 70 75 74 20 70  ligible output p
ad80: 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 73  roduced by the s
ad90: 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e  imple tokenizer.
ada0: 0a 20 20 55 73 69 6e 67 20 74 68 65 20 70 6f 72  .  Using the por
adb0: 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74  ter tokenizer, t
adc0: 68 65 20 64 6f 63 75 6d 65 6e 74 20 6e 6f 74 20  he document not 
add0: 6f 6e 6c 79 20 6d 61 74 63 68 65 73 20 66 75 6c  only matches ful
ade0: 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 0a 20  l-text queries. 
adf0: 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48 20   such as "MATCH 
ae00: 27 46 72 75 73 74 72 61 74 65 64 27 22 2c 20 62  'Frustrated'", b
ae10: 75 74 20 61 6c 73 6f 20 71 75 65 72 69 65 73 20  ut also queries 
ae20: 73 75 63 68 20 61 73 20 22 4d 41 54 43 48 20 27  such as "MATCH '
ae30: 46 72 75 73 74 72 61 74 69 6f 6e 27 22 2c 0a 20  Frustration'",. 
ae40: 20 61 73 20 74 68 65 20 74 65 72 6d 20 22 46 72   as the term "Fr
ae50: 75 73 74 72 61 74 69 6f 6e 22 20 69 73 20 72 65  ustration" is re
ae60: 64 75 63 65 64 20 62 79 20 74 68 65 20 50 6f 72  duced by the Por
ae70: 74 65 72 20 73 74 65 6d 6d 65 72 20 61 6c 67 6f  ter stemmer algo
ae80: 72 69 74 68 6d 20 74 6f 20 0a 20 20 22 66 72 75  rithm to .  "fru
ae90: 73 74 72 61 74 22 20 2d 20 6a 75 73 74 20 61 73  strat" - just as
aea0: 20 22 46 72 75 73 74 72 61 74 65 64 22 20 69 73   "Frustrated" is
aeb0: 2e 20 53 6f 2c 20 77 68 65 6e 20 75 73 69 6e 67  . So, when using
aec0: 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65   the porter toke
aed0: 6e 69 7a 65 72 2c 0a 20 20 46 54 53 33 20 69 73  nizer,.  FTS3 is
aee0: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 6e 6f   able to find no
aef0: 74 20 6a 75 73 74 20 65 78 61 63 74 20 6d 61 74  t just exact mat
af00: 63 68 65 73 20 66 6f 72 20 71 75 65 72 69 65 64  ches for queried
af10: 20 74 65 72 6d 73 2c 20 62 75 74 20 6d 61 74 63   terms, but matc
af20: 68 65 73 0a 20 20 61 67 61 69 6e 73 74 20 73 69  hes.  against si
af30: 6d 69 6c 61 72 20 45 6e 67 6c 69 73 68 20 6c 61  milar English la
af40: 6e 67 75 61 67 65 20 74 65 72 6d 73 2e 20 46 6f  nguage terms. Fo
af50: 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  r more informati
af60: 6f 6e 20 6f 6e 20 74 68 65 20 0a 20 20 50 6f 72  on on the .  Por
af70: 74 65 72 20 53 74 65 6d 6d 65 72 20 61 6c 67 6f  ter Stemmer algo
af80: 72 69 74 68 6d 2c 20 70 6c 65 61 73 65 20 72 65  rithm, please re
af90: 66 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  fer to the page 
afa0: 6c 69 6e 6b 65 64 20 61 62 6f 76 65 2e 0a 0a 3c  linked above...<
afb0: 70 3e 0a 20 20 45 78 61 6d 70 6c 65 20 69 6c 6c  p>.  Example ill
afc0: 75 73 74 72 61 74 69 6e 67 20 74 68 65 20 64 69  ustrating the di
afd0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
afe0: 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20 61 6e   the "simple" an
aff0: 64 20 22 70 6f 72 74 65 72 22 0a 20 20 74 6f 6b  d "porter".  tok
b000: 65 6e 69 7a 65 72 73 3a 0a 0a 5b 43 6f 64 65 20  enizers:..[Code 
b010: 7b 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  {.  <i>-- Create
b020: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
b030: 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  he simple tokeni
b040: 7a 65 72 2e 20 49 6e 73 65 72 74 20 61 20 64 6f  zer. Insert a do
b050: 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e 3c  cument into it.<
b060: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
b070: 54 55 41 4c 20 54 41 42 4c 45 20 73 69 6d 70 6c  TUAL TABLE simpl
b080: 65 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b  e USING fts3(tok
b090: 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 20  enize=simple);. 
b0a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 69 6d   INSERT INTO sim
b0b0: 70 6c 65 20 56 41 4c 55 45 53 28 27 52 69 67 68  ple VALUES('Righ
b0c0: 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76  t now they''re v
b0d0: 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27 29  ery frustrated')
b0e0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
b0f0: 69 72 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  irst of the foll
b100: 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65  owing two querie
b110: 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 64 6f  s matches the do
b120: 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e  cument stored in
b130: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
b140: 6c 65 20 22 73 69 6d 70 6c 65 22 2e 20 54 68 65  le "simple". The
b150: 20 73 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74   second does not
b160: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
b170: 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45   FROM simple WHE
b180: 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20  RE simple MATCH 
b190: 27 46 72 75 73 74 72 61 74 65 64 27 29 3b 0a 20  'Frustrated');. 
b1a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
b1b0: 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70  imple WHERE simp
b1c0: 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73 74 72  le MATCH 'Frustr
b1d0: 61 74 69 6f 6e 27 29 3b 0a 0a 20 20 3c 69 3e 2d  ation');..  <i>-
b1e0: 2d 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65  - Create a table
b1f0: 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74 65   using the porte
b200: 72 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73  r tokenizer. Ins
b210: 65 72 74 20 74 68 65 20 73 61 6d 65 20 64 6f 63  ert the same doc
b220: 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 3c 2f 69  ument into it</i
b230: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
b240: 41 4c 20 54 41 42 4c 45 20 70 6f 72 74 65 72 20  AL TABLE porter 
b250: 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e  USING fts3(token
b260: 69 7a 65 3d 70 6f 72 74 65 72 29 3b 0a 20 20 49  ize=porter);.  I
b270: 4e 53 45 52 54 20 49 4e 54 4f 20 70 6f 72 74 65  NSERT INTO porte
b280: 72 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20  r VALUES('Right 
b290: 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72  now they''re ver
b2a0: 79 20 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a  y frustrated');.
b2b0: 0a 20 20 3c 69 3e 2d 2d 20 42 6f 74 68 20 6f 66  .  <i>-- Both of
b2c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
b2d0: 75 65 72 69 65 73 20 6d 61 74 63 68 20 74 68 65  ueries match the
b2e0: 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64   document stored
b2f0: 20 69 6e 20 74 61 62 6c 65 20 22 70 6f 72 74 65   in table "porte
b300: 72 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  r".</i>.  SELECT
b310: 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20 57   * FROM porter W
b320: 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54 43  HERE porter MATC
b330: 48 20 27 46 72 75 73 74 72 61 74 65 64 27 29 3b  H 'Frustrated');
b340: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
b350: 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f   porter WHERE po
b360: 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75 73  rter MATCH 'Frus
b370: 74 72 61 74 69 6f 6e 27 29 3b 0a 7d 5d 0a 0a 3c  tration');.}]..<
b380: 70 3e 0a 20 20 49 66 20 74 68 69 73 20 65 78 74  p>.  If this ext
b390: 65 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  ension is compil
b3a0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
b3b0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 20 70 72  TE_ENABLE_ICU pr
b3c0: 65 2d 70 72 6f 63 65 73 73 6f 72 0a 20 20 73 79  e-processor.  sy
b3d0: 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2c 20 74 68  mbol defined, th
b3e0: 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20  en there exists 
b3f0: 61 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e  a built-in token
b400: 69 7a 65 72 20 6e 61 6d 65 64 20 22 69 63 75 22  izer named "icu"
b410: 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  .  implemented u
b420: 73 69 6e 67 20 74 68 65 20 49 43 55 20 6c 69 62  sing the ICU lib
b430: 72 61 72 79 2e 20 54 68 65 20 66 69 72 73 74 20  rary. The first 
b440: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
b450: 74 6f 20 74 68 65 0a 20 20 78 43 72 65 61 74 65  to the.  xCreate
b460: 28 29 20 6d 65 74 68 6f 64 20 28 73 65 65 20 66  () method (see f
b470: 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 29  ts3_tokenizer.h)
b480: 20 6f 66 20 74 68 69 73 20 74 6f 6b 65 6e 69 7a   of this tokeniz
b490: 65 72 20 6d 61 79 20 62 65 0a 20 20 61 6e 20 49  er may be.  an I
b4a0: 43 55 20 6c 6f 63 61 6c 65 20 69 64 65 6e 74 69  CU locale identi
b4b0: 66 69 65 72 2e 20 46 6f 72 20 65 78 61 6d 70 6c  fier. For exampl
b4c0: 65 20 22 74 72 5f 54 52 22 20 66 6f 72 20 54 75  e "tr_TR" for Tu
b4d0: 72 6b 69 73 68 20 61 73 20 75 73 65 64 0a 20 20  rkish as used.  
b4e0: 69 6e 20 54 75 72 6b 65 79 2c 20 6f 72 20 22 65  in Turkey, or "e
b4f0: 6e 5f 41 55 22 20 66 6f 72 20 45 6e 67 6c 69 73  n_AU" for Englis
b500: 68 20 61 73 20 75 73 65 64 20 69 6e 20 41 75 73  h as used in Aus
b510: 74 72 61 6c 69 61 2e 20 46 6f 72 20 65 78 61 6d  tralia. For exam
b520: 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  ple:..[Code {.  
b530: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
b540: 20 54 41 42 4c 45 20 74 68 61 69 5f 74 65 78 74   TABLE thai_text
b550: 20 55 53 49 4e 47 20 66 74 73 33 28 74 65 78 74   USING fts3(text
b560: 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20 74  , tokenize=icu t
b570: 68 5f 54 48 29 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  h_TH).}]..<p>.  
b580: 54 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65  The ICU tokenize
b590: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
b5a0: 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e   is very simple.
b5b0: 20 49 74 20 73 70 6c 69 74 73 20 74 68 65 20 69   It splits the i
b5c0: 6e 70 75 74 0a 20 20 74 65 78 74 20 61 63 63 6f  nput.  text acco
b5d0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 49 43 55  rding to the ICU
b5e0: 20 72 75 6c 65 73 20 66 6f 72 20 66 69 6e 64 69   rules for findi
b5f0: 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 69  ng word boundari
b600: 65 73 20 61 6e 64 20 64 69 73 63 61 72 64 73 0a  es and discards.
b610: 20 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74 68 61    any tokens tha
b620: 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65  t consist entire
b630: 6c 79 20 6f 66 20 77 68 69 74 65 2d 73 70 61 63  ly of white-spac
b640: 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 73  e. This may be s
b650: 75 69 74 61 62 6c 65 0a 20 20 66 6f 72 20 73 6f  uitable.  for so
b660: 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  me applications 
b670: 69 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73 2c  in some locales,
b680: 20 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20 49 66   but not all. If
b690: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a 20 20   more complex.  
b6a0: 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65  processing is re
b6b0: 71 75 69 72 65 64 2c 20 66 6f 72 20 65 78 61 6d  quired, for exam
b6c0: 70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ple to implement
b6d0: 20 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20 20 64   stemming or.  d
b6e0: 69 73 63 61 72 64 20 70 75 6e 63 74 75 61 74 69  iscard punctuati
b6f0: 6f 6e 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  on, this can be 
b700: 64 6f 6e 65 20 62 79 20 63 72 65 61 74 69 6e 67  done by creating
b710: 20 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69   a tokenizer.  i
b720: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
b730: 61 74 20 75 73 65 73 20 74 68 65 20 49 43 55 20  at uses the ICU 
b740: 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70 61 72  tokenizer as par
b750: 74 20 6f 66 20 69 74 73 20 69 6d 70 6c 65 6d 65  t of its impleme
b760: 6e 74 61 74 69 6f 6e 2e 0a 0a 5b 68 32 20 22 43  ntation...[h2 "C
b770: 75 73 74 6f 6d 20 28 55 73 65 72 20 49 6d 70 6c  ustom (User Impl
b780: 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69 7a  emented) Tokeniz
b790: 65 72 73 22 5d 0a 0a 3c 70 3e 0a 20 20 41 73 20  ers"]..<p>.  As 
b7a0: 77 65 6c 6c 20 61 73 20 74 68 65 20 62 75 69 6c  well as the buil
b7b0: 74 2d 69 6e 20 22 73 69 6d 70 6c 65 22 2c 20 22  t-in "simple", "
b7c0: 70 6f 72 74 65 72 22 20 61 6e 64 20 28 70 6f 73  porter" and (pos
b7d0: 73 69 62 6c 79 29 20 22 69 63 75 22 20 74 6f 6b  sibly) "icu" tok
b7e0: 65 6e 69 7a 65 72 73 2c 0a 20 20 46 54 53 33 20  enizers,.  FTS3 
b7f0: 65 78 70 6f 72 74 73 20 61 6e 20 69 6e 74 65 72  exports an inter
b800: 66 61 63 65 20 74 68 61 74 20 61 6c 6c 6f 77 73  face that allows
b810: 20 75 73 65 72 73 20 74 6f 20 69 6d 70 6c 65 6d   users to implem
b820: 65 6e 74 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e  ent custom token
b830: 69 7a 65 72 73 0a 20 20 75 73 69 6e 67 20 43 2e  izers.  using C.
b840: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75   The interface u
b850: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  sed to create a 
b860: 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  new tokenizer is
b870: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 0a 20 20   defined and .  
b880: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b890: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts3_tokenizer.
b8a0: 68 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 0a  h source file...
b8b0: 3c 70 3e 0a 20 20 52 65 67 69 73 74 65 72 69 6e  <p>.  Registerin
b8c0: 67 20 61 20 6e 65 77 20 46 54 53 33 20 74 6f 6b  g a new FTS3 tok
b8d0: 65 6e 69 7a 65 72 20 69 73 20 73 69 6d 69 6c 61  enizer is simila
b8e0: 72 20 74 6f 20 72 65 67 69 73 74 65 72 69 6e 67  r to registering
b8f0: 20 61 20 6e 65 77 0a 20 20 76 69 72 74 75 61 6c   a new.  virtual
b900: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77 69   table module wi
b910: 74 68 20 53 51 4c 69 74 65 2e 20 54 68 65 20 75  th SQLite. The u
b920: 73 65 72 20 70 61 73 73 65 73 20 61 20 70 6f 69  ser passes a poi
b930: 6e 74 65 72 20 74 6f 20 61 0a 20 20 73 74 72 75  nter to a.  stru
b940: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
b950: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 76 61 72   pointers to var
b960: 69 6f 75 73 20 63 61 6c 6c 62 61 63 6b 20 66 75  ious callback fu
b970: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 6d  nctions that.  m
b980: 61 6b 65 20 75 70 20 74 68 65 20 69 6d 70 6c 65  ake up the imple
b990: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b9a0: 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 74   new tokenizer t
b9b0: 79 70 65 2e 20 46 6f 72 20 74 6f 6b 65 6e 69 7a  ype. For tokeniz
b9c0: 65 72 73 2c 0a 20 20 74 68 65 20 73 74 72 75 63  ers,.  the struc
b9d0: 74 75 72 65 20 28 64 65 66 69 6e 65 64 20 69 6e  ture (defined in
b9e0: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts3_tokenizer.
b9f0: 68 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 22  h) is called.  "
ba00: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
ba10: 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70 3e 0a  r_module"...<p>.
ba20: 20 20 46 54 53 33 20 64 6f 65 73 20 6e 6f 74 20    FTS3 does not 
ba30: 65 78 70 6f 73 65 20 61 20 43 2d 66 75 6e 63 74  expose a C-funct
ba40: 69 6f 6e 20 74 68 61 74 20 75 73 65 72 73 20 63  ion that users c
ba50: 61 6c 6c 20 74 6f 20 72 65 67 69 73 74 65 72 20  all to register 
ba60: 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 20  new.  tokenizer 
ba70: 74 79 70 65 73 20 77 69 74 68 20 61 20 64 61 74  types with a dat
ba80: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 6e  abase handle. In
ba90: 73 74 65 61 64 2c 20 74 68 65 20 70 6f 69 6e 74  stead, the point
baa0: 65 72 20 6d 75 73 74 0a 20 20 62 65 20 65 6e 63  er must.  be enc
bab0: 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20 62  oded as an SQL b
bac0: 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64 20 70 61  lob value and pa
bad0: 73 73 65 64 20 74 6f 20 46 54 53 33 20 74 68 72  ssed to FTS3 thr
bae0: 6f 75 67 68 20 74 68 65 20 53 51 4c 0a 20 20 65  ough the SQL.  e
baf0: 6e 67 69 6e 65 20 62 79 20 65 76 61 6c 75 61 74  ngine by evaluat
bb00: 69 6e 67 20 61 20 73 70 65 63 69 61 6c 20 73 63  ing a special sc
bb10: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c 20 22  alar function, "
bb20: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
bb30: 22 2e 0a 20 20 54 68 65 20 66 74 73 33 5f 74 6f  "..  The fts3_to
bb40: 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69  kenizer() functi
bb50: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
bb60: 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f   with one or two
bb70: 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20 61 73   arguments,.  as
bb80: 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 43 6f 64 65   follows:..[Code
bb90: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 66 74   {.    SELECT ft
bba0: 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74  s3_tokenizer(&lt
bbb0: 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26  ;tokenizer-name&
bbc0: 67 74 3b 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  gt;);.    SELECT
bbd0: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
bbe0: 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61  &lt;tokenizer-na
bbf0: 6d 65 26 67 74 3b 2c 20 26 6c 74 3b 73 71 6c 69  me&gt;, &lt;sqli
bc00: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
bc10: 64 75 6c 65 20 70 74 72 26 67 74 3b 29 3b 0a 7d  dule ptr&gt;);.}
bc20: 5d 0a 0a 3c 70 3e 0a 20 20 57 68 65 72 65 20 3c  ]..<p>.  Where <
bc30: 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20  tokenizer-name> 
bc40: 69 73 20 61 20 73 74 72 69 6e 67 20 69 64 65 6e  is a string iden
bc50: 74 69 66 79 69 6e 67 20 74 68 65 20 74 6f 6b 65  tifying the toke
bc60: 6e 69 7a 65 72 20 61 6e 64 0a 20 20 3c 73 71 6c  nizer and.  <sql
bc70: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
bc80: 6f 64 75 6c 65 20 70 74 72 3e 20 69 73 20 61 20  odule ptr> is a 
bc90: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
bca0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
bcb0: 6d 6f 64 75 6c 65 0a 20 20 73 74 72 75 63 74 75  module.  structu
bcc0: 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e  re encoded as an
bcd0: 20 53 51 4c 20 62 6c 6f 62 2e 20 49 66 20 74 68   SQL blob. If th
bce0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
bcf0: 74 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 20 20  t is present,.  
bd00: 69 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64  it is registered
bd10: 20 61 73 20 74 6f 6b 65 6e 69 7a 65 72 20 3c 74   as tokenizer <t
bd20: 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 61  okenizer-name> a
bd30: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 69 74 0a  nd a copy of it.
bd40: 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6f    returned. If o
bd50: 6e 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  nly one argument
bd60: 20 69 73 20 70 61 73 73 65 64 2c 20 61 20 70 6f   is passed, a po
bd70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f 6b  inter to the tok
bd80: 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65  enizer.  impleme
bd90: 6e 74 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  ntation currentl
bda0: 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
bdb0: 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e  <tokenizer-name>
bdc0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
bdd0: 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f  encoded as a blo
bde0: 62 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63  b. Or, if no suc
bdf0: 68 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 69 73  h tokenizer exis
be00: 74 73 2c 20 61 6e 20 53 51 4c 20 65 78 63 65 70  ts, an SQL excep
be10: 74 69 6f 6e 0a 20 20 28 65 72 72 6f 72 29 20 69  tion.  (error) i
be20: 73 20 72 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a 20  s raised...<p>. 
be30: 20 3c 62 3e 53 45 43 55 52 49 54 59 20 57 41 52   <b>SECURITY WAR
be40: 4e 49 4e 47 3c 2f 62 3e 3a 20 49 66 20 74 68 65  NING</b>: If the
be50: 20 66 74 73 33 20 65 78 74 65 6e 73 69 6f 6e 20   fts3 extension 
be60: 69 73 20 75 73 65 64 20 69 6e 20 61 6e 20 65 6e  is used in an en
be70: 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 77 68 65 72  vironment.  wher
be80: 65 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 61  e potentially ma
be90: 6c 69 63 69 6f 75 73 20 75 73 65 72 73 20 6d 61  licious users ma
bea0: 79 20 65 78 65 63 75 74 65 20 61 72 62 69 74 72  y execute arbitr
beb0: 61 72 79 20 53 51 4c 2c 20 74 68 65 79 20 73 68  ary SQL, they sh
bec0: 6f 75 6c 64 20 0a 20 20 62 65 20 70 72 65 76 65  ould .  be preve
bed0: 6e 74 65 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 69  nted from invoki
bee0: 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65  ng the fts3_toke
bef0: 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  nizer() function
bf00: 2c 20 70 6f 73 73 69 62 6c 79 20 75 73 69 6e 67  , possibly using
bf10: 20 0a 20 20 74 68 65 20 5c 5b 73 71 6c 69 74 65   .  the \[sqlite
bf20: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
bf30: 28 29 7c 61 75 74 68 6f 72 69 73 61 74 69 6f 6e  ()|authorisation
bf40: 20 63 61 6c 6c 62 61 63 6b 5c 5d 2e 0a 0a 3c 70   callback\]...<p
bf50: 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
bf60: 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
bf70: 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 63   an example of c
bf80: 61 6c 6c 69 6e 67 20 74 68 65 20 66 74 73 33 5f  alling the fts3_
bf90: 74 6f 6b 65 6e 69 7a 65 72 28 29 0a 20 20 66 75  tokenizer().  fu
bfa0: 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 43 20 63 6f  nction from C co
bfb0: 64 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  de:..[Code {.  <
bfc0: 69 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69 73 74  i>/*.  ** Regist
bfd0: 65 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 69  er a tokenizer i
bfe0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69  mplementation wi
bff0: 74 68 20 46 54 53 33 2e 0a 20 20 2a 2f 3c 2f 69  th FTS3..  */</i
c000: 3e 0a 20 20 69 6e 74 20 72 65 67 69 73 74 65 72  >.  int register
c010: 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20 73  Tokenizer(.    s
c020: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20  qlite3 *db,.    
c030: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 20  char *zName,.   
c040: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
c050: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
c060: 2a 70 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  *p.  ){.    int 
c070: 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
c080: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
c090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
c0a0: 6c 20 3d 20 22 53 45 4c 45 43 54 20 66 74 73 33  l = "SELECT fts3
c0b0: 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 2c 20 3f 29  _tokenizer(?, ?)
c0c0: 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ";..    rc = sql
c0d0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
c0e0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
c0f0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
c100: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c110: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c120: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  rc;.    }..    s
c130: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
c140: 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65  (pStmt, 1, zName
c150: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
c160: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
c170: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
c180: 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a 65 6f 66  t, 2, &p, sizeof
c190: 28 70 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  (p), SQLITE_STAT
c1a0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
c1b0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
c1c0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
c1d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
c1e0: 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e 2f 2a 0a  );.  }..  <i>/*.
c1f0: 20 20 2a 2a 20 51 75 65 72 79 20 46 54 53 33 20    ** Query FTS3 
c200: 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  for the tokenize
c210: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
c220: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 20 20   named zName..  
c230: 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71 75 65  */</i>.  int que
c240: 72 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20  ryTokenizer(.   
c250: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c260: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20    char *zName,. 
c270: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
c280: 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
c290: 65 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20 20 20  e **pp.  ){.    
c2a0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  int rc;.    sqli
c2b0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
c2c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c2d0: 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20  *zSql = "SELECT 
c2e0: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f  fts3_tokenizer(?
c2f0: 29 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d 20 30  )";..    *pp = 0
c300: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c310: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
c320: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
c330: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
c340: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
c360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
c370: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
c380: 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20  Stmt, 1, zName, 
c390: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
c3a0: 43 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  C);.    if( SQLI
c3b0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
c3c0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
c3d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c3e0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
c3f0: 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 42  mt, 0)==SQLITE_B
c400: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  LOB ){.        m
c410: 65 6d 63 70 79 28 70 70 2c 20 73 71 6c 69 74 65  emcpy(pp, sqlite
c420: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
c430: 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f 66 28  tmt, 0), sizeof(
c440: 2a 70 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  *pp));.      }. 
c450: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
c460: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
c470: 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d 5d  e(pStmt);.  }.}]
c480: 0a 0a 20 20 0a 20 20 0a 0a 5b 68 31 20 22 44 61  ..  .  ..[h1 "Da
c490: 74 61 20 53 74 72 75 63 74 75 72 65 73 22 20 7b  ta Structures" {
c4a0: 7d 20 7b 73 65 67 6d 65 6e 74 20 62 74 72 65 65  } {segment btree
c4b0: 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 73  }]..<p>.  This s
c4c0: 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73  ection describes
c4d0: 20 61 74 20 61 20 68 69 67 68 2d 6c 65 76 65 6c   at a high-level
c4e0: 20 74 68 65 20 77 61 79 20 74 68 65 20 46 54 53   the way the FTS
c4f0: 33 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73 20  3 module stores 
c500: 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e 64 20  its.  index and 
c510: 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 64  content in the d
c520: 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20 3c  atabase. It is <
c530: 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  b>not necessary 
c540: 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20 75 6e  to read or .  un
c550: 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61 74  derstand the mat
c560: 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20 73 65  erial in this se
c570: 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74  ction in order t
c580: 6f 20 75 73 65 20 46 54 53 33 3c 2f 62 3e 20 69  o use FTS3</b> i
c590: 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61 74  n an .  applicat
c5a0: 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ion. However, it
c5b0: 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20 74   may be useful t
c5c0: 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65  o application de
c5d0: 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70 74  velopers attempt
c5e0: 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79 7a  ing .  to analyz
c5f0: 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64  e and understand
c600: 20 46 54 53 33 20 70 65 72 66 6f 72 6d 61 6e 63   FTS3 performanc
c610: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c620: 73 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70  s, or to develop
c630: 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61  ers .  contempla
c640: 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74  ting enhancement
c650: 73 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e  s to the existin
c660: 67 20 46 54 53 33 20 66 65 61 74 75 72 65 20 73  g FTS3 feature s
c670: 65 74 2e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65  et...<p>.  For e
c680: 61 63 68 20 46 54 53 33 20 76 69 72 74 75 61 6c  ach FTS3 virtual
c690: 20 74 61 62 6c 65 20 69 6e 20 61 20 64 61 74 61   table in a data
c6a0: 62 61 73 65 2c 20 74 68 72 65 65 20 72 65 61 6c  base, three real
c6b0: 20 28 6e 6f 6e 2d 76 69 72 74 75 61 6c 29 20 74   (non-virtual) t
c6c0: 61 62 6c 65 73 20 0a 20 20 61 72 65 20 63 72 65  ables .  are cre
c6d0: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ated to store th
c6e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
c6f0: 61 2e 20 54 68 65 20 72 65 61 6c 20 74 61 62 6c  a. The real tabl
c700: 65 73 20 61 72 65 20 6e 61 6d 65 64 20 22 25 5f  es are named "%_
c710: 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 25 5f 73  content",.  "%_s
c720: 65 67 64 69 72 22 20 61 6e 64 20 22 25 5f 73 65  egdir" and "%_se
c730: 67 6d 65 6e 74 73 22 2c 20 77 68 65 72 65 20 22  gments", where "
c740: 25 22 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  %" is replaced b
c750: 79 20 74 68 65 20 6e 61 6d 65 20 73 75 70 70 6c  y the name suppl
c760: 69 65 64 20 62 79 0a 20 20 74 68 65 20 75 73 65  ied by.  the use
c770: 72 20 66 6f 72 20 74 68 65 20 46 54 53 33 20 76  r for the FTS3 v
c780: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c  irtual table...<
c790: 70 3e 0a 20 20 54 68 65 20 6c 65 66 74 6d 6f 73  p>.  The leftmos
c7a0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
c7b0: 22 25 5f 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c  "%_content" tabl
c7c0: 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  e is an INTEGER 
c7d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c  PRIMARY KEY fiel
c7e0: 64 0a 20 20 6e 61 6d 65 64 20 22 64 6f 63 69 64  d.  named "docid
c7f0: 22 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ". Following thi
c800: 73 20 69 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  s is one column 
c810: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
c820: 6f 66 20 74 68 65 20 46 54 53 33 0a 20 20 76 69  of the FTS3.  vi
c830: 72 74 75 61 6c 20 74 61 62 6c 65 20 61 73 20 64  rtual table as d
c840: 65 63 6c 61 72 65 64 20 62 79 20 74 68 65 20 75  eclared by the u
c850: 73 65 72 2c 20 6e 61 6d 65 64 20 62 79 20 70 72  ser, named by pr
c860: 65 70 65 6e 64 69 6e 67 20 74 68 65 20 63 6f 6c  epending the col
c870: 75 6d 6e 20 6e 61 6d 65 0a 20 20 73 75 70 70 6c  umn name.  suppl
c880: 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ied by the user 
c890: 77 69 74 68 20 22 63 3c 69 3e 4e 3c 2f 69 3e 22  with "c<i>N</i>"
c8a0: 2c 20 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e  , where <i>N</i>
c8b0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
c8c0: 20 74 68 65 20 0a 20 20 63 6f 6c 75 6d 6e 20 77   the .  column w
c8d0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ithin the table,
c8e0: 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c   numbered from l
c8f0: 65 66 74 20 74 6f 20 72 69 67 68 74 20 73 74 61  eft to right sta
c900: 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20 44 61  rting with 1. Da
c910: 74 61 0a 20 20 74 79 70 65 73 20 73 75 70 70 6c  ta.  types suppl
c920: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
c930: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
c940: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72 65   declaration are
c950: 20 6e 6f 74 20 75 73 65 64 20 61 73 0a 20 20 70   not used as.  p
c960: 61 72 74 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e  art of the %_con
c970: 74 65 6e 74 20 74 61 62 6c 65 20 64 65 63 6c 61  tent table decla
c980: 72 61 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  ration. For exam
c990: 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  ple:..[Code {.  
c9a0: 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61  <i>-- Virtual ta
c9b0: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c  ble declaration<
c9c0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
c9d0: 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20 55  TUAL TABLE abc U
c9e0: 53 49 4e 47 20 46 54 53 33 28 61 20 4e 55 4d 42  SING FTS3(a NUMB
c9f0: 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b 0a  ER, b TEXT, c);.
ca00: 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73 70  .  <i>-- Corresp
ca10: 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e 74  onding %_content
ca20: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
ca30: 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  on</i>.  CREATE 
ca40: 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65 6e  TABLE abc_conten
ca50: 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20  t(docid INTEGER 
ca60: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 30 61  PRIMARY KEY, c0a
ca70: 2c 20 63 31 62 2c 20 63 32 63 29 3b 0a 7d 5d 0a  , c1b, c2c);.}].
ca80: 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f 63 6f 6e  .<p>.  The %_con
ca90: 74 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 61  tent table conta
caa0: 69 6e 73 20 74 68 65 20 75 6e 61 64 75 6c 74 65  ins the unadulte
cab0: 72 61 74 65 64 20 64 61 74 61 20 69 6e 73 65 72  rated data inser
cac0: 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
cad0: 0a 20 20 69 6e 74 6f 20 74 68 65 20 46 54 53 33  .  into the FTS3
cae0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62   virtual table b
caf0: 79 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  y the user. If t
cb00: 68 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74  he user does not
cb10: 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 73 75   explicitly.  su
cb20: 70 70 6c 79 20 61 20 22 64 6f 63 69 64 22 20 76  pply a "docid" v
cb30: 61 6c 75 65 20 77 68 65 6e 20 69 6e 73 65 72 74  alue when insert
cb40: 69 6e 67 20 72 65 63 6f 72 64 73 2c 20 6f 6e 65  ing records, one
cb50: 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 75 74   is selected aut
cb60: 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 62 79 20  omatically.  by 
cb70: 74 68 65 20 73 79 73 74 65 6d 2e 0a 0a 3c 70 3e  the system...<p>
cb80: 0a 20 20 54 68 65 20 74 77 6f 20 72 65 6d 61 69  .  The two remai
cb90: 6e 69 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f 73  ning tables, %_s
cba0: 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65  egments and %_se
cbb0: 67 64 69 72 2c 20 61 72 65 20 75 73 65 64 20 74  gdir, are used t
cbc0: 6f 20 73 74 6f 72 65 20 74 68 65 20 0a 20 20 66  o store the .  f
cbd0: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
cbe0: 43 6f 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68  Conceptually, th
cbf0: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 6c 6f  is index is a lo
cc00: 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
cc10: 6d 61 70 73 20 65 61 63 68 20 0a 20 20 74 65 72  maps each .  ter
cc20: 6d 20 28 77 6f 72 64 29 20 74 6f 20 74 68 65 20  m (word) to the 
cc30: 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c  set of docid val
cc40: 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ues correspondin
cc50: 67 20 74 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  g to records in 
cc60: 74 68 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74  the .  %_content
cc70: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
cc80: 61 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ain one or more 
cc90: 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
cca0: 68 65 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65  he term. To.  re
ccb0: 74 72 69 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d  trieve all docum
ccc0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
ccd0: 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 74 65  n a specified te
cce0: 72 6d 2c 20 74 68 65 20 46 54 53 33 20 6d 6f 64  rm, the FTS3 mod
ccf0: 75 6c 65 0a 20 20 71 75 65 72 69 65 73 20 74 68  ule.  queries th
cd00: 69 73 20 69 6e 64 65 78 20 74 6f 20 64 65 74 65  is index to dete
cd10: 72 6d 69 6e 65 20 74 68 65 20 73 65 74 20 6f 66  rmine the set of
cd20: 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 66 6f   docid values fo
cd30: 72 20 72 65 63 6f 72 64 73 20 74 68 61 74 0a 20  r records that. 
cd40: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72   contain the ter
cd50: 6d 2c 20 74 68 65 6e 20 72 65 74 72 69 65 76 65  m, then retrieve
cd60: 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 64  s the required d
cd70: 6f 63 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  ocuments from th
cd80: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 74 61  e %_content.  ta
cd90: 62 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ble. Regardless 
cda0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  of the schema of
cdb0: 20 74 68 65 20 46 54 53 33 20 76 69 72 74 75 61   the FTS3 virtua
cdc0: 6c 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 73  l table, the %_s
cdd0: 65 67 6d 65 6e 74 73 0a 20 20 61 6e 64 20 25 5f  egments.  and %_
cde0: 73 65 67 64 69 72 20 74 61 62 6c 65 73 20 61 72  segdir tables ar
cdf0: 65 20 61 6c 77 61 79 73 20 63 72 65 61 74 65 64  e always created
ce00: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 43   as follows:..[C
ce10: 6f 64 65 20 7b 0a 20 20 43 52 45 41 54 45 20 54  ode {.  CREATE T
ce20: 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28  ABLE %_segments(
ce30: 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e 54  .    blockid INT
ce40: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ce50: 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d  ,       <i>-- B-
ce60: 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69 3e  tree node id</i>
ce70: 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62 20  .    block blob 
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d          <i>-- B-
cea0: 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61 3c 2f  tree node data</
ceb0: 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54  i>.  );..  CREAT
cec0: 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64 69 72  E TABLE %_segdir
ced0: 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e 54 45  (.    level INTE
cee0: 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49 4e 54  GER,.    idx INT
cef0: 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72 74 5f  EGER,.    start_
cf00: 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20  block INTEGER,  
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
cf20: 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66 69  -- Blockid of fi
cf30: 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65  rst node in %_se
cf40: 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 6c  gments</i>.    l
cf50: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
cf60: 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20  INTEGER,        
cf70: 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20    <i>-- Blockid 
cf80: 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f 64  of last leaf nod
cf90: 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
cfa0: 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f 63  /i>.    end_bloc
cfb0: 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20  k INTEGER,      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d             <i>--
cfd0: 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74   Blockid of last
cfe0: 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65   node in %_segme
cff0: 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f 74  nts</i>.    root
d000: 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20   BLOB,          
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
d020: 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f 74  i>-- B-tree root
d030: 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50 52   node</i>.    PR
d040: 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c  IMARY KEY(level,
d050: 20 69 64 78 29 0a 20 20 29 3b 0a 7d 5d 0a 0a 3c   idx).  );.}]..<
d060: 70 3e 0a 20 20 54 68 65 20 73 63 68 65 6d 61 20  p>.  The schema 
d070: 64 65 70 69 63 74 65 64 20 61 62 6f 76 65 20 69  depicted above i
d080: 73 20 6e 6f 74 20 64 65 73 69 67 6e 65 64 20 74  s not designed t
d090: 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
d0a0: 2d 74 65 78 74 20 69 6e 64 65 78 20 0a 20 20 64  -text index .  d
d0b0: 69 72 65 63 74 6c 79 2e 20 49 6e 73 74 65 61 64  irectly. Instead
d0c0: 2c 20 69 74 20 69 73 20 75 73 65 64 20 74 6f 20  , it is used to 
d0d0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 2d 74 72  one or more b-tr
d0e0: 65 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  ee structures. T
d0f0: 68 65 72 65 0a 20 20 69 73 20 6f 6e 65 20 62 2d  here.  is one b-
d100: 74 72 65 65 20 66 6f 72 20 65 61 63 68 20 72 6f  tree for each ro
d110: 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  w in the %_segdi
d120: 72 20 74 61 62 6c 65 2e 20 54 68 65 20 25 5f 73  r table. The %_s
d130: 65 67 64 69 72 20 74 61 62 6c 65 0a 20 20 72 6f  egdir table.  ro
d140: 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  w contains the r
d150: 6f 6f 74 20 6e 6f 64 65 20 61 6e 64 20 76 61 72  oot node and var
d160: 69 6f 75 73 20 6d 65 74 61 2d 64 61 74 61 20 61  ious meta-data a
d170: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d180: 68 65 0a 20 20 62 2d 74 72 65 65 20 73 74 72 75  he.  b-tree stru
d190: 63 74 75 72 65 2c 20 61 6e 64 20 74 68 65 20 25  cture, and the %
d1a0: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
d1b0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 6f 74 68  contains all oth
d1c0: 65 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29 0a 20 20  er (non-root).  
d1d0: 62 2d 74 72 65 65 20 6e 6f 64 65 73 2e 20 45 61  b-tree nodes. Ea
d1e0: 63 68 20 62 2d 74 72 65 65 20 69 73 20 72 65 66  ch b-tree is ref
d1f0: 65 72 72 65 64 20 74 6f 20 61 73 20 61 20 22 73  erred to as a "s
d200: 65 67 6d 65 6e 74 22 2e 20 4f 6e 63 65 20 69 74  egment". Once it
d210: 20 68 61 73 0a 20 20 62 65 65 6e 20 63 72 65 61   has.  been crea
d220: 74 65 64 2c 20 61 20 73 65 67 6d 65 6e 74 20 62  ted, a segment b
d230: 2d 74 72 65 65 20 69 73 20 6e 65 76 65 72 20 75  -tree is never u
d240: 70 64 61 74 65 64 20 28 61 6c 74 68 6f 75 67 68  pdated (although
d250: 20 69 74 20 6d 61 79 20 62 65 0a 20 20 64 65 6c   it may be.  del
d260: 65 74 65 64 20 61 6c 74 6f 67 65 74 68 65 72 29  eted altogether)
d270: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6b 65 79  ...<p>.  The key
d280: 73 20 75 73 65 64 20 62 79 20 65 61 63 68 20 73  s used by each s
d290: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 61 72  egment b-tree ar
d2a0: 65 20 74 65 72 6d 73 20 28 77 6f 72 64 73 29 2e  e terms (words).
d2b0: 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a   As well as the.
d2c0: 20 20 6b 65 79 2c 20 65 61 63 68 20 73 65 67 6d    key, each segm
d2d0: 65 6e 74 20 62 2d 74 72 65 65 20 65 6e 74 72 79  ent b-tree entry
d2e0: 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
d2f0: 65 64 20 22 64 6f 63 6c 69 73 74 22 20 28 64 6f  ed "doclist" (do
d300: 63 75 6d 65 6e 74 20 6c 69 73 74 29 2e 0a 20 20  cument list)..  
d310: 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73  A doclist consis
d320: 74 73 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ts of zero or mo
d330: 72 65 20 65 6e 74 72 69 65 73 2c 20 77 68 65 72  re entries, wher
d340: 65 20 65 61 63 68 20 65 6e 74 72 79 20 63 6f 6e  e each entry con
d350: 73 69 73 74 73 20 6f 66 3a 0a 0a 3c 75 6c 3e 0a  sists of:..<ul>.
d360: 20 20 3c 6c 69 3e 20 41 20 64 6f 63 69 64 20 28    <li> A docid (
d370: 64 6f 63 75 6d 65 6e 74 20 69 64 29 2c 20 61 6e  document id), an
d380: 64 0a 20 20 3c 6c 69 3e 20 41 20 6c 69 73 74 20  d.  <li> A list 
d390: 6f 66 20 74 65 72 6d 20 6f 66 66 73 65 74 73 2c  of term offsets,
d3a0: 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 63   one for each oc
d3b0: 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20  currence of the 
d3c0: 74 65 72 6d 20 77 69 74 68 69 6e 0a 20 20 20 20  term within.    
d3d0: 20 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e     the document.
d3e0: 20 41 20 74 65 72 6d 20 6f 66 66 73 65 74 20 69   A term offset i
d3f0: 6e 64 69 63 61 74 65 73 20 74 68 65 20 6e 75 6d  ndicates the num
d400: 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 28 77  ber of tokens (w
d410: 6f 72 64 73 29 0a 20 20 20 20 20 20 20 74 68 61  ords).       tha
d420: 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
d430: 68 65 20 74 65 72 6d 20 69 6e 20 71 75 65 73 74  he term in quest
d440: 69 6f 6e 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  ion, not the num
d450: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
d460: 73 0a 20 20 20 20 20 20 20 6f 72 20 62 79 74 65  s.       or byte
d470: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
d480: 74 68 65 20 74 65 72 6d 20 6f 66 66 73 65 74 20  the term offset 
d490: 6f 66 20 74 68 65 20 74 65 72 6d 20 22 77 61 72  of the term "war
d4a0: 22 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  " in the.       
d4b0: 70 68 72 61 73 65 20 22 41 6e 63 65 73 74 72 61  phrase "Ancestra
d4c0: 6c 20 76 6f 69 63 65 73 20 70 72 6f 70 68 65 73  l voices prophes
d4d0: 79 69 6e 67 20 77 61 72 21 22 20 69 73 20 33 2e  ying war!" is 3.
d4e0: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 45 6e  .</ul>..<p>.  En
d4f0: 74 72 69 65 73 20 77 69 74 68 69 6e 20 61 20 64  tries within a d
d500: 6f 63 6c 69 73 74 20 61 72 65 20 73 6f 72 74 65  oclist are sorte
d510: 64 20 62 79 20 64 6f 63 69 64 2e 20 50 6f 73 69  d by docid. Posi
d520: 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 61 20 64  tions within a d
d530: 6f 63 6c 69 73 74 0a 20 20 65 6e 74 72 79 20 61  oclist.  entry a
d540: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 73 63  re stored in asc
d550: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 0a 3c  ending order...<
d560: 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  p>.  The content
d570: 73 20 6f 66 20 74 68 65 20 6c 6f 67 69 63 61 6c  s of the logical
d580: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
d590: 20 69 73 20 66 6f 75 6e 64 20 62 79 20 6d 65 72   is found by mer
d5a0: 67 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e 74 65  ging the.  conte
d5b0: 6e 74 73 20 6f 66 20 61 6c 6c 20 73 65 67 6d 65  nts of all segme
d5c0: 6e 74 20 62 2d 74 72 65 65 73 2e 20 49 66 20 61  nt b-trees. If a
d5d0: 20 74 65 72 6d 20 69 73 20 70 72 65 73 65 6e 74   term is present
d5e0: 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   in more than on
d5f0: 65 0a 20 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  e.  segment b-tr
d600: 65 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 70 73  ee, then it maps
d610: 20 74 6f 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66   to the union of
d620: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
d630: 20 64 6f 63 6c 69 73 74 2e 20 49 66 2c 0a 20 20   doclist. If,.  
d640: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
d650: 6d 2c 20 74 68 65 20 73 61 6d 65 20 64 6f 63 69  m, the same doci
d660: 64 20 6f 63 63 75 72 73 20 69 6e 20 6d 6f 72 65  d occurs in more
d670: 20 74 68 61 6e 20 6f 6e 65 20 64 6f 63 6c 69 73   than one doclis
d680: 74 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 20 20 74  t, then only.  t
d690: 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20  he doclist that 
d6a0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6d  is part of the m
d6b0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
d6c0: 61 74 65 64 20 73 65 67 6d 65 6e 74 20 62 2d 74  ated segment b-t
d6d0: 72 65 65 20 69 73 20 0a 20 20 63 6f 6e 73 69 64  ree is .  consid
d6e0: 65 72 65 64 20 76 61 6c 69 64 2e 20 0a 0a 3c 70  ered valid. ..<p
d6f0: 3e 0a 20 20 4d 75 6c 74 69 70 6c 65 20 62 2d 74  >.  Multiple b-t
d700: 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20 61  ree structures a
d710: 72 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  re used instead 
d720: 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72  of a single b-tr
d730: 65 65 20 74 6f 20 72 65 64 75 63 65 0a 20 20 74  ee to reduce.  t
d740: 68 65 20 63 6f 73 74 20 6f 66 20 69 6e 73 65 72  he cost of inser
d750: 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74  ting records int
d760: 6f 20 46 54 53 33 20 74 61 62 6c 65 73 2e 20 57  o FTS3 tables. W
d770: 68 65 6e 20 61 20 6e 65 77 20 72 65 63 6f 72 64  hen a new record
d780: 20 69 73 20 0a 20 20 69 6e 73 65 72 74 65 64 20   is .  inserted 
d790: 69 6e 74 6f 20 61 6e 20 46 54 53 33 20 74 61 62  into an FTS3 tab
d7a0: 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79 20  le that already 
d7b0: 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20 6f  contains a lot o
d7c0: 66 20 64 61 74 61 2c 20 69 74 20 69 73 0a 20 20  f data, it is.  
d7d0: 6c 69 6b 65 6c 79 20 74 68 61 74 20 6d 61 6e 79  likely that many
d7e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 69 6e   of the terms in
d7f0: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
d800: 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
d810: 65 6e 74 20 69 6e 0a 20 20 61 20 6c 61 72 67 65  ent in.  a large
d820: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 69 73 74   number of exist
d830: 69 6e 67 20 72 65 63 6f 72 64 73 2e 20 49 66 20  ing records. If 
d840: 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20  a single b-tree 
d850: 77 65 72 65 20 75 73 65 64 2c 20 74 68 65 6e 0a  were used, then.
d860: 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74 20    large doclist 
d870: 73 74 72 75 63 74 75 72 65 73 20 77 6f 75 6c 64  structures would
d880: 20 68 61 76 65 20 74 6f 20 62 65 20 6c 6f 61 64   have to be load
d890: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
d8a0: 62 61 73 65 2c 0a 20 20 61 6d 65 6e 64 65 64 20  base,.  amended 
d8b0: 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
d8c0: 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 65 72  ew docid and ter
d8d0: 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 2c 20 74  m-offset list, t
d8e0: 68 65 6e 20 77 72 69 74 74 65 6e 20 62 61 63 6b  hen written back
d8f0: 0a 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  .  to the databa
d900: 73 65 2e 20 55 73 69 6e 67 20 6d 75 6c 74 69 70  se. Using multip
d910: 6c 65 20 62 2d 74 72 65 65 20 74 61 62 6c 65 73  le b-tree tables
d920: 20 61 6c 6c 6f 77 73 20 74 68 69 73 20 74 6f 20   allows this to 
d930: 62 65 20 61 76 6f 69 64 65 64 0a 20 20 62 79 20  be avoided.  by 
d940: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 62  creating a new b
d950: 2d 74 72 65 65 20 77 68 69 63 68 20 63 61 6e 20  -tree which can 
d960: 62 65 20 6d 65 72 67 65 64 20 77 69 74 68 20 74  be merged with t
d970: 68 65 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  he existing b-tr
d980: 65 65 0a 20 20 28 6f 72 20 62 2d 74 72 65 65 73  ee.  (or b-trees
d990: 29 20 6c 61 74 65 72 20 6f 6e 2e 20 4d 65 72 67  ) later on. Merg
d9a0: 69 6e 67 20 6f 66 20 62 2d 74 72 65 65 20 73 74  ing of b-tree st
d9b0: 72 75 63 74 75 72 65 73 20 63 61 6e 20 62 65 20  ructures can be 
d9c0: 70 65 72 66 6f 72 6d 65 64 20 61 73 0a 20 20 61  performed as.  a
d9d0: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 61 73 6b   background task
d9e0: 2c 20 6f 72 20 6f 6e 63 65 20 61 20 63 65 72 74  , or once a cert
d9f0: 61 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  ain number of se
da00: 70 61 72 61 74 65 20 62 2d 74 72 65 65 20 73 74  parate b-tree st
da10: 72 75 63 74 75 72 65 73 0a 20 20 68 61 76 65 20  ructures.  have 
da20: 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 65 64  been accumulated
da30: 2e 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68 69  . Of course, thi
da40: 73 20 73 63 68 65 6d 65 20 6d 61 6b 65 73 20 71  s scheme makes q
da50: 75 65 72 69 65 73 20 6d 6f 72 65 20 65 78 70 65  ueries more expe
da60: 6e 73 69 76 65 0a 20 20 28 61 73 20 74 68 65 20  nsive.  (as the 
da70: 46 54 53 33 20 63 6f 64 65 20 6d 61 79 20 68 61  FTS3 code may ha
da80: 76 65 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  ve to look up in
da90: 64 69 76 69 64 75 61 6c 20 74 65 72 6d 73 20 69  dividual terms i
daa0: 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  n more than one.
dab0: 20 20 62 2d 74 72 65 65 20 61 6e 64 20 6d 65 72    b-tree and mer
dac0: 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 29 2c  ge the results),
dad0: 20 62 75 74 20 69 74 20 68 61 73 20 62 65 65 6e   but it has been
dae0: 20 66 6f 75 6e 64 20 74 68 61 74 20 69 6e 20 70   found that in p
daf0: 72 61 63 74 69 63 65 20 74 68 69 73 0a 20 20 6f  ractice this.  o
db00: 76 65 72 68 65 61 64 20 69 73 20 6f 66 74 65 6e  verhead is often
db10: 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20 0a   negligible..  .
db20: 5b 68 32 20 22 56 61 72 69 61 62 6c 65 20 4c 65  [h2 "Variable Le
db30: 6e 67 74 68 20 49 6e 74 65 67 65 72 20 28 76 61  ngth Integer (va
db40: 72 69 6e 74 29 20 46 6f 72 6d 61 74 22 5d 0a 0a  rint) Format"]..
db50: 3c 70 3e 0a 20 20 49 6e 74 65 67 65 72 20 76 61  <p>.  Integer va
db60: 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20 70  lues stored as p
db70: 61 72 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62  art of segment b
db80: 2d 74 72 65 65 20 6e 6f 64 65 73 20 61 72 65 20  -tree nodes are 
db90: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68  encoded using th
dba0: 65 0a 20 20 46 54 53 33 20 76 61 72 69 6e 74 20  e.  FTS3 varint 
dbb0: 66 6f 72 6d 61 74 2e 20 54 68 69 73 20 65 6e 63  format. This enc
dbc0: 6f 64 69 6e 67 20 69 73 20 73 69 6d 69 6c 61 72  oding is similar
dbd0: 2c 20 62 75 74 20 3c 62 3e 6e 6f 74 20 69 64 65  , but <b>not ide
dbe0: 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20 74 6f 20 74  ntical</b>, to t
dbf0: 68 65 0a 20 20 74 68 65 20 3c 61 20 68 72 65 66  he.  the <a href
dc00: 3d 22 66 69 6c 65 66 6f 72 6d 61 74 2e 68 74 6d  ="fileformat.htm
dc10: 6c 23 76 61 72 69 6e 74 5f 66 6f 72 6d 61 74 22  l#varint_format"
dc20: 3e 53 51 4c 69 74 65 20 76 61 72 69 6e 74 20 66  >SQLite varint f
dc30: 6f 72 6d 61 74 3c 2f 61 3e 2e 0a 0a 3c 70 3e 0a  ormat</a>...<p>.
dc40: 20 20 41 6e 20 65 6e 63 6f 64 65 64 20 46 54 53    An encoded FTS
dc50: 33 20 76 61 72 69 6e 74 20 63 6f 6e 73 75 6d 65  3 varint consume
dc60: 73 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 61 6e  s between one an
dc70: 64 20 74 65 6e 20 62 79 74 65 73 20 6f 66 20 73  d ten bytes of s
dc80: 70 61 63 65 2e 20 54 68 65 0a 20 20 6e 75 6d 62  pace. The.  numb
dc90: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
dca0: 69 72 65 64 20 69 73 20 64 65 74 65 72 6d 69 6e  ired is determin
dcb0: 65 64 20 62 79 20 74 68 65 20 73 69 67 6e 20 61  ed by the sign a
dcc0: 6e 64 20 6d 61 67 6e 69 74 75 64 65 20 6f 66 20  nd magnitude of 
dcd0: 74 68 65 0a 20 20 69 6e 74 65 67 65 72 20 76 61  the.  integer va
dce0: 6c 75 65 20 65 6e 63 6f 64 65 64 2e 20 4d 6f 72  lue encoded. Mor
dcf0: 65 20 61 63 63 75 72 61 74 65 6c 79 2c 20 74 68  e accurately, th
dd00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
dd10: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  s used to store.
dd20: 20 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69 6e    the encoded in
dd30: 74 65 67 65 72 20 64 65 70 65 6e 64 73 20 6f 6e  teger depends on
dd40: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66   the position of
dd50: 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   the most signif
dd60: 69 63 61 6e 74 20 73 65 74 20 62 69 74 0a 20 20  icant set bit.  
dd70: 69 6e 20 74 68 65 20 36 34 2d 62 69 74 20 74 77  in the 64-bit tw
dd80: 6f 73 2d 63 6f 6d 70 6c 69 6d 65 6e 74 20 72 65  os-compliment re
dd90: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
dda0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
ddb0: 65 2e 20 4e 65 67 61 74 69 76 65 0a 20 20 76 61  e. Negative.  va
ddc0: 6c 75 65 73 20 61 6c 77 61 79 73 20 68 61 76 65  lues always have
ddd0: 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   the most signif
dde0: 69 63 61 6e 74 20 62 69 74 20 73 65 74 20 28 74  icant bit set (t
ddf0: 68 65 20 73 69 67 6e 20 62 69 74 29 2c 20 61 6e  he sign bit), an
de00: 64 20 73 6f 20 61 72 65 0a 20 20 61 6c 77 61 79  d so are.  alway
de10: 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 74  s stored using t
de20: 68 65 20 66 75 6c 6c 20 74 65 6e 20 62 79 74 65  he full ten byte
de30: 73 2e 20 50 6f 73 69 74 69 76 65 20 69 6e 74 65  s. Positive inte
de40: 67 65 72 20 76 61 6c 75 65 73 20 6d 61 79 20 62  ger values may b
de50: 65 0a 20 20 73 74 6f 72 65 64 20 75 73 69 6e 67  e.  stored using
de60: 20 6c 65 73 73 20 73 70 61 63 65 2e 0a 0a 3c 70   less space...<p
de70: 3e 0a 20 20 54 68 65 20 66 69 6e 61 6c 20 62 79  >.  The final by
de80: 74 65 20 6f 66 20 61 6e 20 65 6e 63 6f 64 65 64  te of an encoded
de90: 20 46 54 53 33 20 76 61 72 69 6e 74 20 68 61 73   FTS3 varint has
dea0: 20 69 74 73 20 6d 6f 73 74 20 73 69 67 6e 69 66   its most signif
deb0: 69 63 61 6e 74 20 62 69 74 20 0a 20 20 63 6c 65  icant bit .  cle
dec0: 61 72 65 64 2e 20 41 6c 6c 20 70 72 65 63 65 64  ared. All preced
ded0: 69 6e 67 20 62 79 74 65 73 20 68 61 76 65 20 74  ing bytes have t
dee0: 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63  he most signific
def0: 61 6e 74 20 62 69 74 20 73 65 74 2e 20 44 61 74  ant bit set. Dat
df00: 61 0a 20 20 69 73 20 73 74 6f 72 65 64 20 69 6e  a.  is stored in
df10: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73   the remaining s
df20: 65 76 65 6e 20 6c 65 61 73 74 20 73 69 67 6e 66  even least signf
df30: 69 63 61 6e 74 20 62 69 74 73 20 6f 66 20 65 61  icant bits of ea
df40: 63 68 20 62 79 74 65 2e 0a 20 20 54 68 65 20 66  ch byte..  The f
df50: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
df60: 20 65 6e 63 6f 64 65 64 20 72 65 70 72 65 73 65   encoded represe
df70: 6e 74 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ntation contains
df80: 20 74 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69   the least signi
df90: 66 69 63 61 6e 74 0a 20 20 73 65 76 65 6e 20 62  ficant.  seven b
dfa0: 69 74 73 20 6f 66 20 74 68 65 20 65 6e 63 6f 64  its of the encod
dfb0: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
dfc0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 62 79 74  . The second byt
dfd0: 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64  e of the encoded
dfe0: 0a 20 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  .  representatio
dff0: 6e 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  n, if it is pres
e000: 65 6e 74 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68  ent, contains th
e010: 65 20 73 65 76 65 6e 20 6e 65 78 74 20 6c 65 61  e seven next lea
e020: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20  st significant. 
e030: 20 62 69 74 73 20 6f 66 20 74 68 65 20 69 6e 74   bits of the int
e040: 65 67 65 72 20 76 61 6c 75 65 2c 20 61 6e 64 20  eger value, and 
e050: 73 6f 20 6f 6e 2e 20 54 68 65 20 66 6f 6c 6c 6f  so on. The follo
e060: 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61  wing table conta
e070: 69 6e 73 20 65 78 61 6d 70 6c 65 73 0a 20 20 6f  ins examples.  o
e080: 66 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65  f encoded intege
e090: 72 20 76 61 6c 75 65 73 3a 0a 0a 5b 54 61 62 6c  r values:..[Tabl
e0a0: 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 44 65 63  e].  [Tr]<th>Dec
e0b0: 69 6d 61 6c 3c 74 68 3e 48 65 78 61 64 65 63 69  imal<th>Hexadeci
e0c0: 6d 61 6c 3c 74 68 20 77 69 64 74 68 3d 31 30 30  mal<th width=100
e0d0: 25 3e 45 6e 63 6f 64 65 64 20 52 65 70 72 65 73  %>Encoded Repres
e0e0: 65 6e 74 61 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c  entation.  [Tr]<
e0f0: 74 64 3e 34 33 3c 74 64 3e 30 78 30 30 30 30 30  td>43<td>0x00000
e100: 30 30 30 30 30 30 30 30 30 32 42 3c 74 64 3e 30  0000000002B<td>0
e110: 78 32 42 20 0a 20 20 5b 54 72 5d 3c 74 64 3e 32  x2B .  [Tr]<td>2
e120: 30 30 38 31 35 3c 74 64 3e 30 78 30 30 30 30 30  00815<td>0x00000
e130: 30 30 30 30 30 30 33 31 30 36 46 3c 74 64 3e 30  0000003106F<td>0
e140: 78 39 43 20 30 78 41 30 20 30 78 30 43 0a 20 20  x9C 0xA0 0x0C.  
e150: 5b 54 72 5d 3c 74 64 3e 2d 31 3c 74 64 3e 30 78  [Tr]<td>-1<td>0x
e160: 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  FFFFFFFFFFFFFFFF
e170: 3c 74 64 3e 30 78 46 46 20 30 78 46 46 20 30 78  <td>0xFF 0xFF 0x
e180: 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
e190: 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46  F 0xFF 0xFF 0xFF
e1a0: 20 30 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a 20   0x01.</table>. 
e1b0: 20 0a 0a 5b 68 32 20 22 53 65 67 6d 65 6e 74 20   ..[h2 "Segment 
e1c0: 42 2d 54 72 65 65 20 46 6f 72 6d 61 74 22 5d 0a  B-Tree Format"].
e1d0: 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20 62  .<p>.  Segment b
e1e0: 2d 74 72 65 65 73 20 61 72 65 20 70 72 65 66 69  -trees are prefi
e1f0: 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b 2d  x-compressed b+-
e200: 74 72 65 65 73 2e 20 54 68 65 72 65 20 69 73 20  trees. There is 
e210: 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  one segment b-tr
e220: 65 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f  ee.  for each ro
e230: 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  w in the %_segdi
e240: 72 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f  r table (see abo
e250: 76 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e 6f  ve). The root no
e260: 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
e270: 74 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73 74  t.  b-tree is st
e280: 6f 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69  ored as a blob i
e290: 6e 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69 65  n the "root" fie
e2a0: 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ld of the corres
e2b0: 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f 66  ponding row.  of
e2c0: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
e2d0: 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e  ble. All other n
e2e0: 6f 64 65 73 20 28 69 66 20 61 6e 79 20 65 78 69  odes (if any exi
e2f0: 73 74 29 20 61 72 65 20 73 74 6f 72 65 64 20 69  st) are stored i
e300: 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22 20  n the .  "blob" 
e310: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f  column of the %_
e320: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
e330: 4e 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68 65  Nodes within the
e340: 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
e350: 65 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66 69  e are.  identifi
e360: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
e370: 72 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 62  r value in the b
e380: 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66 20  lockid field of 
e390: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e3a0: 67 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f 6c  g.  row. The fol
e3b0: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
e3c0: 63 72 69 62 65 73 20 74 68 65 20 66 69 65 6c 64  cribes the field
e3d0: 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  s of the %_segdi
e3e0: 72 20 74 61 62 6c 65 3a 0a 0a 5b 54 61 62 6c 65  r table:..[Table
e3f0: 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 43 6f 6c 75  ].  [Tr]<th>Colu
e400: 6d 6e 20 20 20 20 20 20 20 20 20 20 20 3c 74 68  mn           <th
e410: 20 77 69 64 74 68 3d 31 30 30 25 3e 49 6e 74 65   width=100%>Inte
e420: 72 70 72 65 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c  rpretion.  [Tr]<
e430: 74 64 3e 6c 65 76 65 6c 20 20 20 20 20 20 20 20  td>level        
e440: 20 20 20 20 3c 74 64 3e 20 0a 20 20 20 20 42 65      <td> .    Be
e450: 74 77 65 65 6e 20 74 68 65 6d 2c 20 74 68 65 20  tween them, the 
e460: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
e470: 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78  "level" and "idx
e480: 22 20 66 69 65 6c 64 73 20 64 65 66 69 6e 65 20  " fields define 
e490: 74 68 65 0a 20 20 20 20 72 65 6c 61 74 69 76 65  the.    relative
e4a0: 20 61 67 65 20 6f 66 20 74 68 65 20 73 65 67 6d   age of the segm
e4b0: 65 6e 74 20 62 2d 74 72 65 65 2e 20 54 68 65 20  ent b-tree. The 
e4c0: 73 6d 61 6c 6c 65 72 20 74 68 65 20 76 61 6c 75  smaller the valu
e4d0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  e stored in the.
e4e0: 20 20 20 20 22 6c 65 76 65 6c 22 20 66 69 65 6c      "level" fiel
e4f0: 64 2c 20 74 68 65 20 6d 6f 72 65 20 72 65 63 65  d, the more rece
e500: 6e 74 6c 79 20 74 68 65 20 73 65 67 6d 65 6e 74  ntly the segment
e510: 20 62 2d 74 72 65 65 20 77 61 73 20 63 72 65 61   b-tree was crea
e520: 74 65 64 2e 20 49 66 20 74 77 6f 0a 20 20 20 20  ted. If two.    
e530: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20  segment b-trees 
e540: 61 72 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  are of the same 
e550: 22 6c 65 76 65 6c 22 2c 20 74 68 65 20 73 65 67  "level", the seg
e560: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 6c 61  ment with the la
e570: 72 67 65 72 0a 20 20 20 20 76 61 6c 75 65 20 73  rger.    value s
e580: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 69 64  tored in the "id
e590: 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72  x" column is mor
e5a0: 65 20 72 65 63 65 6e 74 2e 20 54 68 65 20 50 52  e recent. The PR
e5b0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
e5c0: 61 69 6e 74 0a 20 20 20 20 6f 6e 20 74 68 65 20  aint.    on the 
e5d0: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 70  %_segdir table p
e5e0: 72 65 76 65 6e 74 73 20 61 6e 79 20 74 77 6f 20  revents any two 
e5f0: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 68 61  segments from ha
e600: 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ving the same va
e610: 6c 75 65 0a 20 20 20 20 66 6f 72 20 62 6f 74 68  lue.    for both
e620: 20 74 68 65 20 22 6c 65 76 65 6c 22 20 61 6e 64   the "level" and
e630: 20 22 69 64 78 22 20 66 69 65 6c 64 73 2e 0a 20   "idx" fields.. 
e640: 20 5b 54 72 5d 3c 74 64 3e 69 64 78 20 20 20 20   [Tr]<td>idx    
e650: 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e 20 53            <td> S
e660: 65 65 20 61 62 6f 76 65 2e 0a 20 20 5b 54 72 5d  ee above..  [Tr]
e670: 3c 74 64 3e 73 74 61 72 74 5f 62 6c 6f 63 6b 20  <td>start_block 
e680: 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 54 68       <td>.    Th
e690: 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63  e blockid that c
e6a0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
e6b0: 65 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20  e node with the 
e6c0: 73 6d 61 6c 6c 65 73 74 20 62 6c 6f 63 6b 69 64  smallest blockid
e6d0: 20 74 68 61 74 20 0a 20 20 20 20 62 65 6c 6f 6e   that .    belon
e6e0: 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65  gs to this segme
e6f0: 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65  nt b-tree. Or ze
e700: 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
e710: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
e720: 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20      fits on the 
e730: 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74  root node. If it
e740: 20 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f   exists, this no
e750: 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 6c  de is always a l
e760: 65 61 66 20 6e 6f 64 65 2e 0a 20 20 5b 54 72 5d  eaf node..  [Tr]
e770: 3c 74 64 3e 6c 65 61 76 65 73 5f 65 6e 64 5f 62  <td>leaves_end_b
e780: 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68  lock <td>.    Th
e790: 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63  e blockid that c
e7a0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
e7b0: 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 74 68  e leaf node with
e7c0: 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f   the largest blo
e7d0: 63 6b 69 64 20 0a 20 20 20 20 74 68 61 74 20 62  ckid .    that b
e7e0: 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73  elongs to this s
e7f0: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f  egment b-tree. O
e800: 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e  r zero if the en
e810: 74 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  tire segment b-t
e820: 72 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e 20  ree.    fits on 
e830: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20  the root node.. 
e840: 20 5b 54 72 5d 3c 74 64 3e 65 6e 64 5f 62 6c 6f   [Tr]<td>end_blo
e850: 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20  ck <td>.    The 
e860: 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72  blockid that cor
e870: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
e880: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 77 69  interior node wi
e890: 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 0a  th the largest .
e8a0: 20 20 20 20 62 6c 6f 63 6b 69 64 20 74 68 61 74      blockid that
e8b0: 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73   belongs to this
e8c0: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e   segment b-tree.
e8d0: 20 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68 65    Or zero if the
e8e0: 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 0a   entire segment.
e8f0: 20 20 20 20 62 2d 74 72 65 65 20 66 69 74 73 20      b-tree fits 
e900: 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  on the root node
e910: 2e 20 49 66 20 69 74 20 65 78 69 73 74 73 2c 20  . If it exists, 
e920: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c 77  this node is alw
e930: 61 79 73 20 61 6e 0a 20 20 20 20 69 6e 74 65 72  ays an.    inter
e940: 69 6f 72 20 6e 6f 64 65 2e 0a 20 20 5b 54 72 5d  ior node..  [Tr]
e950: 3c 74 64 3e 72 6f 6f 74 20 20 20 20 20 20 20 20  <td>root        
e960: 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 42 6c       <td>.    Bl
e970: 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ob containing th
e980: 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
e990: 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  he segment b-tre
e9a0: 65 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e  e..</table>..<p>
e9b0: 0a 20 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  .  Apart from th
e9c0: 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65  e root node, the
e9d0: 20 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 6b 65   nodes that make
e9e0: 20 75 70 20 61 20 73 69 6e 67 6c 65 20 73 65 67   up a single seg
e9f0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 61 72 65 0a  ment b-tree are.
ea00: 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20    always stored 
ea10: 75 73 69 6e 67 20 61 20 63 6f 6e 74 69 67 75 6f  using a contiguo
ea20: 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  us sequence of b
ea30: 6c 6f 63 6b 69 64 73 2e 20 46 75 72 74 68 65 72  lockids. Further
ea40: 6d 6f 72 65 2c 20 74 68 65 0a 20 20 6e 6f 64 65  more, the.  node
ea50: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61  s that make up a
ea60: 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66   single level of
ea70: 20 74 68 65 20 62 2d 74 72 65 65 20 61 72 65 20   the b-tree are 
ea80: 74 68 65 6d 73 65 6c 76 65 73 20 73 74 6f 72 65  themselves store
ea90: 64 20 61 73 0a 20 20 61 20 63 6f 6e 74 69 67 75  d as.  a contigu
eaa0: 6f 75 73 20 62 6c 6f 63 6b 2c 20 69 6e 20 62 2d  ous block, in b-
eab0: 74 72 65 65 20 6f 72 64 65 72 2e 20 54 68 65 20  tree order. The 
eac0: 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
ead0: 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 0a  nce of blockids.
eae0: 20 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20    used to store 
eaf0: 74 68 65 20 62 2d 74 72 65 65 20 6c 65 61 76 65  the b-tree leave
eb00: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
eb10: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
eb20: 65 20 62 6c 6f 63 6b 69 64 0a 20 20 76 61 6c 75  e blockid.  valu
eb30: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
eb40: 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 63 6f  "start_block" co
eb50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 72 72  lumn of the corr
eb60: 65 73 70 6f 6e 64 69 6e 67 20 25 5f 73 65 67 64  esponding %_segd
eb70: 69 72 20 72 6f 77 2c 0a 20 20 61 6e 64 20 66 69  ir row,.  and fi
eb80: 6e 69 73 68 69 6e 67 20 61 74 20 74 68 65 20 62  nishing at the b
eb90: 6c 6f 63 6b 69 64 20 76 61 6c 75 65 20 73 74 6f  lockid value sto
eba0: 72 65 64 20 69 6e 20 74 68 65 20 22 6c 65 61 76  red in the "leav
ebb0: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 0a 20 20  es_end_block".  
ebc0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 61 6d  field of the sam
ebd0: 65 20 72 6f 77 2e 20 49 74 20 69 73 20 74 68 65  e row. It is the
ebe0: 72 65 66 6f 72 65 20 70 6f 73 73 69 62 6c 65 20  refore possible 
ebf0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
ec00: 67 68 20 61 6c 6c 20 74 68 65 0a 20 20 6c 65 61  gh all the.  lea
ec10: 76 65 73 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  ves of a segment
ec20: 20 62 2d 74 72 65 65 2c 20 69 6e 20 6b 65 79 20   b-tree, in key 
ec30: 6f 72 64 65 72 2c 20 62 79 20 74 72 61 76 65 72  order, by traver
ec40: 73 69 6e 67 20 74 68 65 20 25 5f 73 65 67 6d 65  sing the %_segme
ec50: 6e 74 73 20 0a 20 20 74 61 62 6c 65 20 69 6e 20  nts .  table in 
ec60: 62 6c 6f 63 6b 69 64 20 6f 72 64 65 72 20 66 72  blockid order fr
ec70: 6f 6d 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22  om "start_block"
ec80: 20 74 6f 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f   to "leaves_end_
ec90: 62 6c 6f 63 6b 22 2e 20 20 0a 0a 5b 68 33 20 22  block".  ..[h3 "
eca0: 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c  Segment B-Tree L
ecb0: 65 61 66 20 4e 6f 64 65 73 22 5d 0a 0a 3c 70 3e  eaf Nodes"]..<p>
ecc0: 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
ecd0: 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73   diagram depicts
ece0: 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61   the format of a
ecf0: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
ed00: 6c 65 61 66 20 6e 6f 64 65 2e 0a 0a 5b 46 69 67  leaf node...[Fig
ed10: 20 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65 2e   fts3_leaf_node.
ed20: 70 6e 67 20 22 53 65 67 6d 65 6e 74 20 42 2d 54  png "Segment B-T
ed30: 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 20 46 6f  ree Leaf Node Fo
ed40: 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68  rmat"]..<p>.  Th
ed50: 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 74 6f  e first term sto
ed60: 72 65 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64 65  red on each node
ed70: 20 28 22 54 65 72 6d 20 31 22 20 69 6e 20 74 68   ("Term 1" in th
ed80: 65 20 66 69 67 75 72 65 20 61 62 6f 76 65 29 20  e figure above) 
ed90: 69 73 0a 20 20 73 74 6f 72 65 64 20 76 65 72 62  is.  stored verb
eda0: 61 74 69 6d 2e 20 45 61 63 68 20 73 75 62 73 65  atim. Each subse
edb0: 71 75 65 6e 74 20 74 65 72 6d 20 69 73 20 70 72  quent term is pr
edc0: 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20  efix-compressed 
edd0: 77 69 74 68 20 72 65 73 70 65 63 74 0a 20 20 74  with respect.  t
ede0: 6f 20 69 74 73 20 70 72 65 64 65 63 65 73 73 6f  o its predecesso
edf0: 72 2e 20 54 65 72 6d 73 20 61 72 65 20 73 74 6f  r. Terms are sto
ee00: 72 65 64 20 77 69 74 68 69 6e 20 61 20 70 61 67  red within a pag
ee10: 65 20 69 6e 20 73 6f 72 74 65 64 20 28 6d 65 6d  e in sorted (mem
ee20: 63 6d 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a 5b  cmp).  order...[
ee30: 68 33 20 22 53 65 67 6d 65 6e 74 20 42 2d 54 72  h3 "Segment B-Tr
ee40: 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65  ee Interior Node
ee50: 73 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  s"]..<p>.  The f
ee60: 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d  ollowing diagram
ee70: 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72   depicts the for
ee80: 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  mat of a segment
ee90: 20 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f 72   b-tree interior
eea0: 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 6e   .  (non-leaf) n
eeb0: 6f 64 65 2e 0a 0a 5b 46 69 67 20 66 74 73 33 5f  ode...[Fig fts3_
eec0: 69 6e 74 65 72 69 6f 72 5f 6e 6f 64 65 2e 70 6e  interior_node.pn
eed0: 67 20 22 53 65 67 6d 65 6e 74 20 42 2d 54 72 65  g "Segment B-Tre
eee0: 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 20  e Interior Node 
eef0: 46 6f 72 6d 61 74 22 5d 0a 0a 0a 5b 68 32 20 22  Format"]...[h2 "
ef00: 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74 22 5d  Doclist Format"]
ef10: 0a 0a 3c 70 3e 0a 20 20 41 20 64 6f 63 6c 69 73  ..<p>.  A doclis
ef20: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
ef30: 20 61 72 72 61 79 20 6f 66 20 36 34 2d 62 69 74   array of 64-bit
ef40: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
ef50: 2c 20 73 65 72 69 61 6c 69 7a 65 64 20 75 73 69  , serialized usi
ef60: 6e 67 0a 20 20 74 68 65 20 46 54 53 33 20 76 61  ng.  the FTS3 va
ef70: 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20 45 61 63  rint format. Eac
ef80: 68 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20  h doclist entry 
ef90: 69 73 20 6d 61 64 65 20 75 70 20 6f 66 20 61 20  is made up of a 
efa0: 73 65 72 69 65 73 20 6f 66 20 74 77 6f 20 0a 20  series of two . 
efb0: 20 6f 72 20 6d 6f 72 65 20 69 6e 74 65 67 65 72   or more integer
efc0: 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a  s, as follows:..
efd0: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20  <ol>.  <li> The 
efe0: 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 54 68 65  docid value. The
eff0: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
f000: 61 20 64 6f 63 6c 69 73 74 20 63 6f 6e 74 61 69  a doclist contai
f010: 6e 73 20 74 68 65 20 6c 69 74 65 72 61 6c 20 64  ns the literal d
f020: 6f 63 69 64 0a 20 20 20 20 20 20 20 76 61 6c 75  ocid.       valu
f030: 65 2e 20 54 68 65 20 66 69 72 73 74 20 66 69 65  e. The first fie
f040: 6c 64 20 6f 66 20 65 61 63 68 20 73 75 62 73 65  ld of each subse
f050: 71 75 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  quent doclist en
f060: 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
f070: 20 0a 20 20 20 20 20 20 20 64 69 66 66 65 72 65   .       differe
f080: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
f090: 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 68  new docid and th
f0a0: 65 20 70 72 65 76 69 6f 75 73 20 6f 6e 65 20 28  e previous one (
f0b0: 61 6c 77 61 79 73 20 61 20 70 6f 73 69 74 69 76  always a positiv
f0c0: 65 20 0a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  e .       number
f0d0: 29 2e 0a 20 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f  )..  <li> Zero o
f0e0: 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6f 66 66 73  r more term-offs
f0f0: 65 74 20 6c 69 73 74 73 2e 20 41 20 74 65 72 6d  et lists. A term
f100: 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 69 73 20  -offset list is 
f110: 70 72 65 73 65 6e 74 20 66 6f 72 20 65 61 63 68  present for each
f120: 0a 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f  .       column o
f130: 66 20 74 68 65 20 46 54 53 33 20 76 69 72 74 75  f the FTS3 virtu
f140: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  al table that co
f150: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 2e  ntains the term.
f160: 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 0a 20   A term-offset. 
f170: 20 20 20 20 20 20 6c 69 73 74 20 63 6f 6e 73 69        list consi
f180: 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  sts of the follo
f190: 77 69 6e 67 3a 0a 20 20 20 20 20 3c 6f 6c 3e 0a  wing:.     <ol>.
f1a0: 20 20 20 20 20 20 20 3c 6c 69 3e 20 43 6f 6e 73         <li> Cons
f1b0: 74 61 6e 74 20 76 61 6c 75 65 20 31 2e 20 54 68  tant value 1. Th
f1c0: 69 73 20 66 69 65 6c 64 20 69 73 20 6f 6d 69 74  is field is omit
f1d0: 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72 6d  ted for any term
f1e0: 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 20 20 20  -offset list.   
f1f0: 20 20 20 20 20 20 20 20 20 61 73 73 6f 63 69 61           associa
f200: 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ted with column 
f210: 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 54  0..       <li> T
f220: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
f230: 20 28 31 20 66 6f 72 20 74 68 65 20 73 65 63 6f   (1 for the seco
f240: 6e 64 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75  nd leftmost colu
f250: 6d 6e 2c 20 65 74 63 2e 29 2e 20 54 68 69 73 0a  mn, etc.). This.
f260: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65 6c              fiel
f270: 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  d is omitted for
f280: 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74   any term-offset
f290: 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64   list associated
f2a0: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a   with column 0..
f2b0: 20 20 20 20 20 20 20 3c 6c 69 3e 20 41 20 6c 69         <li> A li
f2c0: 73 74 20 6f 66 20 74 65 72 6d 2d 6f 66 66 73 65  st of term-offse
f2d0: 74 73 2c 20 73 6f 72 74 65 64 20 66 72 6f 6d 20  ts, sorted from 
f2e0: 73 6d 61 6c 6c 65 73 74 20 74 6f 20 6c 61 72 67  smallest to larg
f2f0: 65 73 74 2e 20 49 6e 73 74 65 61 64 0a 20 20 20  est. Instead.   
f300: 20 20 20 20 20 20 20 20 20 6f 66 20 73 74 6f 72           of stor
f310: 69 6e 67 20 74 68 65 20 74 65 72 6d 2d 6f 66 66  ing the term-off
f320: 73 65 74 20 76 61 6c 75 65 20 6c 69 74 65 72 61  set value litera
f330: 6c 6c 79 2c 20 65 61 63 68 20 69 6e 74 65 67 65  lly, each intege
f340: 72 20 73 74 6f 72 65 64 20 0a 20 20 20 20 20 20  r stored .      
f350: 20 20 20 20 20 20 69 73 20 74 68 65 20 64 69 66        is the dif
f360: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
f370: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
f380: 2d 6f 66 66 73 65 74 20 61 6e 64 20 74 68 65 20  -offset and the 
f390: 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 20 20  previous .      
f3a0: 20 20 20 20 20 20 6f 6e 65 20 28 6f 72 20 7a 65        one (or ze
f3b0: 72 6f 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ro if the curren
f3c0: 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 69 73  t term-offset is
f3d0: 20 74 68 65 20 66 69 72 73 74 29 2c 20 70 6c 75   the first), plu
f3e0: 73 20 32 2e 0a 20 20 20 20 20 3c 2f 6f 6c 3e 0a  s 2..     </ol>.
f3f0: 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20    <li> Constant 
f400: 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f 6c 3e 0a 0a  value 0..</ol>..
f410: 5b 46 69 67 20 66 74 73 33 5f 64 6f 63 6c 69 73  [Fig fts3_doclis
f420: 74 32 2e 70 6e 67 20 22 46 54 53 33 20 44 6f 63  t2.png "FTS3 Doc
f430: 6c 69 73 74 20 46 6f 72 6d 61 74 22 5d 0a 0a 5b  list Format"]..[
f440: 46 69 67 20 66 74 73 33 5f 64 6f 63 6c 69 73 74  Fig fts3_doclist
f450: 2e 70 6e 67 20 22 46 54 53 33 20 44 6f 63 6c 69  .png "FTS3 Docli
f460: 73 74 20 45 6e 74 72 79 20 46 6f 72 6d 61 74 22  st Entry Format"
f470: 5d 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 64 6f 63  ]..<p>.  For doc
f480: 6c 69 73 74 73 20 66 6f 72 20 77 68 69 63 68 20  lists for which 
f490: 74 68 65 20 74 65 72 6d 20 61 70 70 65 61 72 73  the term appears
f4a0: 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   in more than on
f4b0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
f4c0: 46 54 53 33 0a 20 20 76 69 72 74 75 61 6c 20 74  FTS3.  virtual t
f4d0: 61 62 6c 65 2c 20 74 65 72 6d 2d 6f 66 66 73 65  able, term-offse
f4e0: 74 20 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74  t lists within t
f4f0: 68 65 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73  he doclist are s
f500: 74 6f 72 65 64 20 69 6e 20 63 6f 6c 75 6d 6e 20  tored in column 
f510: 0a 20 20 6e 75 6d 62 65 72 20 6f 72 64 65 72 2e  .  number order.
f520: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
f530: 61 74 20 74 68 65 20 74 65 72 6d 2d 6f 66 66 73  at the term-offs
f540: 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74  et list associat
f550: 65 64 20 77 69 74 68 20 0a 20 20 63 6f 6c 75 6d  ed with .  colum
f560: 6e 20 30 20 28 69 66 20 61 6e 79 29 20 69 73 20  n 0 (if any) is 
f570: 61 6c 77 61 79 73 20 66 69 72 73 74 2c 20 61 6c  always first, al
f580: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
f590: 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
f5a0: 68 65 0a 20 20 74 65 72 6d 2d 6f 66 66 73 65 74  he.  term-offset
f5b0: 20 6c 69 73 74 20 74 6f 20 62 65 20 6f 6d 69 74   list to be omit
f5c0: 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ted in this case
f5d0: 2e 0a 0a 7d 0a                                   ...}.