Documentation Source Text

Hex Artifact Content
Login

Artifact 2ed30110a16fc4946ffce927abaf20d85541d860:


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 5b 68 31 20 22 49 6e 74 72 6f 64 75  2>..[h1 "Introdu
00e0: 63 74 69 6f 6e 20 74 6f 20 46 54 53 33 22 5d 0a  ction to FTS3"].
00f0: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
0100: 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c 65  extension module
0110: 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f   allows users to
0120: 20 63 72 65 61 74 65 20 73 70 65 63 69 61 6c 20   create special 
0130: 74 61 62 6c 65 73 20 77 69 74 68 20 61 20 0a 20  tables with a . 
0140: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74   built-in full-t
0150: 65 78 74 20 69 6e 64 65 78 20 28 68 65 72 65 61  ext index (herea
0160: 66 74 65 72 20 22 46 54 53 33 20 74 61 62 6c 65  fter "FTS3 table
0170: 73 22 29 2e 20 54 68 65 20 66 75 6c 6c 2d 74 65  s"). The full-te
0180: 78 74 20 69 6e 64 65 78 0a 20 20 61 6c 6c 6f 77  xt index.  allow
0190: 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 65 66  s the user to ef
01a0: 66 69 63 69 65 6e 74 6c 79 20 71 75 65 72 79 20  ficiently query 
01b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
01c0: 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20 63   all rows that c
01d0: 6f 6e 74 61 69 6e 0a 20 20 6f 6e 65 20 6f 72 20  ontain.  one or 
01e0: 6d 6f 72 65 20 69 6e 73 74 61 6e 63 65 73 20 73  more instances s
01f0: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 68  pecified word (h
0200: 65 72 65 61 66 74 65 72 20 61 20 22 74 6f 6b 65  ereafter a "toke
0210: 6e 22 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  n", even if the 
0220: 74 61 62 6c 65 0a 20 20 63 6f 6e 74 61 69 6e 73  table.  contains
0230: 20 6d 61 6e 79 20 6c 61 72 67 65 20 64 6f 63 75   many large docu
0240: 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f  ments...<p>.  Fo
0250: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 65 61  r example, if ea
0260: 63 68 20 6f 66 20 74 68 65 20 35 31 37 34 33 30  ch of the 517430
0270: 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68   documents in th
0280: 65 20 0a 20 20 22 3c 61 20 68 72 65 66 3d 22 68  e .  "<a href="h
0290: 74 74 70 3a 2f 2f 77 77 77 2e 63 73 2e 63 6d 75  ttp://www.cs.cmu
02a0: 2e 65 64 75 2f 7e 65 6e 72 6f 6e 2f 22 3e 45 6e  .edu/~enron/">En
02b0: 72 6f 6e 20 45 2d 4d 61 69 6c 20 44 61 74 61 73  ron E-Mail Datas
02c0: 65 74 3c 2f 61 3e 22 0a 20 20 69 73 20 69 6e 73  et</a>".  is ins
02d0: 65 72 74 65 64 20 69 6e 74 6f 20 62 6f 74 68 20  erted into both 
02e0: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 61  the FTS3 table a
02f0: 6e 64 20 74 68 65 20 6f 72 64 69 6e 61 72 79 20  nd the ordinary 
0300: 53 51 4c 69 74 65 20 74 61 62 6c 65 0a 20 20 63  SQLite table.  c
0310: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
0320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 73   following SQL s
0330: 63 72 69 70 74 3a 0a 0a 5b 43 6f 64 65 20 7b 0a  cript:..[Code {.
0340: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
0350: 20 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61   TABLE enrondata
0360: 31 20 55 53 49 4e 47 20 66 74 73 33 28 63 6f 6e  1 USING fts3(con
0370: 74 65 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20  tent TEXT);     
0380: 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f  /* FTS3 table */
0390: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
03a0: 65 6e 72 6f 6e 64 61 74 61 32 28 63 6f 6e 74 65  enrondata2(conte
03b0: 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20 20 20  nt TEXT);       
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 74 61 62   /* Ordinary tab
03e0: 6c 65 20 2a 2f 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  le */.}]..<p>.  
03f0: 54 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74  Then either of t
0400: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 62  he two queries b
0410: 65 6c 6f 77 20 6d 61 79 20 62 65 20 65 78 65 63  elow may be exec
0420: 75 74 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  uted to find the
0430: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 64 6f 63   number of.  doc
0440: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
0450: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
0460: 61 69 6e 20 74 68 65 20 77 6f 72 64 20 22 6c 69  ain the word "li
0470: 6e 75 78 22 20 28 33 35 31 29 2e 20 55 73 69 6e  nux" (351). Usin
0480: 67 20 6f 6e 65 0a 20 20 64 65 73 6b 74 6f 70 20  g one.  desktop 
0490: 50 43 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  PC hardware conf
04a0: 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20 71  iguration, the q
04b0: 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33  uery on the FTS3
04c0: 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 69   table returns i
04d0: 6e 0a 20 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  n.  approximatel
04e0: 79 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 2c 20  y 0.03 seconds, 
04f0: 76 65 72 73 75 73 20 32 32 2e 35 20 66 6f 72 20  versus 22.5 for 
0500: 71 75 65 72 79 69 6e 67 20 74 68 65 20 6f 72 64  querying the ord
0510: 69 6e 61 72 79 20 74 61 62 6c 65 2e 0a 0a 5b 43  inary table...[C
0520: 6f 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20 63  ode {.  SELECT c
0530: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 65 6e 72  ount(*) FROM enr
0540: 6f 6e 64 61 74 61 31 20 57 48 45 52 45 20 63 6f  ondata1 WHERE co
0550: 6e 74 65 6e 74 20 4d 41 54 43 48 20 27 6c 69 6e  ntent MATCH 'lin
0560: 75 78 27 3b 20 20 2f 2a 20 30 2e 30 33 20 73 65  ux';  /* 0.03 se
0570: 63 6f 6e 64 73 20 2a 2f 0a 20 20 53 45 4c 45 43  conds */.  SELEC
0580: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0590: 65 6e 72 6f 6e 64 61 74 61 32 20 57 48 45 52 45  enrondata2 WHERE
05a0: 20 63 6f 6e 74 65 6e 74 20 4c 49 4b 45 20 27 25   content LIKE '%
05b0: 6c 69 6e 75 78 25 27 3b 20 2f 2a 20 32 32 2e 35  linux%'; /* 22.5
05c0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 7d 5d 0a 0a   seconds */.}]..
05d0: 3c 70 3e 0a 20 20 4f 66 20 63 6f 75 72 73 65 2c  <p>.  Of course,
05e0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
05f0: 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 65   above are not e
0600: 6e 74 69 72 65 6c 79 20 65 71 75 69 76 61 6c 65  ntirely equivale
0610: 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a  nt. For example.
0620: 20 20 74 68 65 20 4c 49 4b 45 20 71 75 65 72 79    the LIKE query
0630: 20 6d 61 74 63 68 65 73 20 72 6f 77 73 20 74 68   matches rows th
0640: 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73  at contain terms
0650: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 75 78 6f   such as "linuxo
0660: 70 68 6f 62 65 22 0a 20 20 6f 72 20 22 45 6e 74  phobe".  or "Ent
0670: 65 72 70 72 69 73 65 4c 69 6e 75 78 22 20 28 61  erpriseLinux" (a
0680: 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
0690: 65 20 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20 44  e Enron E-Mail D
06a0: 61 74 61 73 65 74 20 64 6f 65 73 20 6e 6f 74 0a  ataset does not.
06b0: 20 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61    actually conta
06c0: 69 6e 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d  in any such term
06d0: 73 29 2c 20 77 68 65 72 65 61 73 20 74 68 65 20  s), whereas the 
06e0: 4d 41 54 43 48 20 71 75 65 72 79 20 6f 6e 20 74  MATCH query on t
06f0: 68 65 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20  he FTS3 table.  
0700: 73 65 6c 65 63 74 73 20 6f 6e 6c 79 20 74 68 6f  selects only tho
0710: 73 65 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e  se rows that con
0720: 74 61 69 6e 20 22 6c 69 6e 75 78 22 20 61 73 20  tain "linux" as 
0730: 61 20 64 69 73 63 72 65 65 74 20 74 6f 6b 65 6e  a discreet token
0740: 2e 20 42 6f 74 68 20 0a 20 20 73 65 61 72 63 68  . Both .  search
0750: 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65  es are case-inse
0760: 6e 73 69 74 69 76 65 2e 20 54 68 65 20 46 54 53  nsitive. The FTS
0770: 33 20 74 61 62 6c 65 20 63 6f 6e 73 75 6d 65 73  3 table consumes
0780: 20 61 72 6f 75 6e 64 20 32 30 30 36 20 4d 42 20   around 2006 MB 
0790: 6f 6e 0a 20 20 64 69 73 6b 20 63 6f 6d 70 61 72  on.  disk compar
07a0: 65 64 20 74 6f 20 6a 75 73 74 20 31 34 35 33 20  ed to just 1453 
07b0: 4d 42 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e  MB for the ordin
07c0: 61 72 79 20 74 61 62 6c 65 2e 20 55 73 69 6e 67  ary table. Using
07d0: 20 74 68 65 20 73 61 6d 65 0a 20 20 68 61 72 64   the same.  hard
07e0: 77 61 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ware configurati
07f0: 6f 6e 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  on used to perfo
0800: 72 6d 20 74 68 65 20 53 45 4c 45 43 54 20 71 75  rm the SELECT qu
0810: 65 72 69 65 73 20 61 62 6f 76 65 2c 20 74 68 65  eries above, the
0820: 20 46 54 53 33 0a 20 20 74 61 62 6c 65 20 74 6f   FTS3.  table to
0830: 6f 6b 20 6a 75 73 74 20 6f 76 65 72 20 33 39 20  ok just over 39 
0840: 6d 69 6e 75 74 65 73 20 74 6f 20 70 6f 70 75 6c  minutes to popul
0850: 61 74 65 2c 20 76 65 72 73 75 73 20 32 35 20 66  ate, versus 25 f
0860: 6f 72 20 74 68 65 20 6f 72 64 69 6e 61 72 79 0a  or the ordinary.
0870: 20 20 74 61 62 6c 65 2e 0a 0a 3c 70 20 63 6c 61    table...<p cla
0880: 73 73 3d 74 6f 64 6f 3e 20 0a 20 20 43 68 65 63  ss=todo> .  Chec
0890: 6b 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 73  k if the numbers
08a0: 20 61 72 65 20 73 74 69 6c 6c 20 76 61 6c 69 64   are still valid
08b0: 20 75 73 69 6e 67 20 74 68 65 20 72 65 66 61 63   using the refac
08c0: 74 6f 72 65 64 20 76 65 72 73 69 6f 6e 2e 0a 0a  tored version...
08d0: 5b 68 32 20 22 43 72 65 61 74 69 6e 67 20 61 6e  [h2 "Creating an
08e0: 64 20 44 65 73 74 72 6f 79 69 6e 67 20 46 54 53  d Destroying FTS
08f0: 33 20 54 61 62 6c 65 73 22 5d 0a 0a 3c 70 3e 0a  3 Tables"]..<p>.
0900: 20 20 4c 69 6b 65 20 6f 74 68 65 72 20 76 69 72    Like other vir
0910: 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 73  tual table types
0920: 2c 20 6e 65 77 20 46 54 53 33 20 74 61 62 6c 65  , new FTS3 table
0930: 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73  s are created us
0940: 69 6e 67 20 61 20 0a 20 20 5c 5b 43 52 45 41 54  ing a .  \[CREAT
0950: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 5c  E VIRTUAL TABLE\
0960: 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  ] statement. The
0970: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 2c 20 77 68   module name, wh
0980: 69 63 68 20 66 6f 6c 6c 6f 77 73 0a 20 20 74 68  ich follows.  th
0990: 65 20 55 53 49 4e 47 20 6b 65 79 77 6f 72 64 2c  e USING keyword,
09a0: 20 69 73 20 22 66 74 73 33 22 2e 20 54 68 65 20   is "fts3". The 
09b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
09c0: 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 6d  dule arguments m
09d0: 61 79 0a 20 20 62 65 20 6c 65 66 74 20 65 6d 70  ay.  be left emp
09e0: 74 79 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ty, in which cas
09f0: 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20  e an FTS3 table 
0a00: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 75 73  with a single us
0a10: 65 72 2d 64 65 66 69 6e 65 64 20 0a 20 20 63 6f  er-defined .  co
0a20: 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 63 6f 6e 74  lumn named "cont
0a30: 65 6e 74 22 20 69 73 20 63 72 65 61 74 65 64 2e  ent" is created.
0a40: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
0a50: 74 68 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d  the module argum
0a60: 65 6e 74 73 0a 20 20 6d 61 79 20 62 65 20 70 61  ents.  may be pa
0a70: 73 73 65 64 20 61 20 6c 69 73 74 20 6f 66 20 63  ssed a list of c
0a80: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 63  omma separated c
0a90: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 0a 0a 3c  olumn names. ..<
0aa0: 70 3e 0a 20 20 49 66 20 63 6f 6c 75 6d 6e 20 6e  p>.  If column n
0ab0: 61 6d 65 73 20 61 72 65 20 65 78 70 6c 69 63 69  ames are explici
0ac0: 74 6c 79 20 70 72 6f 76 69 64 65 64 20 66 6f 72  tly provided for
0ad0: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
0ae0: 61 73 20 70 61 72 74 20 6f 66 0a 20 20 74 68 65  as part of.  the
0af0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0b00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
0b10: 20 74 68 65 6e 20 61 20 64 61 74 61 74 79 70 65   then a datatype
0b20: 20 6e 61 6d 65 20 6d 61 79 20 62 65 20 6f 70 74   name may be opt
0b30: 69 6f 6e 61 6c 6c 79 20 0a 20 20 73 70 65 63 69  ionally .  speci
0b40: 66 69 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  fied for each co
0b50: 6c 75 6d 6e 2e 20 48 6f 77 65 76 65 72 2c 20 74  lumn. However, t
0b60: 68 69 73 20 69 73 20 70 75 72 65 20 73 79 6e 74  his is pure synt
0b70: 61 63 74 69 63 20 73 75 67 61 72 2c 20 74 68 65  actic sugar, the
0b80: 0a 20 20 73 75 70 70 6c 69 65 64 20 74 79 70 65  .  supplied type
0b90: 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 75 73  names are not us
0ba0: 65 64 20 62 79 20 46 54 53 33 20 6f 72 20 74 68  ed by FTS3 or th
0bb0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 66 6f  e SQLite core fo
0bc0: 72 20 61 6e 79 0a 20 20 70 75 72 70 6f 73 65 2e  r any.  purpose.
0bd0: 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
0be0: 73 20 74 6f 20 61 6e 79 20 63 6f 6e 73 74 72 61  s to any constra
0bf0: 69 6e 74 73 20 73 70 65 63 69 66 69 65 64 20 61  ints specified a
0c00: 6c 6f 6e 67 20 77 69 74 68 20 61 6e 0a 20 20 46  long with an.  F
0c10: 54 53 33 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  TS3 column name 
0c20: 2d 20 74 68 65 79 20 61 72 65 20 70 61 72 73 65  - they are parse
0c30: 64 20 62 75 74 20 6e 6f 74 20 75 73 65 64 20 6f  d but not used o
0c40: 72 20 72 65 63 6f 72 64 65 64 20 62 79 20 74 68  r recorded by th
0c50: 65 20 73 79 73 74 65 6d 0a 20 20 69 6e 20 61 6e  e system.  in an
0c60: 79 20 77 61 79 2e 0a 0a 5b 43 6f 64 65 20 7b 0a  y way...[Code {.
0c70: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
0c80: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e 61 6d  n FTS3 table nam
0c90: 65 64 20 22 64 61 74 61 22 20 77 69 74 68 20 6f  ed "data" with o
0ca0: 6e 65 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e  ne column - "con
0cb0: 74 65 6e 74 22 3a 3c 2f 69 3e 0a 20 20 43 52 45  tent":</i>.  CRE
0cc0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0cd0: 45 20 64 61 74 61 20 55 53 49 4e 47 20 66 74 73  E data USING fts
0ce0: 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  3();..  <i>-- Cr
0cf0: 65 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62  eate an FTS3 tab
0d00: 6c 65 20 6e 61 6d 65 64 20 22 70 61 67 65 73 22  le named "pages"
0d10: 20 77 69 74 68 20 74 68 72 65 65 20 63 6f 6c 75   with three colu
0d20: 6d 6e 73 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  mns:</i>.  CREAT
0d30: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0d40: 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 33  pages USING fts3
0d50: 28 74 69 74 6c 65 2c 20 6b 65 79 77 6f 72 64 73  (title, keywords
0d60: 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d  , body);..  <i>-
0d70: 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33  - Create an FTS3
0d80: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 6d 61   table named "ma
0d90: 69 6c 22 20 77 69 74 68 20 74 77 6f 20 63 6f 6c  il" with two col
0da0: 75 6d 6e 73 2e 20 44 61 74 61 74 79 70 65 73 0a  umns. Datatypes.
0db0: 20 20 2d 2d 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    -- and column 
0dc0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
0dd0: 73 70 65 63 69 66 69 65 64 20 61 6c 6f 6e 67 20  specified along 
0de0: 77 69 74 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e  with each column
0df0: 2e 20 54 68 65 73 65 0a 20 20 2d 2d 20 61 72 65  . These.  -- are
0e00: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 67 6e 6f   completely igno
0e10: 72 65 64 20 62 79 20 46 54 53 33 20 61 6e 64 20  red by FTS3 and 
0e20: 53 51 4c 69 74 65 2e 20 3c 2f 69 3e 0a 20 20 43  SQLite. </i>.  C
0e30: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0e40: 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66  BLE mail USING f
0e50: 74 73 33 28 0a 20 20 20 20 73 75 62 6a 65 63 74  ts3(.    subject
0e60: 20 56 41 52 43 48 41 52 28 32 35 36 29 20 4e 4f   VARCHAR(256) NO
0e70: 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 62 6f 64 79  T NULL,.    body
0e80: 20 54 45 58 54 20 43 48 45 43 4b 28 6c 65 6e 67   TEXT CHECK(leng
0e90: 74 68 28 62 6f 64 79 29 3c 31 30 32 34 30 29 0a  th(body)<10240).
0ea0: 20 20 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 41    );.}]..<p>.  A
0eb0: 73 20 77 65 6c 6c 20 61 73 20 61 20 6c 69 73 74  s well as a list
0ec0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65   of columns, the
0ed0: 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74   module argument
0ee0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 43 52  s passed to a CR
0ef0: 45 41 54 45 0a 20 20 56 49 52 54 55 41 4c 20 54  EATE.  VIRTUAL T
0f00: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75  ABLE statement u
0f10: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  sed to create an
0f20: 20 46 54 53 33 20 74 61 62 6c 65 20 6d 61 79 20   FTS3 table may 
0f30: 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  be used to speci
0f40: 66 79 0a 20 20 61 20 5c 5b 74 6f 6b 65 6e 69 7a  fy.  a \[tokeniz
0f50: 65 72 5c 5d 2e 20 54 68 69 73 20 69 73 20 64 6f  er\]. This is do
0f60: 6e 65 20 62 79 20 73 70 65 63 69 66 79 69 6e 67  ne by specifying
0f70: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65   a string of the
0f80: 20 66 6f 72 6d 0a 20 20 22 74 6f 6b 65 6e 69 7a   form.  "tokeniz
0f90: 65 3d 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20  e=&lt;tokenizer 
0fa0: 6e 61 6d 65 26 67 74 3b 20 26 6c 74 3b 74 6f 6b  name&gt; &lt;tok
0fb0: 65 6e 69 7a 65 72 20 61 72 67 73 26 6c 74 3b 22  enizer args&lt;"
0fc0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 63   in place of a c
0fd0: 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65 2c 20 77 68  olumn.  name, wh
0fe0: 65 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  ere &lt;tokenize
0ff0: 72 20 6e 61 6d 65 26 67 74 3b 20 69 73 20 74 68  r name&gt; is th
1000: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 6f  e name of the to
1010: 6b 65 6e 69 7a 65 72 20 74 6f 20 75 73 65 20 61  kenizer to use a
1020: 6e 64 0a 20 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a  nd.  &lt;tokeniz
1030: 65 72 20 61 72 67 73 26 67 74 3b 20 69 73 20 61  er args&gt; is a
1040: 6e 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20  n optional list 
1050: 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 73 65  of whitespace se
1060: 70 61 72 61 74 65 64 20 71 75 61 6c 69 66 69 65  parated qualifie
1070: 72 73 0a 20 20 74 6f 20 70 61 73 73 20 74 6f 20  rs.  to pass to 
1080: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  the tokenizer im
1090: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 41 20  plementation. A 
10a0: 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63 69 66  tokenizer specif
10b0: 69 63 61 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20  ication may be. 
10c0: 20 70 6c 61 63 65 64 20 61 6e 79 77 68 65 72 65   placed anywhere
10d0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
10e0: 69 73 74 2c 20 62 75 74 20 61 74 20 6d 6f 73 74  ist, but at most
10f0: 20 6f 6e 65 20 74 6f 6b 65 6e 69 7a 65 72 20 64   one tokenizer d
1100: 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 0a 20 20  eclaration is.  
1110: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 65 61 63 68  allowed for each
1120: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1130: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1140: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6e 64    The second and
1150: 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 74 6f   subsequent.  to
1160: 6b 65 6e 69 7a 65 72 20 64 65 63 6c 61 72 61 74  kenizer declarat
1170: 69 6f 6e 20 61 72 65 20 69 6e 74 65 72 70 72 65  ion are interpre
1180: 74 65 64 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ted as column na
1190: 6d 65 73 2e 20 0a 20 20 5c 5b 74 6f 6b 65 6e 69  mes. .  \[tokeni
11a0: 7a 65 72 7c 53 65 65 20 62 65 6c 6f 77 5c 5d 20  zer|See below\] 
11b0: 66 6f 72 20 61 20 64 65 74 61 69 6c 65 64 20 64  for a detailed d
11c0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 75 73  escription of us
11d0: 69 6e 67 20 28 61 6e 64 2c 20 69 66 0a 20 20 6e  ing (and, if.  n
11e0: 65 63 65 73 73 61 72 79 2c 20 69 6d 70 6c 65 6d  ecessary, implem
11f0: 65 6e 74 69 6e 67 29 20 61 20 74 6f 6b 65 6e 69  enting) a tokeni
1200: 7a 65 72 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  zer...[Code {.  
1210: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
1220: 46 54 53 33 20 74 61 62 6c 65 20 6e 61 6d 65 64  FTS3 table named
1230: 20 22 70 61 70 65 72 73 22 20 77 69 74 68 20 74   "papers" with t
1240: 77 6f 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  wo columns that 
1250: 75 73 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  uses</i>.  <i>--
1260: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 22   the tokenizer "
1270: 70 6f 72 74 65 72 22 2e 3c 2f 69 3e 0a 20 20 43  porter".</i>.  C
1280: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1290: 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
12a0: 20 66 74 73 33 28 61 75 74 68 6f 72 2c 20 64 6f   fts3(author, do
12b0: 63 75 6d 65 6e 74 2c 20 74 6f 6b 65 6e 69 7a 65  cument, tokenize
12c0: 3d 70 6f 72 74 65 72 29 3b 0a 0a 20 20 3c 69 3e  =porter);..  <i>
12d0: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
12e0: 33 20 74 61 62 6c 65 20 77 69 74 68 20 61 20 73  3 table with a s
12f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 2d 20 22  ingle column - "
1300: 63 6f 6e 74 65 6e 74 22 20 2d 20 74 68 61 74 20  content" - that 
1310: 75 73 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  uses</i>.  <i>--
1320: 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20 74 6f   the "simple" to
1330: 6b 65 6e 69 7a 65 72 2e 3c 2f 69 3e 0a 20 20 43  kenizer.</i>.  C
1340: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1350: 42 4c 45 20 64 61 74 61 20 55 53 49 4e 47 20 66  BLE data USING f
1360: 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d  ts3(tokenize=sim
1370: 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43  ple);..  <i>-- C
1380: 72 65 61 74 65 20 61 6e 20 46 54 53 33 20 74 61  reate an FTS3 ta
1390: 62 6c 65 20 77 69 74 68 20 74 77 6f 20 63 6f 6c  ble with two col
13a0: 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73 20 74  umns that uses t
13b0: 68 65 20 22 69 63 75 22 20 74 6f 6b 65 6e 69 7a  he "icu" tokeniz
13c0: 65 72 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  er.</i>.  <i>-- 
13d0: 54 68 65 20 71 75 61 6c 69 66 69 65 72 20 22 65  The qualifier "e
13e0: 6e 5f 41 55 22 20 69 73 20 70 61 73 73 65 64 20  n_AU" is passed 
13f0: 74 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  to the tokenizer
1400: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3c   implementation<
1410: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1420: 54 55 41 4c 20 54 41 42 4c 45 20 6e 61 6d 65 73  TUAL TABLE names
1430: 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20 62   USING fts3(a, b
1440: 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20 65  , tokenize=icu e
1450: 6e 5f 41 55 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20  n_AU);.}]..<p>. 
1460: 20 46 54 53 33 20 74 61 62 6c 65 73 20 6d 61 79   FTS3 tables may
1470: 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1480: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
1490: 69 6e 67 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  ing an ordinary 
14a0: 5c 5b 44 52 4f 50 20 54 41 42 4c 45 5c 5d 0a 20  \[DROP TABLE\]. 
14b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f 72 20   statement. For 
14c0: 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20  example:..[Code 
14d0: 7b 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  {.  <i>-- Create
14e0: 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
14f0: 6c 79 20 64 72 6f 70 2c 20 61 6e 20 46 54 53 33  ly drop, an FTS3
1500: 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52   table.</i>.  CR
1510: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1520: 4c 45 20 64 61 74 61 20 55 53 49 4e 47 20 66 74  LE data USING ft
1530: 73 33 28 29 3b 0a 20 20 44 52 4f 50 20 54 41 42  s3();.  DROP TAB
1540: 4c 45 20 64 61 74 61 3b 0a 7d 5d 0a 0a 5b 68 32  LE data;.}]..[h2
1550: 20 22 50 6f 70 75 6c 61 74 69 6e 67 20 46 54 53   "Populating FTS
1560: 33 20 54 61 62 6c 65 73 22 5d 0a 0a 20 20 3c 70  3 Tables"]..  <p
1570: 3e 0a 20 20 20 20 46 54 53 33 20 74 61 62 6c 65  >.    FTS3 table
1580: 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
1590: 75 73 69 6e 67 20 5c 5b 49 4e 53 45 52 54 5c 5d  using \[INSERT\]
15a0: 2c 20 5c 5b 55 50 44 41 54 45 5c 5d 20 61 6e 64  , \[UPDATE\] and
15b0: 20 5c 5b 44 45 4c 45 54 45 5c 5d 0a 20 20 20 20   \[DELETE\].    
15c0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
15d0: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 6f 72  e same way as or
15e0: 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61  dinary SQLite ta
15f0: 62 6c 65 73 20 61 72 65 2e 0a 0a 20 20 3c 70 3e  bles are...  <p>
1600: 0a 20 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  .    As well as 
1610: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
1620: 64 20 62 79 20 74 68 65 20 75 73 65 72 20 28 6f  d by the user (o
1630: 72 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 22 20  r the "content" 
1640: 63 6f 6c 75 6d 6e 20 69 66 20 6e 6f 0a 20 20 20  column if no.   
1650: 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74   module argument
1660: 73 20 77 68 65 72 65 20 73 70 65 63 69 66 69 65  s where specifie
1670: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1680: 20 5c 5b 43 52 45 41 54 45 20 56 49 52 54 55 41   \[CREATE VIRTUA
1690: 4c 20 54 41 42 4c 45 5c 5d 20 0a 20 20 20 20 73  L TABLE\] .    s
16a0: 74 61 74 65 6d 65 6e 74 29 2c 20 65 61 63 68 20  tatement), each 
16b0: 46 54 53 33 20 74 61 62 6c 65 20 68 61 73 20 61  FTS3 table has a
16c0: 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20   "rowid" column 
16d0: 74 68 61 74 20 62 65 68 61 76 65 73 20 6c 69 6b  that behaves lik
16e0: 65 20 61 6e 0a 20 20 20 20 5c 5b 49 4e 54 45 47  e an.    \[INTEG
16f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 5c 5d  ER PRIMARY KEY\]
1700: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 76 61  , except that va
1710: 6c 75 65 73 20 72 65 6d 61 69 6e 20 75 6e 63 68  lues remain unch
1720: 61 6e 67 65 64 20 69 66 20 74 68 65 0a 20 20 20  anged if the.   
1730: 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 62   database is reb
1740: 75 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20 5c  uilt using the \
1750: 5b 56 41 43 55 55 4d 5c 5d 20 63 6f 6d 6d 61 6e  [VACUUM\] comman
1760: 64 2e 20 46 6f 72 20 46 54 53 33 20 74 61 62 6c  d. For FTS3 tabl
1770: 65 73 2c 20 22 64 6f 63 69 64 22 0a 20 20 20 20  es, "docid".    
1780: 69 73 20 61 6c 6c 6f 77 65 64 20 61 73 20 61 6e  is allowed as an
1790: 20 61 6c 69 61 73 20 61 6c 6f 6e 67 20 77 69 74   alias along wit
17a0: 68 20 74 68 65 20 75 73 75 61 6c 20 22 72 6f 77  h the usual "row
17b0: 69 64 22 2c 20 22 6f 69 64 22 20 61 6e 64 20 22  id", "oid" and "
17c0: 5f 6f 69 64 5f 22 0a 20 20 20 20 69 64 65 6e 74  _oid_".    ident
17d0: 69 66 69 65 72 73 2e 20 41 74 74 65 6d 70 74 69  ifiers. Attempti
17e0: 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 6f 72 20  ng to insert or 
17f0: 75 70 64 61 74 65 20 61 20 72 6f 77 20 77 69 74  update a row wit
1800: 68 20 61 20 64 6f 63 69 64 20 76 61 6c 75 65 20  h a docid value 
1810: 74 68 61 74 20 0a 20 20 20 20 61 6c 72 65 61 64  that .    alread
1820: 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
1830: 74 61 62 6c 65 20 69 73 20 61 6e 20 65 72 72 6f  table is an erro
1840: 72 2c 20 6a 75 73 74 20 61 73 20 69 74 20 77 6f  r, just as it wo
1850: 75 6c 64 20 62 65 20 77 69 74 68 20 61 6e 20 0a  uld be with an .
1860: 20 20 20 20 6f 72 64 69 6e 61 72 79 20 53 51 4c      ordinary SQL
1870: 69 74 65 20 74 61 62 6c 65 2e 0a 0a 20 20 3c 70  ite table...  <p
1880: 20 63 6c 61 73 73 3d 74 6f 64 6f 3e 0a 20 20 20   class=todo>.   
1890: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 68 65   The problem whe
18a0: 6e 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72  n a row is inser
18b0: 74 65 64 20 6f 72 20 75 70 64 61 74 65 64 20 61  ted or updated a
18c0: 6e 64 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  nd distinct valu
18d0: 65 73 20 61 72 65 20 0a 20 20 20 20 73 70 65 63  es are .    spec
18e0: 69 66 69 65 64 20 66 6f 72 20 74 68 65 20 72 6f  ified for the ro
18f0: 77 69 64 20 61 6e 64 20 64 6f 63 69 64 2e 0a 0a  wid and docid...
1900: 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20  [Code {.  <i>-- 
1910: 43 72 65 61 74 65 20 61 6e 20 46 54 53 33 20 74  Create an FTS3 t
1920: 61 62 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54  able</i>.  CREAT
1930: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1940: 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 33  pages USING fts3
1950: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a  (title, body);..
1960: 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61    <i>-- Insert a
1970: 20 72 6f 77 20 77 69 74 68 20 61 20 73 70 65 63   row with a spec
1980: 69 66 69 63 20 64 6f 63 69 64 20 76 61 6c 75 65  ific docid value
1990: 2e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49  .</i>.  INSERT I
19a0: 4e 54 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c  NTO pages(docid,
19b0: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
19c0: 4c 55 45 53 28 35 33 2c 20 27 48 6f 6d 65 20 50  LUES(53, 'Home P
19d0: 61 67 65 27 2c 20 27 53 51 4c 69 74 65 20 69 73  age', 'SQLite is
19e0: 20 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27 29   a software...')
19f0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72  ;..  <i>-- Inser
1a00: 74 20 61 20 72 6f 77 20 61 6e 64 20 61 6c 6c 6f  t a row and allo
1a10: 77 20 46 54 53 33 20 74 6f 20 61 73 73 69 67 6e  w FTS3 to assign
1a20: 20 61 20 64 6f 63 69 64 20 76 61 6c 75 65 20 75   a docid value u
1a30: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61 6c  sing the same al
1a40: 67 6f 72 69 74 68 6d 20 61 73 3c 2f 69 3e 0a 20  gorithm as</i>. 
1a50: 20 3c 69 3e 2d 2d 20 53 51 4c 69 74 65 20 75 73   <i>-- SQLite us
1a60: 65 73 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20  es for ordinary 
1a70: 74 61 62 6c 65 73 2e 20 49 6e 20 74 68 69 73 20  tables. In this 
1a80: 63 61 73 65 20 74 68 65 20 6e 65 77 20 64 6f 63  case the new doc
1a90: 69 64 20 77 69 6c 6c 20 62 65 20 35 34 2c 3c 2f  id will be 54,</
1aa0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 67  i>.  <i>-- one g
1ab0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1ac0: 6c 61 72 67 65 73 74 20 64 6f 63 69 64 20 63 75  largest docid cu
1ad0: 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
1ae0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69  in the table.</i
1af0: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
1b00: 70 61 67 65 73 28 74 69 74 6c 65 2c 20 62 6f 64  pages(title, bod
1b10: 79 29 20 56 41 4c 55 45 53 28 27 44 6f 77 6e 6c  y) VALUES('Downl
1b20: 6f 61 64 27 2c 20 27 41 6c 6c 20 53 51 4c 69 74  oad', 'All SQLit
1b30: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e  e source code...
1b40: 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 68 61  ');..  <i>-- Cha
1b50: 6e 67 65 20 74 68 65 20 74 69 74 6c 65 20 6f 66  nge the title of
1b60: 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e   the row just in
1b70: 73 65 72 74 65 64 2e 3c 2f 69 3e 0a 20 20 55 50  serted.</i>.  UP
1b80: 44 41 54 45 20 70 61 67 65 73 20 53 45 54 20 74  DATE pages SET t
1b90: 69 74 6c 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64  itle = 'Download
1ba0: 20 53 51 4c 69 74 65 27 20 57 48 45 52 45 20 72   SQLite' WHERE r
1bb0: 6f 77 69 64 20 3d 20 6c 61 73 74 5f 69 6e 73 65  owid = last_inse
1bc0: 72 74 5f 72 6f 77 69 64 28 29 3b 0a 0a 20 20 3c  rt_rowid();..  <
1bd0: 69 3e 2d 2d 20 44 65 6c 65 74 65 20 74 68 65 20  i>-- Delete the 
1be0: 65 6e 74 69 72 65 20 74 61 62 6c 65 20 63 6f 6e  entire table con
1bf0: 74 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 44 45 4c  tents.</i>.  DEL
1c00: 45 54 45 20 46 52 4f 4d 20 70 61 67 65 73 3b 0a  ETE FROM pages;.
1c10: 7d 5d 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54 6f  }]..  <p>.    To
1c20: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 2d 74 65   support full-te
1c30: 78 74 20 71 75 65 72 69 65 73 2c 20 46 54 53 33  xt queries, FTS3
1c40: 20 6d 61 69 6e 74 61 69 6e 73 20 61 6e 20 69 6e   maintains an in
1c50: 76 65 72 74 65 64 20 69 6e 64 65 78 20 74 68 61  verted index tha
1c60: 74 20 6d 61 70 73 0a 20 20 20 20 66 72 6f 6d 20  t maps.    from 
1c70: 65 61 63 68 20 75 6e 69 71 75 65 20 74 65 72 6d  each unique term
1c80: 20 6f 72 20 77 6f 72 64 20 74 68 61 74 20 61 70   or word that ap
1c90: 70 65 61 72 73 20 69 6e 20 74 68 65 20 64 61 74  pears in the dat
1ca0: 61 73 65 74 20 74 6f 20 74 68 65 20 6c 6f 63 61  aset to the loca
1cb0: 74 69 6f 6e 73 0a 20 20 20 20 69 6e 20 77 68 69  tions.    in whi
1cc0: 63 68 20 69 74 20 61 70 70 65 61 72 73 20 77 69  ch it appears wi
1cd0: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 63  thin the table c
1ce0: 6f 6e 74 65 6e 74 73 2e 20 46 6f 72 20 74 68 65  ontents. For the
1cf0: 20 63 75 72 69 6f 75 73 2c 20 61 20 0a 20 20 20   curious, a .   
1d00: 20 63 6f 6d 70 6c 65 74 65 20 64 65 73 63 72 69   complete descri
1d10: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 5b 73  ption of the \[s
1d20: 65 67 6d 65 6e 74 20 62 74 72 65 65 7c 64 61 74  egment btree|dat
1d30: 61 20 73 74 72 75 63 74 75 72 65 5c 5d 20 75 73  a structure\] us
1d40: 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20  ed to store.    
1d50: 74 68 69 73 20 69 6e 64 65 78 20 77 69 74 68 69  this index withi
1d60: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d70: 69 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ile is described
1d80: 20 62 65 6c 6f 77 2e 20 41 20 66 65 61 74 75 72   below. A featur
1d90: 65 20 6f 66 0a 20 20 20 20 74 68 69 73 20 64 61  e of.    this da
1da0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
1db0: 74 68 61 74 20 61 74 20 61 6e 79 20 74 69 6d 65  that at any time
1dc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
1dd0: 79 20 63 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20 20  y contain not.  
1de0: 20 20 6f 6e 65 20 69 6e 64 65 78 20 62 2d 74 72    one index b-tr
1df0: 65 65 2c 20 62 75 74 20 73 65 76 65 72 61 6c 20  ee, but several 
1e00: 64 69 66 66 65 72 65 6e 74 20 62 2d 74 72 65 65  different b-tree
1e10: 73 20 74 68 61 74 20 61 72 65 20 69 6e 63 72 65  s that are incre
1e20: 6d 65 6e 74 61 6c 6c 79 0a 20 20 20 20 6d 65 72  mentally.    mer
1e30: 67 65 64 20 61 73 20 72 6f 77 73 20 61 72 65 20  ged as rows are 
1e40: 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74 65  inserted, update
1e50: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 54  d and deleted. T
1e60: 68 69 73 20 74 65 63 68 6e 69 71 75 65 20 69 6d  his technique im
1e70: 70 72 6f 76 65 73 20 0a 20 20 20 20 70 65 72 66  proves .    perf
1e80: 6f 72 6d 61 6e 63 65 20 77 68 65 6e 20 77 72 69  ormance when wri
1e90: 74 69 6e 67 20 74 6f 20 61 6e 20 46 54 53 33 20  ting to an FTS3 
1ea0: 74 61 62 6c 65 2c 20 62 75 74 20 63 61 75 73 65  table, but cause
1eb0: 73 20 73 6f 6d 65 20 6f 76 65 72 68 65 61 64 20  s some overhead 
1ec0: 66 6f 72 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78  for.    full-tex
1ed0: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 20 75  t queries that u
1ee0: 73 65 20 74 68 65 20 69 6e 64 65 78 2e 20 45 78  se the index. Ex
1ef0: 65 63 75 74 69 6e 67 20 61 6e 20 53 51 4c 20 73  ecuting an SQL s
1f00: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a  tatement of the.
1f10: 20 20 20 20 66 6f 72 6d 20 22 53 45 4c 45 43 54      form "SELECT
1f20: 20 6f 70 74 69 6d 69 7a 65 28 26 6c 74 3b 66 74   optimize(&lt;ft
1f30: 73 33 2d 74 61 62 6c 65 26 67 74 3b 29 20 46 52  s3-table&gt;) FR
1f40: 4f 4d 20 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c  OM &lt;fts3-tabl
1f50: 65 26 67 74 3b 22 20 0a 20 20 20 20 63 61 75 73  e&gt;" .    caus
1f60: 65 73 20 46 54 53 33 20 74 6f 20 6d 65 72 67 65  es FTS3 to merge
1f70: 20 61 6c 6c 20 65 78 69 73 74 69 6e 67 20 69 6e   all existing in
1f80: 64 65 78 20 62 2d 74 72 65 65 73 20 69 6e 74 6f  dex b-trees into
1f90: 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a   a single large.
1fa0: 20 20 20 20 62 2d 74 72 65 65 20 63 6f 6e 74 61      b-tree conta
1fb0: 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  ining the entire
1fc0: 20 69 6e 64 65 78 2e 20 54 68 69 73 20 63 61 6e   index. This can
1fd0: 20 62 65 20 61 6e 20 65 78 70 65 6e 73 69 76 65   be an expensive
1fe0: 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 20 20 20 20   operation,.    
1ff0: 62 75 74 20 6d 61 79 20 73 70 65 65 64 20 75 70  but may speed up
2000: 20 66 75 74 75 72 65 20 71 75 65 72 69 65 73 2e   future queries.
2010: 20 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 46 6f 72   ..  <p>.    For
2020: 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 6f 70 74   example, to opt
2030: 69 6d 69 7a 65 20 74 68 65 20 66 75 6c 6c 2d 74  imize the full-t
2040: 65 78 74 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  ext index for an
2050: 20 46 54 53 33 20 74 61 62 6c 65 20 6e 61 6d 65   FTS3 table name
2060: 64 0a 20 20 20 20 22 64 6f 63 73 22 3a 0a 0a 5b  d.    "docs":..[
2070: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 4f  Code {.  <i>-- O
2080: 70 74 69 6d 69 7a 65 20 74 68 65 20 69 6e 74 65  ptimize the inte
2090: 72 6e 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f  rnal structure o
20a0: 66 20 46 54 53 33 20 74 61 62 6c 65 20 22 64 6f  f FTS3 table "do
20b0: 63 73 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  cs".</i>.  SELEC
20c0: 54 20 6f 70 74 69 6d 69 7a 65 28 64 6f 63 73 29  T optimize(docs)
20d0: 20 46 52 4f 4d 20 64 6f 63 73 20 4c 49 4d 49 54   FROM docs LIMIT
20e0: 20 31 3b 0a 7d 5d 0a 0a 20 20 3c 70 3e 0a 20 20   1;.}]..  <p>.  
20f0: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
2100: 61 62 6f 76 65 20 6d 61 79 20 61 70 70 65 61 72  above may appear
2110: 20 73 79 6e 74 61 63 74 69 63 6c 79 20 69 6e 63   syntacticly inc
2120: 6f 72 72 65 63 74 20 74 6f 20 73 6f 6d 65 2e 20  orrect to some. 
2130: 52 65 66 65 72 20 74 6f 0a 20 20 20 20 74 68 65  Refer to.    the
2140: 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62   section describ
2150: 69 6e 67 20 74 68 65 20 5c 5b 73 69 6d 70 6c 65  ing the \[simple
2160: 20 66 74 73 33 20 71 75 65 72 69 65 73 5c 5d 20   fts3 queries\] 
2170: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
2180: 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54  on...  <p>.    T
2190: 68 65 20 6f 70 74 69 6d 69 7a 65 28 29 20 66 75  he optimize() fu
21a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21b0: 20 74 65 78 74 20 76 61 6c 75 65 2e 20 49 66 20   text value. If 
21c0: 74 68 65 20 69 6e 64 65 78 20 77 61 73 20 61 6c  the index was al
21d0: 72 65 61 64 79 0a 20 20 20 20 6f 70 74 69 6d 69  ready.    optimi
21e0: 7a 65 64 20 77 68 65 6e 20 69 74 20 77 61 73 20  zed when it was 
21f0: 63 61 6c 6c 65 64 20 74 68 65 20 74 65 78 74 20  called the text 
2200: 69 73 20 22 49 6e 64 65 78 20 61 6c 72 65 61 64  is "Index alread
2210: 79 20 6f 70 74 69 6d 61 6c 22 2e 20 0a 20 20 20  y optimal". .   
2220: 20 4f 74 68 65 72 77 69 73 65 20 69 66 20 74 68   Otherwise if th
2230: 65 20 69 6e 64 65 78 20 77 61 73 20 6e 6f 74 20  e index was not 
2240: 61 6c 72 65 61 64 79 20 6f 70 74 69 6d 69 7a 65  already optimize
2250: 64 2c 20 69 74 20 69 73 20 6d 61 64 65 20 73 6f  d, it is made so
2260: 20 61 6e 64 0a 20 20 20 20 74 68 65 20 74 65 78   and.    the tex
2270: 74 20 22 49 6e 64 65 78 20 6f 70 74 69 6d 69 7a  t "Index optimiz
2280: 65 64 22 20 72 65 74 75 72 6e 65 64 2e 0a 0a 5b  ed" returned...[
2290: 68 32 20 22 51 75 65 72 79 69 6e 67 20 46 54 53  h2 "Querying FTS
22a0: 33 20 54 61 62 6c 65 73 22 20 7b 7d 20 7b 73 69  3 Tables" {} {si
22b0: 6d 70 6c 65 20 66 74 73 33 20 71 75 65 72 69 65  mple fts3 querie
22c0: 73 7d 5d 0a 0a 3c 70 20 63 6c 61 73 73 3d 74 6f  s}]..<p class=to
22d0: 64 6f 3e 0a 20 20 53 6f 6d 65 20 6e 6f 74 65 20  do>.  Some note 
22e0: 63 6c 61 72 69 66 79 69 6e 67 20 77 68 61 74 20  clarifying what 
22f0: 69 73 20 6d 65 61 6e 74 20 62 79 20 61 20 22 74  is meant by a "t
2300: 65 72 6d 22 2c 20 61 6e 64 20 68 6f 77 20 74 68  erm", and how th
2310: 61 74 20 72 65 6c 61 74 65 73 20 74 6f 0a 20 20  at relates to.  
2320: 74 68 65 20 73 70 65 63 69 66 69 63 20 74 6f 6b  the specific tok
2330: 65 6e 69 7a 65 72 20 75 73 65 64 20 62 79 20 74  enizer used by t
2340: 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 69 6e  he FTS3 table in
2350: 20 71 75 65 73 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a   question...<p>.
2360: 20 20 41 73 20 66 6f 72 20 61 6c 6c 20 6f 74 68    As for all oth
2370: 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73  er SQLite tables
2380: 2c 20 76 69 72 74 75 61 6c 20 6f 72 20 6f 74 68  , virtual or oth
2390: 65 72 77 69 73 65 2c 20 64 61 74 61 20 69 73 20  erwise, data is 
23a0: 72 65 74 72 69 65 76 65 64 0a 20 20 66 72 6f 6d  retrieved.  from
23b0: 20 46 54 53 33 20 74 61 62 6c 65 73 20 75 73 69   FTS3 tables usi
23c0: 6e 67 20 61 20 5c 5b 53 45 4c 45 43 54 5c 5d 20  ng a \[SELECT\] 
23d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a  statement...<p>.
23e0: 20 20 46 54 53 33 20 74 61 62 6c 65 73 20 63 61    FTS3 tables ca
23f0: 6e 20 62 65 20 71 75 65 72 69 65 64 20 65 66 66  n be queried eff
2400: 69 63 69 65 6e 74 6c 79 20 75 73 69 6e 67 20 53  iciently using S
2410: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2420: 20 6f 66 20 74 77 6f 0a 20 20 64 69 66 66 65 72   of two.  differ
2430: 65 6e 74 20 66 6f 72 6d 73 3a 0a 0a 3c 75 6c 3e  ent forms:..<ul>
2440: 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20 3c  .  <li><p>.    <
2450: 62 3e 51 75 65 72 79 20 62 79 20 72 6f 77 69 64  b>Query by rowid
2460: 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20 57 48 45  </b>. If the WHE
2470: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
2480: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2490: 74 0a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61  t.    contains a
24a0: 20 73 75 62 2d 63 6c 61 75 73 65 20 6f 66 20 74   sub-clause of t
24b0: 68 65 20 66 6f 72 6d 20 22 72 6f 77 69 64 20 3d  he form "rowid =
24c0: 20 3f 22 2c 20 77 68 65 72 65 20 3f 20 69 73 20   ?", where ? is 
24d0: 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  an SQL expressio
24e0: 6e 2c 0a 20 20 20 20 46 54 53 33 20 69 73 20 61  n,.    FTS3 is a
24f0: 62 6c 65 20 74 6f 20 72 65 74 72 65 69 76 65 20  ble to retreive 
2500: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 6f  the requested ro
2510: 77 20 64 69 72 65 63 74 6c 79 20 75 73 69 6e 67  w directly using
2520: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
2530: 0a 20 20 20 20 6f 66 20 61 6e 20 53 51 4c 69 74  .    of an SQLit
2540: 65 20 5c 5b 49 4e 54 45 47 45 52 20 50 52 49 4d  e \[INTEGER PRIM
2550: 41 52 59 20 4b 45 59 5c 5d 20 69 6e 64 65 78 2e  ARY KEY\] index.
2560: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20  ..  <li><p>.    
2570: 3c 62 3e 46 75 6c 6c 2d 74 65 78 74 20 71 75 65  <b>Full-text que
2580: 72 79 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20 57  ry</b>. If the W
2590: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
25a0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
25b0: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  ent contains.   
25c0: 20 61 20 73 75 62 2d 63 6c 61 75 73 65 20 6f 66   a sub-clause of
25d0: 20 74 68 65 20 66 6f 72 6d 20 22 26 6c 74 3b 63   the form "&lt;c
25e0: 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20  olumn&gt; MATCH 
25f0: 3f 22 2c 20 46 54 53 33 20 69 73 20 61 62 6c 65  ?", FTS3 is able
2600: 20 74 6f 20 75 73 65 20 0a 20 20 20 20 74 68 65   to use .    the
2610: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74   built-in full-t
2620: 65 78 74 20 69 6e 64 65 78 20 74 6f 20 72 65 73  ext index to res
2630: 74 72 69 63 74 20 74 68 65 20 73 65 61 72 63 68  trict the search
2640: 20 74 6f 20 74 68 6f 73 65 20 64 6f 63 75 6d 65   to those docume
2650: 6e 74 73 20 0a 20 20 20 20 74 68 61 74 20 6d 61  nts .    that ma
2660: 74 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  tch the full-tex
2670: 74 20 71 75 65 72 79 20 73 74 72 69 6e 67 20 73  t query string s
2680: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
2690: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
26a0: 6e 64 0a 20 20 20 20 6f 66 20 74 68 65 20 4d 41  nd.    of the MA
26b0: 54 43 48 20 63 6c 61 75 73 65 2e 0a 3c 2f 75 6c  TCH clause..</ul
26c0: 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 6e 65 69 74  >..<p>.  If neit
26d0: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 71  her of the two q
26e0: 75 65 72 79 20 73 74 72 61 74 65 67 69 65 73 20  uery strategies 
26f0: 65 6e 75 6d 65 72 61 74 65 64 20 61 62 6f 76 65  enumerated above
2700: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 61 6c   can be used, al
2710: 6c 0a 20 20 71 75 65 72 69 65 73 20 6f 6e 20 46  l.  queries on F
2720: 54 53 33 20 74 61 62 6c 65 73 20 61 72 65 20 69  TS3 tables are i
2730: 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
2740: 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f   a linear scan o
2750: 66 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 74  f the entire.  t
2760: 61 62 6c 65 2e 20 49 66 20 74 68 65 20 74 61 62  able. If the tab
2770: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c 61 72 67  le contains larg
2780: 65 20 61 6d 6f 75 6e 74 73 20 6f 66 20 64 61 74  e amounts of dat
2790: 61 2c 20 74 68 69 73 20 6d 61 79 20 62 65 20 61  a, this may be a
27a0: 6e 20 0a 20 20 69 6d 70 72 61 63 74 69 63 61 6c  n .  impractical
27b0: 6c 79 20 61 70 70 72 6f 61 63 68 20 28 74 68 65  ly approach (the
27c0: 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20 6f   first example o
27d0: 6e 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 77  n this page show
27e0: 73 20 74 68 61 74 20 61 20 6c 69 6e 65 61 72 0a  s that a linear.
27f0: 20 20 73 63 61 6e 20 6f 66 20 31 2e 35 20 47 42    scan of 1.5 GB
2800: 20 6f 66 20 64 61 74 61 20 74 61 6b 65 73 20 61   of data takes a
2810: 72 6f 75 6e 64 20 33 30 20 73 65 63 6f 6e 64 73  round 30 seconds
2820: 20 75 73 69 6e 67 20 61 20 6d 6f 64 65 72 6e 20   using a modern 
2830: 50 43 29 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  PC)...[Code {.  
2840: 3c 69 3e 2d 2d 20 54 68 65 20 65 78 61 6d 70 6c  <i>-- The exampl
2850: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
2860: 20 61 73 73 75 6d 65 20 74 68 65 20 66 6f 6c 6c   assume the foll
2870: 6f 77 69 6e 67 20 46 54 53 33 20 74 61 62 6c 65  owing FTS3 table
2880: 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  :</i>.  CREATE V
2890: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69  IRTUAL TABLE mai
28a0: 6c 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62  l USING fts3(sub
28b0: 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20 20  ject, body);..  
28c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
28d0: 69 6c 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  il WHERE rowid =
28e0: 20 31 35 3b 20 20 20 20 20 20 20 20 20 20 20 20   15;            
28f0: 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20      <i>-- Fast. 
2900: 52 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e 3c 2f 69  Rowid lookup.</i
2910: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
2920: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 62 6f 64  M mail WHERE bod
2930: 79 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 27  y MATCH 'sqlite'
2940: 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61  ;       <i>-- Fa
2950: 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75  st. Full-text qu
2960: 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ery.</i>.  SELEC
2970: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
2980: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27  ERE mail MATCH '
2990: 73 65 61 72 63 68 27 3b 20 20 20 20 20 20 20 3c  search';       <
29a0: 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d  i>-- Fast. Full-
29b0: 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  text query.</i>.
29c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
29d0: 6d 61 69 6c 20 57 48 45 52 45 20 72 6f 77 69 64  mail WHERE rowid
29e0: 20 42 45 54 57 45 45 4e 20 31 35 20 41 4e 44 20   BETWEEN 15 AND 
29f0: 32 30 3b 20 20 20 3c 69 3e 2d 2d 20 53 6c 6f 77  20;   <i>-- Slow
2a00: 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e 2e 3c 2f  . Linear scan.</
2a10: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
2a20: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 73 75  OM mail WHERE su
2a30: 62 6a 65 63 74 20 3d 20 27 64 61 74 61 62 61 73  bject = 'databas
2a40: 65 27 3b 20 20 20 20 20 20 3c 69 3e 2d 2d 20 53  e';      <i>-- S
2a50: 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e  low. Linear scan
2a60: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
2a70: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
2a80: 20 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27   subject MATCH '
2a90: 64 61 74 61 62 61 73 65 27 3b 20 20 3c 69 3e 2d  database';  <i>-
2aa0: 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78  - Fast. Full-tex
2ab0: 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 7d 5d 0a  t query.</i>.}].
2ac0: 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c 20 6f 66  .<p>.  In all of
2ad0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
2ae0: 75 65 72 69 65 73 20 61 62 6f 76 65 2c 20 74 68  ueries above, th
2af0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
2b00: 72 61 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43  rand of the MATC
2b10: 48 0a 20 20 6f 70 65 72 61 74 6f 72 20 69 73 20  H.  operator is 
2b20: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  a string consist
2b30: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
2b40: 77 6f 72 64 2e 20 49 6e 20 74 68 69 73 20 63 61  word. In this ca
2b50: 73 65 2c 20 74 68 65 20 4d 41 54 43 48 0a 20 20  se, the MATCH.  
2b60: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
2b70: 61 74 65 73 20 74 6f 20 74 72 75 65 20 66 6f 72  ates to true for
2b80: 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74   all documents t
2b90: 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20  hat contain one 
2ba0: 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e 73 74 61  or more .  insta
2bb0: 6e 63 65 73 20 6f 66 20 74 68 65 20 73 70 65 63  nces of the spec
2bc0: 69 66 69 65 64 20 77 6f 72 64 20 28 22 73 71 6c  ified word ("sql
2bd0: 69 74 65 22 2c 20 22 73 65 61 72 63 68 22 20 6f  ite", "search" o
2be0: 72 20 22 64 61 74 61 62 61 73 65 22 2c 20 64 65  r "database", de
2bf0: 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e 20 77 68  pending .  on wh
2c00: 69 63 68 20 65 78 61 6d 70 6c 65 20 79 6f 75 20  ich example you 
2c10: 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65 63 69 66  look at). Specif
2c20: 79 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 77 6f  ying a single wo
2c30: 72 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  rd as the right-
2c40: 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64 20 6f  hand.  operand o
2c50: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
2c60: 61 74 6f 72 20 72 65 73 75 6c 74 73 20 69 6e 20  ator results in 
2c70: 74 68 65 20 73 69 6d 70 6c 65 73 74 20 28 61 6e  the simplest (an
2c80: 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 29 20 74  d most common) t
2c90: 79 70 65 20 0a 20 20 6f 66 20 66 75 6c 6c 2d 74  ype .  of full-t
2ca0: 65 78 74 20 71 75 65 72 79 20 70 6f 73 73 69 62  ext query possib
2cb0: 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d 6f 72 65  le. However more
2cc0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 71 75 65   complicated que
2cd0: 72 69 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  ries are possibl
2ce0: 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e 67 20 70  e,.  including p
2cf0: 68 72 61 73 65 20 73 65 61 72 63 68 65 73 2c 20  hrase searches, 
2d00: 74 65 72 6d 2d 70 72 65 66 69 78 20 73 65 61 72  term-prefix sear
2d10: 63 68 65 73 20 61 6e 64 20 73 65 61 72 63 68 65  ches and searche
2d20: 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20  s for documents 
2d30: 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  .  containing co
2d40: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 65  mbinations of te
2d50: 72 6d 73 20 6f 63 63 75 72 69 6e 67 20 77 69 74  rms occuring wit
2d60: 68 69 6e 20 61 20 64 65 66 69 6e 65 64 20 70 72  hin a defined pr
2d70: 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68 0a  oximity of each.
2d80: 20 20 6f 74 68 65 72 2e 20 54 68 65 20 76 61 72    other. The var
2d90: 69 6f 75 73 20 77 61 79 73 20 69 6e 20 77 68 69  ious ways in whi
2da0: 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ch the full-text
2db0: 20 69 6e 64 65 78 20 6d 61 79 20 62 65 20 71 75   index may be qu
2dc0: 65 72 69 65 64 20 61 72 65 0a 20 20 5c 5b 46 54  eried are.  \[FT
2dd0: 53 33 20 4d 41 54 43 48 7c 64 65 73 63 72 69 62  S3 MATCH|describ
2de0: 65 64 20 62 65 6c 6f 77 5c 5d 2e 0a 0a 3c 70 3e  ed below\]...<p>
2df0: 0a 20 20 54 68 65 20 70 61 72 61 67 72 61 70 68  .  The paragraph
2e00: 20 61 62 6f 76 65 20 6e 6f 74 65 73 20 74 68 61   above notes tha
2e10: 74 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74  t a MATCH operat
2e20: 6f 72 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65  or with a simple
2e30: 20 77 6f 72 64 20 61 73 20 74 68 65 0a 20 20 72   word as the.  r
2e40: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
2e50: 64 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  d evaluates to t
2e60: 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  rue for all docu
2e70: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
2e80: 69 6e 20 74 68 65 0a 20 20 73 70 65 63 69 66 69  in the.  specifi
2e90: 65 64 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  ed term. In this
2ea0: 20 63 6f 6e 74 65 78 74 2c 20 74 68 65 20 22 64   context, the "d
2eb0: 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20 72 65 66  ocument" may ref
2ec0: 65 72 20 74 6f 20 65 69 74 68 65 72 20 74 68 65  er to either the
2ed0: 20 0a 20 20 64 61 74 61 20 73 74 6f 72 65 64 20   .  data stored 
2ee0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  in a single colu
2ef0: 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f 66 20 61  mn of a row of a
2f00: 6e 20 46 54 53 33 20 74 61 62 6c 65 2c 20 6f 72  n FTS3 table, or
2f10: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   to the contents
2f20: 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  of all column
2f30: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  s in a single ro
2f40: 77 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  w, depending on 
2f50: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 75  the identifier u
2f60: 73 65 64 20 61 73 20 74 68 65 0a 20 20 6c 65 66  sed as the.  lef
2f70: 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 74  t-hand operand t
2f80: 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  o the MATCH oper
2f90: 61 74 6f 72 2e 20 49 66 20 74 68 65 20 69 64 65  ator. If the ide
2fa0: 6e 74 69 66 69 65 72 20 73 70 65 63 69 66 69 65  ntifier specifie
2fb0: 64 20 61 73 0a 20 20 74 68 65 20 6c 65 66 74 2d  d as.  the left-
2fc0: 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20  hand operand of 
2fd0: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
2fe0: 6f 72 20 69 73 20 61 6e 20 46 54 53 33 20 74 61  or is an FTS3 ta
2ff0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  ble column name,
3000: 0a 20 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75  .  then the docu
3010: 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65  ment that the se
3020: 61 72 63 68 20 74 65 72 6d 20 6d 75 73 74 20 62  arch term must b
3030: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69  e contained in i
3040: 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 73 74  s the value.  st
3050: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  ored in the spec
3060: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 48 6f  ified column. Ho
3070: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 69 64  wever, if the id
3080: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
3090: 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46 54  name.  of the FT
30a0: 53 33 20 3c 69 3e 74 61 62 6c 65 3c 2f 69 3e 20  S3 <i>table</i> 
30b0: 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74 68 65  itself, then the
30c0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
30d0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
30e0: 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
30f0: 20 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62   of the FTS3 tab
3100: 6c 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e 79  le for which any
3110: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
3120: 20 74 68 65 20 73 65 61 72 63 68 20 0a 20 20 74   the search .  t
3130: 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  erm. The followi
3140: 6e 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e  ng example demon
3150: 73 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a 5b  strates this:..[
3160: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 45  Code {.  <i>-- E
3170: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 3c 2f 69  xample schema</i
3180: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
3190: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
31a0: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
31b0: 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d  , body);..  <i>-
31c0: 2d 20 45 78 61 6d 70 6c 65 20 74 61 62 6c 65 20  - Example table 
31d0: 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69 3e 0a 20  population</i>. 
31e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
31f0: 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74  l(docid, subject
3200: 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 31  , body) VALUES(1
3210: 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65 64  , 'software feed
3220: 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64 20 69 74  back', 'found it
3230: 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a 20 20 49   too slow');.  I
3240: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28  NSERT INTO mail(
3250: 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20  docid, subject, 
3260: 62 6f 64 79 29 20 56 41 4c 55 45 53 28 32 2c 20  body) VALUES(2, 
3270: 27 73 6f 66 74 77 61 72 65 20 66 65 65 64 62 61  'software feedba
3280: 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64 62 61 63  ck', 'no feedbac
3290: 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  k');.  INSERT IN
32a0: 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73  TO mail(docid, s
32b0: 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41  ubject, body) VA
32c0: 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77 20 6c 75  LUES(3, 'slow lu
32d0: 6e 63 68 20 6f 72 64 65 72 27 2c 20 20 27 77 61  nch order',  'wa
32e0: 73 20 61 20 73 6f 66 74 77 61 72 65 20 70 72 6f  s a software pro
32f0: 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  blem');..  <i>--
3300: 20 45 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73   Example queries
3310: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
3320: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
3330: 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27 73  subject MATCH 's
3340: 6f 66 74 77 61 72 65 27 3b 20 20 20 20 3c 69 3e  oftware';    <i>
3350: 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73 20  -- Selects rows 
3360: 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20 20 53 45  1 and 2</i>.  SE
3370: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
3380: 20 57 48 45 52 45 20 62 6f 64 79 20 20 20 20 4d   WHERE body    M
3390: 41 54 43 48 20 27 66 65 65 64 62 61 63 6b 27 3b  ATCH 'feedback';
33a0: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
33b0: 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20 20 53 45  s row 2</i>.  SE
33c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
33d0: 20 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20 4d   WHERE mail    M
33e0: 41 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b  ATCH 'software';
33f0: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
3400: 73 20 72 6f 77 73 20 31 2c 20 32 20 61 6e 64 20  s rows 1, 2 and 
3410: 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  3</i>.  SELECT *
3420: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
3430: 20 6d 61 69 6c 20 20 20 20 4d 41 54 43 48 20 27   mail    MATCH '
3440: 73 6c 6f 77 27 3b 20 20 20 20 20 20 20 20 3c 69  slow';        <i
3450: 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73  >-- Selects rows
3460: 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a 7d 5d 0a   1 and 3</i>.}].
3470: 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72 73    .<p>.  At firs
3480: 74 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66 69  t glance, the fi
3490: 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78  nal two full-tex
34a0: 74 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  t queries in the
34b0: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73   example above s
34c0: 65 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e 74  eem.  to be synt
34d0: 61 63 74 69 63 6c 79 20 69 6e 63 6f 72 72 65 63  acticly incorrec
34e0: 74 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61  t, as there is a
34f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d 61   table name ("ma
3500: 69 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20 61  il") used as.  a
3510: 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  n SQL expression
3520: 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69  . The reason thi
3530: 73 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20  s is acceptable 
3540: 69 73 20 74 68 61 74 20 65 61 63 68 20 46 54 53  is that each FTS
3550: 33 20 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c  3 table.  actual
3560: 6c 79 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74  ly has a \[sqlit
3570: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 7c  e3_declare_vtab|
3580: 48 49 44 44 45 4e 5c 5d 20 63 6f 6c 75 6d 6e 20  HIDDEN\] column 
3590: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
35a0: 6d 65 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c  me.  as the tabl
35b0: 65 20 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69  e itself (in thi
35c0: 73 20 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e  s case, "mail").
35d0: 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
35e0: 64 20 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75  d in this.  colu
35f0: 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e  mn is not meanin
3600: 67 66 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c  gful to the appl
3610: 69 63 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e  ication, but can
3620: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
3630: 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65  .  left-hand ope
3640: 72 61 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20  rand to a MATCH 
3650: 6f 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73  operator. This s
3660: 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61  pecial column ma
3670: 79 20 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73  y also be.  pass
3680: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
3690: 74 20 74 6f 20 74 68 65 20 5c 5b 73 6e 69 70 70  t to the \[snipp
36a0: 65 74 28 29 7c 46 54 53 33 20 61 75 78 69 6c 6c  et()|FTS3 auxill
36b0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 5c 5d 2e  ary functions\].
36c0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
36d0: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
36e0: 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 61 62  lustrates the ab
36f0: 6f 76 65 2e 20 54 68 65 20 65 78 70 72 65 73 73  ove. The express
3700: 69 6f 6e 73 20 22 64 6f 63 73 22 2c 20 0a 20 20  ions "docs", .  
3710: 22 64 6f 63 73 2e 64 6f 63 73 22 20 61 6e 64 20  "docs.docs" and 
3720: 22 6d 61 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 22  "main.docs.docs"
3730: 20 61 6c 6c 20 72 65 66 65 72 20 74 6f 20 63 6f   all refer to co
3740: 6c 75 6d 6e 20 22 64 6f 63 73 22 2e 20 48 6f 77  lumn "docs". How
3750: 65 76 65 72 2c 20 74 68 65 20 0a 20 20 65 78 70  ever, the .  exp
3760: 72 65 73 73 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f  ression "main.do
3770: 63 73 22 20 64 6f 65 73 20 6e 6f 74 20 72 65 66  cs" does not ref
3780: 65 72 20 74 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e  er to any column
3790: 2e 20 49 74 20 63 6f 75 6c 64 20 62 65 20 75 73  . It could be us
37a0: 65 64 20 74 6f 20 0a 20 20 72 65 66 65 72 20 74  ed to .  refer t
37b0: 6f 20 61 20 74 61 62 6c 65 2c 20 62 75 74 20 61  o a table, but a
37c0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
37d0: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  ot allowed in th
37e0: 65 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  e context in whi
37f0: 63 68 0a 20 20 69 74 20 69 73 20 75 73 65 64 20  ch.  it is used 
3800: 62 65 6c 6f 77 2e 0a 0a 5b 43 6f 64 65 20 7b 0a  below...[Code {.
3810: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
3820: 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45  schema</i>.  CRE
3830: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3840: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
3850: 33 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c  3(content);..  <
3860: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65  i>-- Example que
3870: 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ries</i>.  SELEC
3880: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
3890: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
38a0: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
38b0: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c        <i>-- OK.<
38c0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
38d0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
38e0: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
38f0: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
3900: 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20   <i>-- OK.</i>. 
3910: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
3920: 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64  ocs WHERE main.d
3930: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
3940: 73 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d  sqlite';    <i>-
3950: 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  - OK.</i>.  SELE
3960: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
3970: 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d  HERE main.docs M
3980: 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20  ATCH 'sqlite';  
3990: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72         <i>-- Err
39a0: 6f 72 2e 3c 2f 69 3e 0a 7d 5d 0a 20 0a 5b 68 32  or.</i>.}]. .[h2
39b0: 20 22 53 75 6d 6d 61 72 79 22 5d 0a 0a 3c 70 3e   "Summary"]..<p>
39c0: 0a 20 20 46 72 6f 6d 20 74 68 65 20 75 73 65 72  .  From the user
39d0: 73 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c  s point of view,
39e0: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
39f0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 72 64 69   similar to ordi
3a00: 6e 61 72 79 20 53 51 4c 69 74 65 0a 20 20 74 61  nary SQLite.  ta
3a10: 62 6c 65 73 20 69 6e 20 6d 61 6e 79 20 77 61 79  bles in many way
3a20: 73 2e 20 44 61 74 61 20 6d 61 79 20 62 65 20 61  s. Data may be a
3a30: 64 64 65 64 20 74 6f 2c 20 6d 6f 64 69 66 69 65  dded to, modifie
3a40: 64 20 77 69 74 68 69 6e 20 61 6e 64 20 72 65 6d  d within and rem
3a50: 6f 76 65 64 20 0a 20 20 66 72 6f 6d 20 46 54 53  oved .  from FTS
3a60: 33 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74  3 tables using t
3a70: 68 65 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  he INSERT, UPDAT
3a80: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 63 6f 6d  E and DELETE com
3a90: 6d 61 6e 64 73 20 6a 75 73 74 20 61 73 20 0a 20  mands just as . 
3aa0: 20 69 74 20 6d 61 79 20 62 65 20 77 69 74 68 20   it may be with 
3ab0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e  ordinary tables.
3ac0: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
3ad0: 53 45 4c 45 43 54 20 63 6f 6d 6d 61 6e 64 20 6d  SELECT command m
3ae0: 61 79 20 62 65 20 75 73 65 64 20 0a 20 20 74 6f  ay be used .  to
3af0: 20 71 75 65 72 79 20 64 61 74 61 2e 20 54 68 65   query data. The
3b00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20   following list 
3b10: 73 75 6d 6d 61 72 69 7a 65 73 20 74 68 65 20 64  summarizes the d
3b20: 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65  ifferences betwe
3b30: 65 6e 20 46 54 53 33 0a 20 20 61 6e 64 20 6f 72  en FTS3.  and or
3b40: 64 69 6e 61 72 79 20 74 61 62 6c 65 73 3a 0a 0a  dinary tables:..
3b50: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a  <ol>.  <li><p> .
3b60: 20 20 20 20 41 73 20 77 69 74 68 20 61 6c 6c 20      As with all 
3b70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 79  virtual table ty
3b80: 70 65 73 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  pes, it is not p
3b90: 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
3ba0: 65 20 69 6e 64 69 63 65 73 20 6f 72 0a 20 20 20  e indices or.   
3bb0: 20 74 72 69 67 67 65 72 73 20 61 74 74 61 63 68   triggers attach
3bc0: 65 64 20 74 6f 20 46 54 53 33 20 74 61 62 6c 65  ed to FTS3 table
3bd0: 73 2e 20 4e 6f 72 20 69 73 20 69 74 20 70 6f 73  s. Nor is it pos
3be0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65  sible to use the
3bf0: 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 20 20 20   ALTER TABLE.   
3c00: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 64 64 20   command to add 
3c10: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3c20: 20 46 54 53 33 20 74 61 62 6c 65 73 20 28 61 6c   FTS3 tables (al
3c30: 74 68 6f 75 67 68 20 69 74 20 69 73 20 70 6f 73  though it is pos
3c40: 73 69 62 6c 65 20 74 6f 20 75 73 65 0a 20 20 20  sible to use.   
3c50: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 6f 20   ALTER TABLE to 
3c60: 72 65 6e 61 6d 65 20 61 6e 20 46 54 53 33 20 74  rename an FTS3 t
3c70: 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  able)...  <li><p
3c80: 3e 20 0a 20 20 20 20 44 61 74 61 2d 74 79 70 65  > .    Data-type
3c90: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
3ca0: 61 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41  art of the "CREA
3cb0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
3cc0: 22 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  " statement.    
3cd0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
3ce0: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 61 72 65  n FTS3 table are
3cf0: 20 69 67 6e 6f 72 65 64 20 63 6f 6d 70 6c 65 74   ignored complet
3d00: 65 6c 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ely. Instead of 
3d10: 74 68 65 0a 20 20 20 20 6e 6f 72 6d 61 6c 20 72  the.    normal r
3d20: 75 6c 65 73 20 66 6f 72 20 61 70 70 6c 79 69 6e  ules for applyin
3d30: 67 20 74 79 70 65 20 5c 5b 61 66 66 69 6e 69 74  g type \[affinit
3d40: 79 5c 5d 20 74 6f 20 69 6e 73 65 72 74 65 64 20  y\] to inserted 
3d50: 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20 20 20  values, all.    
3d60: 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20  values inserted 
3d70: 69 6e 74 6f 20 46 54 53 33 20 74 61 62 6c 65 20  into FTS3 table 
3d80: 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74 20  columns (except 
3d90: 74 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77 69  the special rowi
3da0: 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61 72  d.    column) ar
3db0: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74  e converted to t
3dc0: 79 70 65 20 54 45 58 54 20 62 65 66 6f 72 65 20  ype TEXT before 
3dd0: 62 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a 20  being stored... 
3de0: 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46 54   <li><p> .    FT
3df0: 53 33 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74  S3 tables permit
3e00: 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69   the special ali
3e10: 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65  as "docid" to be
3e20: 20 75 73 65 64 20 74 6f 20 72 65 66 65 72 20 74   used to refer t
3e30: 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20  o the.    rowid 
3e40: 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64  column supported
3e50: 20 62 79 20 61 6c 6c 20 5c 5b 76 69 72 74 75 61   by all \[virtua
3e60: 6c 20 74 61 62 6c 65 73 5c 5d 2e 0a 0a 20 20 3c  l tables\]...  <
3e70: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20  li><p> .    The 
3e80: 5c 5b 46 54 53 33 20 4d 41 54 43 48 5c 5d 20 6f  \[FTS3 MATCH\] o
3e90: 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f  perator is suppo
3ea0: 72 74 65 64 20 66 6f 72 20 71 75 65 72 69 65 73  rted for queries
3eb0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
3ec0: 69 6c 74 2d 69 6e 0a 20 20 20 20 66 75 6c 6c 2d  ilt-in.    full-
3ed0: 74 65 78 74 20 69 6e 64 65 78 2e 20 0a 0a 20 20  text index. ..  
3ee0: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65  <li><p> .    The
3ef0: 20 46 54 53 33 20 61 75 78 69 6c 6c 61 72 79 20   FTS3 auxillary 
3f00: 66 75 6e 63 74 69 6f 6e 73 2c 20 5c 5b 73 6e 69  functions, \[sni
3f10: 70 70 65 74 7c 73 6e 69 70 70 65 74 28 29 20 61  ppet|snippet() a
3f20: 6e 64 20 6f 66 66 73 65 74 73 28 29 5c 5d 2c 20  nd offsets()\], 
3f30: 61 72 65 20 0a 20 20 20 20 61 76 61 69 6c 61 62  are .    availab
3f40: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  le to support fu
3f50: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 2e  ll-text queries.
3f60: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
3f70: 20 45 61 63 68 20 46 54 53 33 20 74 61 62 6c 65   Each FTS3 table
3f80: 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74 65 33   has a \[sqlite3
3f90: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 7c  _declare_vtab()|
3fa0: 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 5c 5d 20  HIDDEN column\] 
3fb0: 77 69 74 68 20 74 68 65 20 0a 20 20 20 20 73 61  with the .    sa
3fc0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  me name as the t
3fd0: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54 68 65  able itself. The
3fe0: 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 65 64   value contained
3ff0: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66 6f 72   in each row for
4000: 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 61 6c   the.    special
4010: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 6c 79 20   column is only 
4020: 75 73 65 66 75 6c 20 77 68 65 6e 20 75 73 65 64  useful when used
4030: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   on the left-han
4040: 64 20 73 69 64 65 20 6f 66 20 61 20 0a 20 20 20  d side of a .   
4050: 20 5c 5b 46 54 53 33 20 4d 41 54 43 48 7c 4d 41   \[FTS3 MATCH|MA
4060: 54 43 48 5c 5d 20 6f 70 65 72 61 74 6f 72 2c 20  TCH\] operator, 
4070: 6f 72 20 77 68 65 6e 20 73 70 65 63 69 66 69 65  or when specifie
4080: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
4090: 20 74 6f 20 6f 6e 65 20 0a 20 20 20 20 6f 66 20   to one .    of 
40a0: 74 68 65 20 5c 5b 73 6e 69 70 70 65 74 7c 46 54  the \[snippet|FT
40b0: 53 33 20 61 75 78 69 6c 6c 61 72 79 20 66 75 6e  S3 auxillary fun
40c0: 63 74 69 6f 6e 73 5c 5d 2e 0a 20 20 20 20 0a 0a  ctions\]..    ..
40d0: 3c 2f 6f 6c 3e 0a 0a 0a 5b 68 31 20 22 43 6f 6d  </ol>...[h1 "Com
40e0: 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61 62 6c  piling and Enabl
40f0: 69 6e 67 20 46 54 53 33 22 20 7b 7d 20 7b 63 6f  ing FTS3" {} {co
4100: 6d 70 69 6c 65 20 66 74 73 33 7d 5d 0a 0a 3c 70  mpile fts3}]..<p
4110: 3e 0a 20 20 41 6c 74 68 6f 75 67 68 20 46 54 53  >.  Although FTS
4120: 33 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  3 is distributed
4130: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
4140: 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 63 6f  SQLite source co
4150: 64 65 2c 20 69 74 20 69 73 20 6e 6f 74 0a 20 20  de, it is not.  
4160: 65 6e 61 62 6c 65 64 20 62 79 20 64 65 66 61 75  enabled by defau
4170: 6c 74 2e 20 54 6f 20 62 75 69 6c 64 20 53 51 4c  lt. To build SQL
4180: 69 74 65 20 77 69 74 68 20 46 54 53 33 20 66 75  ite with FTS3 fu
4190: 6e 63 74 69 6f 6e 61 6c 69 74 79 20 65 6e 61 62  nctionality enab
41a0: 6c 65 64 2c 20 64 65 66 69 6e 65 0a 20 20 74 68  led, define.  th
41b0: 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  e preprocessor m
41c0: 61 63 72 6f 20 5c 5b 53 51 4c 49 54 45 5f 45 4e  acro \[SQLITE_EN
41d0: 41 42 4c 45 5f 46 54 53 33 5c 5d 20 77 68 65 6e  ABLE_FTS3\] when
41e0: 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65 77 20   compiling. New 
41f0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 73  applications.  s
4200: 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66 69 6e  hould also defin
4210: 65 20 74 68 65 20 5c 5b 53 51 4c 49 54 45 5f 45  e the \[SQLITE_E
4220: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
4230: 54 48 45 53 49 53 5c 5d 20 6d 61 63 72 6f 20 74  THESIS\] macro t
4240: 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5c  o enable the.  \
4250: 5b 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20  [enhanced query 
4260: 73 79 6e 74 61 78 5c 5d 20 28 73 65 65 20 62 65  syntax\] (see be
4270: 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74  low). Usually, t
4280: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61  his is done by a
4290: 64 64 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c  dding the .  fol
42a0: 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63  lowing two switc
42b0: 68 65 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  hes to the compi
42c0: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
42d0: 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53  :..[Code {.  -DS
42e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
42f0: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
4300: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
4310: 45 53 49 53 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49  ESIS.}]..<p>.  I
4320: 66 20 75 73 69 6e 67 20 74 68 65 20 61 6d 61 6c  f using the amal
4330: 67 61 6d 61 74 69 6f 6e 20 61 75 74 6f 63 6f 6e  gamation autocon
4340: 66 20 62 61 73 65 64 20 62 75 69 6c 64 20 73 79  f based build sy
4350: 73 74 65 6d 2c 20 73 65 74 74 69 6e 67 20 74 68  stem, setting th
4360: 65 20 43 50 50 46 4c 41 47 53 0a 20 20 65 6e 76  e CPPFLAGS.  env
4370: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
4380: 65 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  e while running 
4390: 74 68 65 20 27 63 6f 6e 66 69 67 75 72 65 27 20  the 'configure' 
43a0: 73 63 72 69 70 74 20 69 73 20 61 6e 20 65 61 73  script is an eas
43b0: 79 0a 20 20 77 61 79 20 74 6f 20 73 65 74 20 74  y.  way to set t
43c0: 68 65 73 65 20 6d 61 63 72 6f 73 2e 20 46 6f 72  hese macros. For
43d0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f   example, the fo
43e0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
43f0: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43 50 50 46  ..[Code {.  CPPF
4400: 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45  LAGS="-DSQLITE_E
4410: 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c  NABLE_FTS3 -DSQL
4420: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
4430: 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63  PARENTHESIS" ./c
4440: 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e  onfigure &lt;con
4450: 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67  figure options&g
4460: 74 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 77 68 65  t;.}]..<p>.  whe
4470: 72 65 20 3c 69 3e 26 6c 74 3b 63 6f 6e 66 69 67  re <i>&lt;config
4480: 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 3c  ure options&gt;<
4490: 2f 69 3e 20 61 72 65 20 74 68 6f 73 65 20 6f 70  /i> are those op
44a0: 74 69 6f 6e 73 20 6e 6f 72 6d 61 6c 6c 79 20 70  tions normally p
44b0: 61 73 73 65 64 20 74 6f 0a 20 20 74 68 65 20 63  assed to.  the c
44c0: 6f 6e 66 69 67 75 72 65 20 73 63 72 69 70 74 2c  onfigure script,
44d0: 20 69 66 20 61 6e 79 2e 0a 0a 3c 70 3e 0a 20 20   if any...<p>.  
44e0: 42 65 63 61 75 73 65 20 46 54 53 33 20 69 73 20  Because FTS3 is 
44f0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
4500: 20 69 74 20 69 73 20 69 6e 63 6f 6d 70 61 74 69   it is incompati
4510: 62 6c 65 20 77 69 74 68 20 74 68 65 0a 20 20 5c  ble with the.  \
4520: 5b 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  [SQLITE_OMIT_VIR
4530: 54 55 41 4c 54 41 42 4c 45 5c 5d 20 6f 70 74 69  TUALTABLE\] opti
4540: 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 6e  on...<p>.  If an
4550: 20 53 51 4c 69 74 65 20 62 75 69 6c 64 20 64 6f   SQLite build do
4560: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 46  es not include F
4570: 54 53 33 2c 20 74 68 65 6e 20 61 6e 79 20 61 74  TS3, then any at
4580: 74 65 6d 70 74 20 74 6f 20 70 72 65 70 61 72 65  tempt to prepare
4590: 20 61 6e 0a 20 20 53 51 4c 20 73 74 61 74 65 6d   an.  SQL statem
45a0: 65 6e 74 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ent to create an
45b0: 20 46 54 53 33 20 74 61 62 6c 65 20 6f 72 20 74   FTS3 table or t
45c0: 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73  o drop or access
45d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20   an existing .  
45e0: 46 54 53 33 20 74 61 62 6c 65 20 69 6e 20 61 6e  FTS3 table in an
45f0: 79 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e  y way will fail.
4600: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
4610: 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
4620: 20 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74   be similar .  t
4630: 6f 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  o "no such modul
4640: 65 3a 20 66 74 73 33 22 2e 0a 0a 3c 70 3e 0a 20  e: fts3"...<p>. 
4650: 20 49 66 20 74 68 65 20 43 20 76 65 72 73 69 6f   If the C versio
4660: 6e 20 6f 66 20 74 68 65 20 3c 61 20 68 72 65 66  n of the <a href
4670: 3d 68 74 74 70 3a 2f 2f 73 69 74 65 2e 69 63 75  =http://site.icu
4680: 2d 70 72 6f 6a 65 63 74 2e 6f 72 67 2f 3e 49 43  -project.org/>IC
4690: 55 20 6c 69 62 72 61 72 79 3c 2f 61 3e 0a 20 20  U library</a>.  
46a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  is available, th
46b0: 65 6e 20 46 54 53 33 20 6d 61 79 20 61 6c 73 6f  en FTS3 may also
46c0: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   be compiled wit
46d0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
46e0: 42 4c 45 5f 49 43 55 0a 20 20 70 72 65 2d 70 72  BLE_ICU.  pre-pr
46f0: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 64 65  ocessor macro de
4700: 66 69 6e 65 64 2e 20 43 6f 6d 70 69 6c 69 6e 67  fined. Compiling
4710: 20 77 69 74 68 20 74 68 69 73 20 6d 61 63 72 6f   with this macro
4720: 20 65 6e 61 62 6c 65 73 20 61 6e 20 46 54 53 33   enables an FTS3
4730: 0a 20 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 5c 5d  .  \[tokenizer\]
4740: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 49   that uses the I
4750: 43 55 20 6c 69 62 72 61 72 79 20 74 6f 20 73 70  CU library to sp
4760: 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  lit a document i
4770: 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28 77 6f 72  nto terms.  (wor
4780: 64 73 29 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ds) using the co
4790: 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72 20 61 20  nventions for a 
47a0: 73 70 65 63 69 66 69 65 64 20 6c 61 6e 67 75 61  specified langua
47b0: 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65 2e 0a 0a  ge and locale...
47c0: 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53 51 4c 49  [Code {.  -DSQLI
47d0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 7d 5d  TE_ENABLE_ICU.}]
47e0: 0a 20 20 0a 0a 5b 68 31 20 22 46 75 6c 6c 2d 74  .  ..[h1 "Full-t
47f0: 65 78 74 20 49 6e 64 65 78 20 51 75 65 72 69 65  ext Index Querie
4800: 73 22 20 7b 7d 20 7b 46 54 53 33 20 4d 41 54 43  s" {} {FTS3 MATC
4810: 48 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  H}]..<p>.  The m
4820: 6f 73 74 20 75 73 65 66 75 6c 20 74 68 69 6e 67  ost useful thing
4830: 20 61 62 6f 75 74 20 46 54 53 33 20 74 61 62 6c   about FTS3 tabl
4840: 65 73 20 69 73 20 74 68 65 20 71 75 65 72 69 65  es is the querie
4850: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 0a 20  s that may be . 
4860: 20 70 65 72 66 6f 72 6d 65 64 20 75 73 69 6e 67   performed using
4870: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
4880: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 46  ll-text index. F
4890: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
48a0: 20 61 72 65 20 0a 20 20 70 65 72 66 6f 72 6d 65   are .  performe
48b0: 64 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20  d by specifying 
48c0: 61 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  a clause of the 
48d0: 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b 63 6f 6c  form .  "&lt;col
48e0: 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20 26 6c  umn&gt; MATCH &l
48f0: 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  t;full-text quer
4900: 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b  y expression&gt;
4910: 22 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 0a  " to the WHERE .
4920: 20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45    clause of a SE
4930: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
4940: 68 61 74 20 72 65 61 64 73 20 64 61 74 61 20 66  hat reads data f
4950: 72 6f 6d 20 61 6e 20 46 54 53 33 20 74 61 62 6c  rom an FTS3 tabl
4960: 65 2e 20 0a 20 20 5c 5b 73 69 6d 70 6c 65 20 66  e. .  \[simple f
4970: 74 73 33 20 71 75 65 72 69 65 73 7c 53 69 6d 70  ts3 queries|Simp
4980: 6c 65 20 46 54 53 33 20 71 75 65 72 69 65 73 5c  le FTS3 queries\
4990: 5d 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 6c  ] that return al
49a0: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
49b0: 20 0a 20 20 63 6f 6e 74 61 69 6e 20 61 20 67 69   .  contain a gi
49c0: 76 65 6e 20 74 65 72 6d 20 61 72 65 20 64 65 73  ven term are des
49d0: 63 72 69 62 65 64 20 61 62 6f 76 65 2e 20 49 6e  cribed above. In
49e0: 20 74 68 61 74 20 64 69 73 63 75 73 73 69 6f 6e   that discussion
49f0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a   the right-hand.
4a00: 20 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65    operand of the
4a10: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
4a20: 77 61 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62  was assumed to b
4a30: 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  e a string consi
4a40: 73 74 69 6e 67 20 6f 66 20 61 0a 20 20 73 69 6e  sting of a.  sin
4a50: 67 6c 65 20 74 65 72 6d 2e 20 54 68 69 73 20 73  gle term. This s
4a60: 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73  ection describes
4a70: 20 74 68 65 20 6d 6f 72 65 20 63 6f 6d 70 6c 65   the more comple
4a80: 78 20 71 75 65 72 79 20 74 79 70 65 73 20 73 75  x query types su
4a90: 70 70 6f 72 74 65 64 20 0a 20 20 62 79 20 46 54  pported .  by FT
4aa0: 53 33 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 68  S3 tables, and h
4ab0: 6f 77 20 74 68 65 79 20 6d 61 79 20 62 65 20 75  ow they may be u
4ac0: 74 69 6c 69 7a 65 64 20 62 79 20 73 70 65 63 69  tilized by speci
4ad0: 66 79 69 6e 67 20 6d 6f 72 65 20 61 20 6d 6f 72  fying more a mor
4ae0: 65 0a 20 20 63 6f 6d 70 6c 65 78 20 71 75 65 72  e.  complex quer
4af0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  y expression as 
4b00: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  the right-hand o
4b10: 70 65 72 61 6e 64 20 6f 66 20 61 20 4d 41 54 43  perand of a MATC
4b20: 48 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 20  H operator...<p 
4b30: 63 6c 61 73 73 3d 74 6f 64 6f 3e 0a 20 20 57 68  class=todo>.  Wh
4b40: 65 72 65 20 73 68 6f 75 6c 64 20 74 68 65 20 63  ere should the c
4b50: 6f 6c 75 6d 6e 20 73 65 6c 65 63 74 69 6f 6e 20  olumn selection 
4b60: 73 79 6e 74 61 78 20 67 6f 3f 0a 0a 3c 70 3e 0a  syntax go?..<p>.
4b70: 20 20 46 54 53 33 20 74 61 62 6c 65 73 20 73 75    FTS3 tables su
4b80: 70 70 6f 72 74 20 74 68 72 65 65 20 62 61 73 69  pport three basi
4b90: 63 20 71 75 65 72 79 20 74 79 70 65 73 3a 0a 0a  c query types:..
4ba0: 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62  <ul>.  <li><p><b
4bb0: 3e 54 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20  >Token or token 
4bc0: 70 72 65 66 69 78 20 71 75 65 72 69 65 73 3c 2f  prefix queries</
4bd0: 62 3e 2e 20 0a 20 20 20 20 41 6e 20 46 54 53 33  b>. .    An FTS3
4be0: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 71 75   table may be qu
4bf0: 65 72 69 65 64 20 66 6f 72 20 61 6c 6c 20 64 6f  eried for all do
4c00: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
4c10: 74 61 69 6e 20 61 20 73 70 65 63 69 66 69 65 64  tain a specified
4c20: 0a 20 20 20 20 74 65 72 6d 20 28 74 68 65 20 5c  .    term (the \
4c30: 5b 73 69 6d 70 6c 65 20 66 74 73 33 20 71 75 65  [simple fts3 que
4c40: 72 69 65 73 7c 73 69 6d 70 6c 65 20 63 61 73 65  ries|simple case
4c50: 5c 5d 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  \] described abo
4c60: 76 65 29 2c 20 6f 72 20 66 6f 72 0a 20 20 20 20  ve), or for.    
4c70: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
4c80: 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72  at contain a ter
4c90: 6d 20 77 69 74 68 20 61 20 73 70 65 63 69 66 69  m with a specifi
4ca0: 65 64 20 70 72 65 66 69 78 2e 20 41 73 20 77 65  ed prefix. As we
4cb0: 20 68 61 76 65 0a 20 20 20 20 73 65 65 6e 2c 20   have.    seen, 
4cc0: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
4cd0: 73 69 6f 6e 20 66 6f 72 20 61 20 73 70 65 63 69  sion for a speci
4ce0: 66 69 63 20 74 65 72 6d 20 69 73 20 73 69 6d 70  fic term is simp
4cf0: 6c 79 20 74 68 65 20 74 65 72 6d 20 69 74 73 65  ly the term itse
4d00: 6c 66 2e 0a 20 20 20 20 54 68 65 20 71 75 65 72  lf..    The quer
4d10: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  y expression use
4d20: 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  d to search for 
4d30: 61 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 73  a term prefix is
4d40: 20 74 68 65 20 70 72 65 66 69 78 0a 20 20 20 20   the prefix.    
4d50: 69 74 73 65 6c 66 20 77 69 74 68 20 61 20 27 2a  itself with a '*
4d60: 27 20 63 68 61 72 61 63 74 65 72 20 61 70 70 65  ' character appe
4d70: 6e 64 65 64 20 74 6f 20 69 74 2e 20 46 6f 72 20  nded to it. For 
4d80: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a  example:.</ul>..
4d90: 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20  [Code {.  <i>-- 
4da0: 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f  Query for all do
4db0: 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69  cuments containi
4dc0: 6e 67 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e  ng the term "lin
4dd0: 75 78 22 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ux":</i>.  SELEC
4de0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
4df0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
4e00: 6c 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  linux';..  <i>--
4e10: 20 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64   Query for all d
4e20: 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e  ocuments contain
4e30: 69 6e 67 20 61 20 74 65 72 6d 20 77 69 74 68 20  ing a term with 
4e40: 74 68 65 20 70 72 65 66 69 78 20 22 6c 69 6e 22  the prefix "lin"
4e50: 2e 20 54 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  . This will matc
4e60: 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6c  h</i>.  <i>-- al
4e70: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
4e80: 20 63 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22   contain "linux"
4e90: 2c 20 62 75 74 20 61 6c 73 6f 20 74 68 6f 73 65  , but also those
4ea0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65   that contain te
4eb0: 72 6d 73 20 22 6c 69 6e 65 61 72 22 2c 3c 2f 69  rms "linear",</i
4ec0: 3e 0a 20 20 3c 69 3e 2d 2d 22 6c 69 6e 6b 65 72  >.  <i>--"linker
4ed0: 22 2c 20 22 6c 69 6e 67 75 69 73 74 69 63 22 20  ", "linguistic" 
4ee0: 61 6e 64 20 73 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20  and so on.</i>. 
4ef0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
4f00: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
4f10: 41 54 43 48 20 27 6c 69 6e 2a 27 3b 0a 7d 5d 0a  ATCH 'lin*';.}].
4f20: 20 20 20 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c     .<ul>.  <li><
4f30: 70 3e 3c 62 3e 50 68 72 61 73 65 20 71 75 65 72  p><b>Phrase quer
4f40: 69 65 73 3c 2f 62 3e 2e 0a 20 20 20 20 41 20 70  ies</b>..    A p
4f50: 68 72 61 73 65 20 71 75 65 72 79 20 69 73 20 61  hrase query is a
4f60: 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74 72   query that retr
4f70: 65 69 76 65 73 20 61 6c 6c 20 64 6f 63 75 6d 65  eives all docume
4f80: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
4f90: 20 61 0a 20 20 20 20 6e 6f 6d 69 6e 61 74 65 64   a.    nominated
4fa0: 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 6f 72   set of terms or
4fb0: 20 74 65 72 6d 20 70 72 65 66 69 78 65 73 20 69   term prefixes i
4fc0: 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 6f 72  n a specified or
4fd0: 64 65 72 20 77 69 74 68 20 6e 6f 0a 20 20 20 20  der with no.    
4fe0: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 6f 6b 65  intervening toke
4ff0: 6e 73 2e 20 50 68 72 61 73 65 20 71 75 65 72 69  ns. Phrase queri
5000: 65 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  es are specified
5010: 20 62 79 20 65 6e 63 6c 6f 73 69 6e 67 20 61 20   by enclosing a 
5020: 73 70 61 63 65 0a 20 20 20 20 73 65 70 61 72 61  space.    separa
5030: 74 65 64 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ted sequence of 
5040: 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 20 70 72  terms or term pr
5050: 65 66 69 78 65 73 20 69 6e 20 64 6f 75 62 6c 65  efixes in double
5060: 20 71 75 6f 74 65 73 20 28 22 29 2e 0a 20 20 20   quotes (")..   
5070: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f   For example:.</
5080: 75 6c 3e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  ul>..[Code {.  <
5090: 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 61  i>-- Query for a
50a0: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
50b0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 68  t contain the ph
50c0: 72 61 73 65 20 22 6c 69 6e 75 78 20 61 70 70 6c  rase "linux appl
50d0: 69 63 61 74 69 6f 6e 73 22 2e 3c 2f 69 3e 0a 20  ications".</i>. 
50e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
50f0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
5100: 41 54 43 48 20 27 22 6c 69 6e 75 78 20 61 70 70  ATCH '"linux app
5110: 6c 69 63 61 74 69 6f 6e 73 22 27 3b 0a 0a 20 20  lications"';..  
5120: 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20  <i>-- Query for 
5130: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
5140: 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 70 68 72  at contain a phr
5150: 61 73 65 20 74 68 61 74 20 6d 61 74 63 68 65 73  ase that matches
5160: 20 22 6c 69 6e 2a 20 61 70 70 2a 22 2e 20 41 73   "lin* app*". As
5170: 20 77 65 6c 6c 20 61 73 3c 2f 69 3e 0a 20 20 3c   well as</i>.  <
5180: 69 3e 2d 2d 20 22 6c 69 6e 75 78 20 61 70 70 6c  i>-- "linux appl
5190: 69 63 61 74 69 6f 6e 73 22 2c 20 74 68 69 73 20  ications", this 
51a0: 77 69 6c 6c 20 6d 61 74 63 68 20 63 6f 6d 6d 6f  will match commo
51b0: 6e 20 70 68 72 61 73 65 73 20 73 75 63 68 20 61  n phrases such a
51c0: 73 20 22 6c 69 6e 6f 6c 65 75 6d 20 61 70 70 6c  s "linoleum appl
51d0: 69 61 6e 63 65 73 22 3c 2f 69 3e 0a 20 20 3c 69  iances"</i>.  <i
51e0: 3e 2d 2d 20 6f 72 20 22 6c 69 6e 6b 20 61 70 70  >-- or "link app
51f0: 72 65 6e 74 69 63 65 22 2e 3c 2f 69 3e 0a 20 20  rentice".</i>.  
5200: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
5210: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
5220: 54 43 48 20 27 22 6c 69 6e 2a 20 61 70 70 2a 22  TCH '"lin* app*"
5230: 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  ';.}]..<ul>.  <l
5240: 69 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20 71 75 65  i><p><b>NEAR que
5250: 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20 41  ries</b>. .    A
5260: 20 4e 45 41 52 20 71 75 65 72 79 20 69 73 20 61   NEAR query is a
5270: 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74 75   query that retu
5280: 72 6e 73 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  rns documents th
5290: 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 77 6f  at contain a two
52a0: 20 6f 72 0a 20 20 20 20 6d 6f 72 65 20 6e 6f 6d   or.    more nom
52b0: 69 6e 61 74 65 64 20 74 65 72 6d 73 20 6f 66 20  inated terms of 
52c0: 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20 61  phrases within a
52d0: 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78 69   specified proxi
52e0: 6d 69 74 79 20 6f 66 20 65 61 63 68 20 0a 20 20  mity of each .  
52f0: 20 20 6f 74 68 65 72 20 28 62 79 20 64 65 66 61    other (by defa
5300: 75 6c 74 20 77 69 74 68 20 31 30 20 6f 72 20 6c  ult with 10 or l
5310: 65 73 73 20 69 6e 74 65 72 76 65 6e 69 6e 67 20  ess intervening 
5320: 74 65 72 6d 73 29 2e 20 41 20 4e 45 41 52 20 71  terms). A NEAR q
5330: 75 65 72 79 20 69 73 20 0a 20 20 20 20 73 70 65  uery is .    spe
5340: 63 69 66 69 65 64 20 62 79 20 70 75 74 74 69 6e  cified by puttin
5350: 67 20 74 68 65 20 6b 65 79 77 6f 72 64 20 22 4e  g the keyword "N
5360: 45 41 52 22 20 62 65 74 77 65 65 6e 20 74 77 6f  EAR" between two
5370: 20 70 68 72 61 73 65 2c 20 74 65 72 6d 20 6f 72   phrase, term or
5380: 20 0a 20 20 20 20 74 65 72 6d 20 70 72 65 66 69   .    term prefi
5390: 78 20 71 75 65 72 69 65 73 2e 20 54 6f 20 73 70  x queries. To sp
53a0: 65 63 69 66 79 20 61 20 70 72 6f 78 69 6d 69 74  ecify a proximit
53b0: 79 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  y other than the
53c0: 20 64 65 66 61 75 6c 74 2c 0a 20 20 20 20 61 6e   default,.    an
53d0: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
53e0: 20 66 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e 26   form "NEAR/<i>&
53f0: 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d 61  lt;N&gt;</i>" ma
5400: 79 20 62 65 20 75 73 65 64 2c 20 77 68 65 72 65  y be used, where
5410: 0a 20 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67 74  .    <i>&lt;N&gt
5420: 3b 3c 2f 69 3e 20 69 73 20 74 68 65 20 6d 61 78  ;</i> is the max
5430: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
5440: 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73  ntervening terms
5450: 20 61 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46 6f   allowed..    Fo
5460: 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e  r example:.</ul>
5470: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
5480: 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  - Virtual table 
5490: 64 65 63 6c 61 72 61 74 69 6f 6e 2e 3c 2f 69 3e  declaration.</i>
54a0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
54b0: 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49  L TABLE docs USI
54c0: 4e 47 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69  NG fts3();..  <i
54d0: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
54e0: 65 20 64 61 74 61 2e 3c 2f 69 3e 0a 20 20 49 4e  e data.</i>.  IN
54f0: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 20 56  SERT INTO docs V
5500: 41 4c 55 45 53 28 27 53 51 4c 69 74 65 20 69 73  ALUES('SQLite is
5510: 20 61 6e 20 41 43 49 44 20 63 6f 6d 70 6c 69 61   an ACID complia
5520: 6e 74 20 65 6d 62 65 64 64 65 64 20 72 65 6c 61  nt embedded rela
5530: 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20  tional database 
5540: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 79 73 74 65  management syste
5550: 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  m');..  <i>-- Se
5560: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
5570: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
5580: 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c  s the terms "sql
5590: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
55a0: 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c  se" with</i>.  <
55b0: 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68  i>-- not more th
55c0: 61 6e 20 31 30 20 69 6e 74 65 72 76 65 6e 69 6e  an 10 intervenin
55d0: 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20 6d 61  g terms. This ma
55e0: 74 63 68 65 73 20 74 68 65 20 6f 6e 6c 79 20 64  tches the only d
55f0: 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f 69 3e 0a 20  ocument in</i>. 
5600: 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 64 6f 63   <i>-- table doc
5610: 73 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 61  s (since there a
5620: 72 65 20 6f 6e 6c 79 20 73 69 78 20 74 65 72 6d  re only six term
5630: 73 20 62 65 74 77 65 65 6e 20 22 53 51 4c 69 74  s between "SQLit
5640: 65 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65  e" and "database
5650: 22 3c 2f 69 3e 20 0a 20 20 3c 69 3e 2d 2d 20 69  "</i> .  <i>-- i
5660: 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 29 3c  n the document)<
5670: 2f 69 3e 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20  /i>..  SELECT * 
5680: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
5690: 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69  docs MATCH 'sqli
56a0: 74 65 20 4e 45 41 52 20 64 61 74 61 62 61 73 65  te NEAR database
56b0: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72  ';..  <i>-- Sear
56c0: 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e  ch for a documen
56d0: 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  t that contains 
56e0: 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74  the terms "sqlit
56f0: 65 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65  e" and "database
5700: 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e  " with</i>.  <i>
5710: 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e  -- not more than
5720: 20 36 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74   6 intervening t
5730: 65 72 6d 73 2e 20 54 68 69 73 20 61 6c 73 6f 20  erms. This also 
5740: 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e 6c 79  matches the only
5750: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f 69 3e   document in</i>
5760: 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 64  .  <i>-- table d
5770: 6f 63 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  ocs. Note that t
5780: 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
5790: 68 20 74 68 65 20 74 65 72 6d 73 20 61 70 70 65  h the terms appe
57a0: 61 72 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  ar in the docume
57b0: 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64  nt</i>.  <i>-- d
57c0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
57d0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
57e0: 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
57f0: 68 20 74 68 65 79 20 61 70 70 65 61 72 20 69 6e  h they appear in
5800: 20 74 68 65 20 71 75 65 72 79 2e 3c 2f 69 3e 0a   the query.</i>.
5810: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5820: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
5830: 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20  MATCH 'database 
5840: 4e 45 41 52 2f 36 20 73 71 6c 69 74 65 27 3b 0a  NEAR/6 sqlite';.
5850: 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20  .  <i>-- Search 
5860: 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74  for a document t
5870: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
5880: 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20   terms "sqlite" 
5890: 61 6e 64 20 22 64 61 74 61 62 61 73 65 22 20 77  and "database" w
58a0: 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ith</i>.  <i>-- 
58b0: 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 35 20  not more than 5 
58c0: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d  intervening term
58d0: 73 2e 20 54 68 69 73 20 71 75 65 72 79 20 6d 61  s. This query ma
58e0: 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e  tches no documen
58f0: 74 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ts.</i>.  SELECT
5900: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
5910: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
5920: 61 74 61 62 61 73 65 20 4e 45 41 52 2f 35 20 73  atabase NEAR/5 s
5930: 71 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  qlite';..  <i>--
5940: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f   Search for a do
5950: 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74  cument that cont
5960: 61 69 6e 73 20 74 68 65 20 70 68 72 61 73 65 20  ains the phrase 
5970: 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22  "ACID compliant"
5980: 20 61 6e 64 20 74 68 65 20 74 65 72 6d 3c 2f 69   and the term</i
5990: 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 61 74 61 62  >.  <i>-- "datab
59a0: 61 73 65 22 20 77 69 74 68 20 6e 6f 74 20 6d 6f  ase" with not mo
59b0: 72 65 20 74 68 61 6e 20 32 20 74 65 72 6d 73 20  re than 2 terms 
59c0: 73 65 70 61 72 61 74 69 6e 67 20 74 68 65 20 74  separating the t
59d0: 77 6f 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  wo. This matches
59e0: 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   the</i>.  <i>--
59f0: 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64   document stored
5a00: 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73 2e 3c   in table docs.<
5a10: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
5a20: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
5a30: 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62  ocs MATCH 'datab
5a40: 61 73 65 20 4e 45 41 52 2f 32 20 22 41 43 49 44  ase NEAR/2 "ACID
5a50: 20 63 6f 6d 70 6c 69 61 6e 74 22 27 3b 0a 0a 20   compliant"';.. 
5a60: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
5a70: 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61  r a document tha
5a80: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
5a90: 68 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d 70  hrase "ACID comp
5aa0: 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20 74  liant" and the t
5ab0: 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  erm</i>.  <i>-- 
5ac0: 22 73 71 6c 69 74 65 22 20 77 69 74 68 20 6e 6f  "sqlite" with no
5ad0: 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20 74 65  t more than 2 te
5ae0: 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67 20 74  rms separating t
5af0: 68 65 20 74 77 6f 2e 20 54 68 69 73 20 61 6c 73  he two. This als
5b00: 6f 20 6d 61 74 63 68 65 73 3c 2f 69 3e 0a 20 20  o matches</i>.  
5b10: 3c 69 3e 2d 2d 20 74 68 65 20 6f 6e 6c 79 20 64  <i>-- the only d
5b20: 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69  ocument stored i
5b30: 6e 20 74 61 62 6c 65 20 64 6f 63 73 2e 3c 2f 69  n table docs.</i
5b40: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
5b50: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
5b60: 73 20 4d 41 54 43 48 20 27 22 41 43 49 44 20 63  s MATCH '"ACID c
5b70: 6f 6d 70 6c 69 61 6e 74 22 20 4e 45 41 52 2f 32  ompliant" NEAR/2
5b80: 20 73 71 6c 69 74 65 27 3b 0a 7d 5d 0a 0a 3c 75   sqlite';.}]..<u
5b90: 6c 3e 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22  l>.  <li style="
5ba0: 6c 69 73 74 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65  list-style: none
5bb0: 22 3e 3c 70 3e 0a 20 20 20 20 4d 6f 72 65 20 74  "><p>.    More t
5bc0: 68 61 6e 20 6f 6e 65 20 4e 45 41 52 20 6f 70 65  han one NEAR ope
5bd0: 72 61 74 6f 72 20 6d 61 79 20 61 70 70 65 61 72  rator may appear
5be0: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 71 75 65   in a single que
5bf0: 72 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ry. In this case
5c00: 20 65 61 63 68 0a 20 20 20 20 70 61 69 72 20 6f   each.    pair o
5c10: 66 20 74 65 72 6d 73 20 6f 72 20 70 68 72 61 73  f terms or phras
5c20: 65 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  es separated by 
5c30: 61 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20  a NEAR operator 
5c40: 6d 75 73 74 20 61 70 70 65 61 72 20 77 69 74 68  must appear with
5c50: 69 6e 20 74 68 65 0a 20 20 20 20 73 70 65 63 69  in the.    speci
5c60: 66 69 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f  fied proximity o
5c70: 66 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  f each other in 
5c80: 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 55 73  the document. Us
5c90: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 61 62  ing the same tab
5ca0: 6c 65 20 61 6e 64 0a 20 20 20 20 64 61 74 61 20  le and.    data 
5cb0: 61 73 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  as in the block 
5cc0: 6f 66 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76  of examples abov
5cd0: 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64 65 20  e:.</ul>..[Code 
5ce0: 7b 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c  { <i>-- The foll
5cf0: 6f 77 69 6e 67 20 71 75 65 72 79 20 73 65 6c 65  owing query sele
5d00: 63 74 73 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  cts documents th
5d10: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  at contains an i
5d20: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 74  nstance of the t
5d30: 65 72 6d 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  erm </i>.  <i>--
5d40: 20 22 73 71 6c 69 74 65 22 20 73 65 70 61 72 61   "sqlite" separa
5d50: 74 65 64 20 62 79 20 74 77 6f 20 6f 72 20 66 65  ted by two or fe
5d60: 77 65 72 20 74 65 72 6d 73 20 66 72 6f 6d 20 61  wer terms from a
5d70: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
5d80: 65 20 74 65 72 6d 20 22 61 63 69 64 22 2c 3c 2f  e term "acid",</
5d90: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 68 69 63 68  i>.  <i>-- which
5da0: 20 69 73 20 69 6e 20 74 75 72 6e 20 73 65 70 61   is in turn sepa
5db0: 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f 72 20  rated by two or 
5dc0: 66 65 77 65 72 20 74 65 72 6d 73 20 66 72 6f 6d  fewer terms from
5dd0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5de0: 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c  the term</i>.  <
5df0: 69 3e 2d 2d 20 22 72 65 6c 61 74 69 6f 6e 61 6c  i>-- "relational
5e00: 22 2e 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  ". As it happens
5e10: 2c 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  , the only docum
5e20: 65 6e 74 20 69 6e 20 74 61 62 6c 65 20 64 6f 63  ent in table doc
5e30: 73 20 73 61 74 69 73 66 69 65 73 20 74 68 69 73  s satisfies this
5e40: 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e 0a 20   criteria.</i>. 
5e50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
5e60: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
5e70: 41 54 43 48 20 27 73 71 6c 69 74 65 20 4e 45 41  ATCH 'sqlite NEA
5e80: 52 2f 32 20 61 63 69 64 20 4e 45 41 52 2f 32 20  R/2 acid NEAR/2 
5e90: 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 0a 20 20  relational';..  
5ea0: 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65 72 79  <i>-- This query
5eb0: 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75   matches no docu
5ec0: 6d 65 6e 74 73 2e 20 54 68 65 72 65 20 69 73 20  ments. There is 
5ed0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5ee0: 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22  he term "sqlite"
5ef0: 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   with</i>.  <i>-
5f00: 2d 20 73 75 66 66 69 63 69 65 6e 74 20 70 72 6f  - sufficient pro
5f10: 78 69 6d 69 74 79 20 74 6f 20 61 6e 20 69 6e 73  ximity to an ins
5f20: 74 61 6e 63 65 20 6f 66 20 22 61 63 69 64 22 20  tance of "acid" 
5f30: 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20 73 75  but it is not su
5f40: 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65  fficiently close
5f50: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20  </i>.  <i>-- to 
5f60: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5f70: 68 65 20 74 65 72 6d 20 22 72 65 6c 61 74 69 6f  he term "relatio
5f80: 6e 61 6c 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  nal".</i>.  SELE
5f90: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
5fa0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
5fb0: 27 61 63 69 64 20 4e 45 41 52 2f 32 20 73 71 6c  'acid NEAR/2 sql
5fc0: 69 74 65 20 4e 45 41 52 2f 32 20 72 65 6c 61 74  ite NEAR/2 relat
5fd0: 69 6f 6e 61 6c 27 3b 0a 7d 5d 0a 0a 3c 70 3e 0a  ional';.}]..<p>.
5fe0: 20 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45 41    Phrase and NEA
5ff0: 52 20 71 75 65 72 69 65 73 20 6d 61 79 20 6e 6f  R queries may no
6000: 74 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20  t span multiple 
6010: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 69 6e 20 61  columns within a
6020: 20 72 6f 77 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65   row...<p>.  The
6030: 20 74 68 72 65 65 20 62 61 73 69 63 20 71 75 65   three basic que
6040: 72 79 20 74 79 70 65 73 20 64 65 73 63 72 69 62  ry types describ
6050: 65 64 20 61 62 6f 76 65 20 6d 61 79 20 62 65 20  ed above may be 
6060: 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68  used to query th
6070: 65 20 66 75 6c 6c 2d 74 65 78 74 0a 20 20 69 6e  e full-text.  in
6080: 64 65 78 20 66 6f 72 20 74 68 65 20 73 65 74 20  dex for the set 
6090: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
60a0: 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63  t match the spec
60b0: 69 66 69 65 64 20 63 72 69 74 65 72 69 61 2e 20  ified criteria. 
60c0: 55 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 33  Using the.  FTS3
60d0: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
60e0: 6e 20 6c 61 6e 67 75 61 67 65 20 69 74 20 69 73  n language it is
60f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 70 65 72   possible to per
6100: 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 73 65 74  form various set
6110: 20 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f   .  operations o
6120: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  n the results of
6130: 20 62 61 73 69 63 20 71 75 65 72 69 65 73 2e 20   basic queries. 
6140: 54 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  There are curren
6150: 74 6c 79 20 74 68 72 65 65 20 0a 20 20 73 75 70  tly three .  sup
6160: 70 6f 72 74 65 64 20 6f 70 65 72 61 74 69 6f 6e  ported operation
6170: 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20  s:..<ul>.  <li> 
6180: 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
6190: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
61a0: 3c 62 3e 69 6e 74 65 72 73 65 63 74 69 6f 6e 3c  <b>intersection<
61b0: 2f 62 3e 20 6f 66 20 74 77 6f 20 73 65 74 73 20  /b> of two sets 
61c0: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20  of documents... 
61d0: 20 3c 6c 69 3e 20 54 68 65 20 4f 52 20 6f 70 65   <li> The OR ope
61e0: 72 61 74 6f 72 20 63 61 6c 63 75 6c 61 74 65 73  rator calculates
61f0: 20 74 68 65 20 3c 62 3e 75 6e 69 6f 6e 3c 2f 62   the <b>union</b
6200: 3e 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66  > of two sets of
6210: 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c   documents...  <
6220: 6c 69 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72  li> The NOT oper
6230: 61 74 6f 72 20 28 6f 72 2c 20 69 66 20 75 73 69  ator (or, if usi
6240: 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ng the standard 
6250: 73 79 6e 74 61 78 2c 20 61 20 75 6e 61 72 79 20  syntax, a unary 
6260: 22 2d 22 20 6f 70 65 72 61 74 6f 72 29 0a 20 20  "-" operator).  
6270: 20 20 20 20 20 6d 61 79 20 62 65 20 75 73 65 64       may be used
6280: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
6290: 3c 62 3e 72 65 6c 61 74 69 76 65 20 63 6f 6d 70  <b>relative comp
62a0: 6c 65 6d 65 6e 74 3c 2f 62 3e 20 6f 66 20 6f 6e  lement</b> of on
62b0: 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20  e set of.       
62c0: 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 72  documents with r
62d0: 65 73 70 65 63 74 20 74 6f 20 61 6e 6f 74 68 65  espect to anothe
62e0: 72 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  r..</ul>..<p>.  
62f0: 54 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65 20  The FTS3 module 
6300: 6d 61 79 20 62 65 20 63 6f 6d 70 69 6c 65 64 20  may be compiled 
6310: 74 6f 20 75 73 65 20 6f 6e 65 20 6f 66 20 74 77  to use one of tw
6320: 6f 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  o slightly diffe
6330: 72 65 6e 74 20 76 65 72 73 69 6f 6e 73 0a 20 20  rent versions.  
6340: 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  of the full-text
6350: 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 74   query syntax, t
6360: 68 65 20 22 73 74 61 6e 64 61 72 64 22 20 71 75  he "standard" qu
6370: 65 72 79 20 73 79 6e 74 61 78 20 61 6e 64 20 74  ery syntax and t
6380: 68 65 20 22 65 6e 68 61 6e 63 65 64 22 20 0a 20  he "enhanced" . 
6390: 20 71 75 65 72 79 20 73 79 6e 74 61 78 2e 20 54   query syntax. T
63a0: 68 65 20 62 61 73 69 63 20 74 65 72 6d 2c 20 74  he basic term, t
63b0: 65 72 6d 2d 70 72 65 66 69 78 2c 20 70 68 72 61  erm-prefix, phra
63c0: 73 65 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72  se and NEAR quer
63d0: 69 65 73 20 64 65 73 63 72 69 62 65 64 20 0a 20  ies described . 
63e0: 20 61 62 6f 76 65 20 61 72 65 20 74 68 65 20 73   above are the s
63f0: 61 6d 65 20 69 6e 20 62 6f 74 68 20 76 65 72 73  ame in both vers
6400: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 79 6e 74  ions of the synt
6410: 61 78 2e 20 54 68 65 20 77 61 79 20 69 6e 20 77  ax. The way in w
6420: 68 69 63 68 20 73 65 74 20 0a 20 20 6f 70 65 72  hich set .  oper
6430: 61 74 69 6f 6e 73 20 61 72 65 20 73 70 65 63 69  ations are speci
6440: 66 69 65 64 20 69 73 20 73 6c 69 67 68 74 6c 79  fied is slightly
6450: 20 64 69 66 66 65 72 65 6e 74 2e 20 54 68 65 20   different. The 
6460: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 75  following two su
6470: 62 2d 73 65 63 74 69 6f 6e 73 20 0a 20 20 64 65  b-sections .  de
6480: 73 63 72 69 62 65 20 74 68 65 20 70 61 72 74 20  scribe the part 
6490: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 79  of the two query
64a0: 20 73 79 6e 74 61 78 65 73 20 74 68 61 74 20 70   syntaxes that p
64b0: 65 72 74 61 69 6e 73 20 74 6f 20 73 65 74 20 6f  ertains to set o
64c0: 70 65 72 61 74 69 6f 6e 73 2e 20 0a 20 20 52 65  perations. .  Re
64d0: 66 65 72 20 74 6f 20 74 68 65 20 64 65 73 63 72  fer to the descr
64e0: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f  iption of how to
64f0: 20 5c 5b 63 6f 6d 70 69 6c 65 20 66 74 73 33 5c   \[compile fts3\
6500: 5d 20 66 6f 72 20 63 6f 6d 70 69 6c 61 74 69 6f  ] for compilatio
6510: 6e 20 6e 6f 74 65 73 2e 0a 0a 5b 68 32 20 22 53  n notes...[h2 "S
6520: 65 74 20 4f 70 65 72 61 74 69 6f 6e 73 20 55 73  et Operations Us
6530: 69 6e 67 20 54 68 65 20 45 6e 68 61 6e 63 65 64  ing The Enhanced
6540: 20 51 75 65 72 79 20 53 79 6e 74 61 78 22 20 7b   Query Syntax" {
6550: 7d 20 7b 65 6e 68 61 6e 63 65 64 20 71 75 65 72  } {enhanced quer
6560: 79 20 73 79 6e 74 61 78 7d 5d 0a 0a 3c 70 3e 0a  y syntax}]..<p>.
6570: 20 20 54 68 65 20 65 6e 68 61 6e 63 65 64 20 71    The enhanced q
6580: 75 65 72 79 20 73 79 6e 74 61 78 20 73 75 70 70  uery syntax supp
6590: 6f 72 74 73 20 74 68 65 20 41 4e 44 2c 20 4f 52  orts the AND, OR
65a0: 20 61 6e 64 20 4e 4f 54 20 62 69 6e 61 72 79 20   and NOT binary 
65b0: 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20  set operators.. 
65c0: 20 45 61 63 68 20 6f 66 20 74 68 65 20 74 77 6f   Each of the two
65d0: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 61 6e 20   operands to an 
65e0: 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20  operator may be 
65f0: 61 20 62 61 73 69 63 20 46 54 53 33 20 71 75 65  a basic FTS3 que
6600: 72 79 2c 20 6f 72 20 74 68 65 0a 20 20 72 65 73  ry, or the.  res
6610: 75 6c 74 20 6f 66 20 61 6e 6f 74 68 65 72 20 41  ult of another A
6620: 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73 65  ND, OR or NOT se
6630: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70 65  t operation. Ope
6640: 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 65  rators must be e
6650: 6e 74 65 72 65 64 0a 20 20 75 73 69 6e 67 20 63  ntered.  using c
6660: 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73 2e 20  apital letters. 
6670: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 79 20  Otherwise, they 
6680: 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
6690: 61 73 20 62 61 73 69 63 20 74 65 72 6d 20 71 75  as basic term qu
66a0: 65 72 69 65 73 0a 20 20 69 6e 73 74 65 61 64 20  eries.  instead 
66b0: 6f 66 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73  of set operators
66c0: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e 44  ...<p>.  The AND
66d0: 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65   operator may be
66e0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 73 70 65 63   implicitly spec
66f0: 69 66 69 65 64 2e 20 49 66 20 74 77 6f 20 62 61  ified. If two ba
6700: 73 69 63 20 71 75 65 72 69 65 73 20 61 70 70 65  sic queries appe
6710: 61 72 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f 70  ar .  with no op
6720: 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 69 6e  erator separatin
6730: 67 20 74 68 65 6d 20 69 6e 20 61 6e 20 46 54 53  g them in an FTS
6740: 33 20 71 75 65 72 79 20 73 74 72 69 6e 67 2c 20  3 query string, 
6750: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 0a  the results are.
6760: 20 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66    the same as if
6770: 20 74 68 65 20 74 77 6f 20 62 61 73 69 63 20 71   the two basic q
6780: 75 65 72 69 65 73 20 77 65 72 65 20 73 65 70 61  ueries were sepa
6790: 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
67a0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20  operator..  For 
67b0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
67c0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 22 69  ry expression "i
67d0: 6d 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f 72  mplicit operator
67e0: 22 20 69 73 20 61 20 6d 6f 72 65 20 73 75 63 63  " is a more succ
67f0: 69 6e 63 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f  inct.  version o
6800: 66 20 22 69 6d 70 6c 69 63 69 74 20 41 4e 44 20  f "implicit AND 
6810: 6f 70 65 72 61 74 6f 72 22 2e 0a 0a 5b 43 6f 64  operator"...[Cod
6820: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74  e {.  <i>-- Virt
6830: 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
6840: 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41  ation</i>.  CREA
6850: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
6860: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
6870: 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72  ();..  <i>-- Vir
6880: 74 75 61 6c 20 74 61 62 6c 65 20 64 61 74 61 3c  tual table data<
6890: 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  /i>.  INSERT INT
68a0: 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f  O docs(docid, co
68b0: 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 31 2c  ntent) VALUES(1,
68c0: 20 27 61 20 64 61 74 61 62 61 73 65 20 69 73 20   'a database is 
68d0: 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74 65  a software syste
68e0: 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  m');.  INSERT IN
68f0: 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63  TO docs(docid, c
6900: 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 32  ontent) VALUES(2
6910: 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61 20 73  , 'sqlite is a s
6920: 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 27 29  oftware system')
6930: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6940: 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74  docs(docid, cont
6950: 65 6e 74 29 20 56 41 4c 55 45 53 28 33 2c 20 27  ent) VALUES(3, '
6960: 73 71 6c 69 74 65 20 69 73 20 61 20 64 61 74 61  sqlite is a data
6970: 62 61 73 65 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  base');..  <i>--
6980: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 74 20   Return the set 
6990: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
69a0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  t contain the te
69b0: 72 6d 20 22 73 71 6c 69 74 65 22 2c 20 61 6e 64  rm "sqlite", and
69c0: 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   the</i>.  <i>--
69d0: 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22   term "database"
69e0: 2e 20 54 68 69 73 20 71 75 65 72 79 20 77 69 6c  . This query wil
69f0: 6c 20 72 65 74 75 72 6e 20 74 68 65 20 64 6f 63  l return the doc
6a00: 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64  ument with docid
6a10: 20 33 20 6f 6e 6c 79 2e 3c 2f 69 3e 0a 20 20 53   3 only.</i>.  S
6a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
6a30: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
6a40: 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64  CH 'sqlite AND d
6a50: 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e  atabase';..  <i>
6a60: 2d 2d 20 41 67 61 69 6e 2c 20 72 65 74 75 72 6e  -- Again, return
6a70: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
6a80: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
6a90: 69 6e 20 62 6f 74 68 20 22 73 71 6c 69 74 65 22  in both "sqlite"
6aa0: 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   and</i>.  <i>--
6ab0: 20 22 64 61 74 61 62 61 73 65 22 2e 20 54 68 69   "database". Thi
6ac0: 73 20 74 69 6d 65 2c 20 75 73 65 20 61 6e 20 69  s time, use an i
6ad0: 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70 65 72  mplicit AND oper
6ae0: 61 74 6f 72 2e 20 41 67 61 69 6e 2c 20 64 6f 63  ator. Again, doc
6af0: 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ument</i>.  <i>-
6b00: 2d 20 33 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  - 3 is the only 
6b10: 64 6f 63 75 6d 65 6e 74 20 6d 61 74 63 68 65 64  document matched
6b20: 20 62 79 20 74 68 69 73 20 71 75 65 72 79 2e 20   by this query. 
6b30: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
6b40: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
6b50: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
6b60: 62 61 73 65 20 73 71 6c 69 74 65 27 3b 0a 0a 20  base sqlite';.. 
6b70: 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72   <i>-- Query for
6b80: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
6b90: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
6ba0: 69 6e 73 20 65 69 74 68 65 72 20 22 73 71 6c 69  ins either "sqli
6bb0: 74 65 22 20 6f 72 20 22 64 61 74 61 62 61 73 65  te" or "database
6bc0: 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 41  ".</i>.  <i>-- A
6bd0: 6c 6c 20 74 68 72 65 65 20 64 6f 63 75 6d 65 6e  ll three documen
6be0: 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
6bf0: 73 65 20 61 72 65 20 6d 61 74 63 68 65 64 20 62  se are matched b
6c00: 79 20 74 68 69 73 20 71 75 65 72 79 2e 3c 2f 69  y this query.</i
6c10: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
6c20: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
6c30: 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20  s MATCH 'sqlite 
6c40: 4f 52 20 64 61 74 61 62 61 73 65 27 3b 0a 0a 20  OR database';.. 
6c50: 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72   <i>-- Query for
6c60: 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74   all documents t
6c70: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  hat contain the 
6c80: 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22 2c  term "database",
6c90: 20 62 75 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74   but do not cont
6ca0: 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ain</i>.  <i>-- 
6cb0: 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65  the term "sqlite
6cc0: 22 2e 20 44 6f 63 75 6d 65 6e 74 20 32 20 69 73  ". Document 2 is
6cd0: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
6ce0: 6e 74 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nt that matches 
6cf0: 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f  this criteria.</
6d00: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
6d10: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
6d20: 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  cs MATCH 'databa
6d30: 73 65 20 4e 4f 54 20 73 71 6c 69 74 65 27 3b 0a  se NOT sqlite';.
6d40: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
6d50: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74  lowing query mat
6d60: 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e 74  ches no document
6d70: 73 2e 20 42 65 63 61 75 73 65 20 22 61 6e 64 22  s. Because "and"
6d80: 20 69 73 20 69 6e 20 6c 6f 77 65 72 63 61 73 65   is in lowercase
6d90: 20 6c 65 74 74 65 72 73 2c 3c 2f 69 3e 0a 20 20   letters,</i>.  
6da0: 3c 69 3e 2d 2d 20 69 74 20 69 73 20 69 6e 74 65  <i>-- it is inte
6db0: 72 70 72 65 74 65 64 20 61 73 20 61 20 62 61 73  rpreted as a bas
6dc0: 69 63 20 74 65 72 6d 20 71 75 65 72 79 20 69 6e  ic term query in
6dd0: 73 74 65 61 64 20 6f 66 20 61 6e 20 6f 70 65 72  stead of an oper
6de0: 61 74 6f 72 2e 20 4f 70 65 72 61 74 6f 72 73 20  ator. Operators 
6df0: 6d 75 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  must</i>.  <i>--
6e00: 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73   be specified us
6e10: 69 6e 67 20 63 61 70 69 74 61 6c 20 6c 65 74 74  ing capital lett
6e20: 65 72 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  ers. In practice
6e30: 2c 20 74 68 69 73 20 71 75 65 72 79 20 77 69 6c  , this query wil
6e40: 6c 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75  l match any docu
6e50: 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ments</i>.  <i>-
6e60: 2d 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 65  - that contain e
6e70: 61 63 68 20 6f 66 20 74 68 65 20 74 68 72 65 65  ach of the three
6e80: 20 74 65 72 6d 73 20 22 64 61 74 61 62 61 73 65   terms "database
6e90: 22 2c 20 22 61 6e 64 22 20 61 6e 64 20 22 73 71  ", "and" and "sq
6ea0: 6c 69 74 65 22 20 61 74 20 6c 65 61 73 74 20 6f  lite" at least o
6eb0: 6e 63 65 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  nce.</i>.  <i>--
6ec0: 20 4e 6f 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e   No documents in
6ed0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 64 61 74   the example dat
6ee0: 61 20 61 62 6f 76 65 20 6d 61 74 63 68 20 74 68  a above match th
6ef0: 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e  is criteria.</i>
6f00: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6f10: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
6f20: 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65   MATCH 'database
6f30: 20 61 6e 64 20 73 71 6c 69 74 65 27 3b 0a 7d 5d   and sqlite';.}]
6f40: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 65 78 61 6d  ..<p>.  The exam
6f50: 70 6c 65 73 20 61 62 6f 76 65 20 61 6c 6c 20 75  ples above all u
6f60: 73 65 20 62 61 73 69 63 20 66 75 6c 6c 2d 74 65  se basic full-te
6f70: 78 74 20 74 65 72 6d 20 71 75 65 72 69 65 73 20  xt term queries 
6f80: 61 73 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  as both operands
6f90: 20 6f 66 20 0a 20 20 74 68 65 20 73 65 74 20 6f   of .  the set o
6fa0: 70 65 72 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73  perations demons
6fb0: 74 72 61 74 65 64 2e 20 50 68 72 61 73 65 20 61  trated. Phrase a
6fc0: 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65 73 20  nd NEAR queries 
6fd0: 6d 61 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64  may also be used
6fe0: 2c 0a 20 20 61 73 20 6d 61 79 20 74 68 65 20 72  ,.  as may the r
6ff0: 65 73 75 6c 74 73 20 6f 66 20 6f 74 68 65 72 20  esults of other 
7000: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  set operations. 
7010: 57 68 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  When more than o
7020: 6e 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e  ne set operation
7030: 0a 20 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  .  is present in
7040: 20 61 6e 20 46 54 53 33 20 71 75 65 72 79 2c 20   an FTS3 query, 
7050: 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f  the precedence o
7060: 66 20 6f 70 65 72 61 74 6f 72 73 20 69 73 20 61  f operators is a
7070: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62  s follows:..[Tab
7080: 6c 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 4f 70  le].  [Tr]<th>Op
7090: 65 72 61 74 6f 72 3c 74 68 3e 45 6e 68 61 6e 63  erator<th>Enhanc
70a0: 65 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 20  ed Query Syntax 
70b0: 50 72 65 63 65 64 65 6e 63 65 0a 20 20 5b 54 72  Precedence.  [Tr
70c0: 5d 3c 74 64 3e 4e 4f 54 20 3c 74 64 3e 20 48 69  ]<td>NOT <td> Hi
70d0: 67 68 65 73 74 20 70 72 65 63 65 64 65 6e 63 65  ghest precedence
70e0: 20 28 74 69 67 68 74 65 73 74 20 67 72 6f 75 70   (tightest group
70f0: 69 6e 67 29 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e  ing)..  [Tr]<td>
7100: 41 4e 44 20 3c 74 64 3e 0a 20 20 5b 54 72 5d 3c  AND <td>.  [Tr]<
7110: 74 64 3e 4f 52 20 20 3c 74 64 3e 20 4c 6f 77 65  td>OR  <td> Lowe
7120: 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28 6c  st precedence (l
7130: 6f 6f 73 65 73 74 20 67 72 6f 75 70 69 6e 67 29  oosest grouping)
7140: 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
7150: 20 20 57 68 65 6e 20 75 73 69 6e 67 20 74 68 65    When using the
7160: 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20   enhanced query 
7170: 73 79 6e 74 61 78 2c 20 70 61 72 65 6e 74 68 65  syntax, parenthe
7180: 73 69 73 20 6d 61 79 20 62 65 20 75 73 65 64 20  sis may be used 
7190: 74 6f 20 6f 76 65 72 72 69 64 65 0a 20 20 74 68  to override.  th
71a0: 65 20 64 65 66 61 75 6c 74 20 70 72 65 63 65 64  e default preced
71b0: 65 6e 63 65 20 6f 66 20 74 68 65 20 76 61 72 69  ence of the vari
71c0: 6f 75 73 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  ous operators. F
71d0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f  or example:..[Co
71e0: 64 65 20 7b 0a 0a 20 20 3c 69 3e 2d 2d 20 52 65  de {..  <i>-- Re
71f0: 74 75 72 6e 20 74 68 65 20 64 6f 63 69 64 20 76  turn the docid v
7200: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
7210: 20 77 69 74 68 20 61 6c 6c 20 64 6f 63 75 6d 65   with all docume
7220: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7230: 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   the</i>.  <i>--
7240: 20 74 77 6f 20 74 65 72 6d 73 20 22 73 71 6c 69   two terms "sqli
7250: 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61 73  te" and "databas
7260: 65 22 2c 20 61 6e 64 2f 6f 72 20 63 6f 6e 74 61  e", and/or conta
7270: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 6c 69 62  in the term "lib
7280: 72 61 72 79 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c  rary".</i>.  SEL
7290: 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64  ECT docid FROM d
72a0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
72b0: 41 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44  ATCH 'sqlite AND
72c0: 20 64 61 74 61 62 61 73 65 20 4f 52 20 6c 69 62   database OR lib
72d0: 72 61 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  rary';..  <i>-- 
72e0: 54 68 69 73 20 71 75 65 72 79 20 69 73 20 65 71  This query is eq
72f0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
7300: 61 62 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c  above.</i>.  SEL
7310: 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64  ECT docid FROM d
7320: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
7330: 41 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44  ATCH 'sqlite AND
7340: 20 64 61 74 61 62 61 73 65 27 0a 20 20 20 20 55   database'.    U
7350: 4e 49 4f 4e 0a 20 20 53 45 4c 45 43 54 20 64 6f  NION.  SELECT do
7360: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
7370: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
7380: 6c 69 62 72 61 72 79 27 3b 0a 0a 20 20 3c 69 3e  library';..  <i>
7390: 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 74 68 65  -- Query for the
73a0: 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74   set of document
73b0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  s that contains 
73c0: 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22  the term "linux"
73d0: 2c 20 61 6e 64 20 61 74 20 6c 65 61 73 74 3c 2f  , and at least</
73e0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 6f  i>.  <i>-- one o
73f0: 66 20 74 68 65 20 70 68 72 61 73 65 73 20 22 73  f the phrases "s
7400: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20  qlite database" 
7410: 61 6e 64 20 22 73 71 6c 69 74 65 20 6c 69 62 72  and "sqlite libr
7420: 61 72 79 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ary".</i>.  SELE
7430: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f  CT docid FROM do
7440: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
7450: 54 43 48 20 27 28 22 73 71 6c 69 74 65 20 64 61  TCH '("sqlite da
7460: 74 61 62 61 73 65 22 20 4f 52 20 22 73 71 6c 69  tabase" OR "sqli
7470: 74 65 20 6c 69 62 72 61 72 79 22 29 20 41 4e 44  te library") AND
7480: 20 6c 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d   linux';..  <i>-
7490: 2d 20 54 68 69 73 20 71 75 65 72 79 20 69 73 20  - This query is 
74a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
74b0: 65 20 61 62 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53  e above.</i>.  S
74c0: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
74d0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
74e0: 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 3b 0a   MATCH 'linux';.
74f0: 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20      INTERSECT.  
7500: 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
7510: 4d 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 64  M (.    SELECT d
7520: 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57  ocid FROM docs W
7530: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
7540: 27 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79  '"sqlite library
7550: 22 27 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a 20  "'.      UNION. 
7560: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
7570: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7580: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c  docs MATCH '"sql
7590: 69 74 65 20 64 61 74 61 62 61 73 65 22 27 0a 20  ite database"'. 
75a0: 20 29 3b 0a 7d 5d 0a 0a 0a 5b 68 32 20 22 53 65   );.}]...[h2 "Se
75b0: 74 20 4f 70 65 72 61 74 69 6f 6e 73 20 55 73 69  t Operations Usi
75c0: 6e 67 20 54 68 65 20 53 74 61 6e 64 61 72 64 20  ng The Standard 
75d0: 51 75 65 72 79 20 53 79 6e 74 61 78 22 5d 0a 0a  Query Syntax"]..
75e0: 3c 70 3e 0a 20 20 46 54 53 33 20 71 75 65 72 79  <p>.  FTS3 query
75f0: 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20   set operations 
7600: 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61  using the standa
7610: 72 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20  rd query syntax 
7620: 61 72 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74  are similar, but
7630: 0a 20 20 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c  .  not identical
7640: 2c 20 74 6f 20 73 65 74 20 6f 70 65 72 61 74 69  , to set operati
7650: 6f 6e 73 20 77 69 74 68 20 74 68 65 20 65 6e 68  ons with the enh
7660: 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74  anced query synt
7670: 61 78 2e 20 54 68 65 72 65 0a 20 20 61 72 65 20  ax. There.  are 
7680: 66 6f 75 72 20 64 69 66 66 65 72 65 6e 63 65 73  four differences
7690: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c  , as follows:..<
76a0: 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d  ol>.  <li value=
76b0: 31 3e 3c 70 3e 20 4f 6e 6c 79 20 74 68 65 20 69  1><p> Only the i
76c0: 6d 70 6c 69 63 69 74 20 76 65 72 73 69 6f 6e 20  mplicit version 
76d0: 6f 66 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  of the AND opera
76e0: 74 6f 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  tor is supported
76f0: 2e 0a 20 20 20 20 53 70 65 63 69 66 79 69 6e 67  ..    Specifying
7700: 20 74 68 65 20 73 74 72 69 6e 67 20 22 41 4e 44   the string "AND
7710: 22 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  " as part of an 
7720: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
7730: 79 6e 74 61 78 20 71 75 65 72 79 20 69 73 0a 20  yntax query is. 
7740: 20 20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61     interpreted a
7750: 73 20 61 20 74 65 72 6d 20 71 75 65 72 79 20 66  s a term query f
7760: 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  or the set of do
7770: 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69  cuments containi
7780: 6e 67 20 74 68 65 20 74 65 72 6d 20 0a 20 20 20  ng the term .   
7790: 20 22 61 6e 64 22 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c   "and"..</ol>..<
77a0: 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d  ol>.  <li value=
77b0: 32 3e 3c 70 3e 20 50 61 72 65 6e 74 68 65 73 69  2><p> Parenthesi
77c0: 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72  s are not suppor
77d0: 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c 3e  ted..</ol>..<ol>
77e0: 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 33 3e 3c  .  <li value=3><
77f0: 70 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61  p> The NOT opera
7800: 74 6f 72 20 69 73 20 6e 6f 74 20 73 75 70 70 6f  tor is not suppo
7810: 72 74 65 64 2e 20 49 6e 73 74 65 61 64 20 6f 66  rted. Instead of
7820: 20 74 68 65 20 4e 4f 54 20 0a 20 20 20 20 6f 70   the NOT .    op
7830: 65 72 61 74 6f 72 2c 20 74 68 65 20 73 74 61 6e  erator, the stan
7840: 64 61 72 64 20 71 75 65 72 79 20 73 79 6e 74 61  dard query synta
7850: 78 20 73 75 70 70 6f 72 74 73 20 61 20 75 6e 61  x supports a una
7860: 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72 20  ry "-" operator 
7870: 74 68 61 74 0a 20 20 20 20 6d 61 79 20 62 65 20  that.    may be 
7880: 61 70 70 6c 69 65 64 20 74 6f 20 62 61 73 69 63  applied to basic
7890: 20 74 65 72 6d 20 61 6e 64 20 74 65 72 6d 2d 70   term and term-p
78a0: 72 65 66 69 78 20 71 75 65 72 69 65 73 20 28 62  refix queries (b
78b0: 75 74 20 6e 6f 74 20 74 6f 20 70 68 72 61 73 65  ut not to phrase
78c0: 0a 20 20 20 20 6f 72 20 4e 45 41 52 20 71 75 65  .    or NEAR que
78d0: 72 69 65 73 29 2e 20 41 20 74 65 72 6d 20 6f 72  ries). A term or
78e0: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61   term-prefix tha
78f0: 74 20 68 61 73 20 61 20 75 6e 61 72 79 20 22 2d  t has a unary "-
7900: 22 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 61  " operator.    a
7910: 74 74 61 63 68 65 64 20 74 6f 20 69 74 20 6d 61  ttached to it ma
7920: 79 20 6e 6f 74 20 61 70 70 65 61 72 20 61 73 20  y not appear as 
7930: 61 6e 20 6f 70 65 72 61 6e 64 20 74 6f 20 61 6e  an operand to an
7940: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e   OR operator. An
7950: 20 46 54 53 33 0a 20 20 20 20 71 75 65 72 79 20   FTS3.    query 
7960: 6d 61 79 20 6e 6f 74 20 63 6f 6e 73 69 73 74 20  may not consist 
7970: 65 6e 74 69 72 65 6c 79 20 6f 66 20 74 65 72 6d  entirely of term
7980: 73 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69 78  s or term-prefix
7990: 20 71 75 65 72 69 65 73 20 77 69 74 68 20 75 6e   queries with un
79a0: 61 72 79 0a 20 20 20 20 22 2d 22 20 6f 70 65 72  ary.    "-" oper
79b0: 61 74 6f 72 73 20 61 74 74 61 63 68 65 64 20 74  ators attached t
79c0: 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 5b  o them..</ol>..[
79d0: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 53  Code {.  <i>-- S
79e0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 73 65  earch for the se
79f0: 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74  t of documents t
7a00: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  hat contain the 
7a10: 74 65 72 6d 20 22 73 71 6c 69 74 65 22 20 62 75  term "sqlite" bu
7a20: 74 20 64 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  t do</i>.  <i>--
7a30: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65   not contain the
7a40: 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22   term "database"
7a50: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
7a60: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7a70: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
7a80: 69 74 65 20 2d 64 61 74 61 62 61 73 65 27 3b 0a  ite -database';.
7a90: 7d 5d 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76  }]..<ol>.  <li v
7aa0: 61 6c 75 65 3d 34 3e 3c 70 3e 20 54 68 65 20 72  alue=4><p> The r
7ab0: 65 6c 61 74 69 76 65 20 70 72 65 63 65 64 65 6e  elative preceden
7ac0: 63 65 20 6f 66 20 74 68 65 20 73 65 74 20 6f 70  ce of the set op
7ad0: 65 72 61 74 69 6f 6e 73 20 69 73 20 64 69 66 66  erations is diff
7ae0: 65 72 65 6e 74 2e 20 0a 20 20 20 49 6e 20 70 61  erent. .   In pa
7af0: 72 74 69 63 75 6c 61 72 2c 20 75 73 69 6e 67 20  rticular, using 
7b00: 74 68 65 20 73 74 61 6e 64 61 72 64 20 71 75 65  the standard que
7b10: 72 79 20 73 79 6e 74 61 78 20 74 68 65 20 22 4f  ry syntax the "O
7b20: 52 22 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  R" operator has 
7b30: 61 0a 20 20 20 68 69 67 68 65 72 20 70 72 65 63  a.   higher prec
7b40: 65 64 65 6e 63 65 20 74 68 61 6e 20 22 41 4e 44  edence than "AND
7b50: 22 2e 20 54 68 65 20 70 72 65 63 65 64 65 6e 63  ". The precedenc
7b60: 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 77  e of operators w
7b70: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hen using the.  
7b80: 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20   standard query 
7b90: 73 79 6e 74 61 78 20 69 73 3a 20 0a 3c 2f 6f 6c  syntax is: .</ol
7ba0: 3e 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  >..[Table].  [Tr
7bb0: 5d 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68  ]<th>Operator<th
7bc0: 3e 53 74 61 6e 64 61 72 64 20 51 75 65 72 79 20  >Standard Query 
7bd0: 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e 63  Syntax Precedenc
7be0: 65 0a 20 20 5b 54 72 5d 3c 74 64 3e 55 6e 61 72  e.  [Tr]<td>Unar
7bf0: 79 20 22 2d 22 20 3c 74 64 3e 20 48 69 67 68 65  y "-" <td> Highe
7c00: 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28 74  st precedence (t
7c10: 69 67 68 74 65 73 74 20 67 72 6f 75 70 69 6e 67  ightest grouping
7c20: 29 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 4f 52 20  )..  [Tr]<td>OR 
7c30: 20 3c 74 64 3e 0a 20 20 5b 54 72 5d 3c 74 64 3e   <td>.  [Tr]<td>
7c40: 41 4e 44 20 3c 74 64 3e 20 4c 6f 77 65 73 74 20  AND <td> Lowest 
7c50: 70 72 65 63 65 64 65 6e 63 65 20 28 6c 6f 6f 73  precedence (loos
7c60: 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 3c  est grouping)..<
7c70: 2f 74 61 62 6c 65 3e 0a 0a 3c 6f 6c 3e 3c 6c 69  /table>..<ol><li
7c80: 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79   style="list-sty
7c90: 6c 65 3a 6e 6f 6e 65 22 3e 0a 20 20 54 68 65 20  le:none">.  The 
7ca0: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c  following exampl
7cb0: 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 70 72  e illustrates pr
7cc0: 65 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72  ecedence of oper
7cd0: 61 74 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  ators using the 
7ce0: 73 74 61 6e 64 61 72 64 20 0a 20 20 71 75 65 72  standard .  quer
7cf0: 79 20 73 79 6e 74 61 78 3a 0a 3c 2f 6f 6c 3e 0a  y syntax:.</ol>.
7d00: 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d  .[Code {.  <i>--
7d10: 20 53 65 61 72 63 68 20 66 6f 72 20 64 6f 63 75   Search for docu
7d20: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
7d30: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
7d40: 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 22 64   of the terms "d
7d50: 61 74 61 62 61 73 65 22 3c 2f 69 3e 0a 20 20 3c  atabase"</i>.  <
7d60: 69 3e 2d 2d 20 61 6e 64 20 22 73 71 6c 69 74 65  i>-- and "sqlite
7d70: 22 2c 20 61 6e 64 20 61 6c 73 6f 20 63 6f 6e 74  ", and also cont
7d80: 61 69 6e 73 20 74 68 65 20 74 65 72 6d 20 22 6c  ains the term "l
7d90: 69 62 72 61 72 79 22 2e 20 42 65 63 61 75 73 65  ibrary". Because
7da0: 20 6f 66 20 74 68 65 20 64 69 66 66 65 72 65 6e   of the differen
7db0: 63 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ces</i>.  <i>-- 
7dc0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63  in operator prec
7dd0: 65 64 65 6e 63 65 73 2c 20 74 68 69 73 20 71 75  edences, this qu
7de0: 65 72 79 20 77 6f 75 6c 64 20 68 61 76 65 20 61  ery would have a
7df0: 20 64 69 66 66 65 72 65 6e 74 20 69 6e 74 65 72   different inter
7e00: 70 72 65 74 61 74 69 6f 6e 20 75 73 69 6e 67 3c  pretation using<
7e10: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
7e20: 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73  enhanced query s
7e30: 79 6e 74 61 78 2e 3c 2f 69 3e 0a 20 20 53 45 4c  yntax.</i>.  SEL
7e40: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
7e50: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
7e60: 20 27 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61   'sqlite OR data
7e70: 62 61 73 65 20 6c 69 62 72 61 72 79 27 3b 0a 7d  base library';.}
7e80: 5d 0a 0a 5b 68 31 20 22 41 75 78 69 6c 6c 61 72  ]..[h1 "Auxillar
7e90: 79 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 53 6e  y functions - Sn
7ea0: 69 70 70 65 74 73 20 61 6e 64 20 4f 66 66 73 65  ippets and Offse
7eb0: 74 73 22 20 7b 7d 20 73 6e 69 70 70 65 74 20 6f  ts" {} snippet o
7ec0: 66 66 73 65 74 73 5d 0a 0a 3c 70 3e 0a 20 20 54  ffsets]..<p>.  T
7ed0: 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65 20 70  he FTS3 module p
7ee0: 72 6f 76 69 64 65 73 20 74 77 6f 20 73 70 65 63  rovides two spec
7ef0: 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20 66  ial SQL scalar f
7f00: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 61  unctions that ma
7f10: 79 20 62 65 20 75 73 65 66 75 6c 0a 20 20 74 6f  y be useful.  to
7f20: 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 20   the developers 
7f30: 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  of full-text que
7f40: 72 79 20 73 79 73 74 65 6d 73 2c 20 22 73 6e 69  ry systems, "sni
7f50: 70 70 65 74 22 20 61 6e 64 20 22 6f 66 66 73 65  ppet" and "offse
7f60: 74 73 22 2e 20 54 68 65 0a 20 20 70 75 72 70 6f  ts". The.  purpo
7f70: 73 65 20 6f 66 20 62 6f 74 68 20 66 75 6e 63 74  se of both funct
7f80: 69 6f 6e 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77  ions is to allow
7f90: 20 74 68 65 20 75 73 65 72 20 74 6f 20 69 64 65   the user to ide
7fa0: 6e 74 69 66 79 20 74 68 65 20 6c 6f 63 61 74 69  ntify the locati
7fb0: 6f 6e 20 6f 66 0a 20 20 71 75 65 72 69 65 64 20  on of.  queried 
7fc0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 74  terms in the ret
7fd0: 75 72 6e 65 64 20 64 6f 63 75 6d 65 6e 74 73 2e  urned documents.
7fe0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 72 73  ..<p>.  The firs
7ff0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 62 6f  t argument to bo
8000: 74 68 20 74 68 65 20 73 6e 69 70 70 65 74 20 61  th the snippet a
8010: 6e 64 20 6f 66 66 73 65 74 73 20 53 51 4c 20 73  nd offsets SQL s
8020: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 0a  calar functions.
8030: 20 20 6d 75 73 74 20 62 65 20 74 68 65 20 74 68    must be the th
8040: 65 20 73 70 65 63 69 61 6c 20 68 69 64 64 65 6e  e special hidden
8050: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 46 54   column of an FT
8060: 53 33 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  S3 table that ha
8070: 73 20 74 68 65 20 73 61 6d 65 0a 20 20 6e 61 6d  s the same.  nam
8080: 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 28  e as the table (
8090: 73 65 65 20 61 62 6f 76 65 29 2e 20 46 6f 72 20  see above). For 
80a0: 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 61  example, given a
80b0: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e 61 6d  n FTS3 table nam
80c0: 65 64 20 0a 20 20 22 6d 61 69 6c 22 3a 0a 0a 5b  ed .  "mail":..[
80d0: 43 6f 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20  Code {.  SELECT 
80e0: 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52  offsets(mail) FR
80f0: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
8100: 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c  il MATCH &lt;ful
8110: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70  l-text query exp
8120: 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53  ression&gt;;.  S
8130: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 6d 61  ELECT snippet(ma
8140: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
8150: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26  ERE mail MATCH &
8160: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
8170: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
8180: 3b 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65  ;;.}]..<p>.  The
8190: 20 74 77 6f 20 61 75 78 69 6c 6c 61 72 79 20 66   two auxillary f
81a0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c  unctions are onl
81b0: 79 20 75 73 65 66 75 6c 20 77 69 74 68 69 6e 20  y useful within 
81c0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
81d0: 6e 74 20 74 68 61 74 0a 20 20 75 73 65 73 20 74  nt that.  uses t
81e0: 68 65 20 46 54 53 33 20 74 61 62 6c 65 27 73 20  he FTS3 table's 
81f0: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
8200: 20 49 66 20 75 73 65 64 20 77 69 74 68 69 6e 20   If used within 
8210: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 75 73  a SELECT that us
8220: 65 73 0a 20 20 74 68 65 20 22 71 75 65 72 79 20  es.  the "query 
8230: 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c 69  by rowid" or "li
8240: 6e 65 61 72 20 73 63 61 6e 22 20 73 74 72 61 74  near scan" strat
8250: 65 67 69 65 73 2c 20 62 6f 74 68 20 66 75 6e 63  egies, both func
8260: 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 0a 20 20  tions return .  
8270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8280: 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 61 20 53 45  ..<p>.  For a SE
8290: 4c 45 43 54 20 71 75 65 72 79 20 74 68 61 74 20  LECT query that 
82a0: 75 73 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65  uses the full-te
82b0: 78 74 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 66  xt index, the of
82c0: 66 73 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e  fsets() function
82d0: 20 0a 20 20 72 65 74 75 72 6e 73 20 61 20 74 65   .  returns a te
82e0: 78 74 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e  xt value contain
82f0: 69 6e 67 20 61 20 73 65 72 69 65 73 20 6f 66 20  ing a series of 
8300: 73 70 61 63 65 2d 73 65 70 61 72 61 74 65 64 20  space-separated 
8310: 69 6e 74 65 67 65 72 73 2e 20 46 6f 72 0a 20 20  integers. For.  
8320: 65 61 63 68 20 6f 63 63 75 72 65 6e 63 65 20 6f  each occurence o
8330: 66 20 61 20 71 75 65 72 69 65 64 20 74 65 72 6d  f a queried term
8340: 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
8350: 2c 20 74 68 65 72 65 20 61 72 65 20 66 6f 75 72  , there are four
8360: 20 69 6e 74 65 67 65 72 73 0a 20 20 69 6e 20 74   integers.  in t
8370: 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74  he returned list
8380: 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20 66 6f  . Each set of fo
8390: 75 72 20 69 6e 74 65 67 65 72 73 20 69 73 20 69  ur integers is i
83a0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 0a 20  nterpreted as . 
83b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62 6c   follows:..[Tabl
83c0: 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 49 6e 74  e].  [Tr]<th>Int
83d0: 65 67 65 72 20 3c 74 68 3e 49 6e 74 65 72 70 72  eger <th>Interpr
83e0: 65 74 61 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c 74  etation.  [Tr]<t
83f0: 64 3e 30 20 0a 20 20 20 20 20 20 3c 74 64 3e 54  d>0 .      <td>T
8400: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
8410: 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20 69   that the term i
8420: 6e 73 74 61 6e 63 65 20 6f 63 63 75 72 73 20 69  nstance occurs i
8430: 6e 20 28 30 20 66 6f 72 20 74 68 65 0a 20 20 20  n (0 for the.   
8440: 20 20 20 20 20 20 20 6c 65 66 74 6d 6f 73 74 20         leftmost 
8450: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
8460: 53 33 20 74 61 62 6c 65 2c 20 31 20 66 6f 72 20  S3 table, 1 for 
8470: 74 68 65 20 6e 65 78 74 20 6c 65 66 74 6d 6f 73  the next leftmos
8480: 74 2c 20 65 74 63 2e 29 2e 0a 20 20 5b 54 72 5d  t, etc.)..  [Tr]
8490: 3c 74 64 3e 31 0a 20 20 20 20 20 20 3c 74 64 3e  <td>1.      <td>
84a0: 54 68 65 20 74 65 72 6d 20 6e 75 6d 62 65 72 20  The term number 
84b0: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
84c0: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
84d0: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 0a  full-text query.
84e0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 65 73            expres
84f0: 73 69 6f 6e 2e 20 54 65 72 6d 73 20 77 69 74 68  sion. Terms with
8500: 69 6e 20 61 20 71 75 65 72 79 20 65 78 70 72 65  in a query expre
8510: 73 73 69 6f 6e 20 61 72 65 20 6e 75 6d 62 65 72  ssion are number
8520: 65 64 20 73 74 61 72 74 69 6e 67 0a 20 20 20 20  ed starting.    
8530: 20 20 20 20 20 20 66 72 6f 6d 20 30 20 69 6e 20        from 0 in 
8540: 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
8550: 68 65 79 20 6f 63 63 75 72 2e 0a 20 20 5b 54 72  hey occur..  [Tr
8560: 5d 3c 74 64 3e 32 0a 20 20 20 20 20 20 3c 74 64  ]<td>2.      <td
8570: 3e 54 68 65 20 62 79 74 65 20 6f 66 66 73 65 74  >The byte offset
8580: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
8590: 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
85a0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 5b 54 72 5d 3c   column..  [Tr]<
85b0: 74 64 3e 33 0a 20 20 20 20 20 20 3c 74 64 3e 54  td>3.      <td>T
85c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
85d0: 61 74 63 68 69 6e 67 20 74 65 72 6d 20 69 6e 20  atching term in 
85e0: 62 79 74 65 73 2e 0a 3c 2f 74 61 62 6c 65 3e 0a  bytes..</table>.
85f0: 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f  .<p>.  The follo
8600: 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61  wing block conta
8610: 69 6e 73 20 65 78 61 6d 70 6c 65 73 20 74 68 61  ins examples tha
8620: 74 20 75 73 65 20 74 68 65 20 6f 66 66 73 65 74  t use the offset
8630: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a 5b 43 6f  s function...[Co
8640: 64 65 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  de {.  CREATE VI
8650: 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c  RTUAL TABLE mail
8660: 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a   USING fts3(subj
8670: 65 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49 4e  ect, body);.  IN
8680: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56  SERT INTO mail V
8690: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72  ALUES('hello wor
86a0: 6c 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73 61  ld', 'This messa
86b0: 67 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77 6f  ge is a hello wo
86c0: 72 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b 0a  rld message.');.
86d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
86e0: 69 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65 6e  il VALUES('urgen
86f0: 74 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54 68  t: serious', 'Th
8700: 69 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e 20  is mail is seen 
8710: 61 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f 75  as a more seriou
8720: 73 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e  s mail');..  <i>
8730: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
8740: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61   query returns a
8750: 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73 20   single row (as 
8760: 69 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20  it matches only 
8770: 74 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20 20  the first</i>.  
8780: 3c 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20 74  <i>-- entry in t
8790: 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68 65  able "mail". The
87a0: 20 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62   text returned b
87b0: 79 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75  y the offsets fu
87c0: 6e 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20  nction is</i>.  
87d0: 3c 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20 31  <i>-- "0 0 6 5 1
87e0: 20 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20 20   0 24 5".</i>.  
87f0: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
8800: 2d 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20  - The first set 
8810: 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73  of four integers
8820: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69   in the result i
8830: 6e 64 69 63 61 74 65 20 74 68 61 74 20 63 6f 6c  ndicate that col
8840: 75 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  umn 0</i>.  <i>-
8850: 2d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  - contains an in
8860: 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30  stance of term 0
8870: 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79   ("world") at by
8880: 74 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68 65  te offset 6. The
8890: 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c 2f   term instance</
88a0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35 20  i>.  <i>-- is 5 
88b0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
88c0: 68 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f 66  he second set of
88d0: 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 73   four integers s
88e0: 68 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e  hows that column
88f0: 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f   1</i>.  <i>-- o
8900: 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 72 6f  f the matched ro
8910: 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  w contains an in
8920: 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30  stance of term 0
8930: 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79   ("world") at by
8940: 74 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20 20  te offset</i>.  
8950: 3c 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e 2c  <i>-- 24. Again,
8960: 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e   the term instan
8970: 63 65 20 69 73 20 35 20 62 79 74 65 73 20 69 6e  ce is 5 bytes in
8980: 20 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c   size.</i>.  SEL
8990: 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c  ECT offsets(mail
89a0: 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  ) FROM mail WHER
89b0: 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77 6f  E mail MATCH 'wo
89c0: 72 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  rld';..  <i>-- T
89d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
89e0: 72 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f 20  ry returns also 
89f0: 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65  matches only the
8a00: 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74 61   first row in ta
8a10: 62 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a  ble "mail".</i>.
8a20: 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73 20    <i>-- In this 
8a30: 63 61 73 65 20 74 68 65 20 72 65 74 75 72 6e 65  case the returne
8a40: 64 20 74 65 78 74 20 69 73 20 22 31 20 30 20 35  d text is "1 0 5
8a50: 20 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f 69   7 1 0 30 7".</i
8a60: 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65  >.  SELECT offse
8a70: 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61  ts(mail) FROM ma
8a80: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
8a90: 54 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a 0a  TCH 'message';..
8aa0: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
8ab0: 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63  owing query matc
8ac0: 68 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 72  hes the second r
8ad0: 6f 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69  ow in table "mai
8ae0: 6c 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  l". It returns t
8af0: 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  he</i>.  <i>-- t
8b00: 65 78 74 20 22 31 20 30 20 32 38 20 37 20 31 20  ext "1 0 28 7 1 
8b10: 31 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74 68  1 36 4". Only th
8b20: 6f 73 65 20 6f 63 63 75 72 65 6e 63 65 73 20 6f  ose occurences o
8b30: 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75 73  f terms "serious
8b40: 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69 3e  " and "mail"</i>
8b50: 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61 72  .  <i>-- that ar
8b60: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 73  e part of an ins
8b70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72  tance of the phr
8b80: 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61 69  ase "serious mai
8b90: 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69 65  l" are identifie
8ba0: 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  d; the</i>.  <i>
8bb0: 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 65 6e  -- other occuren
8bc0: 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73 22  ces of "serious"
8bd0: 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65 20   and "mail" are 
8be0: 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20 53  ignored.</i>.  S
8bf0: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61  ELECT offsets(ma
8c00: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
8c10: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27  ERE mail MATCH '
8c20: 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27 3b  "serious mail"';
8c30: 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73  .}]..<p>.  The s
8c40: 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20  nippet function 
8c50: 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
8c60: 65 20 66 6f 72 6d 61 74 74 65 64 20 66 72 61 67  e formatted frag
8c70: 6d 65 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e  ments of documen
8c80: 74 20 74 65 78 74 0a 20 20 66 6f 72 20 64 69 73  t text.  for dis
8c90: 70 6c 61 79 20 61 73 20 70 61 72 74 20 6f 66 20  play as part of 
8ca0: 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  a full-text quer
8cb0: 79 20 72 65 73 75 6c 74 73 20 72 65 70 6f 72 74  y results report
8cc0: 2e 20 54 68 65 20 73 6e 69 70 70 65 74 20 66 75  . The snippet fu
8cd0: 6e 63 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65  nction .  may be
8ce0: 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e 20   passed between 
8cf0: 6f 6e 65 20 61 6e 64 20 66 6f 75 72 20 61 72 67  one and four arg
8d00: 75 6d 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f  uments, as follo
8d10: 77 73 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b  ws:..[Table].  [
8d20: 54 72 5d 3c 74 68 3e 41 72 67 75 6d 65 6e 74 20  Tr]<th>Argument 
8d30: 3c 74 68 3e 44 65 66 61 75 6c 74 20 56 61 6c 75  <th>Default Valu
8d40: 65 20 3c 74 68 3e 44 65 73 63 72 69 70 74 69 6f  e <th>Descriptio
8d50: 6e 0a 20 20 5b 54 72 5d 3c 74 64 3e 30 20 3c 74  n.  [Tr]<td>0 <t
8d60: 64 3e 4e 2f 41 0a 20 20 20 20 20 20 3c 74 64 3e  d>N/A.      <td>
8d70: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
8d80: 65 6e 74 20 74 6f 20 74 68 65 20 73 6e 69 70 70  ent to the snipp
8d90: 65 74 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  et function must
8da0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8db0: 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 20  pecial.         
8dc0: 20 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20    hidden column 
8dd0: 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  of the FTS3 tabl
8de0: 65 20 74 68 61 74 20 74 61 6b 65 73 20 74 68 65  e that takes the
8df0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
8e00: 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
8e10: 20 20 20 69 74 73 65 6c 66 2e 0a 20 20 5b 54 72     itself..  [Tr
8e20: 5d 3c 74 64 3e 31 20 3c 74 64 3e 22 26 6c 74 3b  ]<td>1 <td>"&lt;
8e30: 62 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64  b&gt;".      <td
8e40: 3e 20 54 68 65 20 22 73 74 61 72 74 20 6d 61 74  > The "start mat
8e50: 63 68 22 20 74 65 78 74 2e 0a 20 20 5b 54 72 5d  ch" text..  [Tr]
8e60: 3c 74 64 3e 32 20 3c 74 64 3e 22 26 6c 74 3b 62  <td>2 <td>"&lt;b
8e70: 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e  &gt;".      <td>
8e80: 20 54 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22   The "end match"
8e90: 20 74 65 78 74 2e 0a 20 20 5b 54 72 5d 3c 74 64   text..  [Tr]<td
8ea0: 3e 33 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67 74  >3 <td>"&lt;b&gt
8eb0: 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 0a  ;...&lt;/b&gt;".
8ec0: 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22        <td> The "
8ed0: 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74 2e 0a  ellipses" text..
8ee0: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
8ef0: 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  The snippet func
8f00: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 66  tion returns a f
8f10: 72 61 67 6d 65 6e 74 20 6f 66 20 74 65 78 74 20  ragment of text 
8f20: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
8f30: 6c 20 64 6f 63 75 6d 65 6e 74 20 0a 20 20 73 75  l document .  su
8f40: 72 72 6f 75 6e 64 69 6e 67 20 74 68 65 20 74 65  rrounding the te
8f50: 72 6d 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  rm identified by
8f60: 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20   the first four 
8f70: 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 77 6f  integers that wo
8f80: 75 6c 64 20 62 65 0a 20 20 72 65 74 75 72 6e 65  uld be.  returne
8f90: 64 20 62 79 20 74 68 65 20 6f 66 66 73 65 74 73  d by the offsets
8fa0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 69 74 20   function if it 
8fb0: 77 65 72 65 20 75 73 65 64 20 69 6e 20 61 20 73  were used in a s
8fc0: 69 6d 69 6c 61 72 20 63 6f 6e 74 65 78 74 2e 20  imilar context. 
8fd0: 49 6e 0a 20 20 6d 6f 73 74 20 63 61 73 65 73 2c  In.  most cases,
8fe0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 66 72   the selected fr
8ff0: 61 67 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  agment contains 
9000: 34 30 20 6f 72 20 6c 65 73 73 20 62 79 74 65 73  40 or less bytes
9010: 20 6f 66 20 74 65 78 74 20 62 65 66 6f 72 65 0a   of text before.
9020: 20 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64    the identified
9030: 20 74 65 72 6d 2c 20 61 6e 64 20 34 30 20 6f 72   term, and 40 or
9040: 20 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20 74   more bytes of t
9050: 65 78 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ext following th
9060: 65 20 69 64 65 6e 74 69 66 69 65 64 0a 20 20 74  e identified.  t
9070: 65 72 6d 2e 20 53 6c 69 67 68 74 6c 79 20 6c 65  erm. Slightly le
9080: 73 73 20 74 68 61 6e 20 34 30 20 62 79 74 65 73  ss than 40 bytes
9090: 20 6f 66 20 70 72 65 63 65 64 69 6e 67 20 6f 72   of preceding or
90a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20   following text 
90b0: 69 73 20 70 72 6f 76 69 64 65 64 0a 20 20 73 6f  is provided.  so
90c0: 20 74 68 61 74 20 74 68 65 20 66 72 61 67 6d 65   that the fragme
90d0: 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  nt does not cont
90e0: 61 69 6e 20 61 6e 79 20 70 61 72 74 69 61 6c 20  ain any partial 
90f0: 74 65 72 6d 73 2e 20 49 66 20 74 68 65 20 66 69  terms. If the fi
9100: 72 73 74 20 74 65 72 6d 20 0a 20 20 28 74 68 61  rst term .  (tha
9110: 74 20 77 6f 75 6c 64 20 62 65 29 20 69 64 65 6e  t would be) iden
9120: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 66  tified by the of
9130: 66 73 65 74 73 20 66 75 6e 63 74 69 6f 6e 20 69  fsets function i
9140: 73 20 6c 65 73 73 20 74 68 61 6e 20 34 30 20 62  s less than 40 b
9150: 79 74 65 73 20 0a 20 20 66 72 6f 6d 20 74 68 65  ytes .  from the
9160: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
9170: 64 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e  d of the documen
9180: 74 2c 20 74 68 65 6e 20 65 78 74 72 61 20 74 65  t, then extra te
9190: 78 74 20 6d 61 79 20 61 70 70 65 61 72 20 62 65  xt may appear be
91a0: 66 6f 72 65 0a 20 20 6f 72 20 61 66 74 65 72 20  fore.  or after 
91b0: 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 74  the identified t
91c0: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 66  erm within the f
91d0: 72 61 67 6d 65 6e 74 20 74 6f 20 6d 61 6b 65 20  ragment to make 
91e0: 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
91f0: 65 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65  e...<p>.  If the
9200: 20 72 65 74 75 72 6e 65 64 20 66 72 61 67 6d 65   returned fragme
9210: 6e 74 20 6f 66 20 74 65 78 74 20 64 6f 65 73 20  nt of text does 
9220: 6e 6f 74 20 73 74 61 72 74 20 61 74 20 74 68 65  not start at the
9230: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 65 6e   start of the en
9240: 74 69 72 65 0a 20 20 64 6f 63 75 6d 65 6e 74 2c  tire.  document,
9250: 20 74 68 65 6e 20 74 68 65 20 22 65 6c 6c 69 70   then the "ellip
9260: 73 65 73 22 20 74 65 78 74 20 28 73 65 65 20 74  ses" text (see t
9270: 61 62 6c 65 20 61 62 6f 76 65 29 20 69 73 20 70  able above) is p
9280: 72 65 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a  repended to the.
9290: 20 20 66 72 61 67 6d 65 6e 74 20 62 65 66 6f 72    fragment befor
92a0: 65 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  e it is returned
92b0: 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20  . Similarly, if 
92c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
92d0: 65 74 75 72 6e 65 64 20 66 72 61 67 6d 65 6e 74  eturned fragment
92e0: 0a 20 20 69 73 20 6e 6f 74 20 61 6c 73 6f 20 74  .  is not also t
92f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 6e  he end of the en
9300: 74 69 72 65 20 64 6f 63 75 6d 65 6e 74 2c 20 74  tire document, t
9310: 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65  he "ellipses" te
9320: 78 74 20 69 73 20 61 70 70 65 6e 64 65 64 0a 20  xt is appended. 
9330: 20 74 6f 20 69 74 20 62 65 66 6f 72 65 20 69 74   to it before it
9340: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 0a 3c   is returned...<
9350: 70 3e 0a 20 20 42 65 66 6f 72 65 20 69 74 20 69  p>.  Before it i
9360: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
9370: 22 73 74 61 72 74 20 6d 61 74 63 68 22 20 74 65  "start match" te
9380: 78 74 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  xt is inserted i
9390: 6e 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74  nto the fragment
93a0: 0a 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  .  immediately b
93b0: 65 66 6f 72 65 20 61 6e 79 20 74 65 72 6d 73 20  efore any terms 
93c0: 77 69 74 68 69 6e 20 74 68 65 20 66 72 61 67 6d  within the fragm
93d0: 65 6e 74 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ent that would h
93e0: 61 76 65 20 62 65 65 6e 0a 20 20 69 64 65 6e 74  ave been.  ident
93f0: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 66 66  ified by the off
9400: 73 65 74 73 20 66 75 6e 63 74 69 6f 6e 20 28 6e  sets function (n
9410: 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
9420: 74 20 6f 6e 65 29 20 77 65 72 65 20 69 74 20 69  t one) were it i
9430: 6e 76 6f 6b 65 64 0a 20 20 69 6e 20 74 68 65 20  nvoked.  in the 
9440: 73 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 54 68  same context. Th
9450: 65 20 22 65 6e 64 20 6d 61 74 63 68 22 20 69 73  e "end match" is
9460: 20 69 6e 73 65 72 74 65 64 20 69 6d 6d 65 64 69   inserted immedi
9470: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
9480: 61 6c 6c 0a 20 20 73 75 63 68 20 74 65 72 6d 73  all.  such terms
9490: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 62 3e  ...[Code {.  <b>
94a0: 4e 6f 74 65 3a 20 49 6e 20 74 68 69 73 20 62 6c  Note: In this bl
94b0: 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c 65 73 2c  ock of examples,
94c0: 20 6e 65 77 6c 69 6e 65 73 20 61 6e 64 20 77 68   newlines and wh
94d0: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
94e0: 65 72 73 20 68 61 76 65 0a 20 20 62 65 65 6e 20  ers have.  been 
94f0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
9500: 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e 73 65 72  e document inser
9510: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 46 54 53  ted into the FTS
9520: 33 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  3 table, and the
9530: 20 65 78 70 65 63 74 65 64 0a 20 20 72 65 73 75   expected.  resu
9540: 6c 74 73 20 64 65 73 63 72 69 62 65 64 20 69 6e  lts described in
9550: 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 73 2e 20 54   SQL comments. T
9560: 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 65  his is done to e
9570: 6e 68 61 6e 63 65 20 72 65 61 64 61 62 69 6c 69  nhance readabili
9580: 74 79 20 6f 6e 6c 79 2c 0a 20 20 74 68 65 79 20  ty only,.  they 
9590: 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 65  would not be pre
95a0: 73 65 6e 74 20 69 6e 20 61 63 74 75 61 6c 20 53  sent in actual S
95b0: 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64 73 20 6f  QLite commands o
95c0: 72 20 6f 75 74 70 75 74 2e 3c 2f 62 3e 0a 0a 20  r output.</b>.. 
95d0: 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e   <i>-- Create an
95e0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46 54  d populate an FT
95f0: 53 33 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20  S3 table.</i>.  
9600: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
9610: 41 42 4c 45 20 74 65 78 74 20 55 53 49 4e 47 20  ABLE text USING 
9620: 66 74 73 33 28 29 3b 0a 20 20 49 4e 53 45 52 54  fts3();.  INSERT
9630: 20 49 4e 54 4f 20 74 65 78 74 20 56 41 4c 55 45   INTO text VALUE
9640: 53 28 27 0a 20 20 20 20 44 75 72 69 6e 67 20 33  S('.    During 3
9650: 30 20 4e 6f 76 2d 31 20 44 65 63 2c 20 32 2d 33  0 Nov-1 Dec, 2-3
9660: 6f 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c 20 69  oC drops. Cool i
9670: 6e 20 74 68 65 20 75 70 70 65 72 20 70 6f 72 74  n the upper port
9680: 69 6f 6e 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d  ion, minimum tem
9690: 70 65 72 61 74 75 72 65 20 31 34 2d 31 36 6f 43  perature 14-16oC
96a0: 20 0a 20 20 20 20 61 6e 64 20 63 6f 6f 6c 20 65   .    and cool e
96b0: 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75  lsewhere, minimu
96c0: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 37  m temperature 17
96d0: 2d 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f 20 76  -20oC. Cold to v
96e0: 65 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f 75 6e  ery cold on moun
96f0: 74 61 69 6e 74 6f 70 73 2c 20 0a 20 20 20 20 6d  taintops, .    m
9700: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
9710: 72 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72 74 68  re 6-12oC. North
9720: 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31  easterly winds 1
9730: 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66 74 65  5-30 km/hr. Afte
9740: 72 20 74 68 61 74 2c 20 74 65 6d 70 65 72 61 74  r that, temperat
9750: 75 72 65 20 0a 20 20 20 20 69 6e 63 72 65 61 73  ure .    increas
9760: 65 73 2e 20 4e 6f 72 74 68 65 61 73 74 65 72 6c  es. Northeasterl
9770: 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d  y winds 15-30 km
9780: 2f 68 72 2e 20 20 20 20 20 0a 20 20 27 29 3b 0a  /hr.     .  ');.
9790: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
97a0: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65 74  lowing query ret
97b0: 75 72 6e 73 20 74 68 65 20 74 65 78 74 20 76 61  urns the text va
97c0: 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  lue:</i>.  <i>--
97d0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 22  </i>.  <i>--   "
97e0: 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b  &lt;b&gt;...&lt;
97f0: 2f 62 26 67 74 3b 20 65 6c 73 65 77 68 65 72 65  /b&gt; elsewhere
9800: 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72  , minimum temper
9810: 61 74 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 26  ature 17-20oC. &
9820: 6c 74 3b 62 26 67 74 3b 43 6f 6c 64 26 6c 74 3b  lt;b&gt;Cold&lt;
9830: 2f 62 26 67 74 3b 20 74 6f 20 76 65 72 79 20 26  /b&gt; to very &
9840: 6c 74 3b 62 26 67 74 3b 63 6f 6c 64 26 6c 74 3b  lt;b&gt;cold&lt;
9850: 2f 62 26 67 74 3b 20 6f 6e 3c 2f 69 3e 0a 20 20  /b&gt; on</i>.  
9860: 3c 69 3e 2d 2d 20 20 20 20 6d 6f 75 6e 74 61 69  <i>--    mountai
9870: 6e 74 6f 70 73 2c 20 6d 69 6e 69 6d 75 6d 20 26  ntops, minimum &
9880: 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f  lt;b&gt;...&lt;/
9890: 62 26 67 74 3b 22 2e 3c 2f 69 3e 0a 20 20 3c 69  b&gt;".</i>.  <i
98a0: 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  >--</i>.  SELECT
98b0: 20 73 6e 69 70 70 65 74 28 74 65 78 74 29 20 46   snippet(text) F
98c0: 52 4f 4d 20 74 65 78 74 20 57 48 45 52 45 20 74  ROM text WHERE t
98d0: 65 78 74 20 4d 41 54 43 48 20 27 63 6f 6c 64 27  ext MATCH 'cold'
98e0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
98f0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72  ollowing query r
9900: 65 74 75 72 6e 73 20 74 68 65 20 74 65 78 74 20  eturns the text 
9910: 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  value:</i>.  <i>
9920: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
9930: 20 22 2e 2e 2e 20 32 2d 33 6f 43 20 64 72 6f 70   "... 2-3oC drop
9940: 73 2e 20 43 6f 6f 6c 20 69 6e 20 74 68 65 20 75  s. Cool in the u
9950: 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 26 23  pper portion, &#
9960: 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20  91;minimum&#93; 
9970: 26 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65  &#91;temperature
9980: 26 23 39 33 3b 20 31 34 2d 31 36 6f 43 20 61 6e  &#93; 14-16oC an
9990: 64 20 63 6f 6f 6c 3c 2f 69 3e 0a 20 20 3c 69 3e  d cool</i>.  <i>
99a0: 2d 2d 20 20 20 20 65 6c 73 65 77 68 65 72 65 2c  --    elsewhere,
99b0: 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39   &#91;minimum&#9
99c0: 33 3b 20 2e 2e 2e 22 3c 2f 69 3e 0a 20 20 3c 69  3; ..."</i>.  <i
99d0: 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  >--</i>.  SELECT
99e0: 20 73 6e 69 70 70 65 74 28 74 65 78 74 2c 20 27   snippet(text, '
99f0: 26 23 39 31 3b 20 27 26 23 39 33 3b 27 2c 20 27  &#91; '&#93;', '
9a00: 2e 2e 2e 27 29 20 46 52 4f 4d 20 74 65 78 74 20  ...') FROM text 
9a10: 57 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48  WHERE text MATCH
9a20: 20 27 22 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a 7d   '"min* tem*"'.}
9a30: 5d 0a 0a 5b 68 31 20 22 54 6f 6b 65 6e 69 7a 65  ]..[h1 "Tokenize
9a40: 72 73 22 20 74 6f 6b 65 6e 69 7a 65 72 20 7b 74  rs" tokenizer {t
9a50: 6f 6b 65 6e 69 7a 65 72 7d 5d 0a 0a 3c 70 3e 0a  okenizer}]..<p>.
9a60: 20 20 41 6e 20 46 54 53 33 20 74 6f 6b 65 6e 69    An FTS3 tokeni
9a70: 7a 65 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  zer is a set of 
9a80: 72 75 6c 65 73 20 66 6f 72 20 65 78 74 72 61 63  rules for extrac
9a90: 74 69 6e 67 20 74 65 72 6d 73 20 66 72 6f 6d 20  ting terms from 
9aa0: 61 20 64 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72  a document .  or
9ab0: 20 62 61 73 69 63 20 46 54 53 33 20 66 75 6c 6c   basic FTS3 full
9ac0: 2d 74 65 78 74 20 71 75 65 72 79 2e 20 0a 0a 3c  -text query. ..<
9ad0: 70 3e 0a 20 20 55 6e 6c 65 73 73 20 61 20 73 70  p>.  Unless a sp
9ae0: 65 63 69 66 69 63 20 74 6f 6b 65 6e 69 7a 65 72  ecific tokenizer
9af0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9b00: 20 70 61 72 74 20 6f 66 20 74 68 65 20 43 52 45   part of the CRE
9b10: 41 54 45 20 0a 20 20 56 49 52 54 55 41 4c 20 54  ATE .  VIRTUAL T
9b20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75  ABLE statement u
9b30: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 68  sed to create th
9b40: 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20 74 68  e FTS3 table, th
9b50: 65 20 64 65 66 61 75 6c 74 20 0a 20 20 74 6f 6b  e default .  tok
9b60: 65 6e 69 7a 65 72 2c 20 22 73 69 6d 70 6c 65 22  enizer, "simple"
9b70: 2c 20 69 73 20 75 73 65 64 2e 20 54 68 65 20 73  , is used. The s
9b80: 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20  imple tokenizer 
9b90: 65 78 74 72 61 63 74 73 20 74 6f 6b 65 6e 73 20  extracts tokens 
9ba0: 66 72 6f 6d 0a 20 20 61 20 64 6f 63 75 6d 65 6e  from.  a documen
9bb0: 74 20 6f 72 20 62 61 73 69 63 20 46 54 53 33 20  t or basic FTS3 
9bc0: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
9bd0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
9be0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 72 75   following .  ru
9bf0: 6c 65 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69  les:..<ul>.  <li
9c00: 3e 3c 70 3e 20 41 20 74 65 72 6d 20 69 73 20 61  ><p> A term is a
9c10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
9c20: 65 6e 63 65 20 6f 66 20 65 6c 69 67 69 62 6c 65  ence of eligible
9c30: 20 63 68 61 72 61 63 74 65 72 73 2c 20 77 68 65   characters, whe
9c40: 72 65 20 0a 20 20 20 20 65 6c 69 67 69 62 6c 65  re .    eligible
9c50: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
9c60: 61 6c 6c 20 61 6c 70 68 61 6e 75 6d 65 72 69 63  all alphanumeric
9c70: 20 63 68 61 72 61 63 74 65 72 73 2c 20 74 68 65   characters, the
9c80: 20 22 5f 22 20 63 68 61 72 61 63 74 65 72 2c 0a   "_" character,.
9c90: 20 20 20 20 61 6e 64 20 61 6c 6c 20 63 68 61 72      and all char
9ca0: 61 63 74 65 72 73 20 77 69 74 68 20 55 54 46 20  acters with UTF 
9cb0: 63 6f 64 65 70 6f 69 6e 74 73 20 67 72 65 61 74  codepoints great
9cc0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
9cd0: 20 74 6f 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c   to 128..    All
9ce0: 20 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72   other character
9cf0: 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
9d00: 77 68 65 6e 20 73 70 6c 69 74 74 69 6e 67 20 61  when splitting a
9d10: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74   document into t
9d20: 65 72 6d 73 2e 0a 20 20 20 20 54 68 65 79 20 73  erms..    They s
9d30: 65 72 76 65 20 6f 6e 6c 79 20 74 6f 20 73 65 70  erve only to sep
9d40: 61 72 61 74 65 20 61 64 6a 61 63 65 6e 74 20 74  arate adjacent t
9d50: 65 72 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e  erms...  <li><p>
9d60: 20 41 6c 6c 20 75 70 70 65 72 63 61 73 65 20 63   All uppercase c
9d70: 68 61 72 61 63 74 65 72 73 20 77 69 74 68 69 6e  haracters within
9d80: 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65   the ASCII range
9d90: 20 28 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73   (UTF codepoints
9da0: 20 6c 65 73 73 20 0a 20 20 20 20 74 68 61 6e 20   less .    than 
9db0: 31 32 38 29 2c 20 61 72 65 20 74 72 61 6e 73 66  128), are transf
9dc0: 6f 72 6d 65 64 20 74 6f 20 74 68 65 69 72 20 6c  ormed to their l
9dd0: 6f 77 65 72 63 61 73 65 20 65 71 75 69 76 61 6c  owercase equival
9de0: 65 6e 74 73 20 61 73 20 70 61 72 74 20 6f 66 20  ents as part of 
9df0: 74 68 65 0a 20 20 20 20 74 6f 6b 65 6e 69 7a 61  the.    tokeniza
9e00: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 54 68  tion process. Th
9e10: 75 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  us, full-text qu
9e20: 65 72 69 65 73 20 61 72 65 20 63 61 73 65 2d 69  eries are case-i
9e30: 6e 73 65 6e 73 69 74 69 76 65 20 77 68 65 6e 0a  nsensitive when.
9e40: 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 73 69      using the si
9e50: 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a  mple tokenizer..
9e60: 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72  </ul>..<p>.  For
9e70: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
9e80: 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74 61 69   document contai
9e90: 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20 22 52  ning the text "R
9ea0: 69 67 68 74 20 6e 6f 77 2c 20 74 68 65 79 27 72  ight now, they'r
9eb0: 65 20 76 65 72 79 0a 20 20 66 72 75 73 74 72 61  e very.  frustra
9ec0: 74 65 64 2e 22 2c 20 74 68 65 20 74 65 72 6d 73  ted.", the terms
9ed0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
9ee0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 61 6e 64  the document and
9ef0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20   added to the . 
9f00: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
9f10: 20 61 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20   are, in order, 
9f20: 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65 79 20  "right now they 
9f30: 72 65 20 76 65 72 79 20 66 72 75 73 74 72 61 74  re very frustrat
9f40: 65 64 22 2e 20 53 75 63 68 0a 20 20 61 20 64 6f  ed". Such.  a do
9f50: 63 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d 61 74  cument would mat
9f60: 63 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71  ch a full-text q
9f70: 75 65 72 79 20 73 75 63 68 20 61 73 20 22 4d 41  uery such as "MA
9f80: 54 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27  TCH 'Frustrated'
9f90: 22 2c 20 0a 20 20 61 73 20 74 68 65 20 73 69 6d  ", .  as the sim
9fa0: 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 74 72  ple tokenizer tr
9fb0: 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 74 65 72  ansforms the ter
9fc0: 6d 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 74  m in the query t
9fd0: 6f 20 6c 6f 77 65 72 63 61 73 65 0a 20 20 62 65  o lowercase.  be
9fe0: 66 6f 72 65 20 73 65 61 72 63 68 69 6e 67 20 74  fore searching t
9ff0: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
a000: 65 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65  ex...<p>.  As we
a010: 6c 6c 20 61 73 20 74 68 65 20 22 73 69 6d 70 6c  ll as the "simpl
a020: 65 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68  e" tokenizer, th
a030: 65 20 46 54 53 33 20 73 6f 75 72 63 65 20 63 6f  e FTS3 source co
a040: 64 65 20 66 65 61 74 75 72 65 73 20 61 20 74 6f  de features a to
a050: 6b 65 6e 69 7a 65 72 20 0a 20 20 74 68 61 74 20  kenizer .  that 
a060: 75 73 65 73 20 74 68 65 20 3c 61 20 68 72 65 66  uses the <a href
a070: 3d 22 68 74 74 70 3a 2f 2f 74 61 72 74 61 72 75  ="http://tartaru
a080: 73 2e 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f  s.org/~martin/Po
a090: 72 74 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f  rterStemmer/">Po
a0a0: 72 74 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67  rter .  Stemming
a0b0: 20 61 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20   algorithm</a>. 
a0c0: 54 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75  This tokenizer u
a0d0: 73 65 73 20 74 68 65 20 73 61 6d 65 20 72 75 6c  ses the same rul
a0e0: 65 73 20 74 6f 20 73 65 70 61 72 61 74 65 0a 20  es to separate. 
a0f0: 20 74 68 65 20 69 6e 70 75 74 20 64 6f 63 75 6d   the input docum
a100: 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 2c 20  ent into terms, 
a110: 62 75 74 20 61 73 20 77 65 6c 6c 20 61 73 20 66  but as well as f
a120: 6f 6c 64 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73  olding all terms
a130: 20 74 6f 20 6c 6f 77 65 72 0a 20 20 63 61 73 65   to lower.  case
a140: 20 69 74 20 75 73 65 73 20 74 68 65 20 50 6f 72   it uses the Por
a150: 74 65 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67  ter Stemming alg
a160: 6f 72 69 74 68 6d 20 74 6f 20 72 65 64 75 63 65  orithm to reduce
a170: 20 72 65 6c 61 74 65 64 20 45 6e 67 6c 69 73 68   related English
a180: 20 6c 61 6e 67 75 61 67 65 0a 20 20 77 6f 72 64   language.  word
a190: 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f  s to a common ro
a1a0: 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ot. For example,
a1b0: 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
a1c0: 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 61  input document a
a1d0: 73 20 69 6e 20 74 68 65 0a 20 20 70 61 72 61 67  s in the.  parag
a1e0: 72 61 70 68 20 61 62 6f 76 65 2c 20 74 68 65 20  raph above, the 
a1f0: 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72  porter tokenizer
a200: 20 65 78 74 72 61 63 74 73 20 74 68 65 20 66 6f   extracts the fo
a210: 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a  llowing tokens:.
a220: 20 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65    "right now the
a230: 69 20 76 65 72 69 20 66 72 75 73 74 72 61 74 22  i veri frustrat"
a240: 2e 20 45 76 65 6e 20 74 68 6f 75 67 68 20 73 6f  . Even though so
a250: 6d 65 20 6f 66 20 74 68 65 73 65 20 74 65 72 6d  me of these term
a260: 73 20 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20  s are not even. 
a270: 20 45 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c 20   English words, 
a280: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 75 73  in some cases us
a290: 69 6e 67 20 74 68 65 6d 20 74 6f 20 62 75 69 6c  ing them to buil
a2a0: 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  d the full-text 
a2b0: 69 6e 64 65 78 20 69 73 20 6d 6f 72 65 0a 20 20  index is more.  
a2c0: 75 73 65 66 75 6c 20 74 68 61 6e 20 74 68 65 20  useful than the 
a2d0: 6d 6f 72 65 20 69 6e 74 65 6c 6c 69 67 62 6c 65  more intelligble
a2e0: 20 6f 75 74 70 75 74 20 70 72 6f 64 75 63 65 64   output produced
a2f0: 20 62 79 20 74 68 65 20 73 69 6d 70 6c 65 20 74   by the simple t
a300: 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69 6e  okenizer..  Usin
a310: 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b  g the porter tok
a320: 65 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f 63 75  enizer, the docu
a330: 6d 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d 61  ment not only ma
a340: 74 63 68 65 73 20 66 75 6c 6c 2d 74 65 78 74 20  tches full-text 
a350: 71 75 65 72 69 65 73 0a 20 20 73 75 63 68 20 61  queries.  such a
a360: 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72  s "MATCH 'Frustr
a370: 61 74 65 64 27 22 2c 20 62 75 74 20 61 6c 73 6f  ated'", but also
a380: 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
a390: 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61   "MATCH 'Frustra
a3a0: 74 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68 65  tion'",.  as the
a3b0: 20 74 65 72 6d 20 22 46 72 75 73 74 72 61 74 69   term "Frustrati
a3c0: 6f 6e 22 20 69 73 20 72 65 64 75 63 65 64 20 62  on" is reduced b
a3d0: 79 20 74 68 65 20 50 6f 72 74 65 72 20 73 74 65  y the Porter ste
a3e0: 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 20 74  mmer algorithm t
a3f0: 6f 20 0a 20 20 22 66 72 75 73 74 72 61 74 22 20  o .  "frustrat" 
a400: 2d 20 6a 75 73 74 20 61 73 20 22 46 72 75 73 74  - just as "Frust
a410: 72 61 74 65 64 22 20 69 73 2e 20 53 6f 2c 20 77  rated" is. So, w
a420: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70 6f  hen using the po
a430: 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 0a  rter tokenizer,.
a440: 20 20 46 54 53 33 20 69 73 20 61 62 6c 65 20 74    FTS3 is able t
a450: 6f 20 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20  o find not just 
a460: 65 78 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f  exact matches fo
a470: 72 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c  r queried terms,
a480: 20 62 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61   but matches.  a
a490: 67 61 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45  gainst similar E
a4a0: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
a4b0: 74 65 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20  terms. For more 
a4c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  information on t
a4d0: 68 65 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65  he .  Porter Ste
a4e0: 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20  mmer algorithm, 
a4f0: 70 6c 65 61 73 65 20 72 65 66 65 72 20 74 6f 20  please refer to 
a500: 74 68 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20  the page linked 
a510: 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78  above...<p>.  Ex
a520: 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69  ample illustrati
a530: 6e 67 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ng the differenc
a540: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 22 73  e between the "s
a550: 69 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74  imple" and "port
a560: 65 72 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73  er".  tokenizers
a570: 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  :..[Code {.  <i>
a580: 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61 62 6c  -- Create a tabl
a590: 65 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70  e using the simp
a5a0: 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e  le tokenizer. In
a5b0: 73 65 72 74 20 61 20 64 6f 63 75 6d 65 6e 74 20  sert a document 
a5c0: 69 6e 74 6f 20 69 74 2e 3c 2f 69 3e 0a 20 20 43  into it.</i>.  C
a5d0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
a5e0: 42 4c 45 20 73 69 6d 70 6c 65 20 55 53 49 4e 47  BLE simple USING
a5f0: 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73   fts3(tokenize=s
a600: 69 6d 70 6c 65 29 3b 0a 20 20 49 4e 53 45 52 54  imple);.  INSERT
a610: 20 49 4e 54 4f 20 73 69 6d 70 6c 65 20 56 41 4c   INTO simple VAL
a620: 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74  UES('Right now t
a630: 68 65 79 27 27 72 65 20 76 65 72 79 20 66 72 75  hey''re very fru
a640: 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69  strated');..  <i
a650: 3e 2d 2d 20 54 68 65 20 66 69 72 73 74 20 6f 66  >-- The first of
a660: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
a670: 77 6f 20 71 75 65 72 69 65 73 20 6d 61 74 63 68  wo queries match
a680: 65 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  es the document 
a690: 73 74 6f 72 65 64 20 69 6e 3c 2f 69 3e 0a 20 20  stored in</i>.  
a6a0: 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 22 73 69 6d  <i>-- table "sim
a6b0: 70 6c 65 22 2e 20 54 68 65 20 73 65 63 6f 6e 64  ple". The second
a6c0: 20 64 6f 65 73 20 6e 6f 74 2e 3c 2f 69 3e 0a 20   does not.</i>. 
a6d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
a6e0: 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70  imple WHERE simp
a6f0: 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73 74 72  le MATCH 'Frustr
a700: 61 74 65 64 27 29 3b 0a 20 20 53 45 4c 45 43 54  ated');.  SELECT
a710: 20 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57   * FROM simple W
a720: 48 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43  HERE simple MATC
a730: 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27 29  H 'Frustration')
a740: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
a750: 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  e a table using 
a760: 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
a770: 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 74 68 65  izer. Insert the
a780: 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e 74 20 69   same document i
a790: 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20 43 52 45  nto it</i>.  CRE
a7a0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
a7b0: 45 20 70 6f 72 74 65 72 20 55 53 49 4e 47 20 66  E porter USING f
a7c0: 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  ts3(tokenize=por
a7d0: 74 65 72 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ter);.  INSERT I
a7e0: 4e 54 4f 20 70 6f 72 74 65 72 20 56 41 4c 55 45  NTO porter VALUE
a7f0: 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65  S('Right now the
a800: 79 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74  y''re very frust
a810: 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d  rated');..  <i>-
a820: 2d 20 42 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  - Both of the fo
a830: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20  llowing queries 
a840: 6d 61 74 63 68 20 74 68 65 20 64 6f 63 75 6d 65  match the docume
a850: 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62  nt stored in tab
a860: 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e  le "porter".</i>
a870: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
a880: 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f   porter WHERE po
a890: 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75 73  rter MATCH 'Frus
a8a0: 74 72 61 74 65 64 27 29 3b 0a 20 20 53 45 4c 45  trated');.  SELE
a8b0: 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72  CT * FROM porter
a8c0: 20 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41   WHERE porter MA
a8d0: 54 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e  TCH 'Frustration
a8e0: 27 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 66  ');.}]..<p>.  If
a8f0: 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   this extension 
a900: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
a910: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
a920: 4c 45 5f 49 43 55 20 70 72 65 2d 70 72 6f 63 65  LE_ICU pre-proce
a930: 73 73 6f 72 0a 20 20 73 79 6d 62 6f 6c 20 64 65  ssor.  symbol de
a940: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 72  fined, then ther
a950: 65 20 65 78 69 73 74 73 20 61 20 62 75 69 6c 74  e exists a built
a960: 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61  -in tokenizer na
a970: 6d 65 64 20 22 69 63 75 22 0a 20 20 69 6d 70 6c  med "icu".  impl
a980: 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68  emented using th
a990: 65 20 49 43 55 20 6c 69 62 72 61 72 79 2e 20 54  e ICU library. T
a9a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
a9b0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a  t passed to the.
a9c0: 20 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68    xCreate() meth
a9d0: 6f 64 20 28 73 65 65 20 66 74 73 33 5f 74 6f 6b  od (see fts3_tok
a9e0: 65 6e 69 7a 65 72 2e 68 29 20 6f 66 20 74 68 69  enizer.h) of thi
a9f0: 73 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20  s tokenizer may 
aa00: 62 65 0a 20 20 61 6e 20 49 43 55 20 6c 6f 63 61  be.  an ICU loca
aa10: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20 46  le identifier. F
aa20: 6f 72 20 65 78 61 6d 70 6c 65 20 22 74 72 5f 54  or example "tr_T
aa30: 52 22 20 66 6f 72 20 54 75 72 6b 69 73 68 20 61  R" for Turkish a
aa40: 73 20 75 73 65 64 0a 20 20 69 6e 20 54 75 72 6b  s used.  in Turk
aa50: 65 79 2c 20 6f 72 20 22 65 6e 5f 41 55 22 20 66  ey, or "en_AU" f
aa60: 6f 72 20 45 6e 67 6c 69 73 68 20 61 73 20 75 73  or English as us
aa70: 65 64 20 69 6e 20 41 75 73 74 72 61 6c 69 61 2e  ed in Australia.
aa80: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b   For example:..[
aa90: 43 6f 64 65 20 7b 0a 20 20 20 20 43 52 45 41 54  Code {.    CREAT
aaa0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
aab0: 74 68 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20  thai_text USING 
aac0: 66 74 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e  fts3(text, token
aad0: 69 7a 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 7d  ize=icu th_TH).}
aae0: 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 49 43 55  ]..<p>.  The ICU
aaf0: 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
ab00: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 76 65 72  mentation is ver
ab10: 79 20 73 69 6d 70 6c 65 2e 20 49 74 20 73 70 6c  y simple. It spl
ab20: 69 74 73 20 74 68 65 20 69 6e 70 75 74 0a 20 20  its the input.  
ab30: 74 65 78 74 20 61 63 63 6f 72 64 69 6e 67 20 74  text according t
ab40: 6f 20 74 68 65 20 49 43 55 20 72 75 6c 65 73 20  o the ICU rules 
ab50: 66 6f 72 20 66 69 6e 64 69 6e 67 20 77 6f 72 64  for finding word
ab60: 20 62 6f 75 6e 64 61 72 69 65 73 20 61 6e 64 20   boundaries and 
ab70: 64 69 73 63 61 72 64 73 0a 20 20 61 6e 79 20 74  discards.  any t
ab80: 6f 6b 65 6e 73 20 74 68 61 74 20 63 6f 6e 73 69  okens that consi
ab90: 73 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77  st entirely of w
aba0: 68 69 74 65 2d 73 70 61 63 65 2e 20 54 68 69 73  hite-space. This
abb0: 20 6d 61 79 20 62 65 20 73 75 69 74 61 62 6c 65   may be suitable
abc0: 0a 20 20 66 6f 72 20 73 6f 6d 65 20 61 70 70 6c  .  for some appl
abd0: 69 63 61 74 69 6f 6e 73 20 69 6e 20 73 6f 6d 65  ications in some
abe0: 20 6c 6f 63 61 6c 65 73 2c 20 62 75 74 20 6e 6f   locales, but no
abf0: 74 20 61 6c 6c 2e 20 49 66 20 6d 6f 72 65 20 63  t all. If more c
ac00: 6f 6d 70 6c 65 78 0a 20 20 70 72 6f 63 65 73 73  omplex.  process
ac10: 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2c  ing is required,
ac20: 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f 20   for example to 
ac30: 69 6d 70 6c 65 6d 65 6e 74 20 73 74 65 6d 6d 69  implement stemmi
ac40: 6e 67 20 6f 72 0a 20 20 64 69 73 63 61 72 64 20  ng or.  discard 
ac50: 70 75 6e 63 74 75 61 74 69 6f 6e 2c 20 74 68 69  punctuation, thi
ac60: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 79  s can be done by
ac70: 20 63 72 65 61 74 69 6e 67 20 61 20 74 6f 6b 65   creating a toke
ac80: 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e  nizer.  implemen
ac90: 74 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  tation that uses
aca0: 20 74 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a   the ICU tokeniz
acb0: 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 69 74  er as part of it
acc0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
acd0: 2e 0a 0a 5b 68 32 20 22 43 75 73 74 6f 6d 20 28  ...[h2 "Custom (
ace0: 55 73 65 72 20 49 6d 70 6c 65 6d 65 6e 74 65 64  User Implemented
acf0: 29 20 54 6f 6b 65 6e 69 7a 65 72 73 22 5d 0a 0a  ) Tokenizers"]..
ad00: 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61 73  <p>.  As well as
ad10: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 22 73   the built-in "s
ad20: 69 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22  imple", "porter"
ad30: 20 61 6e 64 20 28 70 6f 73 73 69 62 6c 79 29 20   and (possibly) 
ad40: 22 69 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72 73  "icu" tokenizers
ad50: 2c 0a 20 20 46 54 53 33 20 65 78 70 6f 72 74 73  ,.  FTS3 exports
ad60: 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68   an interface th
ad70: 61 74 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20  at allows users 
ad80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 63 75 73  to implement cus
ad90: 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 73 0a 20  tom tokenizers. 
ada0: 20 75 73 69 6e 67 20 43 2e 20 54 68 65 20 69 6e   using C. The in
adb0: 74 65 72 66 61 63 65 20 75 73 65 64 20 74 6f 20  terface used to 
adc0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 74 6f 6b  create a new tok
add0: 65 6e 69 7a 65 72 20 69 73 20 64 65 66 69 6e 65  enizer is define
ade0: 64 20 61 6e 64 20 0a 20 20 64 65 73 63 72 69 62  d and .  describ
adf0: 65 64 20 69 6e 20 74 68 65 20 66 74 73 33 5f 74  ed in the fts3_t
ae00: 6f 6b 65 6e 69 7a 65 72 2e 68 20 73 6f 75 72 63  okenizer.h sourc
ae10: 65 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 52  e file...<p>.  R
ae20: 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77  egistering a new
ae30: 20 46 54 53 33 20 74 6f 6b 65 6e 69 7a 65 72 20   FTS3 tokenizer 
ae40: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72 65  is similar to re
ae50: 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77 0a  gistering a new.
ae60: 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20    virtual table 
ae70: 6d 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69  module with SQLi
ae80: 74 65 2e 20 54 68 65 20 75 73 65 72 20 70 61 73  te. The user pas
ae90: 73 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ses a pointer to
aea0: 20 61 0a 20 20 73 74 72 75 63 74 75 72 65 20 63   a.  structure c
aeb0: 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65  ontaining pointe
aec0: 72 73 20 74 6f 20 76 61 72 69 6f 75 73 20 63 61  rs to various ca
aed0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73  llback functions
aee0: 20 74 68 61 74 0a 20 20 6d 61 6b 65 20 75 70 20   that.  make up 
aef0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
af00: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 6f  on of the new to
af10: 6b 65 6e 69 7a 65 72 20 74 79 70 65 2e 20 46 6f  kenizer type. Fo
af20: 72 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20  r tokenizers,.  
af30: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28 64  the structure (d
af40: 65 66 69 6e 65 64 20 69 6e 20 66 74 73 33 5f 74  efined in fts3_t
af50: 6f 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73 20 63  okenizer.h) is c
af60: 61 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74 65 33  alled.  "sqlite3
af70: 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
af80: 65 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20  e"...<p>.  FTS3 
af90: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20  does not expose 
afa0: 61 20 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  a C-function tha
afb0: 74 20 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20  t users call to 
afc0: 72 65 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74  register new.  t
afd0: 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77  okenizer types w
afe0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 68  ith a database h
aff0: 61 6e 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20  andle. Instead, 
b000: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74  the pointer must
b010: 0a 20 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  .  be encoded as
b020: 20 61 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c   an SQL blob val
b030: 75 65 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f  ue and passed to
b040: 20 46 54 53 33 20 74 68 72 6f 75 67 68 20 74 68   FTS3 through th
b050: 65 20 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62  e SQL.  engine b
b060: 79 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73  y evaluating a s
b070: 70 65 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75  pecial scalar fu
b080: 6e 63 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f  nction, "fts3_to
b090: 6b 65 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68  kenizer()"..  Th
b0a0: 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
b0b0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  () function may 
b0c0: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f  be called with o
b0d0: 6e 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65  ne or two argume
b0e0: 6e 74 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77  nts,.  as follow
b0f0: 73 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 20 20  s:..[Code {.    
b100: 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65  SELECT fts3_toke
b110: 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69  nizer(&lt;tokeni
b120: 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 29 3b 0a 20  zer-name&gt;);. 
b130: 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74     SELECT fts3_t
b140: 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b  okenizer(&lt;tok
b150: 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 2c  enizer-name&gt;,
b160: 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f 74 6f 6b   &lt;sqlite3_tok
b170: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74  enizer_module pt
b180: 72 26 67 74 3b 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a  r&gt;);.}]..<p>.
b190: 20 20 57 68 65 72 65 20 3c 74 6f 6b 65 6e 69 7a    Where <tokeniz
b1a0: 65 72 2d 6e 61 6d 65 3e 20 69 73 20 61 20 73 74  er-name> is a st
b1b0: 72 69 6e 67 20 69 64 65 6e 74 69 66 79 69 6e 67  ring identifying
b1c0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61   the tokenizer a
b1d0: 6e 64 0a 20 20 3c 73 71 6c 69 74 65 33 5f 74 6f  nd.  <sqlite3_to
b1e0: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70  kenizer_module p
b1f0: 74 72 3e 20 69 73 20 61 20 70 6f 69 6e 74 65 72  tr> is a pointer
b200: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 74   to an sqlite3_t
b210: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 0a  okenizer_module.
b220: 20 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f    structure enco
b230: 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20 62 6c  ded as an SQL bl
b240: 6f 62 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ob. If the secon
b250: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 72  d argument is pr
b260: 65 73 65 6e 74 2c 0a 20 20 69 74 20 69 73 20 72  esent,.  it is r
b270: 65 67 69 73 74 65 72 65 64 20 61 73 20 74 6f 6b  egistered as tok
b280: 65 6e 69 7a 65 72 20 3c 74 6f 6b 65 6e 69 7a 65  enizer <tokenize
b290: 72 2d 6e 61 6d 65 3e 20 61 6e 64 20 61 20 63 6f  r-name> and a co
b2a0: 70 79 20 6f 66 20 69 74 0a 20 20 72 65 74 75 72  py of it.  retur
b2b0: 6e 65 64 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65  ned. If only one
b2c0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73   argument is pas
b2d0: 73 65 64 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  sed, a pointer t
b2e0: 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a  o the tokenizer.
b2f0: 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e    implementation
b300: 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
b310: 74 65 72 65 64 20 61 73 20 3c 74 6f 6b 65 6e 69  tered as <tokeni
b320: 7a 65 72 2d 6e 61 6d 65 3e 20 69 73 20 72 65 74  zer-name> is ret
b330: 75 72 6e 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64  urned,.  encoded
b340: 20 61 73 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20   as a blob. Or, 
b350: 69 66 20 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e  if no such token
b360: 69 7a 65 72 20 65 78 69 73 74 73 2c 20 61 6e 20  izer exists, an 
b370: 53 51 4c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  SQL exception.  
b380: 28 65 72 72 6f 72 29 20 69 73 20 72 61 69 73 65  (error) is raise
b390: 64 2e 0a 0a 3c 70 3e 0a 20 20 3c 62 3e 53 45 43  d...<p>.  <b>SEC
b3a0: 55 52 49 54 59 20 57 41 52 4e 49 4e 47 3c 2f 62  URITY WARNING</b
b3b0: 3e 3a 20 49 66 20 74 68 65 20 66 74 73 33 20 65  >: If the fts3 e
b3c0: 78 74 65 6e 73 69 6f 6e 20 69 73 20 75 73 65 64  xtension is used
b3d0: 20 69 6e 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65   in an environme
b3e0: 6e 74 0a 20 20 77 68 65 72 65 20 70 6f 74 65 6e  nt.  where poten
b3f0: 74 69 61 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73  tially malicious
b400: 20 75 73 65 72 73 20 6d 61 79 20 65 78 65 63 75   users may execu
b410: 74 65 20 61 72 62 69 74 72 61 72 79 20 53 51 4c  te arbitrary SQL
b420: 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 0a 20  , they should . 
b430: 20 62 65 20 70 72 65 76 65 6e 74 65 64 20 66 72   be prevented fr
b440: 6f 6d 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  om invoking the 
b450: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
b460: 20 66 75 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69   function, possi
b470: 62 6c 79 20 75 73 69 6e 67 20 0a 20 20 74 68 65  bly using .  the
b480: 20 5c 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61   \[sqlite3_set_a
b490: 75 74 68 6f 72 69 7a 65 72 28 29 7c 61 75 74 68  uthorizer()|auth
b4a0: 6f 72 69 73 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orisation callba
b4b0: 63 6b 5c 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ck\]...<p>.  The
b4c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
b4d0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61   contains an exa
b4e0: 6d 70 6c 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20  mple of calling 
b4f0: 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  the fts3_tokeniz
b500: 65 72 28 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20  er().  function 
b510: 66 72 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a 5b 43  from C code:..[C
b520: 6f 64 65 20 7b 0a 20 20 3c 69 3e 2f 2a 0a 20 20  ode {.  <i>/*.  
b530: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 6f  ** Register a to
b540: 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
b550: 74 61 74 69 6f 6e 20 77 69 74 68 20 46 54 53 33  tation with FTS3
b560: 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74  ..  */</i>.  int
b570: 20 72 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a   registerTokeniz
b580: 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20  er(.    sqlite3 
b590: 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a  *db,.    char *z
b5a0: 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20  Name,.    const 
b5b0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
b5c0: 72 5f 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b  r_module *p.  ){
b5d0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
b5e0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
b5f0: 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Stmt;.    const 
b600: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45  char *zSql = "SE
b610: 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69  LECT fts3_tokeni
b620: 7a 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20  zer(?, ?)";..   
b630: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
b640: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
b650: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
b660: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b670: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b680: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
b690: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
b6a0: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
b6b0: 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53   1, zName, -1, S
b6c0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
b6d0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
b6e0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26  blob(pStmt, 2, &
b6f0: 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51  p, sizeof(p), SQ
b700: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
b710: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
b720: 53 74 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75  Stmt);..    retu
b730: 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
b740: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  ize(pStmt);.  }.
b750: 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75  .  <i>/*.  ** Qu
b760: 65 72 79 20 46 54 53 33 20 66 6f 72 20 74 68 65  ery FTS3 for the
b770: 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
b780: 6d 65 6e 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20  mentation named 
b790: 7a 4e 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a  zName..  */</i>.
b7a0: 20 20 69 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e    int queryToken
b7b0: 69 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65  izer(.    sqlite
b7c0: 33 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20  3 *db,.    char 
b7d0: 2a 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73  *zName,.    cons
b7e0: 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  t sqlite3_tokeni
b7f0: 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a  zer_module **pp.
b800: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b    ){.    int rc;
b810: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
b820: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f  t *pStmt;.    co
b830: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
b840: 20 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f   "SELECT fts3_to
b850: 6b 65 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20  kenizer(?)";..  
b860: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 72    *pp = 0;.    r
b870: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
b880: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
b890: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
b8a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b8b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b8c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
b8d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ..    sqlite3_bi
b8e0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
b8f0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
b900: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
b910: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
b920: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
b930: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tmt) ){.      if
b940: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
b950: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d  _type(pStmt, 0)=
b960: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
b970: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
b980: 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  p, sqlite3_colum
b990: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
b9a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a  , sizeof(*pp));.
b9b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b9c0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
b9d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
b9e0: 29 3b 0a 20 20 7d 0a 7d 5d 0a 0a 20 20 0a 20 20  );.  }.}]..  .  
b9f0: 0a 0a 5b 68 31 20 22 44 61 74 61 20 53 74 72 75  ..[h1 "Data Stru
ba00: 63 74 75 72 65 73 22 20 7b 7d 20 7b 73 65 67 6d  ctures" {} {segm
ba10: 65 6e 74 20 62 74 72 65 65 7d 5d 0a 0a 3c 70 3e  ent btree}]..<p>
ba20: 0a 20 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  .  This section 
ba30: 64 65 73 63 72 69 62 65 73 20 61 74 20 61 20 68  describes at a h
ba40: 69 67 68 2d 6c 65 76 65 6c 20 74 68 65 20 77 61  igh-level the wa
ba50: 79 20 74 68 65 20 46 54 53 33 20 6d 6f 64 75 6c  y the FTS3 modul
ba60: 65 20 73 74 6f 72 65 73 20 69 74 73 0a 20 20 69  e stores its.  i
ba70: 6e 64 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74  ndex and content
ba80: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
ba90: 2e 20 49 74 20 69 73 20 3c 62 3e 6e 6f 74 20 6e  . It is <b>not n
baa0: 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 61 64  ecessary to read
bab0: 20 6f 72 20 0a 20 20 75 6e 64 65 72 73 74 61 6e   or .  understan
bac0: 64 20 74 68 65 20 6d 61 74 65 72 69 61 6c 20 69  d the material i
bad0: 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  n this section i
bae0: 6e 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 46  n order to use F
baf0: 54 53 33 3c 2f 62 3e 20 69 6e 20 61 6e 20 0a 20  TS3</b> in an . 
bb00: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 48 6f   application. Ho
bb10: 77 65 76 65 72 2c 20 69 74 20 6d 61 79 20 62 65  wever, it may be
bb20: 20 75 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69   useful to appli
bb30: 63 61 74 69 6f 6e 20 64 65 76 65 6c 6f 70 65 72  cation developer
bb40: 73 20 61 74 74 65 6d 70 74 69 6e 67 20 0a 20 20  s attempting .  
bb50: 74 6f 20 61 6e 61 6c 79 7a 65 20 61 6e 64 20 75  to analyze and u
bb60: 6e 64 65 72 73 74 61 6e 64 20 46 54 53 33 20 70  nderstand FTS3 p
bb70: 65 72 66 6f 72 6d 61 6e 63 65 20 63 68 61 72 61  erformance chara
bb80: 63 74 65 72 69 73 74 69 63 73 2c 20 6f 72 20 74  cteristics, or t
bb90: 6f 20 64 65 76 65 6c 6f 70 65 72 73 20 0a 20 20  o developers .  
bba0: 63 6f 6e 74 65 6d 70 6c 61 74 69 6e 67 20 65 6e  contemplating en
bbb0: 68 61 6e 63 65 6d 65 6e 74 73 20 74 6f 20 74 68  hancements to th
bbc0: 65 20 65 78 69 73 74 69 6e 67 20 46 54 53 33 20  e existing FTS3 
bbd0: 66 65 61 74 75 72 65 20 73 65 74 2e 0a 0a 3c 70  feature set...<p
bbe0: 3e 0a 20 20 46 6f 72 20 65 61 63 68 20 46 54 53  >.  For each FTS
bbf0: 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  3 virtual table 
bc00: 69 6e 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  in a database, t
bc10: 68 72 65 65 20 72 65 61 6c 20 28 6e 6f 6e 2d 76  hree real (non-v
bc20: 69 72 74 75 61 6c 29 20 74 61 62 6c 65 73 20 0a  irtual) tables .
bc30: 20 20 61 72 65 20 63 72 65 61 74 65 64 20 74 6f    are created to
bc40: 20 73 74 6f 72 65 20 74 68 65 20 75 6e 64 65 72   store the under
bc50: 6c 79 69 6e 67 20 64 61 74 61 2e 20 54 68 65 20  lying data. The 
bc60: 72 65 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20  real tables are 
bc70: 6e 61 6d 65 64 20 22 25 5f 63 6f 6e 74 65 6e 74  named "%_content
bc80: 22 2c 0a 20 20 22 25 5f 73 65 67 64 69 72 22 20  ",.  "%_segdir" 
bc90: 61 6e 64 20 22 25 5f 73 65 67 6d 65 6e 74 73 22  and "%_segments"
bca0: 2c 20 77 68 65 72 65 20 22 25 22 20 69 73 20 72  , where "%" is r
bcb0: 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
bcc0: 61 6d 65 20 73 75 70 70 6c 69 65 64 20 62 79 0a  ame supplied by.
bcd0: 20 20 74 68 65 20 75 73 65 72 20 66 6f 72 20 74    the user for t
bce0: 68 65 20 46 54 53 33 20 76 69 72 74 75 61 6c 20  he FTS3 virtual 
bcf0: 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68  table...<p>.  Th
bd00: 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d  e leftmost colum
bd10: 6e 20 6f 66 20 74 68 65 20 22 25 5f 63 6f 6e 74  n of the "%_cont
bd20: 65 6e 74 22 20 74 61 62 6c 65 20 69 73 20 61 6e  ent" table is an
bd30: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
bd40: 20 4b 45 59 20 66 69 65 6c 64 0a 20 20 6e 61 6d   KEY field.  nam
bd50: 65 64 20 22 64 6f 63 69 64 22 2e 20 46 6f 6c 6c  ed "docid". Foll
bd60: 6f 77 69 6e 67 20 74 68 69 73 20 69 73 20 6f 6e  owing this is on
bd70: 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 65 61 63  e column for eac
bd80: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
bd90: 46 54 53 33 0a 20 20 76 69 72 74 75 61 6c 20 74  FTS3.  virtual t
bda0: 61 62 6c 65 20 61 73 20 64 65 63 6c 61 72 65 64  able as declared
bdb0: 20 62 79 20 74 68 65 20 75 73 65 72 2c 20 6e 61   by the user, na
bdc0: 6d 65 64 20 62 79 20 70 72 65 70 65 6e 64 69 6e  med by prependin
bdd0: 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  g the column nam
bde0: 65 0a 20 20 73 75 70 70 6c 69 65 64 20 62 79 20  e.  supplied by 
bdf0: 74 68 65 20 75 73 65 72 20 77 69 74 68 20 22 63  the user with "c
be00: 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65 72 65  <i>N</i>", where
be10: 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65   <i>N</i> is the
be20: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 0a 20   index of the . 
be30: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 74   column within t
be40: 68 65 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65 72  he table, number
be50: 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
be60: 72 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77  right starting w
be70: 69 74 68 20 31 2e 20 44 61 74 61 0a 20 20 74 79  ith 1. Data.  ty
be80: 70 65 73 20 73 75 70 70 6c 69 65 64 20 61 73 20  pes supplied as 
be90: 70 61 72 74 20 6f 66 20 74 68 65 20 76 69 72 74  part of the virt
bea0: 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
beb0: 61 74 69 6f 6e 20 61 72 65 20 6e 6f 74 20 75 73  ation are not us
bec0: 65 64 20 61 73 0a 20 20 70 61 72 74 20 6f 66 20  ed as.  part of 
bed0: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
bee0: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ble declaration.
bef0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b   For example:..[
bf00: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56  Code {.  <i>-- V
bf10: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63  irtual table dec
bf20: 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43  laration</i>.  C
bf30: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
bf40: 42 4c 45 20 61 62 63 20 55 53 49 4e 47 20 46 54  BLE abc USING FT
bf50: 53 33 28 61 20 4e 55 4d 42 45 52 2c 20 62 20 54  S3(a NUMBER, b T
bf60: 45 58 54 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d  EXT, c);..  <i>-
bf70: 2d 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  - Corresponding 
bf80: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
bf90: 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a  declaration</i>.
bfa0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
bfb0: 62 63 5f 63 6f 6e 74 65 6e 74 28 64 6f 63 69 64  bc_content(docid
bfc0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
bfd0: 20 4b 45 59 2c 20 63 31 61 2c 20 63 32 62 2c 20   KEY, c1a, c2b, 
bfe0: 63 32 63 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  c2c);.}]..<p>.  
bff0: 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  The %_content ta
c000: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
c010: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64   unadulterated d
c020: 61 74 61 20 69 6e 73 65 72 74 65 64 20 62 79 20  ata inserted by 
c030: 74 68 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f  the user .  into
c040: 20 74 68 65 20 46 54 53 33 20 76 69 72 74 75 61   the FTS3 virtua
c050: 6c 20 74 61 62 6c 65 20 62 79 20 74 68 65 20 75  l table by the u
c060: 73 65 72 2e 20 49 66 20 74 68 65 20 75 73 65 72  ser. If the user
c070: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
c080: 69 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20  itly.  supply a 
c090: 22 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68  "docid" value wh
c0a0: 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63  en inserting rec
c0b0: 6f 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c  ords, one is sel
c0c0: 65 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ected automatica
c0d0: 6c 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79 73  lly.  by the sys
c0e0: 74 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  tem...<p>.  The 
c0f0: 74 77 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61  two remaining ta
c100: 62 6c 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73  bles, %_segments
c110: 20 61 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61   and %_segdir, a
c120: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
c130: 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78   the .  full-tex
c140: 74 20 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74  t index. Concept
c150: 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65  ually, this inde
c160: 78 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61  x is a lookup ta
c170: 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 65 61  ble that maps ea
c180: 63 68 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64  ch .  term (word
c190: 29 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  ) to the set of 
c1a0: 64 6f 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72  docid values cor
c1b0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65  responding to re
c1c0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20  cords in the .  
c1d0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
c1e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65  that contain one
c1f0: 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65   or more occurre
c200: 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d  nces of the term
c210: 2e 20 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20  . To.  retrieve 
c220: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
c230: 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65  at contain a spe
c240: 63 69 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65  cified term, the
c250: 20 46 54 53 33 20 6d 6f 64 75 6c 65 0a 20 20 71   FTS3 module.  q
c260: 75 65 72 69 65 73 20 74 68 69 73 20 69 6e 64 65  ueries this inde
c270: 78 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  x to determine t
c280: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20  he set of docid 
c290: 76 61 6c 75 65 73 20 66 6f 72 20 72 65 63 6f 72  values for recor
c2a0: 64 73 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69  ds that.  contai
c2b0: 6e 20 74 68 65 20 74 65 72 6d 2c 20 74 68 65 6e  n the term, then
c2c0: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 72   retrieves the r
c2d0: 65 71 75 69 72 65 64 20 64 6f 63 75 6d 65 6e 74  equired document
c2e0: 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e  s from the %_con
c2f0: 74 65 6e 74 0a 20 20 74 61 62 6c 65 2e 20 52 65  tent.  table. Re
c300: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
c310: 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 46 54  schema of the FT
c320: 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  S3 virtual table
c330: 2c 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  , the %_segments
c340: 0a 20 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20  .  and %_segdir 
c350: 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79  tables are alway
c360: 73 20 63 72 65 61 74 65 64 20 61 73 20 66 6f 6c  s created as fol
c370: 6c 6f 77 73 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20  lows:..[Code {. 
c380: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f   CREATE TABLE %_
c390: 73 65 67 6d 65 6e 74 73 28 0a 20 20 20 20 62 6c  segments(.    bl
c3a0: 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52  ockid INTEGER PR
c3b0: 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 20 20 20  IMARY KEY,      
c3c0: 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
c3d0: 64 65 20 69 64 3c 2f 69 3e 0a 20 20 20 20 62 6c  de id</i>.    bl
c3e0: 6f 63 6b 20 62 6c 6f 62 20 20 20 20 20 20 20 20  ock blob        
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
c410: 64 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 29 3b  de data</i>.  );
c420: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
c430: 20 25 5f 73 65 67 64 69 72 28 0a 20 20 20 20 6c   %_segdir(.    l
c440: 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 0a 20 20  evel INTEGER,.  
c450: 20 20 69 64 78 20 49 4e 54 45 47 45 52 2c 0a 20    idx INTEGER,. 
c460: 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49     start_block I
c470: 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
c480: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63        <i>-- Bloc
c490: 6b 69 64 20 6f 66 20 66 69 72 73 74 20 6e 6f 64  kid of first nod
c4a0: 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
c4b0: 2f 69 3e 0a 20 20 20 20 6c 65 61 76 65 73 5f 65  /i>.    leaves_e
c4c0: 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52  nd_block INTEGER
c4d0: 2c 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d  ,          <i>--
c4e0: 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74   Blockid of last
c4f0: 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20 25 5f   leaf node in %_
c500: 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20  segments</i>.   
c510: 20 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47   end_block INTEG
c520: 45 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ER,             
c530: 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
c540: 64 20 6f 66 20 6c 61 73 74 20 6e 6f 64 65 20 69  d of last node i
c550: 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e  n %_segments</i>
c560: 0a 20 20 20 20 72 6f 6f 74 20 42 4c 4f 42 2c 20  .    root BLOB, 
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d          <i>-- B-
c590: 74 72 65 65 20 72 6f 6f 74 20 6e 6f 64 65 3c 2f  tree root node</
c5a0: 69 3e 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b  i>.    PRIMARY K
c5b0: 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 0a 20  EY(level, idx). 
c5c0: 20 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68   );.}]..<p>.  Th
c5d0: 65 20 73 63 68 65 6d 61 20 64 65 70 69 63 74 65  e schema depicte
c5e0: 64 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 64  d above is not d
c5f0: 65 73 69 67 6e 65 64 20 74 6f 20 73 74 6f 72 65  esigned to store
c600: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
c610: 6e 64 65 78 20 0a 20 20 64 69 72 65 63 74 6c 79  ndex .  directly
c620: 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73  . Instead, it is
c630: 20 75 73 65 64 20 74 6f 20 6f 6e 65 20 6f 72 20   used to one or 
c640: 6d 6f 72 65 20 62 2d 74 72 65 65 20 73 74 72 75  more b-tree stru
c650: 63 74 75 72 65 73 2e 20 54 68 65 72 65 0a 20 20  ctures. There.  
c660: 69 73 20 6f 6e 65 20 62 2d 74 72 65 65 20 66 6f  is one b-tree fo
c670: 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68  r each row in th
c680: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
c690: 2e 20 54 68 65 20 25 5f 73 65 67 64 69 72 20 74  . The %_segdir t
c6a0: 61 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e 74 61  able.  row conta
c6b0: 69 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  ins the root nod
c6c0: 65 20 61 6e 64 20 76 61 72 69 6f 75 73 20 6d 65  e and various me
c6d0: 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
c6e0: 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 62 2d  ed with the.  b-
c6f0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2c 20  tree structure, 
c700: 61 6e 64 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  and the %_segmen
c710: 74 73 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ts table contain
c720: 73 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e 6f 6e  s all other (non
c730: 2d 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65 65 20  -root).  b-tree 
c740: 6e 6f 64 65 73 2e 20 45 61 63 68 20 62 2d 74 72  nodes. Each b-tr
c750: 65 65 20 69 73 20 72 65 66 65 72 72 65 64 20 74  ee is referred t
c760: 6f 20 61 73 20 61 20 22 73 65 67 6d 65 6e 74 22  o as a "segment"
c770: 2e 20 4f 6e 63 65 20 69 74 20 68 61 73 0a 20 20  . Once it has.  
c780: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 61 20  been created, a 
c790: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
c7a0: 73 20 6e 65 76 65 72 20 75 70 64 61 74 65 64 20  s never updated 
c7b0: 28 61 6c 74 68 6f 75 67 68 20 69 74 20 6d 61 79  (although it may
c7c0: 20 62 65 0a 20 20 64 65 6c 65 74 65 64 20 61 6c   be.  deleted al
c7d0: 74 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70 3e 0a  together)...<p>.
c7e0: 20 20 54 68 65 20 6b 65 79 73 20 75 73 65 64 20    The keys used 
c7f0: 62 79 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  by each segment 
c800: 62 2d 74 72 65 65 20 61 72 65 20 74 65 72 6d 73  b-tree are terms
c810: 20 28 77 6f 72 64 73 29 2e 20 41 73 20 77 65 6c   (words). As wel
c820: 6c 20 61 73 20 74 68 65 0a 20 20 6b 65 79 2c 20  l as the.  key, 
c830: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d 74  each segment b-t
c840: 72 65 65 20 65 6e 74 72 79 20 68 61 73 20 61 6e  ree entry has an
c850: 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f 63   associated "doc
c860: 6c 69 73 74 22 20 28 64 6f 63 75 6d 65 6e 74 20  list" (document 
c870: 6c 69 73 74 29 2e 0a 20 20 41 20 64 6f 63 6c 69  list)..  A docli
c880: 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  st consists of z
c890: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72  ero or more entr
c8a0: 69 65 73 2c 20 77 68 65 72 65 20 65 61 63 68 20  ies, where each 
c8b0: 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f  entry consists o
c8c0: 66 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20  f:..<ul>.  <li> 
c8d0: 41 20 64 6f 63 69 64 20 28 64 6f 63 75 6d 65 6e  A docid (documen
c8e0: 74 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c 6c 69  t id), and.  <li
c8f0: 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d  > A list of term
c900: 20 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20 66 6f   offsets, one fo
c910: 72 20 65 61 63 68 20 6f 63 63 75 72 72 65 6e 63  r each occurrenc
c920: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 77 69  e of the term wi
c930: 74 68 69 6e 0a 20 20 20 20 20 20 20 74 68 65 20  thin.       the 
c940: 64 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65 72 6d  document. A term
c950: 20 6f 66 66 73 65 74 20 69 6e 64 69 63 61 74 65   offset indicate
c960: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c970: 74 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29 0a 20  tokens (words). 
c980: 20 20 20 20 20 20 74 68 61 74 20 6f 63 63 75 72        that occur
c990: 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d   before the term
c9a0: 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20 6e 6f   in question, no
c9b0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c9c0: 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
c9d0: 20 20 6f 72 20 62 79 74 65 73 2e 20 46 6f 72 20    or bytes. For 
c9e0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 65 72  example, the ter
c9f0: 6d 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  m offset of the 
ca00: 74 65 72 6d 20 22 77 61 72 22 20 69 6e 20 74 68  term "war" in th
ca10: 65 0a 20 20 20 20 20 20 20 70 68 72 61 73 65 20  e.       phrase 
ca20: 22 41 6e 63 65 73 74 72 61 6c 20 76 6f 69 63 65  "Ancestral voice
ca30: 73 20 70 72 6f 70 68 65 73 79 69 6e 67 20 77 61  s prophesying wa
ca40: 72 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e 0a  r!" is 3..</ul>.
ca50: 0a 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73 20 77  .<p>.  Entries w
ca60: 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 20  ithin a doclist 
ca70: 61 72 65 20 73 6f 72 74 65 64 20 62 79 20 64 6f  are sorted by do
ca80: 63 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73 20 77  cid. Positions w
ca90: 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 0a  ithin a doclist.
caa0: 20 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f 72    entry are stor
cab0: 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
cac0: 6f 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54 68  order...<p>.  Th
cad0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
cae0: 65 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c 2d 74  e logical full-t
caf0: 65 78 74 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ext index is fou
cb00: 6e 64 20 62 79 20 6d 65 72 67 69 6e 67 20 74 68  nd by merging th
cb10: 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  e.  contents of 
cb20: 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  all segment b-tr
cb30: 65 65 73 2e 20 49 66 20 61 20 74 65 72 6d 20 69  ees. If a term i
cb40: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 6d 6f 72  s present in mor
cb50: 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73 65 67  e than one.  seg
cb60: 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20 74 68 65  ment b-tree, the
cb70: 6e 20 69 74 20 6d 61 70 73 20 74 6f 20 74 68 65  n it maps to the
cb80: 20 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68 20 69   union of each i
cb90: 6e 64 69 76 69 64 75 61 6c 20 64 6f 63 6c 69 73  ndividual doclis
cba0: 74 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61 20 73  t. If,.  for a s
cbb0: 69 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68 65 20  ingle term, the 
cbc0: 73 61 6d 65 20 64 6f 63 69 64 20 6f 63 63 75 72  same docid occur
cbd0: 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s in more than o
cbe0: 6e 65 20 64 6f 63 6c 69 73 74 2c 20 74 68 65 6e  ne doclist, then
cbf0: 20 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f 63 6c   only.  the docl
cc00: 69 73 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ist that is part
cc10: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
cc20: 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 65  ently created se
cc30: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20  gment b-tree is 
cc40: 0a 20 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  .  considered va
cc50: 6c 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75 6c  lid. ..<p>.  Mul
cc60: 74 69 70 6c 65 20 62 2d 74 72 65 65 20 73 74 72  tiple b-tree str
cc70: 75 63 74 75 72 65 73 20 61 72 65 20 75 73 65 64  uctures are used
cc80: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69   instead of a si
cc90: 6e 67 6c 65 20 62 2d 74 72 65 65 20 74 6f 20 72  ngle b-tree to r
cca0: 65 64 75 63 65 0a 20 20 74 68 65 20 63 6f 73 74  educe.  the cost
ccb0: 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20 72 65   of inserting re
ccc0: 63 6f 72 64 73 20 69 6e 74 6f 20 46 54 53 33 20  cords into FTS3 
ccd0: 74 61 62 6c 65 73 2e 20 57 68 65 6e 20 61 20 6e  tables. When a n
cce0: 65 77 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  ew record is .  
ccf0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  inserted into an
cd00: 20 46 54 53 33 20 74 61 62 6c 65 20 74 68 61 74   FTS3 table that
cd10: 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
cd20: 73 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c  s a lot of data,
cd30: 20 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20   it is.  likely 
cd40: 74 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65  that many of the
cd50: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65   terms in the ne
cd60: 77 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72  w record are alr
cd70: 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a  eady present in.
cd80: 20 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72    a large number
cd90: 20 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65 63   of existing rec
cda0: 6f 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c  ords. If a singl
cdb0: 65 20 62 2d 74 72 65 65 20 77 65 72 65 20 75 73  e b-tree were us
cdc0: 65 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65  ed, then.  large
cdd0: 20 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75   doclist structu
cde0: 72 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74  res would have t
cdf0: 6f 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d  o be loaded from
ce00: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20   the database,. 
ce10: 20 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c   amended to incl
ce20: 75 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69  ude the new doci
ce30: 64 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65  d and term-offse
ce40: 74 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69  t list, then wri
ce50: 74 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74  tten back.  to t
ce60: 68 65 20 64 61 74 61 62 61 73 65 2e 20 55 73 69  he database. Usi
ce70: 6e 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72  ng multiple b-tr
ce80: 65 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73  ee tables allows
ce90: 20 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69   this to be avoi
cea0: 64 65 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e  ded.  by creatin
ceb0: 67 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77  g a new b-tree w
cec0: 68 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67  hich can be merg
ced0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
cee0: 74 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f  ting b-tree.  (o
cef0: 72 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72  r b-trees) later
cf00: 20 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20   on. Merging of 
cf10: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
cf20: 73 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d  s can be perform
cf30: 65 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72  ed as.  a backgr
cf40: 6f 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e  ound task, or on
cf50: 63 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d  ce a certain num
cf60: 62 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 20  ber of separate 
cf70: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
cf80: 73 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61 63  s.  have been ac
cf90: 63 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f  cumulated. Of co
cfa0: 75 72 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d  urse, this schem
cfb0: 65 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20  e makes queries 
cfc0: 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20  more expensive. 
cfd0: 20 28 61 73 20 74 68 65 20 46 54 53 33 20 63 6f   (as the FTS3 co
cfe0: 64 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c  de may have to l
cff0: 6f 6f 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61  ook up individua
d000: 6c 20 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20  l terms in more 
d010: 74 68 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65  than one.  b-tre
d020: 65 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  e and merge the 
d030: 72 65 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74  results), but it
d040: 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
d050: 74 68 61 74 20 69 6e 20 70 72 61 63 74 69 63 65  that in practice
d060: 20 74 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64   this.  overhead
d070: 20 69 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67   is often neglig
d080: 69 62 6c 65 2e 0a 20 20 0a 5b 68 32 20 22 56 61  ible..  .[h2 "Va
d090: 72 69 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e  riable Length In
d0a0: 74 65 67 65 72 20 28 76 61 72 69 6e 74 29 20 46  teger (varint) F
d0b0: 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 49  ormat"]..<p>.  I
d0c0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 73 74  nteger values st
d0d0: 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
d0e0: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6e  segment b-tree n
d0f0: 6f 64 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64  odes are encoded
d100: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53   using the.  FTS
d110: 33 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e  3 varint format.
d120: 20 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   This encoding i
d130: 73 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c  s similar, but <
d140: 62 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c  b>not identical<
d150: 2f 62 3e 2c 20 74 6f 20 74 68 65 0a 20 20 74 68  /b>, to the.  th
d160: 65 20 3c 61 20 68 72 65 66 3d 22 66 69 6c 65 66  e <a href="filef
d170: 6f 72 6d 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e  ormat.html#varin
d180: 74 5f 66 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65  t_format">SQLite
d190: 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f   varint format</
d1a0: 61 3e 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e  a>...<p>.  An en
d1b0: 63 6f 64 65 64 20 46 54 53 33 20 76 61 72 69 6e  coded FTS3 varin
d1c0: 74 20 63 6f 6e 73 75 6d 65 73 20 62 65 74 77 65  t consumes betwe
d1d0: 65 6e 20 6f 6e 65 20 61 6e 64 20 74 65 6e 20 62  en one and ten b
d1e0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 2e 20 54  ytes of space. T
d1f0: 68 65 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62  he.  number of b
d200: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 69 73  ytes required is
d210: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
d220: 68 65 20 73 69 67 6e 20 61 6e 64 20 6d 61 67 6e  he sign and magn
d230: 69 74 75 64 65 20 6f 66 20 74 68 65 0a 20 20 69  itude of the.  i
d240: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65 6e 63  nteger value enc
d250: 6f 64 65 64 2e 20 4d 6f 72 65 20 61 63 63 75 72  oded. More accur
d260: 61 74 65 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ately, the numbe
d270: 72 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20  r of bytes used 
d280: 74 6f 20 73 74 6f 72 65 0a 20 20 74 68 65 20 65  to store.  the e
d290: 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 64  ncoded integer d
d2a0: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 6f  epends on the po
d2b0: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  sition of the mo
d2c0: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73  st significant s
d2d0: 65 74 20 62 69 74 0a 20 20 69 6e 20 74 68 65 20  et bit.  in the 
d2e0: 36 34 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70  64-bit twos-comp
d2f0: 6c 69 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74  liment represent
d300: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74  ation of the int
d310: 65 67 65 72 20 76 61 6c 75 65 2e 20 4e 65 67 61  eger value. Nega
d320: 74 69 76 65 0a 20 20 76 61 6c 75 65 73 20 61 6c  tive.  values al
d330: 77 61 79 73 20 68 61 76 65 20 74 68 65 20 6d 6f  ways have the mo
d340: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62  st significant b
d350: 69 74 20 73 65 74 20 28 74 68 65 20 73 69 67 6e  it set (the sign
d360: 20 62 69 74 29 2c 20 61 6e 64 20 73 6f 20 61 72   bit), and so ar
d370: 65 0a 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65  e.  always store
d380: 64 20 75 73 69 6e 67 20 74 68 65 20 66 75 6c 6c  d using the full
d390: 20 74 65 6e 20 62 79 74 65 73 2e 20 50 6f 73 69   ten bytes. Posi
d3a0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 76 61 6c  tive integer val
d3b0: 75 65 73 20 6d 61 79 20 62 65 0a 20 20 73 74 6f  ues may be.  sto
d3c0: 72 65 64 20 75 73 69 6e 67 20 6c 65 73 73 20 73  red using less s
d3d0: 70 61 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  pace...<p>.  The
d3e0: 20 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 61   final byte of a
d3f0: 6e 20 65 6e 63 6f 64 65 64 20 46 54 53 33 20 76  n encoded FTS3 v
d400: 61 72 69 6e 74 20 68 61 73 20 69 74 73 20 6d 6f  arint has its mo
d410: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62  st significant b
d420: 69 74 20 0a 20 20 63 6c 65 61 72 65 64 2e 20 41  it .  cleared. A
d430: 6c 6c 20 70 72 65 63 65 64 69 6e 67 20 62 79 74  ll preceding byt
d440: 65 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74  es have the most
d450: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
d460: 20 73 65 74 2e 20 44 61 74 61 0a 20 20 69 73 20   set. Data.  is 
d470: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 65  stored in the re
d480: 6d 61 69 6e 69 6e 67 20 73 65 76 65 6e 20 6c 65  maining seven le
d490: 61 73 74 20 73 69 67 6e 66 69 63 61 6e 74 20 62  ast signficant b
d4a0: 69 74 73 20 6f 66 20 65 61 63 68 20 62 79 74 65  its of each byte
d4b0: 2e 0a 20 20 54 68 65 20 66 69 72 73 74 20 62 79  ..  The first by
d4c0: 74 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65  te of the encode
d4d0: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
d4e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 65   contains the le
d4f0: 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  ast significant.
d500: 20 20 73 65 76 65 6e 20 62 69 74 73 20 6f 66 20    seven bits of 
d510: 74 68 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65  the encoded inte
d520: 67 65 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73  ger value. The s
d530: 65 63 6f 6e 64 20 62 79 74 65 20 6f 66 20 74 68  econd byte of th
d540: 65 20 65 6e 63 6f 64 65 64 0a 20 20 72 65 70 72  e encoded.  repr
d550: 65 73 65 6e 74 61 74 69 6f 6e 2c 20 69 66 20 69  esentation, if i
d560: 74 20 69 73 20 70 72 65 73 65 6e 74 2c 20 63 6f  t is present, co
d570: 6e 74 61 69 6e 73 20 74 68 65 20 73 65 76 65 6e  ntains the seven
d580: 20 6e 65 78 74 20 6c 65 61 73 74 20 73 69 67 6e   next least sign
d590: 69 66 69 63 61 6e 74 0a 20 20 62 69 74 73 20 6f  ificant.  bits o
d5a0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  f the integer va
d5b0: 6c 75 65 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20  lue, and so on. 
d5c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
d5d0: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61  ble contains exa
d5e0: 6d 70 6c 65 73 0a 20 20 6f 66 20 65 6e 63 6f 64  mples.  of encod
d5f0: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
d600: 73 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54  s:..[Table].  [T
d610: 72 5d 3c 74 68 3e 44 65 63 69 6d 61 6c 3c 74 68  r]<th>Decimal<th
d620: 3e 48 65 78 61 64 65 63 69 6d 61 6c 3c 74 68 20  >Hexadecimal<th 
d630: 77 69 64 74 68 3d 31 30 30 25 3e 45 6e 63 6f 64  width=100%>Encod
d640: 65 64 20 52 65 70 72 65 73 65 6e 74 61 74 69 6f  ed Representatio
d650: 6e 0a 20 20 5b 54 72 5d 3c 74 64 3e 34 33 3c 74  n.  [Tr]<td>43<t
d660: 64 3e 30 78 30 30 30 30 30 30 30 30 30 30 30 30  d>0x000000000000
d670: 30 30 32 42 3c 74 64 3e 30 78 32 42 20 0a 20 20  002B<td>0x2B .  
d680: 5b 54 72 5d 3c 74 64 3e 32 30 30 38 31 35 3c 74  [Tr]<td>200815<t
d690: 64 3e 30 78 30 30 30 30 30 30 30 30 30 30 30 33  d>0x000000000003
d6a0: 31 30 36 46 3c 74 64 3e 30 78 39 43 20 30 78 41  106F<td>0x9C 0xA
d6b0: 30 20 30 78 30 43 0a 20 20 5b 54 72 5d 3c 74 64  0 0x0C.  [Tr]<td
d6c0: 3e 2d 31 3c 74 64 3e 30 78 46 46 46 46 46 46 46  >-1<td>0xFFFFFFF
d6d0: 46 46 46 46 46 46 46 46 46 3c 74 64 3e 30 78 46  FFFFFFFFF<td>0xF
d6e0: 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46  F 0xFF 0xFF 0xFF
d6f0: 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20   0xFF 0xFF 0xFF 
d700: 30 78 46 46 20 30 78 46 46 20 30 78 30 31 0a 3c  0xFF 0xFF 0x01.<
d710: 2f 74 61 62 6c 65 3e 0a 20 20 0a 0a 5b 68 32 20  /table>.  ..[h2 
d720: 22 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20  "Segment B-Tree 
d730: 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20  Format"]..<p>.  
d740: 53 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20  Segment b-trees 
d750: 61 72 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72  are prefix-compr
d760: 65 73 73 65 64 20 62 2b 2d 74 72 65 65 73 2e 20  essed b+-trees. 
d770: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67  There is one seg
d780: 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 66 6f  ment b-tree.  fo
d790: 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68  r each row in th
d7a0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
d7b0: 20 28 73 65 65 20 61 62 6f 76 65 29 2e 20 54 68   (see above). Th
d7c0: 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
d7d0: 68 65 20 73 65 67 6d 65 6e 74 0a 20 20 62 2d 74  he segment.  b-t
d7e0: 72 65 65 20 69 73 20 73 74 6f 72 65 64 20 61 73  ree is stored as
d7f0: 20 61 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22   a blob in the "
d800: 72 6f 6f 74 22 20 66 69 65 6c 64 20 6f 66 20 74  root" field of t
d810: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d820: 20 72 6f 77 0a 20 20 6f 66 20 74 68 65 20 25 5f   row.  of the %_
d830: 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20 41 6c  segdir table. Al
d840: 6c 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 28 69  l other nodes (i
d850: 66 20 61 6e 79 20 65 78 69 73 74 29 20 61 72 65  f any exist) are
d860: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a   stored in the .
d870: 20 20 22 62 6c 6f 62 22 20 63 6f 6c 75 6d 6e 20    "blob" column 
d880: 6f 66 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  of the %_segment
d890: 73 20 74 61 62 6c 65 2e 20 4e 6f 64 65 73 20 77  s table. Nodes w
d8a0: 69 74 68 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  ithin the %_segm
d8b0: 65 6e 74 73 20 74 61 62 6c 65 20 61 72 65 0a 20  ents table are. 
d8c0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
d8d0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
d8e0: 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 69 64 20   in the blockid 
d8f0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72  field of the cor
d900: 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20 72 6f 77  responding.  row
d910: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
d920: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
d930: 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
d940: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
d950: 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
d960: 5d 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20  ]<th>Column     
d970: 20 20 20 20 20 20 3c 74 68 20 77 69 64 74 68 3d        <th width=
d980: 31 30 30 25 3e 49 6e 74 65 72 70 72 65 74 69 6f  100%>Interpretio
d990: 6e 0a 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 76 65  n.  [Tr]<td>leve
d9a0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64  l            <td
d9b0: 3e 20 0a 20 20 20 20 42 65 74 77 65 65 6e 20 74  > .    Between t
d9c0: 68 65 6d 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  hem, the content
d9d0: 73 20 6f 66 20 74 68 65 20 22 6c 65 76 65 6c 22  s of the "level"
d9e0: 20 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64   and "idx" field
d9f0: 73 20 64 65 66 69 6e 65 20 74 68 65 0a 20 20 20  s define the.   
da00: 20 72 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66   relative age of
da10: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
da20: 72 65 65 2e 20 54 68 65 20 73 6d 61 6c 6c 65 72  ree. The smaller
da30: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
da40: 64 20 69 6e 20 74 68 65 0a 20 20 20 20 22 6c 65  d in the.    "le
da50: 76 65 6c 22 20 66 69 65 6c 64 2c 20 74 68 65 20  vel" field, the 
da60: 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79 20 74 68  more recently th
da70: 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
da80: 20 77 61 73 20 63 72 65 61 74 65 64 2e 20 49 66   was created. If
da90: 20 74 77 6f 0a 20 20 20 20 73 65 67 6d 65 6e 74   two.    segment
daa0: 20 62 2d 74 72 65 65 73 20 61 72 65 20 6f 66 20   b-trees are of 
dab0: 74 68 65 20 73 61 6d 65 20 22 6c 65 76 65 6c 22  the same "level"
dac0: 2c 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69  , the segment wi
dad0: 74 68 20 74 68 65 20 6c 61 72 67 65 72 0a 20 20  th the larger.  
dae0: 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69    value stored i
daf0: 6e 20 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75  n the "idx" colu
db00: 6d 6e 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e  mn is more recen
db10: 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b  t. The PRIMARY K
db20: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  EY constraint.  
db30: 20 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 64 69    on the %_segdi
db40: 72 20 74 61 62 6c 65 20 70 72 65 76 65 6e 74 73  r table prevents
db50: 20 61 6e 79 20 74 77 6f 20 73 65 67 6d 65 6e 74   any two segment
db60: 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 68  s from having th
db70: 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20  e same value.   
db80: 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 22 6c   for both the "l
db90: 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20  evel" and "idx" 
dba0: 66 69 65 6c 64 73 2e 0a 20 20 5b 54 72 5d 3c 74  fields..  [Tr]<t
dbb0: 64 3e 69 64 78 20 20 20 20 20 20 20 20 20 20 20  d>idx           
dbc0: 20 20 20 3c 74 64 3e 20 53 65 65 20 61 62 6f 76     <td> See abov
dbd0: 65 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 73 74 61  e..  [Tr]<td>sta
dbe0: 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20 3c 74  rt_block      <t
dbf0: 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b  d>.    The block
dc00: 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  id that correspo
dc10: 6e 64 73 20 74 6f 20 74 68 65 20 6e 6f 64 65 20  nds to the node 
dc20: 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
dc30: 74 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 0a  t blockid that .
dc40: 20 20 20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74      belongs to t
dc50: 68 69 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  his segment b-tr
dc60: 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74  ee. Or zero if t
dc70: 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e  he entire segmen
dc80: 74 20 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74  t b-tree.    fit
dc90: 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f  s on the root no
dca0: 64 65 2e 20 49 66 20 69 74 20 65 78 69 73 74 73  de. If it exists
dcb0: 2c 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61  , this node is a
dcc0: 6c 77 61 79 73 20 61 20 6c 65 61 66 20 6e 6f 64  lways a leaf nod
dcd0: 65 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 61  e..  [Tr]<td>lea
dce0: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74  ves_end_block <t
dcf0: 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b  d>.    The block
dd00: 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  id that correspo
dd10: 6e 64 73 20 74 6f 20 74 68 65 20 6c 65 61 66 20  nds to the leaf 
dd20: 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c 61  node with the la
dd30: 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 0a 20  rgest blockid . 
dd40: 20 20 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20     that belongs 
dd50: 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  to this segment 
dd60: 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20  b-tree. Or zero 
dd70: 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65  if the entire se
dd80: 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20  gment b-tree.   
dd90: 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f   fits on the roo
dda0: 74 20 6e 6f 64 65 2e 0a 20 20 5b 54 72 5d 3c 74  t node..  [Tr]<t
ddb0: 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e  d>end_block <td>
ddc0: 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64  .    The blockid
ddd0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
dde0: 73 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f  s to the interio
ddf0: 72 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20  r node with the 
de00: 6c 61 72 67 65 73 74 20 0a 20 20 20 20 62 6c 6f  largest .    blo
de10: 63 6b 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67  ckid that belong
de20: 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e  s to this segmen
de30: 74 20 62 2d 74 72 65 65 2e 20 20 4f 72 20 7a 65  t b-tree.  Or ze
de40: 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
de50: 20 73 65 67 6d 65 6e 74 0a 20 20 20 20 62 2d 74   segment.    b-t
de60: 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ree fits on the 
de70: 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74  root node. If it
de80: 20 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f   exists, this no
de90: 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 6e 0a  de is always an.
dea0: 20 20 20 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64      interior nod
deb0: 65 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 72 6f 6f  e..  [Tr]<td>roo
dec0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74  t             <t
ded0: 64 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74  d>.    Blob cont
dee0: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20  aining the root 
def0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d  node of the segm
df00: 65 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61  ent b-tree..</ta
df10: 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72  ble>..<p>.  Apar
df20: 74 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20  t from the root 
df30: 6e 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20  node, the nodes 
df40: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73  that make up a s
df50: 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d  ingle segment b-
df60: 74 72 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79  tree are.  alway
df70: 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61  s stored using a
df80: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
df90: 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73  ence of blockids
dfa0: 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  . Furthermore, t
dfb0: 68 65 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20  he.  nodes that 
dfc0: 6d 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65  make up a single
dfd0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d   level of the b-
dfe0: 74 72 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c  tree are themsel
dff0: 76 65 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20  ves stored as.  
e000: 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f  a contiguous blo
e010: 63 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72  ck, in b-tree or
e020: 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75  der. The contigu
e030: 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ous sequence of 
e040: 62 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20  blockids.  used 
e050: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74  to store the b-t
e060: 72 65 65 20 6c 65 61 76 65 73 20 61 72 65 20 61  ree leaves are a
e070: 6c 6c 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e  llocated startin
e080: 67 20 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b  g with the block
e090: 69 64 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65  id.  value store
e0a0: 64 20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f  d in the "start_
e0b0: 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66  block" column of
e0c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
e0d0: 6e 67 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c  ng %_segdir row,
e0e0: 0a 20 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67  .  and finishing
e0f0: 20 61 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20   at the blockid 
e100: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
e110: 74 68 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f  the "leaves_end_
e120: 62 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f  block".  field o
e130: 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  f the same row. 
e140: 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
e150: 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72  possible to iter
e160: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
e170: 74 68 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20  the.  leaves of 
e180: 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
e190: 2c 20 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20  , in key order, 
e1a0: 62 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68  by traversing th
e1b0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20  e %_segments .  
e1c0: 74 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64  table in blockid
e1d0: 20 6f 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61   order from "sta
e1e0: 72 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65  rt_block" to "le
e1f0: 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e  aves_end_block".
e200: 20 20 0a 0a 5b 68 33 20 22 53 65 67 6d 65 6e 74    ..[h3 "Segment
e210: 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64   B-Tree Leaf Nod
e220: 65 73 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  es"]..<p>.  The 
e230: 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61  following diagra
e240: 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f  m depicts the fo
e250: 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e  rmat of a segmen
e260: 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f  t b-tree leaf no
e270: 64 65 2e 0a 0a 5b 46 69 67 20 66 74 73 33 5f 6c  de...[Fig fts3_l
e280: 65 61 66 5f 6e 6f 64 65 2e 70 6e 67 20 22 53 65  eaf_node.png "Se
e290: 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61  gment B-Tree Lea
e2a0: 66 20 4e 6f 64 65 20 46 6f 72 6d 61 74 22 5d 0a  f Node Format"].
e2b0: 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 72 73 74  .<p>.  The first
e2c0: 20 74 65 72 6d 20 73 74 6f 72 65 64 20 6f 6e 20   term stored on 
e2d0: 65 61 63 68 20 6e 6f 64 65 20 28 22 54 65 72 6d  each node ("Term
e2e0: 20 31 22 20 69 6e 20 74 68 65 20 66 69 67 75 72   1" in the figur
e2f0: 65 20 61 62 6f 76 65 29 20 69 73 0a 20 20 73 74  e above) is.  st
e300: 6f 72 65 64 20 76 65 72 62 61 74 69 6d 2e 20 45  ored verbatim. E
e310: 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ach subsequent t
e320: 65 72 6d 20 69 73 20 70 72 65 66 69 78 2d 63 6f  erm is prefix-co
e330: 6d 70 72 65 73 73 65 64 20 77 69 74 68 20 72 65  mpressed with re
e340: 73 70 65 63 74 0a 20 20 74 6f 20 69 74 73 20 70  spect.  to its p
e350: 72 65 64 65 63 65 73 73 6f 72 2e 20 54 65 72 6d  redecessor. Term
e360: 73 20 61 72 65 20 73 74 6f 72 65 64 20 77 69 74  s are stored wit
e370: 68 69 6e 20 61 20 70 61 67 65 20 69 6e 20 73 6f  hin a page in so
e380: 72 74 65 64 20 28 6d 65 6d 63 6d 70 29 0a 20 20  rted (memcmp).  
e390: 6f 72 64 65 72 2e 0a 0a 5b 68 33 20 22 53 65 67  order...[h3 "Seg
e3a0: 6d 65 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65  ment B-Tree Inte
e3b0: 72 69 6f 72 20 4e 6f 64 65 73 22 5d 0a 0a 3c 70  rior Nodes"]..<p
e3c0: 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
e3d0: 67 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74  g diagram depict
e3e0: 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  s the format of 
e3f0: 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
e400: 20 69 6e 74 65 72 69 6f 72 20 0a 20 20 28 6e 6f   interior .  (no
e410: 6e 2d 6c 65 61 66 29 20 6e 6f 64 65 2e 0a 0a 5b  n-leaf) node...[
e420: 46 69 67 20 66 74 73 33 5f 69 6e 74 65 72 69 6f  Fig fts3_interio
e430: 72 5f 6e 6f 64 65 2e 70 6e 67 20 22 53 65 67 6d  r_node.png "Segm
e440: 65 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72  ent B-Tree Inter
e450: 69 6f 72 20 4e 6f 64 65 20 46 6f 72 6d 61 74 22  ior Node Format"
e460: 5d 0a 0a 0a 5b 68 32 20 22 44 6f 63 6c 69 73 74  ]...[h2 "Doclist
e470: 20 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20   Format"]..<p>. 
e480: 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69   A doclist consi
e490: 73 74 73 20 6f 66 20 61 6e 20 61 72 72 61 79 20  sts of an array 
e4a0: 6f 66 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64  of 64-bit signed
e4b0: 20 69 6e 74 65 67 65 72 73 2c 20 73 65 72 69 61   integers, seria
e4c0: 6c 69 7a 65 64 20 75 73 69 6e 67 0a 20 20 74 68  lized using.  th
e4d0: 65 20 46 54 53 33 20 76 61 72 69 6e 74 20 66 6f  e FTS3 varint fo
e4e0: 72 6d 61 74 2e 20 45 61 63 68 20 64 6f 63 6c 69  rmat. Each docli
e4f0: 73 74 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  st entry is made
e500: 20 75 70 20 6f 66 20 61 20 73 65 72 69 65 73 20   up of a series 
e510: 6f 66 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72  of two .  or mor
e520: 65 20 69 6e 74 65 67 65 72 73 2c 20 61 73 20 66  e integers, as f
e530: 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20  ollows:..<ol>.  
e540: 3c 6c 69 3e 20 54 68 65 20 64 6f 63 69 64 20 76  <li> The docid v
e550: 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20  alue. The first 
e560: 65 6e 74 72 79 20 69 6e 20 61 20 64 6f 63 6c 69  entry in a docli
e570: 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  st contains the 
e580: 6c 69 74 65 72 61 6c 20 64 6f 63 69 64 0a 20 20  literal docid.  
e590: 20 20 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20       value. The 
e5a0: 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 65  first field of e
e5b0: 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 64  ach subsequent d
e5c0: 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e  oclist entry con
e5d0: 74 61 69 6e 73 20 74 68 65 20 0a 20 20 20 20 20  tains the .     
e5e0: 20 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74    difference bet
e5f0: 77 65 65 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  ween the new doc
e600: 69 64 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  id and the previ
e610: 6f 75 73 20 6f 6e 65 20 28 61 6c 77 61 79 73 20  ous one (always 
e620: 61 20 70 6f 73 69 74 69 76 65 20 0a 20 20 20 20  a positive .    
e630: 20 20 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c     number)..  <l
e640: 69 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  i> Zero or more 
e650: 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
e660: 73 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74  s. A term-offset
e670: 20 6c 69 73 74 20 69 73 20 70 72 65 73 65 6e 74   list is present
e680: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20   for each.      
e690: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
e6a0: 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
e6b0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
e6c0: 74 68 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d  the term. A term
e6d0: 2d 6f 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c  -offset.       l
e6e0: 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ist consists of 
e6f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
e700: 20 20 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20      <ol>.       
e710: 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61  <li> Constant va
e720: 6c 75 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c  lue 1. This fiel
e730: 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  d is omitted for
e740: 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74   any term-offset
e750: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20   list.          
e760: 20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74    associated wit
e770: 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20  h column 0..    
e780: 20 20 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75     <li> The colu
e790: 6d 6e 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72  mn number (1 for
e7a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
e7b0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63  most column, etc
e7c0: 2e 29 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20  .). This.       
e7d0: 20 20 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d       field is om
e7e0: 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65  itted for any te
e7f0: 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61  rm-offset list a
e800: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
e810: 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20  olumn 0..       
e820: 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74  <li> A list of t
e830: 65 72 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72  erm-offsets, sor
e840: 74 65 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73  ted from smalles
e850: 74 20 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e  t to largest. In
e860: 73 74 65 61 64 0a 20 20 20 20 20 20 20 20 20 20  stead.          
e870: 20 20 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65    of storing the
e880: 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c   term-offset val
e890: 75 65 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61  ue literally, ea
e8a0: 63 68 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65  ch integer store
e8b0: 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  d .            i
e8c0: 73 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  s the difference
e8d0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 75 72   between the cur
e8e0: 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74  rent term-offset
e8f0: 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
e900: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  s .            o
e910: 6e 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74  ne (or zero if t
e920: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d  he current term-
e930: 6f 66 66 73 65 74 20 69 73 20 74 68 65 20 66 69  offset is the fi
e940: 72 73 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20  rst), plus 2..  
e950: 20 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20     </ol>.  <li> 
e960: 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30  Constant value 0
e970: 2e 0a 3c 2f 6f 6c 3e 0a 0a 5b 46 69 67 20 66 74  ..</ol>..[Fig ft
e980: 73 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67 20  s3_doclist2.png 
e990: 22 46 54 53 33 20 44 6f 63 6c 69 73 74 20 46 6f  "FTS3 Doclist Fo
e9a0: 72 6d 61 74 22 5d 0a 0a 5b 46 69 67 20 66 74 73  rmat"]..[Fig fts
e9b0: 33 5f 64 6f 63 6c 69 73 74 2e 70 6e 67 20 22 46  3_doclist.png "F
e9c0: 54 53 33 20 44 6f 63 6c 69 73 74 20 45 6e 74 72  TS3 Doclist Entr
e9d0: 79 20 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a  y Format"]..<p>.
e9e0: 20 20 46 6f 72 20 64 6f 63 6c 69 73 74 73 20 66    For doclists f
e9f0: 6f 72 20 77 68 69 63 68 20 74 68 65 20 74 65 72  or which the ter
ea00: 6d 20 61 70 70 65 61 72 73 20 69 6e 20 6d 6f 72  m appears in mor
ea10: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
ea20: 6e 20 6f 66 20 74 68 65 20 46 54 53 33 0a 20 20  n of the FTS3.  
ea30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74  virtual table, t
ea40: 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73  erm-offset lists
ea50: 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63 6c   within the docl
ea60: 69 73 74 20 61 72 65 20 73 74 6f 72 65 64 20 69  ist are stored i
ea70: 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d 62  n column .  numb
ea80: 65 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20 65  er order. This e
ea90: 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
eaa0: 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
eab0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
eac0: 20 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69 66   .  column 0 (if
ead0: 20 61 6e 79 29 20 69 73 20 61 6c 77 61 79 73 20   any) is always 
eae0: 66 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67 20  first, allowing 
eaf0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  the first two fi
eb00: 65 6c 64 73 20 6f 66 20 74 68 65 0a 20 20 74 65  elds of the.  te
eb10: 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 74  rm-offset list t
eb20: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 69 6e 20  o be omitted in 
eb30: 74 68 69 73 20 63 61 73 65 2e 0a 0a 7d 0a        this case...}.