Documentation Source Text

Hex Artifact Content
Login

Artifact ed32c844d9c95554cc273346a1031c6ee4c41f99:


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 7d 5d 0a 0a 3c 70 3e 0a 20 20  ple);.}]..<p>.  
1380: 46 54 53 33 20 74 61 62 6c 65 73 20 6d 61 79 20  FTS3 tables may 
1390: 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
13a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
13b0: 6e 67 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 5c  ng an ordinary \
13c0: 5b 44 52 4f 50 20 54 41 42 4c 45 5c 5d 0a 20 20  [DROP TABLE\].  
13d0: 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f 72 20 65  statement. For e
13e0: 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b  xample:..[Code {
13f0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 2c  .  <i>-- Create,
1400: 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
1410: 79 20 64 72 6f 70 2c 20 61 6e 20 46 54 53 33 20  y drop, an FTS3 
1420: 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45  table.</i>.  CRE
1430: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1440: 45 20 64 61 74 61 20 55 53 49 4e 47 20 66 74 73  E data USING fts
1450: 33 28 29 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c  3();.  DROP TABL
1460: 45 20 64 61 74 61 3b 0a 7d 5d 0a 0a 5b 68 32 20  E data;.}]..[h2 
1470: 22 50 6f 70 75 6c 61 74 69 6e 67 20 46 54 53 33  "Populating FTS3
1480: 20 54 61 62 6c 65 73 22 5d 0a 0a 20 20 3c 70 3e   Tables"]..  <p>
1490: 0a 20 20 20 20 46 54 53 33 20 74 61 62 6c 65 73  .    FTS3 tables
14a0: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 75   are populated u
14b0: 73 69 6e 67 20 5c 5b 49 4e 53 45 52 54 5c 5d 2c  sing \[INSERT\],
14c0: 20 5c 5b 55 50 44 41 54 45 5c 5d 20 61 6e 64 20   \[UPDATE\] and 
14d0: 5c 5b 44 45 4c 45 54 45 5c 5d 0a 20 20 20 20 73  \[DELETE\].    s
14e0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
14f0: 20 73 61 6d 65 20 77 61 79 20 61 73 20 6f 72 64   same way as ord
1500: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61 62  inary SQLite tab
1510: 6c 65 73 20 61 72 65 2e 0a 0a 20 20 3c 70 3e 0a  les are...  <p>.
1520: 20 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20 74      As well as t
1530: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64  he columns named
1540: 20 62 79 20 74 68 65 20 75 73 65 72 20 28 6f 72   by the user (or
1550: 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 22 20 63   the "content" c
1560: 6f 6c 75 6d 6e 20 69 66 20 6e 6f 0a 20 20 20 20  olumn if no.    
1570: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73  module arguments
1580: 20 77 68 65 72 65 20 73 70 65 63 69 66 69 65 64   where specified
1590: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
15a0: 5c 5b 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  \[CREATE VIRTUAL
15b0: 20 54 41 42 4c 45 5c 5d 20 0a 20 20 20 20 73 74   TABLE\] .    st
15c0: 61 74 65 6d 65 6e 74 29 2c 20 65 61 63 68 20 46  atement), each F
15d0: 54 53 33 20 74 61 62 6c 65 20 68 61 73 20 61 20  TS3 table has a 
15e0: 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20 74  "rowid" column t
15f0: 68 61 74 20 62 65 68 61 76 65 73 20 6c 69 6b 65  hat behaves like
1600: 20 61 6e 0a 20 20 20 20 5c 5b 49 4e 54 45 47 45   an.    \[INTEGE
1610: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 5c 5d 2c  R PRIMARY KEY\],
1620: 20 65 78 63 65 70 74 20 74 68 61 74 20 76 61 6c   except that val
1630: 75 65 73 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  ues remain uncha
1640: 6e 67 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  nged if the.    
1650: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 62 75  database is rebu
1660: 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20 5c 5b  ilt using the \[
1670: 56 41 43 55 55 4d 5c 5d 20 63 6f 6d 6d 61 6e 64  VACUUM\] command
1680: 2e 20 46 6f 72 20 46 54 53 33 20 74 61 62 6c 65  . For FTS3 table
1690: 73 2c 20 22 64 6f 63 69 64 22 0a 20 20 20 20 69  s, "docid".    i
16a0: 73 20 61 6c 6c 6f 77 65 64 20 61 73 20 61 6e 20  s allowed as an 
16b0: 61 6c 69 61 73 20 61 6c 6f 6e 67 20 77 69 74 68  alias along with
16c0: 20 74 68 65 20 75 73 75 61 6c 20 22 72 6f 77 69   the usual "rowi
16d0: 64 22 2c 20 22 6f 69 64 22 20 61 6e 64 20 22 5f  d", "oid" and "_
16e0: 6f 69 64 5f 22 0a 20 20 20 20 69 64 65 6e 74 69  oid_".    identi
16f0: 66 69 65 72 73 2e 20 41 74 74 65 6d 70 74 69 6e  fiers. Attemptin
1700: 67 20 74 6f 20 69 6e 73 65 72 74 20 6f 72 20 75  g to insert or u
1710: 70 64 61 74 65 20 61 20 72 6f 77 20 77 69 74 68  pdate a row with
1720: 20 61 20 64 6f 63 69 64 20 76 61 6c 75 65 20 74   a docid value t
1730: 68 61 74 20 0a 20 20 20 20 61 6c 72 65 61 64 79  hat .    already
1740: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 74   exists in the t
1750: 61 62 6c 65 20 69 73 20 61 6e 20 65 72 72 6f 72  able is an error
1760: 2c 20 6a 75 73 74 20 61 73 20 69 74 20 77 6f 75  , just as it wou
1770: 6c 64 20 62 65 20 77 69 74 68 20 61 6e 20 0a 20  ld be with an . 
1780: 20 20 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69     ordinary SQLi
1790: 74 65 20 74 61 62 6c 65 2e 0a 0a 20 20 3c 70 20  te table...  <p 
17a0: 63 6c 61 73 73 3d 74 6f 64 6f 3e 0a 20 20 20 20  class=todo>.    
17b0: 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 68 65 6e  The problem when
17c0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
17d0: 65 64 20 6f 72 20 75 70 64 61 74 65 64 20 61 6e  ed or updated an
17e0: 64 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65  d distinct value
17f0: 73 20 61 72 65 20 0a 20 20 20 20 73 70 65 63 69  s are .    speci
1800: 66 69 65 64 20 66 6f 72 20 74 68 65 20 72 6f 77  fied for the row
1810: 69 64 20 61 6e 64 20 64 6f 63 69 64 2e 0a 0a 5b  id and docid...[
1820: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 43  Code {.  <i>-- C
1830: 72 65 61 74 65 20 61 6e 20 46 54 53 33 20 74 61  reate an FTS3 ta
1840: 62 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ble</i>.  CREATE
1850: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
1860: 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 33 28  ages USING fts3(
1870: 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a 20  title, body);.. 
1880: 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20   <i>-- Insert a 
1890: 72 6f 77 20 77 69 74 68 20 61 20 73 70 65 63 69  row with a speci
18a0: 66 69 63 20 64 6f 63 69 64 20 76 61 6c 75 65 2e  fic docid value.
18b0: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
18c0: 54 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c 20  TO pages(docid, 
18d0: 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c  title, body) VAL
18e0: 55 45 53 28 35 33 2c 20 27 48 6f 6d 65 20 50 61  UES(53, 'Home Pa
18f0: 67 65 27 2c 20 27 53 51 4c 69 74 65 20 69 73 20  ge', 'SQLite is 
1900: 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27 29 3b  a software...');
1910: 0a 0a 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74  ..  <i>-- Insert
1920: 20 61 20 72 6f 77 20 61 6e 64 20 61 6c 6c 6f 77   a row and allow
1930: 20 46 54 53 33 20 74 6f 20 61 73 73 69 67 6e 20   FTS3 to assign 
1940: 61 20 64 6f 63 69 64 20 76 61 6c 75 65 20 75 73  a docid value us
1950: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61 6c 67  ing the same alg
1960: 6f 72 69 74 68 6d 20 61 73 3c 2f 69 3e 0a 20 20  orithm as</i>.  
1970: 3c 69 3e 2d 2d 20 53 51 4c 69 74 65 20 75 73 65  <i>-- SQLite use
1980: 73 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  s for ordinary t
1990: 61 62 6c 65 73 2e 20 49 6e 20 74 68 69 73 20 63  ables. In this c
19a0: 61 73 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69  ase the new doci
19b0: 64 20 77 69 6c 6c 20 62 65 20 35 34 2c 3c 2f 69  d will be 54,</i
19c0: 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 67 72  >.  <i>-- one gr
19d0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
19e0: 61 72 67 65 73 74 20 64 6f 63 69 64 20 63 75 72  argest docid cur
19f0: 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69  rently present i
1a00: 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e  n the table.</i>
1a10: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
1a20: 61 67 65 73 28 74 69 74 6c 65 2c 20 62 6f 64 79  ages(title, body
1a30: 29 20 56 41 4c 55 45 53 28 27 44 6f 77 6e 6c 6f  ) VALUES('Downlo
1a40: 61 64 27 2c 20 27 41 6c 6c 20 53 51 4c 69 74 65  ad', 'All SQLite
1a50: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e 27   source code...'
1a60: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 68 61 6e  );..  <i>-- Chan
1a70: 67 65 20 74 68 65 20 74 69 74 6c 65 20 6f 66 20  ge the title of 
1a80: 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  the row just ins
1a90: 65 72 74 65 64 2e 3c 2f 69 3e 0a 20 20 55 50 44  erted.</i>.  UPD
1aa0: 41 54 45 20 70 61 67 65 73 20 53 45 54 20 74 69  ATE pages SET ti
1ab0: 74 6c 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64 20  tle = 'Download 
1ac0: 53 51 4c 69 74 65 27 20 57 48 45 52 45 20 72 6f  SQLite' WHERE ro
1ad0: 77 69 64 20 3d 20 6c 61 73 74 5f 69 6e 73 65 72  wid = last_inser
1ae0: 74 5f 72 6f 77 69 64 28 29 3b 0a 0a 20 20 3c 69  t_rowid();..  <i
1af0: 3e 2d 2d 20 44 65 6c 65 74 65 20 74 68 65 20 65  >-- Delete the e
1b00: 6e 74 69 72 65 20 74 61 62 6c 65 20 63 6f 6e 74  ntire table cont
1b10: 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 44 45 4c 45  ents.</i>.  DELE
1b20: 54 45 20 46 52 4f 4d 20 70 61 67 65 73 3b 0a 7d  TE FROM pages;.}
1b30: 5d 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54 6f 20  ]..  <p>.    To 
1b40: 73 75 70 70 6f 72 74 20 66 75 6c 6c 2d 74 65 78  support full-tex
1b50: 74 20 71 75 65 72 69 65 73 2c 20 46 54 53 33 20  t queries, FTS3 
1b60: 6d 61 69 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76  maintains an inv
1b70: 65 72 74 65 64 20 69 6e 64 65 78 20 74 68 61 74  erted index that
1b80: 20 6d 61 70 73 0a 20 20 20 20 66 72 6f 6d 20 65   maps.    from e
1b90: 61 63 68 20 75 6e 69 71 75 65 20 74 65 72 6d 20  ach unique term 
1ba0: 6f 72 20 77 6f 72 64 20 74 68 61 74 20 61 70 70  or word that app
1bb0: 65 61 72 73 20 69 6e 20 74 68 65 20 64 61 74 61  ears in the data
1bc0: 73 65 74 20 74 6f 20 74 68 65 20 6c 6f 63 61 74  set to the locat
1bd0: 69 6f 6e 73 0a 20 20 20 20 69 6e 20 77 68 69 63  ions.    in whic
1be0: 68 20 69 74 20 61 70 70 65 61 72 73 20 77 69 74  h it appears wit
1bf0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 63 6f  hin the table co
1c00: 6e 74 65 6e 74 73 2e 20 46 6f 72 20 74 68 65 20  ntents. For the 
1c10: 63 75 72 69 6f 75 73 2c 20 61 20 0a 20 20 20 20  curious, a .    
1c20: 63 6f 6d 70 6c 65 74 65 20 64 65 73 63 72 69 70  complete descrip
1c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 5b 73 65  tion of the \[se
1c40: 67 6d 65 6e 74 20 62 74 72 65 65 7c 64 61 74 61  gment btree|data
1c50: 20 73 74 72 75 63 74 75 72 65 5c 5d 20 75 73 65   structure\] use
1c60: 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 20 20 74  d to store.    t
1c70: 68 69 73 20 69 6e 64 65 78 20 77 69 74 68 69 6e  his index within
1c80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c90: 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64 20  le is described 
1ca0: 62 65 6c 6f 77 2e 20 41 20 66 65 61 74 75 72 65  below. A feature
1cb0: 20 6f 66 0a 20 20 20 20 74 68 69 73 20 64 61 74   of.    this dat
1cc0: 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 74  a structure is t
1cd0: 68 61 74 20 61 74 20 61 6e 79 20 74 69 6d 65 20  hat at any time 
1ce0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1cf0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20 20 20   contain not.   
1d00: 20 6f 6e 65 20 69 6e 64 65 78 20 62 2d 74 72 65   one index b-tre
1d10: 65 2c 20 62 75 74 20 73 65 76 65 72 61 6c 20 64  e, but several d
1d20: 69 66 66 65 72 65 6e 74 20 62 2d 74 72 65 65 73  ifferent b-trees
1d30: 20 74 68 61 74 20 61 72 65 20 69 6e 63 72 65 6d   that are increm
1d40: 65 6e 74 61 6c 6c 79 0a 20 20 20 20 6d 65 72 67  entally.    merg
1d50: 65 64 20 61 73 20 72 6f 77 73 20 61 72 65 20 69  ed as rows are i
1d60: 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74 65 64  nserted, updated
1d70: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 54 68   and deleted. Th
1d80: 69 73 20 74 65 63 68 6e 69 71 75 65 20 69 6d 70  is technique imp
1d90: 72 6f 76 65 73 20 0a 20 20 20 20 70 65 72 66 6f  roves .    perfo
1da0: 72 6d 61 6e 63 65 20 77 68 65 6e 20 77 72 69 74  rmance when writ
1db0: 69 6e 67 20 74 6f 20 61 6e 20 46 54 53 33 20 74  ing to an FTS3 t
1dc0: 61 62 6c 65 2c 20 62 75 74 20 63 61 75 73 65 73  able, but causes
1dd0: 20 73 6f 6d 65 20 6f 76 65 72 68 65 61 64 20 66   some overhead f
1de0: 6f 72 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78 74  or.    full-text
1df0: 20 71 75 65 72 69 65 73 20 74 68 61 74 20 75 73   queries that us
1e00: 65 20 74 68 65 20 69 6e 64 65 78 2e 20 45 78 65  e the index. Exe
1e10: 63 75 74 69 6e 67 20 61 6e 20 53 51 4c 20 73 74  cuting an SQL st
1e20: 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a 20  atement of the. 
1e30: 20 20 20 66 6f 72 6d 20 22 53 45 4c 45 43 54 20     form "SELECT 
1e40: 6f 70 74 69 6d 69 7a 65 28 26 6c 74 3b 66 74 73  optimize(&lt;fts
1e50: 33 2d 74 61 62 6c 65 26 67 74 3b 29 20 46 52 4f  3-table&gt;) FRO
1e60: 4d 20 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c 65  M &lt;fts3-table
1e70: 26 67 74 3b 22 20 0a 20 20 20 20 63 61 75 73 65  &gt;" .    cause
1e80: 73 20 46 54 53 33 20 74 6f 20 6d 65 72 67 65 20  s FTS3 to merge 
1e90: 61 6c 6c 20 65 78 69 73 74 69 6e 67 20 69 6e 64  all existing ind
1ea0: 65 78 20 62 2d 74 72 65 65 73 20 69 6e 74 6f 20  ex b-trees into 
1eb0: 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a 20  a single large. 
1ec0: 20 20 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69     b-tree contai
1ed0: 6e 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  ning the entire 
1ee0: 69 6e 64 65 78 2e 20 54 68 69 73 20 63 61 6e 20  index. This can 
1ef0: 62 65 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  be an expensive 
1f00: 6f 70 65 72 61 74 69 6f 6e 2c 0a 20 20 20 20 62  operation,.    b
1f10: 75 74 20 6d 61 79 20 73 70 65 65 64 20 75 70 20  ut may speed up 
1f20: 66 75 74 75 72 65 20 71 75 65 72 69 65 73 2e 20  future queries. 
1f30: 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 46 6f 72 20  ..  <p>.    For 
1f40: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 6f 70 74 69  example, to opti
1f50: 6d 69 7a 65 20 74 68 65 20 66 75 6c 6c 2d 74 65  mize the full-te
1f60: 78 74 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  xt index for an 
1f70: 46 54 53 33 20 74 61 62 6c 65 20 6e 61 6d 65 64  FTS3 table named
1f80: 0a 20 20 20 20 22 64 6f 63 73 22 3a 0a 0a 5b 43  .    "docs":..[C
1f90: 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 4f 70  ode {.  <i>-- Op
1fa0: 74 69 6d 69 7a 65 20 74 68 65 20 69 6e 74 65 72  timize the inter
1fb0: 6e 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 66  nal structure of
1fc0: 20 46 54 53 33 20 74 61 62 6c 65 20 22 64 6f 63   FTS3 table "doc
1fd0: 73 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  s".</i>.  SELECT
1fe0: 20 6f 70 74 69 6d 69 7a 65 28 64 6f 63 73 29 20   optimize(docs) 
1ff0: 46 52 4f 4d 20 64 6f 63 73 20 4c 49 4d 49 54 20  FROM docs LIMIT 
2000: 31 3b 0a 7d 5d 0a 0a 20 20 3c 70 3e 0a 20 20 20  1;.}]..  <p>.   
2010: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   The statement a
2020: 62 6f 76 65 20 6d 61 79 20 61 70 70 65 61 72 20  bove may appear 
2030: 73 79 6e 74 61 63 74 69 63 6c 79 20 69 6e 63 6f  syntacticly inco
2040: 72 72 65 63 74 20 74 6f 20 73 6f 6d 65 2e 20 52  rrect to some. R
2050: 65 66 65 72 20 74 6f 0a 20 20 20 20 74 68 65 20  efer to.    the 
2060: 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 69  section describi
2070: 6e 67 20 74 68 65 20 5c 5b 73 6e 69 70 70 65 74  ng the \[snippet
2080: 73 28 29 7c 46 54 53 33 20 61 75 78 69 6c 6c 61  s()|FTS3 auxilla
2090: 72 79 20 66 75 6e 63 74 69 6f 6e 73 5c 5d 20 66  ry functions\] f
20a0: 6f 72 0a 20 20 20 20 61 20 64 65 73 63 72 69 70  or.    a descrip
20b0: 74 69 6f 6e 20 6f 66 20 77 68 79 20 69 74 20 69  tion of why it i
20c0: 73 20 6e 6f 74 2e 0a 0a 20 20 3c 70 3e 0a 20 20  s not...  <p>.  
20d0: 20 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 28 29    The optimize()
20e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
20f0: 73 20 61 20 74 65 78 74 20 76 61 6c 75 65 2e 20  s a text value. 
2100: 49 66 20 74 68 65 20 69 6e 64 65 78 20 77 61 73  If the index was
2110: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 6f 70 74   already.    opt
2120: 69 6d 69 7a 65 64 20 77 68 65 6e 20 69 74 20 77  imized when it w
2130: 61 73 20 63 61 6c 6c 65 64 20 74 68 65 20 74 65  as called the te
2140: 78 74 20 69 73 20 22 49 6e 64 65 78 20 61 6c 72  xt is "Index alr
2150: 65 61 64 79 20 6f 70 74 69 6d 61 6c 22 2e 20 0a  eady optimal". .
2160: 20 20 20 20 4f 74 68 65 72 77 69 73 65 20 69 66      Otherwise if
2170: 20 74 68 65 20 69 6e 64 65 78 20 77 61 73 20 6e   the index was n
2180: 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 74 69 6d  ot already optim
2190: 69 7a 65 64 2c 20 69 74 20 69 73 20 6d 61 64 65  ized, it is made
21a0: 20 73 6f 20 61 6e 64 0a 20 20 20 20 74 68 65 20   so and.    the 
21b0: 74 65 78 74 20 22 49 6e 64 65 78 20 6f 70 74 69  text "Index opti
21c0: 6d 69 7a 65 64 22 20 72 65 74 75 72 6e 65 64 2e  mized" returned.
21d0: 0a 0a 5b 68 32 20 22 51 75 65 72 79 69 6e 67 20  ..[h2 "Querying 
21e0: 46 54 53 33 20 54 61 62 6c 65 73 22 20 7b 7d 20  FTS3 Tables" {} 
21f0: 7b 73 69 6d 70 6c 65 20 66 74 73 33 20 71 75 65  {simple fts3 que
2200: 72 69 65 73 7d 5d 0a 0a 3c 70 20 63 6c 61 73 73  ries}]..<p class
2210: 3d 74 6f 64 6f 3e 0a 20 20 53 6f 6d 65 20 6e 6f  =todo>.  Some no
2220: 74 65 20 63 6c 61 72 69 66 79 69 6e 67 20 77 68  te clarifying wh
2230: 61 74 20 69 73 20 6d 65 61 6e 74 20 62 79 20 61  at is meant by a
2240: 20 22 74 65 72 6d 22 2c 20 61 6e 64 20 68 6f 77   "term", and how
2250: 20 74 68 61 74 20 72 65 6c 61 74 65 73 20 74 6f   that relates to
2260: 0a 20 20 74 68 65 20 73 70 65 63 69 66 69 63 20  .  the specific 
2270: 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65 64 20 62  tokenizer used b
2280: 79 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  y the FTS3 table
2290: 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 0a 0a 3c   in question...<
22a0: 70 3e 0a 20 20 41 73 20 66 6f 72 20 61 6c 6c 20  p>.  As for all 
22b0: 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62  other SQLite tab
22c0: 6c 65 73 2c 20 76 69 72 74 75 61 6c 20 6f 72 20  les, virtual or 
22d0: 6f 74 68 65 72 77 69 73 65 2c 20 64 61 74 61 20  otherwise, data 
22e0: 69 73 20 72 65 74 72 69 65 76 65 64 0a 20 20 66  is retrieved.  f
22f0: 72 6f 6d 20 46 54 53 33 20 74 61 62 6c 65 73 20  rom FTS3 tables 
2300: 75 73 69 6e 67 20 61 20 5c 5b 53 45 4c 45 43 54  using a \[SELECT
2310: 5c 5d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 3c  \] statement...<
2320: 70 3e 0a 20 20 46 54 53 33 20 74 61 62 6c 65 73  p>.  FTS3 tables
2330: 20 63 61 6e 20 62 65 20 71 75 65 72 69 65 64 20   can be queried 
2340: 65 66 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e  efficiently usin
2350: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
2360: 6e 74 73 20 6f 66 20 74 77 6f 0a 20 20 64 69 66  nts of two.  dif
2370: 66 65 72 65 6e 74 20 66 6f 72 6d 73 3a 0a 0a 3c  ferent forms:..<
2380: 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20  ul>.  <li><p>.  
2390: 20 20 3c 62 3e 51 75 65 72 79 20 62 79 20 72 6f    <b>Query by ro
23a0: 77 69 64 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20  wid</b>. If the 
23b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
23c0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
23d0: 6d 65 6e 74 0a 20 20 20 20 63 6f 6e 74 61 69 6e  ment.    contain
23e0: 73 20 61 20 73 75 62 2d 63 6c 61 75 73 65 20 6f  s a sub-clause o
23f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 72 6f 77 69  f the form "rowi
2400: 64 20 3d 20 3f 22 2c 20 77 68 65 72 65 20 3f 20  d = ?", where ? 
2410: 69 73 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  is an SQL expres
2420: 73 69 6f 6e 2c 0a 20 20 20 20 46 54 53 33 20 69  sion,.    FTS3 i
2430: 73 20 61 62 6c 65 20 74 6f 20 72 65 74 72 65 69  s able to retrei
2440: 76 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ve the requested
2450: 20 72 6f 77 20 64 69 72 65 63 74 6c 79 20 75 73   row directly us
2460: 69 6e 67 20 74 68 65 20 65 71 75 69 76 61 6c 65  ing the equivale
2470: 6e 74 20 0a 20 20 20 20 6f 66 20 61 6e 20 53 51  nt .    of an SQ
2480: 4c 69 74 65 20 5c 5b 49 4e 54 45 47 45 52 20 50  Lite \[INTEGER P
2490: 52 49 4d 41 52 59 20 4b 45 59 5c 5d 20 69 6e 64  RIMARY KEY\] ind
24a0: 65 78 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20  ex...  <li><p>. 
24b0: 20 20 20 3c 62 3e 46 75 6c 6c 2d 74 65 78 74 20     <b>Full-text 
24c0: 71 75 65 72 79 3c 2f 62 3e 2e 20 49 66 20 74 68  query</b>. If th
24d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
24e0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24f0: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 0a  tement contains.
2500: 20 20 20 20 61 20 73 75 62 2d 63 6c 61 75 73 65      a sub-clause
2510: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 26 6c   of the form "&l
2520: 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54  t;column&gt; MAT
2530: 43 48 20 3f 22 2c 20 46 54 53 33 20 69 73 20 61  CH ?", FTS3 is a
2540: 62 6c 65 20 74 6f 20 75 73 65 20 0a 20 20 20 20  ble to use .    
2550: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c  the built-in ful
2560: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74 6f 20  l-text index to 
2570: 72 65 73 74 72 69 63 74 20 74 68 65 20 73 65 61  restrict the sea
2580: 72 63 68 20 74 6f 20 74 68 6f 73 65 20 64 6f 63  rch to those doc
2590: 75 6d 65 6e 74 73 20 0a 20 20 20 20 74 68 61 74  uments .    that
25a0: 20 6d 61 74 63 68 20 74 68 65 20 66 75 6c 6c 2d   match the full-
25b0: 74 65 78 74 20 71 75 65 72 79 20 73 74 72 69 6e  text query strin
25c0: 67 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  g specified as t
25d0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  he right-hand op
25e0: 65 72 61 6e 64 0a 20 20 20 20 6f 66 20 74 68 65  erand.    of the
25f0: 20 4d 41 54 43 48 20 63 6c 61 75 73 65 2e 0a 3c   MATCH clause..<
2600: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 6e  /ul>..<p>.  If n
2610: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2620: 6f 20 71 75 65 72 79 20 73 74 72 61 74 65 67 69  o query strategi
2630: 65 73 20 65 6e 75 6d 65 72 61 74 65 64 20 61 62  es enumerated ab
2640: 6f 76 65 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ove can be used,
2650: 20 61 6c 6c 0a 20 20 71 75 65 72 69 65 73 20 6f   all.  queries o
2660: 6e 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72  n FTS3 tables ar
2670: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
2680: 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
2690: 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 0a  n of the entire.
26a0: 20 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20    table. If the 
26b0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c  table contains l
26c0: 61 72 67 65 20 61 6d 6f 75 6e 74 73 20 6f 66 20  arge amounts of 
26d0: 64 61 74 61 2c 20 74 68 69 73 20 6d 61 79 20 62  data, this may b
26e0: 65 20 61 6e 20 0a 20 20 69 6d 70 72 61 63 74 69  e an .  impracti
26f0: 63 61 6c 6c 79 20 61 70 70 72 6f 61 63 68 20 28  cally approach (
2700: 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
2710: 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 73  e on this page s
2720: 68 6f 77 73 20 74 68 61 74 20 61 20 6c 69 6e 65  hows that a line
2730: 61 72 0a 20 20 73 63 61 6e 20 6f 66 20 31 2e 35  ar.  scan of 1.5
2740: 20 47 42 20 6f 66 20 64 61 74 61 20 74 61 6b 65   GB of data take
2750: 73 20 61 72 6f 75 6e 64 20 33 30 20 73 65 63 6f  s around 30 seco
2760: 6e 64 73 20 75 73 69 6e 67 20 61 20 6d 6f 64 65  nds using a mode
2770: 72 6e 20 50 43 29 2e 0a 0a 5b 43 6f 64 65 20 7b  rn PC)...[Code {
2780: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 65 78 61  .  <i>-- The exa
2790: 6d 70 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  mples in this bl
27a0: 6f 63 6b 20 61 73 73 75 6d 65 20 74 68 65 20 66  ock assume the f
27b0: 6f 6c 6c 6f 77 69 6e 67 20 46 54 53 33 20 74 61  ollowing FTS3 ta
27c0: 62 6c 65 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  ble:</i>.  CREAT
27d0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
27e0: 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28  mail USING fts3(
27f0: 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a  subject, body);.
2800: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2810: 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f 77 69   mail WHERE rowi
2820: 64 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  d = 15;         
2830: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73         <i>-- Fas
2840: 74 2e 20 52 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e  t. Rowid lookup.
2850: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
2860: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
2870: 62 6f 64 79 20 4d 41 54 43 48 20 27 73 71 6c 69  body MATCH 'sqli
2880: 74 65 27 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d  te';       <i>--
2890: 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74   Fast. Full-text
28a0: 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45   query.</i>.  SE
28b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
28c0: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
28d0: 48 20 27 73 65 61 72 63 68 27 3b 20 20 20 20 20  H 'search';     
28e0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
28f0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
2900: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
2910: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f  OM mail WHERE ro
2920: 77 69 64 20 42 45 54 57 45 45 4e 20 31 35 20 41  wid BETWEEN 15 A
2930: 4e 44 20 32 30 3b 20 20 20 3c 69 3e 2d 2d 20 53  ND 20;   <i>-- S
2940: 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e  low. Linear scan
2950: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
2960: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
2970: 20 73 75 62 6a 65 63 74 20 3d 20 27 64 61 74 61   subject = 'data
2980: 62 61 73 65 27 3b 20 20 20 20 20 20 3c 69 3e 2d  base';      <i>-
2990: 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73  - Slow. Linear s
29a0: 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  can.</i>.  SELEC
29b0: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
29c0: 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43  ERE subject MATC
29d0: 48 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 3c  H 'database';  <
29e0: 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d  i>-- Fast. Full-
29f0: 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  text query.</i>.
2a00: 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c  }]..<p>.  In all
2a10: 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   of the full-tex
2a20: 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c  t queries above,
2a30: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2a40: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d  operand of the M
2a50: 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72 20  ATCH.  operator 
2a60: 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  is a string cons
2a70: 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
2a80: 6c 65 20 77 6f 72 64 2e 20 49 6e 20 74 68 69 73  le word. In this
2a90: 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43 48   case, the MATCH
2aa0: 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  .  expression ev
2ab0: 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 20  aluates to true 
2ac0: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
2ad0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f  s that contain o
2ae0: 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e  ne or more .  in
2af0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
2b00: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 22  pecified word ("
2b10: 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63 68  sqlite", "search
2b20: 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2c  " or "database",
2b30: 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e   depending .  on
2b40: 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20 79   which example y
2b50: 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65  ou look at). Spe
2b60: 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c 65  cifying a single
2b70: 20 77 6f 72 64 20 61 73 20 74 68 65 20 72 69 67   word as the rig
2b80: 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e  ht-hand.  operan
2b90: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
2ba0: 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73 20  perator results 
2bb0: 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20  in the simplest 
2bc0: 28 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  (and most common
2bd0: 29 20 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c  ) type .  of ful
2be0: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 70 6f 73  l-text query pos
2bf0: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d  sible. However m
2c00: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
2c10: 71 75 65 72 69 65 73 20 61 72 65 20 70 6f 73 73  queries are poss
2c20: 69 62 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e  ible,.  includin
2c30: 67 20 70 68 72 61 73 65 20 73 65 61 72 63 68 65  g phrase searche
2c40: 73 2c 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73  s, term-prefix s
2c50: 65 61 72 63 68 65 73 20 61 6e 64 20 73 65 61 72  earches and sear
2c60: 63 68 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e  ches for documen
2c70: 74 73 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67  ts .  containing
2c80: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2c90: 20 74 65 72 6d 73 20 6f 63 63 75 72 69 6e 67 20   terms occuring 
2ca0: 77 69 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64  within a defined
2cb0: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
2cc0: 63 68 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20  ch.  other. The 
2cd0: 76 61 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20  various ways in 
2ce0: 77 68 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74  which the full-t
2cf0: 65 78 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65  ext index may be
2d00: 20 71 75 65 72 69 65 64 20 61 72 65 0a 20 20 5c   queried are.  \
2d10: 5b 46 54 53 33 20 4d 41 54 43 48 7c 64 65 73 63  [FTS3 MATCH|desc
2d20: 72 69 62 65 64 20 62 65 6c 6f 77 5c 5d 2e 0a 0a  ribed below\]...
2d30: 3c 70 3e 0a 20 20 54 68 65 20 70 61 72 61 67 72  <p>.  The paragr
2d40: 61 70 68 20 61 62 6f 76 65 20 6e 6f 74 65 73 20  aph above notes 
2d50: 74 68 61 74 20 61 20 4d 41 54 43 48 20 6f 70 65  that a MATCH ope
2d60: 72 61 74 6f 72 20 77 69 74 68 20 61 20 73 69 6d  rator with a sim
2d70: 70 6c 65 20 77 6f 72 64 20 61 73 20 74 68 65 0a  ple word as the.
2d80: 20 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65    right-hand ope
2d90: 72 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74  rand evaluates t
2da0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  o true for all d
2db0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
2dc0: 6e 74 61 69 6e 20 74 68 65 0a 20 20 73 70 65 63  ntain the.  spec
2dd0: 69 66 69 65 64 20 74 65 72 6d 2e 20 49 6e 20 74  ified term. In t
2de0: 68 69 73 20 63 6f 6e 74 65 78 74 2c 20 74 68 65  his context, the
2df0: 20 22 64 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20   "document" may 
2e00: 72 65 66 65 72 20 74 6f 20 65 69 74 68 65 72 20  refer to either 
2e10: 74 68 65 20 0a 20 20 64 61 74 61 20 73 74 6f 72  the .  data stor
2e20: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 63  ed in a single c
2e30: 6f 6c 75 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f  olumn of a row o
2e40: 66 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 2c  f an FTS3 table,
2e50: 20 6f 72 20 74 6f 20 74 68 65 20 63 6f 6e 74 65   or to the conte
2e60: 6e 74 73 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c  nts.  of all col
2e70: 75 6d 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  umns in a single
2e80: 20 72 6f 77 2c 20 64 65 70 65 6e 64 69 6e 67 20   row, depending 
2e90: 6f 6e 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  on the identifie
2ea0: 72 20 75 73 65 64 20 61 73 20 74 68 65 0a 20 20  r used as the.  
2eb0: 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  left-hand operan
2ec0: 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f  d to the MATCH o
2ed0: 70 65 72 61 74 6f 72 2e 20 49 66 20 74 68 65 20  perator. If the 
2ee0: 69 64 65 6e 74 69 66 69 65 72 20 73 70 65 63 69  identifier speci
2ef0: 66 69 65 64 20 61 73 0a 20 20 74 68 65 20 6c 65  fied as.  the le
2f00: 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20  ft-hand operand 
2f10: 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  of the MATCH ope
2f20: 72 61 74 6f 72 20 69 73 20 61 6e 20 46 54 53 33  rator is an FTS3
2f30: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61   table column na
2f40: 6d 65 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 64  me,.  then the d
2f50: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 74 68 65  ocument that the
2f60: 20 73 65 61 72 63 68 20 74 65 72 6d 20 6d 75 73   search term mus
2f70: 74 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69  t be contained i
2f80: 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  n is the value. 
2f90: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
2fa0: 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e  pecified column.
2fb0: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
2fc0: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
2fd0: 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65  he name.  of the
2fe0: 20 46 54 53 33 20 3c 69 3e 74 61 62 6c 65 3c 2f   FTS3 <i>table</
2ff0: 69 3e 20 69 74 73 65 6c 66 2c 20 74 68 65 6e 20  i> itself, then 
3000: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
3010: 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  or evaluates to 
3020: 74 72 75 65 0a 20 20 66 6f 72 20 65 61 63 68 20  true.  for each 
3030: 72 6f 77 20 6f 66 20 74 68 65 20 46 54 53 33 20  row of the FTS3 
3040: 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20  table for which 
3050: 61 6e 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  any column conta
3060: 69 6e 73 20 74 68 65 20 73 65 61 72 63 68 20 0a  ins the search .
3070: 20 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c    term. The foll
3080: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 64 65  owing example de
3090: 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 69 73 3a  monstrates this:
30a0: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
30b0: 2d 20 45 78 61 6d 70 6c 65 20 73 63 68 65 6d 61  - Example schema
30c0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
30d0: 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c  RTUAL TABLE mail
30e0: 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a   USING fts3(subj
30f0: 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c  ect, body);..  <
3100: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 74 61 62  i>-- Example tab
3110: 6c 65 20 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69  le population</i
3120: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
3130: 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a  mail(docid, subj
3140: 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45  ect, body) VALUE
3150: 53 28 31 2c 20 27 73 6f 66 74 77 61 72 65 20 66  S(1, 'software f
3160: 65 65 64 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64  eedback', 'found
3170: 20 69 74 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a   it too slow');.
3180: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
3190: 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63  il(docid, subjec
31a0: 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28  t, body) VALUES(
31b0: 32 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65  2, 'software fee
31c0: 64 62 61 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64  dback', 'no feed
31d0: 62 61 63 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54  back');.  INSERT
31e0: 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64   INTO mail(docid
31f0: 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  , subject, body)
3200: 20 56 41 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77   VALUES(3, 'slow
3210: 20 6c 75 6e 63 68 20 6f 72 64 65 72 27 2c 20 20   lunch order',  
3220: 27 77 61 73 20 61 20 73 6f 66 74 77 61 72 65 20  'was a software 
3230: 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69  problem');..  <i
3240: 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72  >-- Example quer
3250: 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ies</i>.  SELECT
3260: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
3270: 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43 48  RE subject MATCH
3280: 20 27 73 6f 66 74 77 61 72 65 27 3b 20 20 20 20   'software';    
3290: 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f  <i>-- Selects ro
32a0: 77 73 20 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20  ws 1 and 2</i>. 
32b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
32c0: 61 69 6c 20 57 48 45 52 45 20 62 6f 64 79 20 20  ail WHERE body  
32d0: 20 20 4d 41 54 43 48 20 27 66 65 65 64 62 61 63    MATCH 'feedbac
32e0: 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  k';    <i>-- Sel
32f0: 65 63 74 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20  ects row 2</i>. 
3300: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
3310: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 20  ail WHERE mail  
3320: 20 20 4d 41 54 43 48 20 27 73 6f 66 74 77 61 72    MATCH 'softwar
3330: 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  e';    <i>-- Sel
3340: 65 63 74 73 20 72 6f 77 73 20 31 2c 20 32 20 61  ects rows 1, 2 a
3350: 6e 64 20 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  nd 3</i>.  SELEC
3360: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
3370: 45 52 45 20 6d 61 69 6c 20 20 20 20 4d 41 54 43  ERE mail    MATC
3380: 48 20 27 73 6c 6f 77 27 3b 20 20 20 20 20 20 20  H 'slow';       
3390: 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72   <i>-- Selects r
33a0: 6f 77 73 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a  ows 1 and 3</i>.
33b0: 7d 5d 0a 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66  }].  .<p>.  At f
33c0: 69 72 73 74 20 67 6c 61 6e 63 65 2c 20 74 68 65  irst glance, the
33d0: 20 66 69 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d   final two full-
33e0: 74 65 78 74 20 71 75 65 72 69 65 73 20 69 6e 20  text queries in 
33f0: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
3400: 65 20 73 65 65 6d 0a 20 20 74 6f 20 62 65 20 73  e seem.  to be s
3410: 79 6e 74 61 63 74 69 63 6c 79 20 69 6e 63 6f 72  yntacticly incor
3420: 72 65 63 74 2c 20 61 73 20 74 68 65 72 65 20 69  rect, as there i
3430: 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 28  s a table name (
3440: 22 6d 61 69 6c 22 29 20 75 73 65 64 20 61 73 0a  "mail") used as.
3450: 20 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73    an SQL express
3460: 69 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20  ion. The reason 
3470: 74 68 69 73 20 69 73 20 61 63 63 65 70 74 61 62  this is acceptab
3480: 6c 65 20 69 73 20 74 68 61 74 20 65 61 63 68 20  le is that each 
3490: 46 54 53 33 20 74 61 62 6c 65 0a 20 20 61 63 74  FTS3 table.  act
34a0: 75 61 6c 6c 79 20 68 61 73 20 61 20 5c 5b 73 71  ually has a \[sq
34b0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
34c0: 61 62 7c 48 49 44 44 45 4e 5c 5d 20 63 6f 6c 75  ab|HIDDEN\] colu
34d0: 6d 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  mn with the same
34e0: 20 6e 61 6d 65 0a 20 20 61 73 20 74 68 65 20 74   name.  as the t
34f0: 61 62 6c 65 20 69 74 73 65 6c 66 20 28 69 6e 20  able itself (in 
3500: 74 68 69 73 20 63 61 73 65 2c 20 22 6d 61 69 6c  this case, "mail
3510: 22 29 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74  "). The value st
3520: 6f 72 65 64 20 69 6e 20 74 68 69 73 0a 20 20 63  ored in this.  c
3530: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61  olumn is not mea
3540: 6e 69 6e 67 66 75 6c 20 74 6f 20 74 68 65 20 61  ningful to the a
3550: 70 70 6c 69 63 61 74 69 6f 6e 2c 20 62 75 74 20  pplication, but 
3560: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
3570: 68 65 20 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20  he .  left-hand 
3580: 6f 70 65 72 61 6e 64 20 74 6f 20 61 20 4d 41 54  operand to a MAT
3590: 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 69  CH operator. Thi
35a0: 73 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e  s special column
35b0: 20 6d 61 79 20 61 6c 73 6f 20 62 65 0a 20 20 70   may also be.  p
35c0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
35d0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 5c 5b 73 6e  ment to the \[sn
35e0: 69 70 70 65 74 73 28 29 7c 46 54 53 33 20 61 75  ippets()|FTS3 au
35f0: 78 69 6c 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e  xillary function
3600: 73 5c 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  s\]...<p>.  The 
3610: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c  following exampl
3620: 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 68  e illustrates th
3630: 65 20 61 62 6f 76 65 2e 20 54 68 65 20 65 78 70  e above. The exp
3640: 72 65 73 73 69 6f 6e 73 20 22 64 6f 63 73 22 2c  ressions "docs",
3650: 20 0a 20 20 22 64 6f 63 73 2e 64 6f 63 73 22 20   .  "docs.docs" 
3660: 61 6e 64 20 22 6d 61 69 6e 2e 64 6f 63 73 2e 64  and "main.docs.d
3670: 6f 63 73 22 20 61 6c 6c 20 72 65 66 65 72 20 74  ocs" all refer t
3680: 6f 20 63 6f 6c 75 6d 6e 20 22 64 6f 63 73 22 2e  o column "docs".
3690: 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 20   However, the . 
36a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 6d 61 69   expression "mai
36b0: 6e 2e 64 6f 63 73 22 20 64 6f 65 73 20 6e 6f 74  n.docs" does not
36c0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 63 6f   refer to any co
36d0: 6c 75 6d 6e 2e 20 49 74 20 63 6f 75 6c 64 20 62  lumn. It could b
36e0: 65 20 75 73 65 64 20 74 6f 20 0a 20 20 72 65 66  e used to .  ref
36f0: 65 72 20 74 6f 20 61 20 74 61 62 6c 65 2c 20 62  er to a table, b
3700: 75 74 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  ut a table name 
3710: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  is not allowed i
3720: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69 6e  n the context in
3730: 20 77 68 69 63 68 0a 20 20 69 74 20 69 73 20 75   which.  it is u
3740: 73 65 64 20 62 65 6c 6f 77 2e 0a 0a 5b 43 6f 64  sed below...[Cod
3750: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d  e {.  <i>-- Exam
3760: 70 6c 65 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20  ple schema</i>. 
3770: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3780: 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47  TABLE docs USING
3790: 20 66 74 73 33 28 63 6f 6e 74 65 6e 74 29 3b 0a   fts3(content);.
37a0: 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65  .  <i>-- Example
37b0: 20 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53   queries</i>.  S
37c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
37d0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
37e0: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
37f0: 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
3800: 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  OK.</i>.  SELECT
3810: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
3820: 52 45 20 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54  RE docs.docs MAT
3830: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
3840: 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f       <i>-- OK.</
3850: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
3860: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 6d 61  OM docs WHERE ma
3870: 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54  in.docs.docs MAT
3880: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
3890: 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20  <i>-- OK.</i>.  
38a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
38b0: 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f  cs WHERE main.do
38c0: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
38d0: 27 3b 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d  ';         <i>--
38e0: 20 45 72 72 6f 72 2e 3c 2f 69 3e 0a 7d 5d 0a 20   Error.</i>.}]. 
38f0: 0a 5b 68 32 20 22 53 75 6d 6d 61 72 79 22 5d 0a  .[h2 "Summary"].
3900: 0a 3c 70 3e 0a 20 20 46 72 6f 6d 20 74 68 65 20  .<p>.  From the 
3910: 75 73 65 72 73 20 70 6f 69 6e 74 20 6f 66 20 76  users point of v
3920: 69 65 77 2c 20 46 54 53 33 20 74 61 62 6c 65 73  iew, FTS3 tables
3930: 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20   are similar to 
3940: 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74 65 0a  ordinary SQLite.
3950: 20 20 74 61 62 6c 65 73 20 69 6e 20 6d 61 6e 79    tables in many
3960: 20 77 61 79 73 2e 20 44 61 74 61 20 6d 61 79 20   ways. Data may 
3970: 62 65 20 61 64 64 65 64 20 74 6f 2c 20 6d 6f 64  be added to, mod
3980: 69 66 69 65 64 20 77 69 74 68 69 6e 20 61 6e 64  ified within and
3990: 20 72 65 6d 6f 76 65 64 20 0a 20 20 66 72 6f 6d   removed .  from
39a0: 20 46 54 53 33 20 74 61 62 6c 65 73 20 75 73 69   FTS3 tables usi
39b0: 6e 67 20 74 68 65 20 49 4e 53 45 52 54 2c 20 55  ng the INSERT, U
39c0: 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45  PDATE and DELETE
39d0: 20 63 6f 6d 6d 61 6e 64 73 20 6a 75 73 74 20 61   commands just a
39e0: 73 20 0a 20 20 69 74 20 6d 61 79 20 62 65 20 77  s .  it may be w
39f0: 69 74 68 20 6f 72 64 69 6e 61 72 79 20 74 61 62  ith ordinary tab
3a00: 6c 65 73 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  les. Similarly, 
3a10: 74 68 65 20 53 45 4c 45 43 54 20 63 6f 6d 6d 61  the SELECT comma
3a20: 6e 64 20 6d 61 79 20 62 65 20 75 73 65 64 20 0a  nd may be used .
3a30: 20 20 74 6f 20 71 75 65 72 79 20 64 61 74 61 2e    to query data.
3a40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
3a50: 69 73 74 20 73 75 6d 6d 61 72 69 7a 65 73 20 74  ist summarizes t
3a60: 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 62  he differences b
3a70: 65 74 77 65 65 6e 20 46 54 53 33 0a 20 20 61 6e  etween FTS3.  an
3a80: 64 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  d ordinary table
3a90: 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 3c  s:..<ol>.  <li><
3aa0: 70 3e 20 0a 20 20 20 20 41 73 20 77 69 74 68 20  p> .    As with 
3ab0: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
3ac0: 65 20 74 79 70 65 73 2c 20 69 74 20 69 73 20 6e  e types, it is n
3ad0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
3ae0: 72 65 61 74 65 20 69 6e 64 69 63 65 73 20 6f 72  reate indices or
3af0: 0a 20 20 20 20 74 72 69 67 67 65 72 73 20 61 74  .    triggers at
3b00: 74 61 63 68 65 64 20 74 6f 20 46 54 53 33 20 74  tached to FTS3 t
3b10: 61 62 6c 65 73 2e 20 4e 6f 72 20 69 73 20 69 74  ables. Nor is it
3b20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
3b30: 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45   the ALTER TABLE
3b40: 0a 20 20 20 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  .    command to 
3b50: 61 64 64 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  add extra column
3b60: 73 20 74 6f 20 46 54 53 33 20 74 61 62 6c 65 73  s to FTS3 tables
3b70: 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 69 73   (although it is
3b80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
3b90: 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45  .    ALTER TABLE
3ba0: 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e 20 46 54   to rename an FT
3bb0: 53 33 20 74 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c  S3 table)...  <l
3bc0: 69 3e 3c 70 3e 20 0a 20 20 20 20 44 61 74 61 2d  i><p> .    Data-
3bd0: 74 79 70 65 73 20 73 70 65 63 69 66 69 65 64 20  types specified 
3be0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 22  as part of the "
3bf0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3c00: 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 0a  ABLE" statement.
3c10: 20 20 20 20 75 73 65 64 20 74 6f 20 63 72 65 61      used to crea
3c20: 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65  te an FTS3 table
3c30: 20 61 72 65 20 69 67 6e 6f 72 65 64 20 63 6f 6d   are ignored com
3c40: 70 6c 65 74 65 6c 79 2e 20 49 6e 73 74 65 61 64  pletely. Instead
3c50: 20 6f 66 20 74 68 65 0a 20 20 20 20 6e 6f 72 6d   of the.    norm
3c60: 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 61 70 70  al rules for app
3c70: 6c 79 69 6e 67 20 74 79 70 65 20 5c 5b 61 66 66  lying type \[aff
3c80: 69 6e 69 74 79 5c 5d 20 74 6f 20 69 6e 73 65 72  inity\] to inser
3c90: 74 65 64 20 76 61 6c 75 65 73 2c 20 61 6c 6c 0a  ted values, all.
3ca0: 20 20 20 20 76 61 6c 75 65 73 20 69 6e 73 65 72      values inser
3cb0: 74 65 64 20 69 6e 74 6f 20 46 54 53 33 20 74 61  ted into FTS3 ta
3cc0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 28 65 78 63  ble columns (exc
3cd0: 65 70 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  ept the special 
3ce0: 72 6f 77 69 64 0a 20 20 20 20 63 6f 6c 75 6d 6e  rowid.    column
3cf0: 29 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  ) are converted 
3d00: 74 6f 20 74 79 70 65 20 54 45 58 54 20 62 65 66  to type TEXT bef
3d10: 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  ore being stored
3d20: 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20  ...  <li><p> .  
3d30: 20 20 46 54 53 33 20 74 61 62 6c 65 73 20 70 65    FTS3 tables pe
3d40: 72 6d 69 74 20 74 68 65 20 73 70 65 63 69 61 6c  rmit the special
3d50: 20 61 6c 69 61 73 20 22 64 6f 63 69 64 22 20 74   alias "docid" t
3d60: 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 66  o be used to ref
3d70: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 72 6f  er to the.    ro
3d80: 77 69 64 20 63 6f 6c 75 6d 6e 20 73 75 70 70 6f  wid column suppo
3d90: 72 74 65 64 20 62 79 20 61 6c 6c 20 5c 5b 76 69  rted by all \[vi
3da0: 72 74 75 61 6c 20 74 61 62 6c 65 73 5c 5d 2e 0a  rtual tables\]..
3db0: 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20  .  <li><p> .    
3dc0: 54 68 65 20 5c 5b 46 54 53 33 20 4d 41 54 43 48  The \[FTS3 MATCH
3dd0: 5c 5d 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  \] operator is s
3de0: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 71 75 65  upported for que
3df0: 72 69 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ries based on th
3e00: 65 20 62 75 69 6c 74 2d 69 6e 0a 20 20 20 20 66  e built-in.    f
3e10: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
3e20: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
3e30: 20 54 68 65 20 46 54 53 33 20 61 75 78 69 6c 6c   The FTS3 auxill
3e40: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2c 20 5c  ary functions, \
3e50: 5b 73 6e 69 70 70 65 74 73 7c 73 6e 69 70 70 65  [snippets|snippe
3e60: 74 73 28 29 20 61 6e 64 20 6f 66 66 73 65 74 73  ts() and offsets
3e70: 28 29 5c 5d 2c 20 61 72 65 20 0a 20 20 20 20 61  ()\], are .    a
3e80: 76 61 69 6c 61 62 6c 65 20 74 6f 20 73 75 70 70  vailable to supp
3e90: 6f 72 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  ort full-text qu
3ea0: 65 72 69 65 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  eries...  <li><p
3eb0: 3e 20 0a 20 20 20 20 45 61 63 68 20 46 54 53 33  > .    Each FTS3
3ec0: 20 74 61 62 6c 65 20 68 61 73 20 61 20 5c 5b 73   table has a \[s
3ed0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
3ee0: 74 61 62 28 29 7c 48 49 44 44 45 4e 20 63 6f 6c  tab()|HIDDEN col
3ef0: 75 6d 6e 5c 5d 20 77 69 74 68 20 74 68 65 20 0a  umn\] with the .
3f00: 20 20 20 20 73 61 6d 65 20 6e 61 6d 65 20 61 73      same name as
3f10: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
3f20: 66 2e 20 54 68 65 20 76 61 6c 75 65 20 63 6f 6e  f. The value con
3f30: 74 61 69 6e 65 64 20 69 6e 20 65 61 63 68 20 72  tained in each r
3f40: 6f 77 20 66 6f 72 20 74 68 65 0a 20 20 20 20 73  ow for the.    s
3f50: 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 69 73  pecial column is
3f60: 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 68 65   only useful whe
3f70: 6e 20 75 73 65 64 20 6f 6e 20 74 68 65 20 6c 65  n used on the le
3f80: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
3f90: 61 20 0a 20 20 20 20 5c 5b 46 54 53 33 20 4d 41  a .    \[FTS3 MA
3fa0: 54 43 48 7c 4d 41 54 43 48 5c 5d 20 6f 70 65 72  TCH|MATCH\] oper
3fb0: 61 74 6f 72 2c 20 6f 72 20 77 68 65 6e 20 73 70  ator, or when sp
3fc0: 65 63 69 66 69 65 64 20 61 73 20 61 6e 20 61 72  ecified as an ar
3fd0: 67 75 6d 65 6e 74 20 74 6f 20 6f 6e 65 20 0a 20  gument to one . 
3fe0: 20 20 20 6f 66 20 74 68 65 20 5c 5b 73 6e 69 70     of the \[snip
3ff0: 70 65 74 73 7c 46 54 53 33 20 61 75 78 69 6c 6c  pets|FTS3 auxill
4000: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 5c 5d 2e  ary functions\].
4010: 0a 20 20 20 20 0a 0a 3c 2f 6f 6c 3e 0a 0a 0a 5b  .    ..</ol>...[
4020: 68 31 20 22 43 6f 6d 70 69 6c 69 6e 67 20 61 6e  h1 "Compiling an
4030: 64 20 45 6e 61 62 6c 69 6e 67 20 46 54 53 33 22  d Enabling FTS3"
4040: 20 7b 7d 20 7b 63 6f 6d 70 69 6c 65 20 66 74 73   {} {compile fts
4050: 33 7d 5d 0a 0a 3c 70 3e 0a 20 20 41 6c 74 68 6f  3}]..<p>.  Altho
4060: 75 67 68 20 46 54 53 33 20 69 73 20 64 69 73 74  ugh FTS3 is dist
4070: 72 69 62 75 74 65 64 20 61 73 20 70 61 72 74 20  ributed as part 
4080: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 73 6f  of the SQLite so
4090: 75 72 63 65 20 63 6f 64 65 2c 20 69 74 20 69 73  urce code, it is
40a0: 20 6e 6f 74 0a 20 20 65 6e 61 62 6c 65 64 20 62   not.  enabled b
40b0: 79 20 64 65 66 61 75 6c 74 2e 20 54 6f 20 62 75  y default. To bu
40c0: 69 6c 64 20 53 51 4c 69 74 65 20 77 69 74 68 20  ild SQLite with 
40d0: 46 54 53 33 20 66 75 6e 63 74 69 6f 6e 61 6c 69  FTS3 functionali
40e0: 74 79 20 65 6e 61 62 6c 65 64 2c 20 64 65 66 69  ty enabled, defi
40f0: 6e 65 0a 20 20 74 68 65 20 70 72 65 70 72 6f 63  ne.  the preproc
4100: 65 73 73 6f 72 20 6d 61 63 72 6f 20 5c 5b 53 51  essor macro \[SQ
4110: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
4120: 5c 5d 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  \] when compilin
4130: 67 2e 20 4e 65 77 20 61 70 70 6c 69 63 61 74 69  g. New applicati
4140: 6f 6e 73 0a 20 20 73 68 6f 75 6c 64 20 61 6c 73  ons.  should als
4150: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 5c 5b 53  o define the \[S
4160: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
4170: 33 5f 50 41 52 45 4e 54 48 45 53 49 53 5c 5d 20  3_PARENTHESIS\] 
4180: 6d 61 63 72 6f 20 74 6f 20 65 6e 61 62 6c 65 20  macro to enable 
4190: 74 68 65 0a 20 20 61 64 76 61 6e 63 65 64 20 71  the.  advanced q
41a0: 75 65 72 79 20 73 79 6e 74 61 78 20 28 73 65 65  uery syntax (see
41b0: 20 62 65 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79   below). Usually
41c0: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
41d0: 79 20 61 64 64 69 6e 67 20 74 68 65 20 0a 20 20  y adding the .  
41e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77  following two sw
41f0: 69 74 63 68 65 73 20 74 6f 20 74 68 65 20 63 6f  itches to the co
4200: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
4210: 69 6e 65 3a 0a 0a 3c 70 20 63 6c 61 73 73 3d 74  ine:..<p class=t
4220: 6f 64 6f 3e 0a 20 20 4d 65 6e 74 69 6f 6e 20 74  odo>.  Mention t
4230: 68 65 20 49 43 55 20 54 6f 6b 65 6e 69 7a 65 72  he ICU Tokenizer
4240: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53  ...[Code {.  -DS
4250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
4260: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
4270: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
4280: 45 53 49 53 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49  ESIS.}]..<p>.  I
4290: 66 20 75 73 69 6e 67 20 74 68 65 20 61 6d 61 6c  f using the amal
42a0: 67 61 6d 61 74 69 6f 6e 20 61 75 74 6f 63 6f 6e  gamation autocon
42b0: 66 20 62 61 73 65 64 20 62 75 69 6c 64 20 73 79  f based build sy
42c0: 73 74 65 6d 2c 20 73 65 74 74 69 6e 67 20 74 68  stem, setting th
42d0: 65 20 43 50 50 46 4c 41 47 53 0a 20 20 65 6e 76  e CPPFLAGS.  env
42e0: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
42f0: 65 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  e while running 
4300: 74 68 65 20 27 63 6f 6e 66 69 67 75 72 65 27 20  the 'configure' 
4310: 73 63 72 69 70 74 20 69 73 20 61 6e 20 65 61 73  script is an eas
4320: 79 0a 20 20 77 61 79 20 74 6f 20 73 65 74 20 74  y.  way to set t
4330: 68 65 73 65 20 6d 61 63 72 6f 73 2e 20 46 6f 72  hese macros. For
4340: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f   example, the fo
4350: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
4360: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43 50 50 46  ..[Code {.  CPPF
4370: 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45  LAGS="-DSQLITE_E
4380: 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c  NABLE_FTS3 -DSQL
4390: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
43a0: 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63  PARENTHESIS" ./c
43b0: 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e  onfigure &lt;con
43c0: 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67  figure options&g
43d0: 74 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 77 68 65  t;.}]..<p>.  whe
43e0: 72 65 20 3c 69 3e 26 6c 74 3b 63 6f 6e 66 69 67  re <i>&lt;config
43f0: 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 3c  ure options&gt;<
4400: 2f 69 3e 20 61 72 65 20 74 68 6f 73 65 20 6f 70  /i> are those op
4410: 74 69 6f 6e 73 20 6e 6f 72 6d 61 6c 6c 79 20 70  tions normally p
4420: 61 73 73 65 64 20 74 6f 0a 20 20 74 68 65 20 63  assed to.  the c
4430: 6f 6e 66 69 67 75 72 65 20 73 63 72 69 70 74 2c  onfigure script,
4440: 20 69 66 20 61 6e 79 2e 0a 0a 3c 70 3e 0a 20 20   if any...<p>.  
4450: 42 65 63 61 75 73 65 20 46 54 53 33 20 69 73 20  Because FTS3 is 
4460: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
4470: 20 69 74 20 69 73 20 69 6e 63 6f 6d 70 61 74 69   it is incompati
4480: 62 6c 65 20 77 69 74 68 20 74 68 65 0a 20 20 5c  ble with the.  \
4490: 5b 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  [SQLITE_OMIT_VIR
44a0: 54 55 41 4c 54 41 42 4c 45 5c 5d 20 6f 70 74 69  TUALTABLE\] opti
44b0: 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 6e  on...<p>.  If an
44c0: 20 53 51 4c 69 74 65 20 62 75 69 6c 64 20 64 6f   SQLite build do
44d0: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 46  es not include F
44e0: 54 53 33 2c 20 74 68 65 6e 20 61 6e 79 20 61 74  TS3, then any at
44f0: 74 65 6d 70 74 20 74 6f 20 70 72 65 70 61 72 65  tempt to prepare
4500: 20 61 6e 0a 20 20 53 51 4c 20 73 74 61 74 65 6d   an.  SQL statem
4510: 65 6e 74 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ent to create an
4520: 20 46 54 53 33 20 74 61 62 6c 65 20 6f 72 20 74   FTS3 table or t
4530: 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73  o drop or access
4540: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20   an existing .  
4550: 46 54 53 33 20 74 61 62 6c 65 20 69 6e 20 61 6e  FTS3 table in an
4560: 79 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e  y way will fail.
4570: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
4580: 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
4590: 20 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74   be similar .  t
45a0: 6f 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  o "no such modul
45b0: 65 3a 20 66 74 73 33 22 2e 0a 20 20 0a 0a 5b 68  e: fts3"..  ..[h
45c0: 31 20 22 46 75 6c 6c 2d 74 65 78 74 20 49 6e 64  1 "Full-text Ind
45d0: 65 78 20 51 75 65 72 69 65 73 22 20 7b 7d 20 7b  ex Queries" {} {
45e0: 46 54 53 33 20 4d 41 54 43 48 7d 5d 0a 0a 3c 70  FTS3 MATCH}]..<p
45f0: 3e 0a 20 20 54 68 65 20 6d 6f 73 74 20 75 73 65  >.  The most use
4600: 66 75 6c 20 74 68 69 6e 67 20 61 62 6f 75 74 20  ful thing about 
4610: 46 54 53 33 20 74 61 62 6c 65 73 20 69 73 20 74  FTS3 tables is t
4620: 68 65 20 71 75 65 72 69 65 73 20 74 68 61 74 20  he queries that 
4630: 6d 61 79 20 62 65 20 0a 20 20 70 65 72 66 6f 72  may be .  perfor
4640: 6d 65 64 20 75 73 69 6e 67 20 74 68 65 20 62 75  med using the bu
4650: 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74 65 78 74  ilt-in full-text
4660: 20 69 6e 64 65 78 2e 20 46 75 6c 6c 2d 74 65 78   index. Full-tex
4670: 74 20 71 75 65 72 69 65 73 20 61 72 65 20 0a 20  t queries are . 
4680: 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 73 70   performed by sp
4690: 65 63 69 66 79 69 6e 67 20 61 20 63 6c 61 75 73  ecifying a claus
46a0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  e of the form . 
46b0: 20 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b   "&lt;column&gt;
46c0: 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d   MATCH &lt;full-
46d0: 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65  text query expre
46e0: 73 73 69 6f 6e 26 67 74 3b 22 20 74 6f 20 74 68  ssion&gt;" to th
46f0: 65 20 57 48 45 52 45 20 0a 20 20 63 6c 61 75 73  e WHERE .  claus
4700: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
4710: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65 61  atement that rea
4720: 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ds data from an 
4730: 46 54 53 33 20 74 61 62 6c 65 2e 20 0a 20 20 5c  FTS3 table. .  \
4740: 5b 73 69 6d 70 6c 65 20 66 74 73 33 20 71 75 65  [simple fts3 que
4750: 72 69 65 73 7c 53 69 6d 70 6c 65 20 46 54 53 33  ries|Simple FTS3
4760: 20 71 75 65 72 69 65 73 5c 5d 20 74 68 61 74 20   queries\] that 
4770: 72 65 74 75 72 6e 20 61 6c 6c 20 64 6f 63 75 6d  return all docum
4780: 65 6e 74 73 20 74 68 61 74 20 0a 20 20 63 6f 6e  ents that .  con
4790: 74 61 69 6e 20 61 20 67 69 76 65 6e 20 74 65 72  tain a given ter
47a0: 6d 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  m are described 
47b0: 61 62 6f 76 65 2e 20 49 6e 20 74 68 61 74 20 64  above. In that d
47c0: 69 73 63 75 73 73 69 6f 6e 20 74 68 65 20 72 69  iscussion the ri
47d0: 67 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61  ght-hand.  opera
47e0: 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  nd of the MATCH 
47f0: 6f 70 65 72 61 74 6f 72 20 77 61 73 20 61 73 73  operator was ass
4800: 75 6d 65 64 20 74 6f 20 62 65 20 61 20 73 74 72  umed to be a str
4810: 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ing consisting o
4820: 66 20 61 0a 20 20 73 69 6e 67 6c 65 20 74 65 72  f a.  single ter
4830: 6d 2e 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  m. This section 
4840: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6d 6f  describes the mo
4850: 72 65 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79  re complex query
4860: 20 74 79 70 65 73 20 73 75 70 70 6f 72 74 65 64   types supported
4870: 20 0a 20 20 62 79 20 46 54 53 33 20 74 61 62 6c   .  by FTS3 tabl
4880: 65 73 2c 20 61 6e 64 20 68 6f 77 20 74 68 65 79  es, and how they
4890: 20 6d 61 79 20 62 65 20 75 74 69 6c 69 7a 65 64   may be utilized
48a0: 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20 6d   by specifying m
48b0: 6f 72 65 20 61 20 6d 6f 72 65 0a 20 20 63 6f 6d  ore a more.  com
48c0: 70 6c 65 78 20 71 75 65 72 79 20 65 78 70 72 65  plex query expre
48d0: 73 73 69 6f 6e 20 61 73 20 74 68 65 20 72 69 67  ssion as the rig
48e0: 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20  ht-hand operand 
48f0: 6f 66 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61  of a MATCH opera
4900: 74 6f 72 2e 0a 0a 3c 70 20 63 6c 61 73 73 3d 74  tor...<p class=t
4910: 6f 64 6f 3e 0a 20 20 57 68 65 72 65 20 73 68 6f  odo>.  Where sho
4920: 75 6c 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73  uld the column s
4930: 65 6c 65 63 74 69 6f 6e 20 73 79 6e 74 61 78 20  election syntax 
4940: 67 6f 3f 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20  go?..<p>.  FTS3 
4950: 74 61 62 6c 65 73 20 73 75 70 70 6f 72 74 20 74  tables support t
4960: 68 72 65 65 20 62 61 73 69 63 20 71 75 65 72 79  hree basic query
4970: 20 74 79 70 65 73 3a 0a 0a 3c 75 6c 3e 0a 20 20   types:..<ul>.  
4980: 3c 6c 69 3e 3c 70 3e 3c 62 3e 54 6f 6b 65 6e 20  <li><p><b>Token 
4990: 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 20  or token prefix 
49a0: 71 75 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20  queries</b>. .  
49b0: 20 20 41 6e 20 46 54 53 33 20 74 61 62 6c 65 20    An FTS3 table 
49c0: 6d 61 79 20 62 65 20 71 75 65 72 69 65 64 20 66  may be queried f
49d0: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
49e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20   that contain a 
49f0: 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 74 65  specified.    te
4a00: 72 6d 20 28 74 68 65 20 5c 5b 73 69 6d 70 6c 65  rm (the \[simple
4a10: 20 66 74 73 33 20 71 75 65 72 69 65 73 7c 73 69   fts3 queries|si
4a20: 6d 70 6c 65 20 63 61 73 65 5c 5d 20 64 65 73 63  mple case\] desc
4a30: 72 69 62 65 64 20 61 62 6f 76 65 29 2c 20 6f 72  ribed above), or
4a40: 20 66 6f 72 0a 20 20 20 20 61 6c 6c 20 64 6f 63   for.    all doc
4a50: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
4a60: 61 69 6e 20 61 20 74 65 72 6d 20 77 69 74 68 20  ain a term with 
4a70: 61 20 73 70 65 63 69 66 69 65 64 20 70 72 65 66  a specified pref
4a80: 69 78 2e 20 41 73 20 77 65 20 68 61 76 65 0a 20  ix. As we have. 
4a90: 20 20 20 73 65 65 6e 2c 20 74 68 65 20 71 75 65     seen, the que
4aa0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  ry expression fo
4ab0: 72 20 61 20 73 70 65 63 69 66 69 63 20 74 65 72  r a specific ter
4ac0: 6d 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20  m is simply the 
4ad0: 74 65 72 6d 20 69 74 73 65 6c 66 2e 0a 20 20 20  term itself..   
4ae0: 20 54 68 65 20 71 75 65 72 79 20 65 78 70 72 65   The query expre
4af0: 73 73 69 6f 6e 20 75 73 65 64 20 74 6f 20 73 65  ssion used to se
4b00: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
4b10: 70 72 65 66 69 78 20 69 73 20 74 68 65 20 70 72  prefix is the pr
4b20: 65 66 69 78 0a 20 20 20 20 69 74 73 65 6c 66 20  efix.    itself 
4b30: 77 69 74 68 20 61 20 27 2a 27 20 63 68 61 72 61  with a '*' chara
4b40: 63 74 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  cter appended to
4b50: 20 69 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65   it. For example
4b60: 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64 65 20 7b  :.</ul>..[Code {
4b70: 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66  .  <i>-- Query f
4b80: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
4b90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4ba0: 74 65 72 6d 20 22 6c 69 6e 75 78 22 3a 3c 2f 69  term "linux":</i
4bb0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
4bc0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
4bd0: 73 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 3b  s MATCH 'linux';
4be0: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
4bf0: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
4c00: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  s containing a t
4c10: 65 72 6d 20 77 69 74 68 20 74 68 65 20 70 72 65  erm with the pre
4c20: 66 69 78 20 22 6c 69 6e 22 2e 20 54 68 69 73 20  fix "lin". This 
4c30: 77 69 6c 6c 20 6d 61 74 63 68 3c 2f 69 3e 0a 20  will match</i>. 
4c40: 20 3c 69 3e 2d 2d 20 61 6c 6c 20 64 6f 63 75 6d   <i>-- all docum
4c50: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
4c60: 6e 20 22 6c 69 6e 75 78 22 2c 20 62 75 74 20 61  n "linux", but a
4c70: 6c 73 6f 20 74 68 6f 73 65 20 74 68 61 74 20 63  lso those that c
4c80: 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 22 6c 69  ontain terms "li
4c90: 6e 65 61 72 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e  near",</i>.  <i>
4ca0: 2d 2d 22 6c 69 6e 6b 65 72 22 2c 20 22 6c 69 6e  --"linker", "lin
4cb0: 67 75 69 73 74 69 63 22 20 61 6e 64 20 73 6f 20  guistic" and so 
4cc0: 6f 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  on.</i>.  SELECT
4cd0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
4ce0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c  RE docs MATCH 'l
4cf0: 69 6e 2a 27 3b 0a 7d 5d 0a 20 20 20 0a 3c 75 6c  in*';.}].   .<ul
4d00: 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 50 68  >.  <li><p><b>Ph
4d10: 72 61 73 65 20 71 75 65 72 69 65 73 3c 2f 62 3e  rase queries</b>
4d20: 2e 0a 20 20 20 20 41 20 70 68 72 61 73 65 20 71  ..    A phrase q
4d30: 75 65 72 79 20 69 73 20 61 20 71 75 65 72 79 20  uery is a query 
4d40: 74 68 61 74 20 72 65 74 72 65 69 76 65 73 20 61  that retreives a
4d50: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
4d60: 74 20 63 6f 6e 74 61 69 6e 20 61 0a 20 20 20 20  t contain a.    
4d70: 6e 6f 6d 69 6e 61 74 65 64 20 73 65 74 20 6f 66  nominated set of
4d80: 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 20 70   terms or term p
4d90: 72 65 66 69 78 65 73 20 69 6e 20 61 20 73 70 65  refixes in a spe
4da0: 63 69 66 69 65 64 20 6f 72 64 65 72 20 77 69 74  cified order wit
4db0: 68 20 6e 6f 0a 20 20 20 20 69 6e 74 65 72 76 65  h no.    interve
4dc0: 6e 69 6e 67 20 74 6f 6b 65 6e 73 2e 20 50 68 72  ning tokens. Phr
4dd0: 61 73 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ase queries are 
4de0: 73 70 65 63 69 66 69 65 64 20 62 79 20 65 6e 63  specified by enc
4df0: 6c 6f 73 69 6e 67 20 61 20 73 70 61 63 65 0a 20  losing a space. 
4e00: 20 20 20 73 65 70 61 72 61 74 65 64 20 73 65 71     separated seq
4e10: 75 65 6e 63 65 20 6f 66 20 74 65 72 6d 73 20 6f  uence of terms o
4e20: 72 20 74 65 72 6d 20 70 72 65 66 69 78 65 73 20  r term prefixes 
4e30: 69 6e 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73  in double quotes
4e40: 20 28 22 29 2e 0a 20 20 20 20 46 6f 72 20 65 78   (")..    For ex
4e50: 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43  ample:.</ul>..[C
4e60: 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 51 75  ode {.  <i>-- Qu
4e70: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
4e80: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
4e90: 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 22 6c  in the phrase "l
4ea0: 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e  inux application
4eb0: 73 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  s".</i>.  SELECT
4ec0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
4ed0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
4ee0: 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f  linux applicatio
4ef0: 6e 73 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ns"';..  <i>-- Q
4f00: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
4f10: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
4f20: 61 69 6e 20 61 20 70 68 72 61 73 65 20 74 68 61  ain a phrase tha
4f30: 74 20 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20  t matches "lin* 
4f40: 61 70 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61  app*". As well a
4f50: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c  s</i>.  <i>-- "l
4f60: 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e  inux application
4f70: 73 22 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61  s", this will ma
4f80: 74 63 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73  tch common phras
4f90: 65 73 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f  es such as "lino
4fa0: 6c 65 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22  leum appliances"
4fb0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20  </i>.  <i>-- or 
4fc0: 22 6c 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65  "link apprentice
4fd0: 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
4fe0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
4ff0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c  E docs MATCH '"l
5000: 69 6e 2a 20 61 70 70 2a 22 27 3b 0a 7d 5d 0a 0a  in* app*"';.}]..
5010: 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62  <ul>.  <li><p><b
5020: 3e 4e 45 41 52 20 71 75 65 72 69 65 73 3c 2f 62  >NEAR queries</b
5030: 3e 2e 20 0a 20 20 20 20 41 20 4e 45 41 52 20 71  >. .    A NEAR q
5040: 75 65 72 79 20 69 73 20 61 20 71 75 65 72 79 20  uery is a query 
5050: 74 68 61 74 20 72 65 74 75 72 6e 73 20 64 6f 63  that returns doc
5060: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
5070: 61 69 6e 20 61 20 74 77 6f 20 6f 72 0a 20 20 20  ain a two or.   
5080: 20 6d 6f 72 65 20 6e 6f 6d 69 6e 61 74 65 64 20   more nominated 
5090: 74 65 72 6d 73 20 6f 66 20 70 68 72 61 73 65 73  terms of phrases
50a0: 20 77 69 74 68 69 6e 20 61 20 73 70 65 63 69 66   within a specif
50b0: 69 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66  ied proximity of
50c0: 20 65 61 63 68 20 0a 20 20 20 20 6f 74 68 65 72   each .    other
50d0: 20 28 62 79 20 64 65 66 61 75 6c 74 20 77 69 74   (by default wit
50e0: 68 20 31 30 20 6f 72 20 6c 65 73 73 20 69 6e 74  h 10 or less int
50f0: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 29 2e  ervening terms).
5100: 20 41 20 4e 45 41 52 20 71 75 65 72 79 20 69 73   A NEAR query is
5110: 20 0a 20 20 20 20 73 70 65 63 69 66 69 65 64 20   .    specified 
5120: 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 6b  by putting the k
5130: 65 79 77 6f 72 64 20 22 4e 45 41 52 22 20 62 65  eyword "NEAR" be
5140: 74 77 65 65 6e 20 74 77 6f 20 70 68 72 61 73 65  tween two phrase
5150: 2c 20 74 65 72 6d 20 6f 72 20 0a 20 20 20 20 74  , term or .    t
5160: 65 72 6d 20 70 72 65 66 69 78 20 71 75 65 72 69  erm prefix queri
5170: 65 73 2e 20 54 6f 20 73 70 65 63 69 66 79 20 61  es. To specify a
5180: 20 70 72 6f 78 69 6d 69 74 79 20 6f 74 68 65 72   proximity other
5190: 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c   than the defaul
51a0: 74 2c 0a 20 20 20 20 61 6e 20 6f 70 65 72 61 74  t,.    an operat
51b0: 6f 72 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  or of the form "
51c0: 4e 45 41 52 2f 3c 69 3e 26 6c 74 3b 4e 26 67 74  NEAR/<i>&lt;N&gt
51d0: 3b 3c 2f 69 3e 22 20 6d 61 79 20 62 65 20 75 73  ;</i>" may be us
51e0: 65 64 2c 20 77 68 65 72 65 0a 20 20 20 20 3c 69  ed, where.    <i
51f0: 3e 26 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 20 69  >&lt;N&gt;</i> i
5200: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  s the maximum nu
5210: 6d 62 65 72 20 6f 66 20 69 6e 74 65 72 76 65 6e  mber of interven
5220: 69 6e 67 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65  ing terms allowe
5230: 64 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  d..    For examp
5240: 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64 65  le:.</ul>..[Code
5250: 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75   {.  <i>-- Virtu
5260: 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61  al table declara
5270: 74 69 6f 6e 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  tion.</i>.  CREA
5280: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
5290: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
52a0: 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72  ();..  <i>-- Vir
52b0: 74 75 61 6c 20 74 61 62 6c 65 20 64 61 74 61 2e  tual table data.
52c0: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
52d0: 54 4f 20 64 6f 63 73 20 56 41 4c 55 45 53 28 27  TO docs VALUES('
52e0: 53 51 4c 69 74 65 20 69 73 20 61 6e 20 41 43 49  SQLite is an ACI
52f0: 44 20 63 6f 6d 70 6c 69 61 6e 74 20 65 6d 62 65  D compliant embe
5300: 64 64 65 64 20 72 65 6c 61 74 69 6f 6e 61 6c 20  dded relational 
5310: 64 61 74 61 62 61 73 65 20 6d 61 6e 61 67 65 6d  database managem
5320: 65 6e 74 20 73 79 73 74 65 6d 27 29 3b 0a 0a 20  ent system');.. 
5330: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
5340: 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61  r a document tha
5350: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
5360: 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e  erms "sqlite" an
5370: 64 20 22 64 61 74 61 62 61 73 65 22 20 77 69 74  d "database" wit
5380: 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f  h</i>.  <i>-- no
5390: 74 20 6d 6f 72 65 20 74 68 61 6e 20 31 30 20 69  t more than 10 i
53a0: 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73  ntervening terms
53b0: 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
53c0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
53d0: 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   in</i>.  <i>-- 
53e0: 74 61 62 6c 65 20 64 6f 63 73 20 28 73 69 6e 63  table docs (sinc
53f0: 65 20 74 68 65 72 65 20 61 72 65 20 6f 6e 6c 79  e there are only
5400: 20 73 69 78 20 74 65 72 6d 73 20 62 65 74 77 65   six terms betwe
5410: 65 6e 20 22 53 51 4c 69 74 65 22 20 61 6e 64 20  en "SQLite" and 
5420: 22 64 61 74 61 62 61 73 65 22 3c 2f 69 3e 20 0a  "database"</i> .
5430: 20 20 3c 69 3e 2d 2d 20 69 6e 20 74 68 65 20 64    <i>-- in the d
5440: 6f 63 75 6d 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20  ocument)</i>..  
5450: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
5460: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
5470: 54 43 48 20 27 73 71 6c 69 74 65 20 4e 45 41 52  TCH 'sqlite NEAR
5480: 20 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c   database';..  <
5490: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
54a0: 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20  a document that 
54b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72  contains the ter
54c0: 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20  ms "sqlite" and 
54d0: 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68 3c  "database" with<
54e0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20  /i>.  <i>-- not 
54f0: 6d 6f 72 65 20 74 68 61 6e 20 36 20 69 6e 74 65  more than 6 inte
5500: 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54  rvening terms. T
5510: 68 69 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73  his also matches
5520: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
5530: 6e 74 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  nt in</i>.  <i>-
5540: 2d 20 74 61 62 6c 65 20 64 6f 63 73 2e 20 4e 6f  - table docs. No
5550: 74 65 20 74 68 61 74 20 74 68 65 20 6f 72 64 65  te that the orde
5560: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74  r in which the t
5570: 65 72 6d 73 20 61 70 70 65 61 72 20 69 6e 20 74  erms appear in t
5580: 68 65 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a  he document</i>.
5590: 20 20 3c 69 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74    <i>-- does not
55a0: 20 68 61 76 65 20 74 6f 20 62 65 20 74 68 65 20   have to be the 
55b0: 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 64 65  same as the orde
55c0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 20  r in which they 
55d0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 71 75  appear in the qu
55e0: 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ery.</i>.  SELEC
55f0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
5600: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
5610: 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 36 20  database NEAR/6 
5620: 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d  sqlite';..  <i>-
5630: 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64  - Search for a d
5640: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e  ocument that con
5650: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
5660: 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61  "sqlite" and "da
5670: 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e  tabase" with</i>
5680: 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72  .  <i>-- not mor
5690: 65 20 74 68 61 6e 20 35 20 69 6e 74 65 72 76 65  e than 5 interve
56a0: 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73  ning terms. This
56b0: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e   query matches n
56c0: 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e  o documents.</i>
56d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
56e0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
56f0: 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65   MATCH 'database
5700: 20 4e 45 41 52 2f 35 20 73 71 6c 69 74 65 27 3b   NEAR/5 sqlite';
5710: 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68  ..  <i>-- Search
5720: 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20   for a document 
5730: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
5740: 65 20 70 68 72 61 73 65 20 22 41 43 49 44 20 63  e phrase "ACID c
5750: 6f 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20 74 68  ompliant" and th
5760: 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e  e term</i>.  <i>
5770: 2d 2d 20 22 64 61 74 61 62 61 73 65 22 20 77 69  -- "database" wi
5780: 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e  th not more than
5790: 20 32 20 74 65 72 6d 73 20 73 65 70 61 72 61 74   2 terms separat
57a0: 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69  ing the two. Thi
57b0: 73 20 6d 61 74 63 68 65 73 20 74 68 65 3c 2f 69  s matches the</i
57c0: 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65  >.  <i>-- docume
57d0: 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62  nt stored in tab
57e0: 6c 65 20 64 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53  le docs.</i>.  S
57f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
5800: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
5810: 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 45 41  CH 'database NEA
5820: 52 2f 32 20 22 41 43 49 44 20 63 6f 6d 70 6c 69  R/2 "ACID compli
5830: 61 6e 74 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ant"';..  <i>-- 
5840: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
5850: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
5860: 69 6e 73 20 74 68 65 20 70 68 72 61 73 65 20 22  ins the phrase "
5870: 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20  ACID compliant" 
5880: 61 6e 64 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e  and the term</i>
5890: 0a 20 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65  .  <i>-- "sqlite
58a0: 22 20 77 69 74 68 20 6e 6f 74 20 6d 6f 72 65 20  " with not more 
58b0: 74 68 61 6e 20 32 20 74 65 72 6d 73 20 73 65 70  than 2 terms sep
58c0: 61 72 61 74 69 6e 67 20 74 68 65 20 74 77 6f 2e  arating the two.
58d0: 20 54 68 69 73 20 61 6c 73 6f 20 6d 61 74 63 68   This also match
58e0: 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  es</i>.  <i>-- t
58f0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
5900: 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65   stored in table
5910: 20 64 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c   docs.</i>.  SEL
5920: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
5930: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
5940: 20 27 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e   '"ACID complian
5950: 74 22 20 4e 45 41 52 2f 32 20 73 71 6c 69 74 65  t" NEAR/2 sqlite
5960: 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  ';.}]..<ul>.  <l
5970: 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74  i style="list-st
5980: 79 6c 65 3a 20 6e 6f 6e 65 22 3e 3c 70 3e 0a 20  yle: none"><p>. 
5990: 20 20 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65     More than one
59a0: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d   NEAR operator m
59b0: 61 79 20 61 70 70 65 61 72 20 69 6e 20 61 20 73  ay appear in a s
59c0: 69 6e 67 6c 65 20 71 75 65 72 79 2e 20 49 6e 20  ingle query. In 
59d0: 74 68 69 73 20 63 61 73 65 20 65 61 63 68 0a 20  this case each. 
59e0: 20 20 20 70 61 69 72 20 6f 66 20 74 65 72 6d 73     pair of terms
59f0: 20 6f 72 20 70 68 72 61 73 65 73 20 73 65 70 61   or phrases sepa
5a00: 72 61 74 65 64 20 62 79 20 61 20 4e 45 41 52 20  rated by a NEAR 
5a10: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 61 70  operator must ap
5a20: 70 65 61 72 20 77 69 74 68 69 6e 20 74 68 65 0a  pear within the.
5a30: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 70 72      specified pr
5a40: 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20  oximity of each 
5a50: 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 6f 63  other in the doc
5a60: 75 6d 65 6e 74 2e 20 55 73 69 6e 67 20 74 68 65  ument. Using the
5a70: 20 73 61 6d 65 20 74 61 62 6c 65 20 61 6e 64 0a   same table and.
5a80: 20 20 20 20 64 61 74 61 20 61 73 20 69 6e 20 74      data as in t
5a90: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d  he block of exam
5aa0: 70 6c 65 73 20 61 62 6f 76 65 3a 0a 3c 2f 75 6c  ples above:.</ul
5ab0: 3e 0a 0a 5b 43 6f 64 65 20 7b 20 3c 69 3e 2d 2d  >..[Code { <i>--
5ac0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
5ad0: 75 65 72 79 20 73 65 6c 65 63 74 73 20 64 6f 63  uery selects doc
5ae0: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
5af0: 61 69 6e 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  ains an instance
5b00: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 3c 2f 69   of the term </i
5b10: 3e 0a 20 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74  >.  <i>-- "sqlit
5b20: 65 22 20 73 65 70 61 72 61 74 65 64 20 62 79 20  e" separated by 
5b30: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
5b40: 6d 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61  ms from an insta
5b50: 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  nce of the term 
5b60: 22 61 63 69 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69  "acid",</i>.  <i
5b70: 3e 2d 2d 20 77 68 69 63 68 20 69 73 20 69 6e 20  >-- which is in 
5b80: 74 75 72 6e 20 73 65 70 61 72 61 74 65 64 20 62  turn separated b
5b90: 79 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74  y two or fewer t
5ba0: 65 72 6d 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73  erms from an ins
5bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72  tance of the ter
5bc0: 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72  m</i>.  <i>-- "r
5bd0: 65 6c 61 74 69 6f 6e 61 6c 22 2e 20 41 73 20 69  elational". As i
5be0: 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  t happens, the o
5bf0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20  nly document in 
5c00: 74 61 62 6c 65 20 64 6f 63 73 20 73 61 74 69 73  table docs satis
5c10: 66 69 65 73 20 74 68 69 73 20 63 72 69 74 65 72  fies this criter
5c20: 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ia.</i>.  SELECT
5c30: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
5c40: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73  RE docs MATCH 's
5c50: 71 6c 69 74 65 20 4e 45 41 52 2f 32 20 61 63 69  qlite NEAR/2 aci
5c60: 64 20 4e 45 41 52 2f 32 20 72 65 6c 61 74 69 6f  d NEAR/2 relatio
5c70: 6e 61 6c 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  nal';..  <i>-- T
5c80: 68 69 73 20 71 75 65 72 79 20 6d 61 74 63 68 65  his query matche
5c90: 73 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20  s no documents. 
5ca0: 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e 73 74  There is an inst
5cb0: 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d  ance of the term
5cc0: 20 22 73 71 6c 69 74 65 22 20 77 69 74 68 3c 2f   "sqlite" with</
5cd0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 73 75 66 66 69  i>.  <i>-- suffi
5ce0: 63 69 65 6e 74 20 70 72 6f 78 69 6d 69 74 79 20  cient proximity 
5cf0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
5d00: 66 20 22 61 63 69 64 22 20 62 75 74 20 69 74 20  f "acid" but it 
5d10: 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
5d20: 74 6c 79 20 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20  tly close</i>.  
5d30: 3c 69 3e 2d 2d 20 74 6f 20 61 6e 20 69 6e 73 74  <i>-- to an inst
5d40: 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d  ance of the term
5d50: 20 22 72 65 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f   "relational".</
5d60: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
5d70: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
5d80: 63 73 20 4d 41 54 43 48 20 27 61 63 69 64 20 4e  cs MATCH 'acid N
5d90: 45 41 52 2f 32 20 73 71 6c 69 74 65 20 4e 45 41  EAR/2 sqlite NEA
5da0: 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b  R/2 relational';
5db0: 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 50 68 72 61 73  .}]..<p>.  Phras
5dc0: 65 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69  e and NEAR queri
5dd0: 65 73 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20  es may not span 
5de0: 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73  multiple columns
5df0: 20 77 69 74 68 69 6e 20 61 20 72 6f 77 2e 0a 0a   within a row...
5e00: 3c 70 3e 0a 20 20 54 68 65 20 74 68 72 65 65 20  <p>.  The three 
5e10: 62 61 73 69 63 20 71 75 65 72 79 20 74 79 70 65  basic query type
5e20: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
5e30: 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  e may be used to
5e40: 20 71 75 65 72 79 20 74 68 65 20 66 75 6c 6c 2d   query the full-
5e50: 74 65 78 74 0a 20 20 69 6e 64 65 78 20 66 6f 72  text.  index for
5e60: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
5e70: 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68  ments that match
5e80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
5e90: 72 69 74 65 72 69 61 2e 20 55 73 69 6e 67 20 74  riteria. Using t
5ea0: 68 65 0a 20 20 46 54 53 33 20 71 75 65 72 79 20  he.  FTS3 query 
5eb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 61 6e 67 75  expression langu
5ec0: 61 67 65 20 69 74 20 69 73 20 70 6f 73 73 69 62  age it is possib
5ed0: 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61  le to perform va
5ee0: 72 69 6f 75 73 20 73 65 74 20 0a 20 20 6f 70 65  rious set .  ope
5ef0: 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 72  rations on the r
5f00: 65 73 75 6c 74 73 20 6f 66 20 62 61 73 69 63 20  esults of basic 
5f10: 71 75 65 72 69 65 73 2e 20 54 68 65 72 65 20 61  queries. There a
5f20: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 74 68 72  re currently thr
5f30: 65 65 20 0a 20 20 73 75 70 70 6f 72 74 65 64 20  ee .  supported 
5f40: 6f 70 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c  operations:..<ul
5f50: 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20 41 4e 44  >.  <li> The AND
5f60: 20 6f 70 65 72 61 74 6f 72 20 64 65 74 65 72 6d   operator determ
5f70: 69 6e 65 73 20 74 68 65 20 3c 62 3e 69 6e 74 65  ines the <b>inte
5f80: 72 73 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f 66 20  rsection</b> of 
5f90: 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75  two sets of docu
5fa0: 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54  ments...  <li> T
5fb0: 68 65 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 63  he OR operator c
5fc0: 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20 3c 62  alculates the <b
5fd0: 3e 75 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77  >union</b> of tw
5fe0: 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65  o sets of docume
5ff0: 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65  nts...  <li> The
6000: 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 20 28 6f   NOT operator (o
6010: 72 2c 20 69 66 20 75 73 69 6e 67 20 74 68 65 20  r, if using the 
6020: 73 74 61 6e 64 61 72 64 20 73 79 6e 74 61 78 2c  standard syntax,
6030: 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65   a unary "-" ope
6040: 72 61 74 6f 72 29 0a 20 20 20 20 20 20 20 6d 61  rator).       ma
6050: 79 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d  y be used to com
6060: 70 75 74 65 20 74 68 65 20 3c 62 3e 72 65 6c 61  pute the <b>rela
6070: 74 69 76 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 3c  tive complement<
6080: 2f 62 3e 20 6f 66 20 6f 6e 65 20 73 65 74 20 6f  /b> of one set o
6090: 66 0a 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e  f.       documen
60a0: 74 73 20 77 69 74 68 20 72 65 73 70 65 63 74 20  ts with respect 
60b0: 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f 75 6c  to another..</ul
60c0: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53  >..<p>.  The FTS
60d0: 33 20 6d 6f 64 75 6c 65 20 6d 61 79 20 62 65 20  3 module may be 
60e0: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 75 73 65 20  compiled to use 
60f0: 6f 6e 65 20 6f 66 20 74 77 6f 20 73 6c 69 67 68  one of two sligh
6100: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 76 65  tly different ve
6110: 72 73 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65 20  rsions.  of the 
6120: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
6130: 73 79 6e 74 61 78 2c 20 74 68 65 20 22 73 74 61  syntax, the "sta
6140: 6e 64 61 72 64 22 20 71 75 65 72 79 20 73 79 6e  ndard" query syn
6150: 74 61 78 20 61 6e 64 20 74 68 65 20 22 65 6e 68  tax and the "enh
6160: 61 6e 63 65 64 22 20 0a 20 20 71 75 65 72 79 20  anced" .  query 
6170: 73 79 6e 74 61 78 2e 20 54 68 65 20 62 61 73 69  syntax. The basi
6180: 63 20 74 65 72 6d 2c 20 74 65 72 6d 2d 70 72 65  c term, term-pre
6190: 66 69 78 2c 20 70 68 72 61 73 65 20 61 6e 64 20  fix, phrase and 
61a0: 4e 45 41 52 20 71 75 65 72 69 65 73 20 64 65 73  NEAR queries des
61b0: 63 72 69 62 65 64 20 0a 20 20 61 62 6f 76 65 20  cribed .  above 
61c0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 69 6e 20  are the same in 
61d0: 62 6f 74 68 20 76 65 72 73 69 6f 6e 73 20 6f 66  both versions of
61e0: 20 74 68 65 20 73 79 6e 74 61 78 2e 20 54 68 65   the syntax. The
61f0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 73 65   way in which se
6200: 74 20 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20  t .  operations 
6210: 61 72 65 20 73 70 65 63 69 66 69 65 64 20 69 73  are specified is
6220: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
6230: 65 6e 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ent. The followi
6240: 6e 67 20 74 77 6f 20 73 75 62 2d 73 65 63 74 69  ng two sub-secti
6250: 6f 6e 73 20 0a 20 20 64 65 73 63 72 69 62 65 20  ons .  describe 
6260: 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  the part of the 
6270: 74 77 6f 20 71 75 65 72 79 20 73 79 6e 74 61 78  two query syntax
6280: 65 73 20 74 68 61 74 20 70 65 72 74 61 69 6e 73  es that pertains
6290: 20 74 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f   to set operatio
62a0: 6e 73 2e 20 0a 20 20 52 65 66 65 72 20 74 6f 20  ns. .  Refer to 
62b0: 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  the description 
62c0: 6f 66 20 68 6f 77 20 74 6f 20 5c 5b 63 6f 6d 70  of how to \[comp
62d0: 69 6c 65 20 66 74 73 33 5c 5d 20 66 6f 72 20 63  ile fts3\] for c
62e0: 6f 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65 73  ompilation notes
62f0: 2e 0a 0a 5b 68 32 20 22 53 65 74 20 4f 70 65 72  ...[h2 "Set Oper
6300: 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65  ations Using The
6310: 20 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20   Enhanced Query 
6320: 53 79 6e 74 61 78 22 5d 0a 0a 3c 70 3e 0a 20 20  Syntax"]..<p>.  
6330: 54 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65  The enhanced que
6340: 72 79 20 73 79 6e 74 61 78 20 73 75 70 70 6f 72  ry syntax suppor
6350: 74 73 20 74 68 65 20 41 4e 44 2c 20 4f 52 20 61  ts the AND, OR a
6360: 6e 64 20 4e 4f 54 20 62 69 6e 61 72 79 20 73 65  nd NOT binary se
6370: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 45  t operators..  E
6380: 61 63 68 20 6f 66 20 74 68 65 20 74 77 6f 20 6f  ach of the two o
6390: 70 65 72 61 6e 64 73 20 74 6f 20 61 6e 20 6f 70  perands to an op
63a0: 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 61 20  erator may be a 
63b0: 62 61 73 69 63 20 46 54 53 33 20 71 75 65 72 79  basic FTS3 query
63c0: 2c 20 6f 72 20 74 68 65 0a 20 20 72 65 73 75 6c  , or the.  resul
63d0: 74 20 6f 66 20 61 6e 6f 74 68 65 72 20 41 4e 44  t of another AND
63e0: 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73 65 74 20  , OR or NOT set 
63f0: 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70 65 72 61  operation. Opera
6400: 74 6f 72 73 20 6d 75 73 74 20 62 65 20 65 6e 74  tors must be ent
6410: 65 72 65 64 0a 20 20 75 73 69 6e 67 20 63 61 70  ered.  using cap
6420: 69 74 61 6c 20 6c 65 74 74 65 72 73 2e 20 4f 74  ital letters. Ot
6430: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
6440: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
6450: 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65 72   basic term quer
6460: 69 65 73 0a 20 20 69 6e 73 74 65 61 64 20 6f 66  ies.  instead of
6470: 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a   set operators..
6480: 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e 44 20 6f  .<p>.  The AND o
6490: 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 69  perator may be i
64a0: 6d 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  mplicitly specif
64b0: 69 65 64 2e 20 49 66 20 74 77 6f 20 62 61 73 69  ied. If two basi
64c0: 63 20 71 75 65 72 69 65 73 20 61 70 70 65 61 72  c queries appear
64d0: 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f 70 65 72   .  with no oper
64e0: 61 74 6f 72 20 73 65 70 61 72 61 74 69 6e 67 20  ator separating 
64f0: 74 68 65 6d 20 69 6e 20 61 6e 20 46 54 53 33 20  them in an FTS3 
6500: 71 75 65 72 79 20 73 74 72 69 6e 67 2c 20 74 68  query string, th
6510: 65 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20 20  e results are.  
6520: 74 68 65 20 73 61 6d 65 20 61 73 20 69 66 20 74  the same as if t
6530: 68 65 20 74 77 6f 20 62 61 73 69 63 20 71 75 65  he two basic que
6540: 72 69 65 73 20 77 65 72 65 20 73 65 70 61 72 61  ries were separa
6550: 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
6560: 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20 65 78  erator..  For ex
6570: 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
6580: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 69 6d 70   expression "imp
6590: 6c 69 63 69 74 20 6f 70 65 72 61 74 6f 72 22 20  licit operator" 
65a0: 69 73 20 61 20 6d 6f 72 65 20 73 75 63 63 69 6e  is a more succin
65b0: 63 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f 66 20  ct.  version of 
65c0: 22 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70  "implicit AND op
65d0: 65 72 61 74 6f 72 22 2e 0a 0a 5b 43 6f 64 65 20  erator"...[Code 
65e0: 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61  {.  <i>-- Virtua
65f0: 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  l table declarat
6600: 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ion</i>.  CREATE
6610: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
6620: 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33 28 29  ocs USING fts3()
6630: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75  ;..  <i>-- Virtu
6640: 61 6c 20 74 61 62 6c 65 20 64 61 74 61 3c 2f 69  al table data</i
6650: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
6660: 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74  docs(docid, cont
6670: 65 6e 74 29 20 56 41 4c 55 45 53 28 31 2c 20 27  ent) VALUES(1, '
6680: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  a database is a 
6690: 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 27  software system'
66a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
66b0: 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e   docs(docid, con
66c0: 74 65 6e 74 29 20 56 41 4c 55 45 53 28 32 2c 20  tent) VALUES(2, 
66d0: 27 73 71 6c 69 74 65 20 69 73 20 61 20 73 6f 66  'sqlite is a sof
66e0: 74 77 61 72 65 20 73 79 73 74 65 6d 27 29 3b 0a  tware system');.
66f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f    INSERT INTO do
6700: 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74 65 6e  cs(docid, conten
6710: 74 29 20 56 41 4c 55 45 53 28 33 2c 20 27 73 71  t) VALUES(3, 'sq
6720: 6c 69 74 65 20 69 73 20 61 20 64 61 74 61 62 61  lite is a databa
6730: 73 65 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 52  se');..  <i>-- R
6740: 65 74 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66  eturn the set of
6750: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
6760: 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d  contain the term
6770: 20 22 73 71 6c 69 74 65 22 2c 20 61 6e 64 20 74   "sqlite", and t
6780: 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  he</i>.  <i>-- t
6790: 65 72 6d 20 22 64 61 74 61 62 61 73 65 22 2e 20  erm "database". 
67a0: 54 68 69 73 20 71 75 65 72 79 20 77 69 6c 6c 20  This query will 
67b0: 72 65 74 75 72 6e 20 74 68 65 20 64 6f 63 75 6d  return the docum
67c0: 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 20 33  ent with docid 3
67d0: 20 6f 6e 6c 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c   only.</i>.  SEL
67e0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
67f0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
6800: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
6810: 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  abase';..  <i>--
6820: 20 41 67 61 69 6e 2c 20 72 65 74 75 72 6e 20 74   Again, return t
6830: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
6840: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
6850: 20 62 6f 74 68 20 22 73 71 6c 69 74 65 22 20 61   both "sqlite" a
6860: 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  nd</i>.  <i>-- "
6870: 64 61 74 61 62 61 73 65 22 2e 20 54 68 69 73 20  database". This 
6880: 74 69 6d 65 2c 20 75 73 65 20 61 6e 20 69 6d 70  time, use an imp
6890: 6c 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74  licit AND operat
68a0: 6f 72 2e 20 41 67 61 69 6e 2c 20 64 6f 63 75 6d  or. Again, docum
68b0: 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ent</i>.  <i>-- 
68c0: 33 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  3 is the only do
68d0: 63 75 6d 65 6e 74 20 6d 61 74 63 68 65 64 20 62  cument matched b
68e0: 79 20 74 68 69 73 20 71 75 65 72 79 2e 20 3c 2f  y this query. </
68f0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
6900: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
6910: 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  cs MATCH 'databa
6920: 73 65 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c  se sqlite';..  <
6930: 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 74  i>-- Query for t
6940: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
6950: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
6960: 73 20 65 69 74 68 65 72 20 22 73 71 6c 69 74 65  s either "sqlite
6970: 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2e  " or "database".
6980: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 41 6c 6c  </i>.  <i>-- All
6990: 20 74 68 72 65 65 20 64 6f 63 75 6d 65 6e 74 73   three documents
69a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
69b0: 20 61 72 65 20 6d 61 74 63 68 65 64 20 62 79 20   are matched by 
69c0: 74 68 69 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  this query.</i>.
69d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
69e0: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
69f0: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f 52  MATCH 'sqlite OR
6a00: 20 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c   database';..  <
6a10: 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 61  i>-- Query for a
6a20: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
6a30: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  t contain the te
6a40: 72 6d 20 22 64 61 74 61 62 61 73 65 22 2c 20 62  rm "database", b
6a50: 75 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  ut do not contai
6a60: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  n</i>.  <i>-- th
6a70: 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22 2e  e term "sqlite".
6a80: 20 44 6f 63 75 6d 65 6e 74 20 32 20 69 73 20 74   Document 2 is t
6a90: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
6aa0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
6ab0: 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e  is criteria.</i>
6ac0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6ad0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
6ae0: 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65   MATCH 'database
6af0: 20 4e 4f 54 20 73 71 6c 69 74 65 27 3b 0a 0a 20   NOT sqlite';.. 
6b00: 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
6b10: 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63 68  wing query match
6b20: 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e  es no documents.
6b30: 20 42 65 63 61 75 73 65 20 22 61 6e 64 22 20 69   Because "and" i
6b40: 73 20 69 6e 20 6c 6f 77 65 72 63 61 73 65 20 6c  s in lowercase l
6b50: 65 74 74 65 72 73 2c 3c 2f 69 3e 0a 20 20 3c 69  etters,</i>.  <i
6b60: 3e 2d 2d 20 69 74 20 69 73 20 69 6e 74 65 72 70  >-- it is interp
6b70: 72 65 74 65 64 20 61 73 20 61 20 62 61 73 69 63  reted as a basic
6b80: 20 74 65 72 6d 20 71 75 65 72 79 20 69 6e 73 74   term query inst
6b90: 65 61 64 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  ead of an operat
6ba0: 6f 72 2e 20 4f 70 65 72 61 74 6f 72 73 20 6d 75  or. Operators mu
6bb0: 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 62  st</i>.  <i>-- b
6bc0: 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e  e specified usin
6bd0: 67 20 63 61 70 69 74 61 6c 20 6c 65 74 74 65 72  g capital letter
6be0: 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 20  s. In practice, 
6bf0: 74 68 69 73 20 71 75 65 72 79 20 77 69 6c 6c 20  this query will 
6c00: 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65  match any docume
6c10: 6e 74 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  nts</i>.  <i>-- 
6c20: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 65 61 63  that contain eac
6c30: 68 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 74  h of the three t
6c40: 65 72 6d 73 20 22 64 61 74 61 62 61 73 65 22 2c  erms "database",
6c50: 20 22 61 6e 64 22 20 61 6e 64 20 22 73 71 6c 69   "and" and "sqli
6c60: 74 65 22 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  te" at least onc
6c70: 65 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 4e  e.</i>.  <i>-- N
6c80: 6f 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74  o documents in t
6c90: 68 65 20 65 78 61 6d 70 6c 65 20 64 61 74 61 20  he example data 
6ca0: 61 62 6f 76 65 20 6d 61 74 63 68 20 74 68 69 73  above match this
6cb0: 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e 0a 20   criteria.</i>. 
6cc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
6cd0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
6ce0: 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20 61  ATCH 'database a
6cf0: 6e 64 20 73 71 6c 69 74 65 27 3b 0a 7d 5d 0a 0a  nd sqlite';.}]..
6d00: 3c 70 3e 0a 20 20 54 68 65 20 65 78 61 6d 70 6c  <p>.  The exampl
6d10: 65 73 20 61 62 6f 76 65 20 61 6c 6c 20 75 73 65  es above all use
6d20: 20 62 61 73 69 63 20 66 75 6c 6c 2d 74 65 78 74   basic full-text
6d30: 20 74 65 72 6d 20 71 75 65 72 69 65 73 20 61 73   term queries as
6d40: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 6f   both operands o
6d50: 66 20 0a 20 20 74 68 65 20 73 65 74 20 6f 70 65  f .  the set ope
6d60: 72 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73 74 72  rations demonstr
6d70: 61 74 65 64 2e 20 50 68 72 61 73 65 20 61 6e 64  ated. Phrase and
6d80: 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 6d 61   NEAR queries ma
6d90: 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64 2c 0a  y also be used,.
6da0: 20 20 61 73 20 6d 61 79 20 74 68 65 20 72 65 73    as may the res
6db0: 75 6c 74 73 20 6f 66 20 6f 74 68 65 72 20 73 65  ults of other se
6dc0: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 57 68  t operations. Wh
6dd0: 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  en more than one
6de0: 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 0a 20   set operation. 
6df0: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61   is present in a
6e00: 6e 20 46 54 53 33 20 71 75 65 72 79 2c 20 74 68  n FTS3 query, th
6e10: 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  e precedence of 
6e20: 6f 70 65 72 61 74 6f 72 73 20 69 73 20 61 73 20  operators is as 
6e30: 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62 6c 65  follows:..[Table
6e40: 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 4f 70 65 72  ].  [Tr]<th>Oper
6e50: 61 74 6f 72 3c 74 68 3e 45 6e 68 61 6e 63 65 64  ator<th>Enhanced
6e60: 20 51 75 65 72 79 20 53 79 6e 74 61 78 20 50 72   Query Syntax Pr
6e70: 65 63 65 64 65 6e 63 65 0a 20 20 5b 54 72 5d 3c  ecedence.  [Tr]<
6e80: 74 64 3e 4e 4f 54 20 3c 74 64 3e 20 48 69 67 68  td>NOT <td> High
6e90: 65 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28  est precedence (
6ea0: 74 69 67 68 74 65 73 74 20 67 72 6f 75 70 69 6e  tightest groupin
6eb0: 67 29 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 41 4e  g)..  [Tr]<td>AN
6ec0: 44 20 3c 74 64 3e 0a 20 20 5b 54 72 5d 3c 74 64  D <td>.  [Tr]<td
6ed0: 3e 4f 52 20 20 3c 74 64 3e 20 4c 6f 77 65 73 74  >OR  <td> Lowest
6ee0: 20 70 72 65 63 65 64 65 6e 63 65 20 28 6c 6f 6f   precedence (loo
6ef0: 73 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a  sest grouping)..
6f00: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
6f10: 57 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 65  When using the e
6f20: 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79  nhanced query sy
6f30: 6e 74 61 78 2c 20 70 61 72 65 6e 74 68 65 73 69  ntax, parenthesi
6f40: 73 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  s may be used to
6f50: 20 6f 76 65 72 72 69 64 65 0a 20 20 74 68 65 20   override.  the 
6f60: 64 65 66 61 75 6c 74 20 70 72 65 63 65 64 65 6e  default preceden
6f70: 63 65 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  ce of the variou
6f80: 73 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  s operators. For
6f90: 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65   example:..[Code
6fa0: 20 7b 0a 0a 20 20 3c 69 3e 2d 2d 20 52 65 74 75   {..  <i>-- Retu
6fb0: 72 6e 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c  rn the docid val
6fc0: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
6fd0: 69 74 68 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  ith all document
6fe0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  s that contain t
6ff0: 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  he</i>.  <i>-- t
7000: 77 6f 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65  wo terms "sqlite
7010: 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65 22  " and "database"
7020: 2c 20 61 6e 64 2f 6f 72 20 63 6f 6e 74 61 69 6e  , and/or contain
7030: 20 74 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61   the term "libra
7040: 72 79 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ry".</i>.  SELEC
7050: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
7060: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
7070: 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64  CH 'sqlite AND d
7080: 61 74 61 62 61 73 65 20 4f 52 20 6c 69 62 72 61  atabase OR libra
7090: 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ry';..  <i>-- Th
70a0: 69 73 20 71 75 65 72 79 20 69 73 20 65 71 75 69  is query is equi
70b0: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62  valent to the ab
70c0: 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ove.</i>.  SELEC
70d0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
70e0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
70f0: 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64  CH 'sqlite AND d
7100: 61 74 61 62 61 73 65 27 0a 20 20 20 20 55 4e 49  atabase'.    UNI
7110: 4f 4e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  ON.  SELECT doci
7120: 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  d FROM docs WHER
7130: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69  E docs MATCH 'li
7140: 62 72 61 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  brary';..  <i>--
7150: 20 51 75 65 72 79 20 66 6f 72 20 74 68 65 20 73   Query for the s
7160: 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  et of documents 
7170: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
7180: 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 2c 20  e term "linux", 
7190: 61 6e 64 20 61 74 20 6c 65 61 73 74 3c 2f 69 3e  and at least</i>
71a0: 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 6f 66 20  .  <i>-- one of 
71b0: 74 68 65 20 70 68 72 61 73 65 73 20 22 73 71 6c  the phrases "sql
71c0: 69 74 65 20 64 61 74 61 62 61 73 65 22 20 61 6e  ite database" an
71d0: 64 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72  d "sqlite librar
71e0: 79 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  y".</i>.  SELECT
71f0: 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73   docid FROM docs
7200: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
7210: 48 20 27 28 22 73 71 6c 69 74 65 20 64 61 74 61  H '("sqlite data
7220: 62 61 73 65 22 20 4f 52 20 22 73 71 6c 69 74 65  base" OR "sqlite
7230: 20 6c 69 62 72 61 72 79 22 29 20 41 4e 44 20 6c   library") AND l
7240: 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  inux';..  <i>-- 
7250: 54 68 69 73 20 71 75 65 72 79 20 69 73 20 65 71  This query is eq
7260: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
7270: 61 62 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c  above.</i>.  SEL
7280: 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64  ECT docid FROM d
7290: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
72a0: 41 54 43 48 20 27 6c 69 6e 75 78 27 3b 0a 20 20  ATCH 'linux';.  
72b0: 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 53 45    INTERSECT.  SE
72c0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
72d0: 28 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  (.    SELECT doc
72e0: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45  id FROM docs WHE
72f0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
7300: 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22 27  sqlite library"'
7310: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  .      UNION.   
7320: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
7330: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
7340: 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c 69 74  cs MATCH '"sqlit
7350: 65 20 64 61 74 61 62 61 73 65 22 27 0a 20 20 29  e database"'.  )
7360: 3b 0a 7d 5d 0a 0a 0a 5b 68 32 20 22 53 65 74 20  ;.}]...[h2 "Set 
7370: 4f 70 65 72 61 74 69 6f 6e 73 20 55 73 69 6e 67  Operations Using
7380: 20 54 68 65 20 53 74 61 6e 64 61 72 64 20 51 75   The Standard Qu
7390: 65 72 79 20 53 79 6e 74 61 78 22 5d 0a 0a 3c 70  ery Syntax"]..<p
73a0: 3e 0a 20 20 46 54 53 33 20 71 75 65 72 79 20 73  >.  FTS3 query s
73b0: 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 75 73  et operations us
73c0: 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72 64  ing the standard
73d0: 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 61 72   query syntax ar
73e0: 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 0a 20  e similar, but. 
73f0: 20 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 2c 20   not identical, 
7400: 74 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e  to set operation
7410: 73 20 77 69 74 68 20 74 68 65 20 65 6e 68 61 6e  s with the enhan
7420: 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78  ced query syntax
7430: 2e 20 54 68 65 72 65 0a 20 20 61 72 65 20 66 6f  . There.  are fo
7440: 75 72 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  ur differences, 
7450: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c  as follows:..<ol
7460: 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 31 3e  >.  <li value=1>
7470: 3c 70 3e 20 4f 6e 6c 79 20 74 68 65 20 69 6d 70  <p> Only the imp
7480: 6c 69 63 69 74 20 76 65 72 73 69 6f 6e 20 6f 66  licit version of
7490: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
74a0: 72 20 69 73 20 73 75 70 70 6f 72 74 65 64 2e 0a  r is supported..
74b0: 20 20 20 20 53 70 65 63 69 66 79 69 6e 67 20 74      Specifying t
74c0: 68 65 20 73 74 72 69 6e 67 20 22 41 4e 44 22 20  he string "AND" 
74d0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 73 74  as part of an st
74e0: 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e  andard query syn
74f0: 74 61 78 20 71 75 65 72 79 20 69 73 0a 20 20 20  tax query is.   
7500: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
7510: 61 20 74 65 72 6d 20 71 75 65 72 79 20 66 6f 72  a term query for
7520: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
7530: 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  ments containing
7540: 20 74 68 65 20 74 65 72 6d 20 0a 20 20 20 20 22   the term .    "
7550: 61 6e 64 22 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c  and"..</ol>..<ol
7560: 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 32 3e  >.  <li value=2>
7570: 3c 70 3e 20 50 61 72 65 6e 74 68 65 73 69 73 20  <p> Parenthesis 
7580: 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  are not supporte
7590: 64 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c 3e 0a 20  d..</ol>..<ol>. 
75a0: 20 3c 6c 69 20 76 61 6c 75 65 3d 33 3e 3c 70 3e   <li value=3><p>
75b0: 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61 74 6f   The NOT operato
75c0: 72 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  r is not support
75d0: 65 64 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 74  ed. Instead of t
75e0: 68 65 20 4e 4f 54 20 0a 20 20 20 20 6f 70 65 72  he NOT .    oper
75f0: 61 74 6f 72 2c 20 74 68 65 20 73 74 61 6e 64 61  ator, the standa
7600: 72 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20  rd query syntax 
7610: 73 75 70 70 6f 72 74 73 20 61 20 75 6e 61 72 79  supports a unary
7620: 20 22 2d 22 20 6f 70 65 72 61 74 6f 72 20 74 68   "-" operator th
7630: 61 74 0a 20 20 20 20 6d 61 79 20 62 65 20 61 70  at.    may be ap
7640: 70 6c 69 65 64 20 74 6f 20 62 61 73 69 63 20 74  plied to basic t
7650: 65 72 6d 20 61 6e 64 20 74 65 72 6d 2d 70 72 65  erm and term-pre
7660: 66 69 78 20 71 75 65 72 69 65 73 20 28 62 75 74  fix queries (but
7670: 20 6e 6f 74 20 74 6f 20 70 68 72 61 73 65 0a 20   not to phrase. 
7680: 20 20 20 6f 72 20 4e 45 41 52 20 71 75 65 72 69     or NEAR queri
7690: 65 73 29 2e 20 41 20 74 65 72 6d 20 6f 72 20 74  es). A term or t
76a0: 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61 74 20  erm-prefix that 
76b0: 68 61 73 20 61 20 75 6e 61 72 79 20 22 2d 22 20  has a unary "-" 
76c0: 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 61 74 74  operator.    att
76d0: 61 63 68 65 64 20 74 6f 20 69 74 20 6d 61 79 20  ached to it may 
76e0: 6e 6f 74 20 61 70 70 65 61 72 20 61 73 20 61 6e  not appear as an
76f0: 20 6f 70 65 72 61 6e 64 20 74 6f 20 61 6e 20 4f   operand to an O
7700: 52 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 20 46  R operator. An F
7710: 54 53 33 0a 20 20 20 20 71 75 65 72 79 20 6d 61  TS3.    query ma
7720: 79 20 6e 6f 74 20 63 6f 6e 73 69 73 74 20 65 6e  y not consist en
7730: 74 69 72 65 6c 79 20 6f 66 20 74 65 72 6d 73 20  tirely of terms 
7740: 6f 72 20 74 65 72 6d 2d 70 72 65 66 69 78 20 71  or term-prefix q
7750: 75 65 72 69 65 73 20 77 69 74 68 20 75 6e 61 72  ueries with unar
7760: 79 0a 20 20 20 20 22 2d 22 20 6f 70 65 72 61 74  y.    "-" operat
7770: 6f 72 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  ors attached to 
7780: 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 5b 43 6f  them..</ol>..[Co
7790: 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 53 65 61  de {.  <i>-- Sea
77a0: 72 63 68 20 66 6f 72 20 74 68 65 20 73 65 74 20  rch for the set 
77b0: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
77c0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  t contain the te
77d0: 72 6d 20 22 73 71 6c 69 74 65 22 20 62 75 74 20  rm "sqlite" but 
77e0: 64 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e  do</i>.  <i>-- n
77f0: 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  ot contain the t
7800: 65 72 6d 20 22 64 61 74 61 62 61 73 65 22 2e 3c  erm "database".<
7810: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
7820: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
7830: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
7840: 65 20 2d 64 61 74 61 62 61 73 65 27 3b 0a 7d 5d  e -database';.}]
7850: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
7860: 75 65 3d 34 3e 3c 70 3e 20 54 68 65 20 72 65 6c  ue=4><p> The rel
7870: 61 74 69 76 65 20 70 72 65 63 65 64 65 6e 63 65  ative precedence
7880: 20 6f 66 20 74 68 65 20 73 65 74 20 6f 70 65 72   of the set oper
7890: 61 74 69 6f 6e 73 20 69 73 20 64 69 66 66 65 72  ations is differ
78a0: 65 6e 74 2e 20 54 68 65 0a 20 20 20 70 72 65 63  ent. The.   prec
78b0: 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74  edence of operat
78c0: 6f 72 73 20 77 68 65 6e 20 75 73 69 6e 67 20 74  ors when using t
78d0: 68 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72  he standard quer
78e0: 79 20 73 79 6e 74 61 78 20 69 73 3a 0a 3c 2f 6f  y syntax is:.</o
78f0: 6c 3e 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54  l>..[Table].  [T
7900: 72 5d 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74  r]<th>Operator<t
7910: 68 3e 53 74 61 6e 64 61 72 64 20 51 75 65 72 79  h>Standard Query
7920: 20 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e   Syntax Preceden
7930: 63 65 0a 20 20 5b 54 72 5d 3c 74 64 3e 55 6e 61  ce.  [Tr]<td>Una
7940: 72 79 20 22 2d 22 20 3c 74 64 3e 20 48 69 67 68  ry "-" <td> High
7950: 65 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28  est precedence (
7960: 74 69 67 68 74 65 73 74 20 67 72 6f 75 70 69 6e  tightest groupin
7970: 67 29 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 4f 52  g)..  [Tr]<td>OR
7980: 20 20 3c 74 64 3e 0a 20 20 5b 54 72 5d 3c 74 64    <td>.  [Tr]<td
7990: 3e 41 4e 44 20 3c 74 64 3e 20 4c 6f 77 65 73 74  >AND <td> Lowest
79a0: 20 70 72 65 63 65 64 65 6e 63 65 20 28 6c 6f 6f   precedence (loo
79b0: 73 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a  sest grouping)..
79c0: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 6f 6c 3e 3c 6c  </table>..<ol><l
79d0: 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74  i style="list-st
79e0: 79 6c 65 3a 6e 6f 6e 65 22 3e 0a 20 20 54 68 65  yle:none">.  The
79f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70   following examp
7a00: 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 70  le illustrates p
7a10: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65  recedence of ope
7a20: 72 61 74 6f 72 73 20 75 73 69 6e 67 20 74 68 65  rators using the
7a30: 20 73 74 61 6e 64 61 72 64 20 0a 20 20 71 75 65   standard .  que
7a40: 72 79 20 73 79 6e 74 61 78 3a 0a 3c 2f 6f 6c 3e  ry syntax:.</ol>
7a50: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
7a60: 2d 20 53 65 61 72 63 68 20 66 6f 72 20 64 6f 63  - Search for doc
7a70: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
7a80: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
7a90: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 22  e of the terms "
7aa0: 64 61 74 61 62 61 73 65 22 3c 2f 69 3e 0a 20 20  database"</i>.  
7ab0: 3c 69 3e 2d 2d 20 61 6e 64 20 22 73 71 6c 69 74  <i>-- and "sqlit
7ac0: 65 22 2c 20 61 6e 64 20 61 6c 73 6f 20 63 6f 6e  e", and also con
7ad0: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 20 22  tains the term "
7ae0: 6c 69 62 72 61 72 79 22 2e 20 42 65 63 61 75 73  library". Becaus
7af0: 65 20 6f 66 20 74 68 65 20 64 69 66 66 65 72 65  e of the differe
7b00: 6e 63 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  nces</i>.  <i>--
7b10: 20 69 6e 20 6f 70 65 72 61 74 6f 72 20 70 72 65   in operator pre
7b20: 63 65 64 65 6e 63 65 73 2c 20 74 68 69 73 20 71  cedences, this q
7b30: 75 65 72 79 20 77 6f 75 6c 64 20 68 61 76 65 20  uery would have 
7b40: 61 20 64 69 66 66 65 72 65 6e 74 20 69 6e 74 65  a different inte
7b50: 72 70 72 65 74 61 74 69 6f 6e 20 75 73 69 6e 67  rpretation using
7b60: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
7b70: 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20   enhanced query 
7b80: 73 79 6e 74 61 78 2e 3c 2f 69 3e 0a 20 20 53 45  syntax.</i>.  SE
7b90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
7ba0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
7bb0: 48 20 27 73 71 6c 69 74 65 20 4f 52 20 64 61 74  H 'sqlite OR dat
7bc0: 61 62 61 73 65 20 6c 69 62 72 61 72 79 27 3b 0a  abase library';.
7bd0: 7d 5d 0a 0a 5b 68 31 20 22 41 75 78 69 6c 6c 61  }]..[h1 "Auxilla
7be0: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 53  ry functions - S
7bf0: 6e 69 70 70 65 74 73 20 61 6e 64 20 4f 66 66 73  nippets and Offs
7c00: 65 74 73 22 20 7b 7d 20 73 6e 69 70 70 65 74 73  ets" {} snippets
7c10: 20 6f 66 66 73 65 74 73 5d 0a 0a 5b 68 31 20 22   offsets]..[h1 "
7c20: 54 6f 6b 65 6e 69 7a 65 72 73 22 20 74 6f 6b 65  Tokenizers" toke
7c30: 6e 69 7a 65 72 20 7b 74 6f 6b 65 6e 69 7a 65 72  nizer {tokenizer
7c40: 7d 5d 0a 0a 3c 70 3e 0a 20 20 41 6e 20 46 54 53  }]..<p>.  An FTS
7c50: 33 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 61  3 tokenizer is a
7c60: 20 73 65 74 20 6f 66 20 72 75 6c 65 73 20 66 6f   set of rules fo
7c70: 72 20 65 78 74 72 61 63 74 69 6e 67 20 74 65 72  r extracting ter
7c80: 6d 73 20 66 72 6f 6d 20 61 20 64 6f 63 75 6d 65  ms from a docume
7c90: 6e 74 20 0a 20 20 6f 72 20 62 61 73 69 63 20 46  nt .  or basic F
7ca0: 54 53 33 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  TS3 full-text qu
7cb0: 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e 6c  ery. ..<p>.  Unl
7cc0: 65 73 73 20 61 20 73 70 65 63 69 66 69 63 20 74  ess a specific t
7cd0: 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 70 65 63  okenizer is spec
7ce0: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
7cf0: 20 74 68 65 20 43 52 45 41 54 45 20 0a 20 20 56   the CREATE .  V
7d00: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61  IRTUAL TABLE sta
7d10: 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 63  tement used to c
7d20: 72 65 61 74 65 20 74 68 65 20 46 54 53 33 20 74  reate the FTS3 t
7d30: 61 62 6c 65 2c 20 74 68 65 20 64 65 66 61 75 6c  able, the defaul
7d40: 74 20 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  t .  tokenizer, 
7d50: 22 73 69 6d 70 6c 65 22 2c 20 69 73 20 75 73 65  "simple", is use
7d60: 64 2e 20 54 68 65 20 73 69 6d 70 6c 65 20 74 6f  d. The simple to
7d70: 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73  kenizer extracts
7d80: 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20 20 61   tokens from.  a
7d90: 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20 62 61 73   document or bas
7da0: 69 63 20 46 54 53 33 20 66 75 6c 6c 2d 74 65 78  ic FTS3 full-tex
7db0: 74 20 71 75 65 72 79 20 61 63 63 6f 72 64 69 6e  t query accordin
7dc0: 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
7dd0: 6e 67 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c 75  ng .  rules:..<u
7de0: 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74  l>.  <li><p> A t
7df0: 65 72 6d 20 69 73 20 61 20 63 6f 6e 74 69 67 75  erm is a contigu
7e00: 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ous sequence of 
7e10: 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74  eligible charact
7e20: 65 72 73 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ers, where .    
7e30: 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74  eligible charact
7e40: 65 72 73 20 61 72 65 20 61 6c 6c 20 61 6c 70 68  ers are all alph
7e50: 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74  anumeric charact
7e60: 65 72 73 2c 20 74 68 65 20 22 5f 22 20 63 68 61  ers, the "_" cha
7e70: 72 61 63 74 65 72 2c 0a 20 20 20 20 61 6e 64 20  racter,.    and 
7e80: 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 77  all characters w
7e90: 69 74 68 20 55 54 46 20 63 6f 64 65 70 6f 69 6e  ith UTF codepoin
7ea0: 74 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ts greater than 
7eb0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 31 32 38 2e  or equal to 128.
7ec0: 0a 20 20 20 20 41 6c 6c 20 6f 74 68 65 72 20 63  .    All other c
7ed0: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 64 69  haracters are di
7ee0: 73 63 61 72 64 65 64 20 77 68 65 6e 20 73 70 6c  scarded when spl
7ef0: 69 74 74 69 6e 67 20 61 20 64 6f 63 75 6d 65 6e  itting a documen
7f00: 74 20 69 6e 74 6f 20 74 65 72 6d 73 2e 0a 20 20  t into terms..  
7f10: 20 20 54 68 65 79 20 73 65 72 76 65 20 6f 6e 6c    They serve onl
7f20: 79 20 74 6f 20 73 65 70 61 72 61 74 65 20 61 64  y to separate ad
7f30: 6a 61 63 65 6e 74 20 74 65 72 6d 73 2e 0a 0a 20  jacent terms... 
7f40: 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c 20 75 70 70   <li><p> All upp
7f50: 65 72 63 61 73 65 20 63 68 61 72 61 63 74 65 72  ercase character
7f60: 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 53 43  s within the ASC
7f70: 49 49 20 72 61 6e 67 65 20 28 55 54 46 20 63 6f  II range (UTF co
7f80: 64 65 70 6f 69 6e 74 73 20 6c 65 73 73 20 0a 20  depoints less . 
7f90: 20 20 20 74 68 61 6e 20 31 32 38 29 2c 20 61 72     than 128), ar
7fa0: 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  e transformed to
7fb0: 20 74 68 65 69 72 20 6c 6f 77 65 72 63 61 73 65   their lowercase
7fc0: 20 65 71 75 69 76 61 6c 65 6e 74 73 20 61 73 20   equivalents as 
7fd0: 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
7fe0: 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 70 72 6f  tokenization pro
7ff0: 63 65 73 73 2e 20 54 68 75 73 2c 20 66 75 6c 6c  cess. Thus, full
8000: 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 61 72  -text queries ar
8010: 65 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  e case-insensiti
8020: 76 65 20 77 68 65 6e 0a 20 20 20 20 75 73 69 6e  ve when.    usin
8030: 67 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b  g the simple tok
8040: 65 6e 69 7a 65 72 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  enizer..</ul>..<
8050: 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  p>.  For example
8060: 2c 20 77 68 65 6e 20 61 20 64 6f 63 75 6d 65 6e  , when a documen
8070: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
8080: 20 74 65 78 74 20 22 52 69 67 68 74 20 6e 6f 77   text "Right now
8090: 2c 20 74 68 65 79 27 72 65 20 76 65 72 79 0a 20  , they're very. 
80a0: 20 66 72 75 73 74 72 61 74 65 64 2e 22 2c 20 74   frustrated.", t
80b0: 68 65 20 74 65 72 6d 73 20 65 78 74 72 61 63 74  he terms extract
80c0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75  ed from the docu
80d0: 6d 65 6e 74 20 61 6e 64 20 61 64 64 65 64 20 74  ment and added t
80e0: 6f 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65  o the .  full-te
80f0: 78 74 20 69 6e 64 65 78 20 61 72 65 2c 20 69 6e  xt index are, in
8100: 20 6f 72 64 65 72 2c 20 22 72 69 67 68 74 20 6e   order, "right n
8110: 6f 77 20 74 68 65 79 20 72 65 20 76 65 72 79 20  ow they re very 
8120: 66 72 75 73 74 72 61 74 65 64 22 2e 20 53 75 63  frustrated". Suc
8130: 68 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 77  h.  a document w
8140: 6f 75 6c 64 20 6d 61 74 63 68 20 61 20 66 75 6c  ould match a ful
8150: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 75 63  l-text query suc
8160: 68 20 61 73 20 22 4d 41 54 43 48 20 27 46 72 75  h as "MATCH 'Fru
8170: 73 74 72 61 74 65 64 27 22 2c 20 0a 20 20 61 73  strated'", .  as
8180: 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65   the simple toke
8190: 6e 69 7a 65 72 20 74 72 61 6e 73 66 6f 72 6d 73  nizer transforms
81a0: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
81b0: 20 71 75 65 72 79 20 74 6f 20 6c 6f 77 65 72 63   query to lowerc
81c0: 61 73 65 0a 20 20 62 65 66 6f 72 65 20 73 65 61  ase.  before sea
81d0: 72 63 68 69 6e 67 20 74 68 65 20 66 75 6c 6c 2d  rching the full-
81e0: 74 65 78 74 20 69 6e 64 65 78 2e 0a 0a 3c 70 3e  text index...<p>
81f0: 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  .  As well as th
8200: 65 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e  e "simple" token
8210: 69 7a 65 72 2c 20 74 68 65 20 46 54 53 33 20 73  izer, the FTS3 s
8220: 6f 75 72 63 65 20 63 6f 64 65 20 66 65 61 74 75  ource code featu
8230: 72 65 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20  res a tokenizer 
8240: 0a 20 20 74 68 61 74 20 75 73 65 73 20 74 68 65  .  that uses the
8250: 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f   <a href="http:/
8260: 2f 74 61 72 74 61 72 75 73 2e 6f 72 67 2f 7e 6d  /tartarus.org/~m
8270: 61 72 74 69 6e 2f 50 6f 72 74 65 72 53 74 65 6d  artin/PorterStem
8280: 6d 65 72 2f 22 3e 50 6f 72 74 65 72 20 0a 20 20  mer/">Porter .  
8290: 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72 69 74  Stemming algorit
82a0: 68 6d 3c 2f 61 3e 2e 20 54 68 69 73 20 74 6f 6b  hm</a>. This tok
82b0: 65 6e 69 7a 65 72 20 75 73 65 73 20 74 68 65 20  enizer uses the 
82c0: 73 61 6d 65 20 72 75 6c 65 73 20 74 6f 20 73 65  same rules to se
82d0: 70 61 72 61 74 65 0a 20 20 74 68 65 20 69 6e 70  parate.  the inp
82e0: 75 74 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f  ut document into
82f0: 20 74 65 72 6d 73 2c 20 62 75 74 20 61 73 20 77   terms, but as w
8300: 65 6c 6c 20 61 73 20 66 6f 6c 64 69 6e 67 20 61  ell as folding a
8310: 6c 6c 20 74 65 72 6d 73 20 74 6f 20 6c 6f 77 65  ll terms to lowe
8320: 72 0a 20 20 63 61 73 65 20 69 74 20 75 73 65 73  r.  case it uses
8330: 20 74 68 65 20 50 6f 72 74 65 72 20 53 74 65 6d   the Porter Stem
8340: 6d 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 20 74  ming algorithm t
8350: 6f 20 72 65 64 75 63 65 20 72 65 6c 61 74 65 64  o reduce related
8360: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
8370: 65 0a 20 20 77 6f 72 64 73 20 74 6f 20 61 20 63  e.  words to a c
8380: 6f 6d 6d 6f 6e 20 72 6f 6f 74 2e 20 46 6f 72 20  ommon root. For 
8390: 65 78 61 6d 70 6c 65 2c 20 75 73 69 6e 67 20 74  example, using t
83a0: 68 65 20 73 61 6d 65 20 69 6e 70 75 74 20 64 6f  he same input do
83b0: 63 75 6d 65 6e 74 20 61 73 20 69 6e 20 74 68 65  cument as in the
83c0: 0a 20 20 70 61 72 61 67 72 61 70 68 20 61 62 6f  .  paragraph abo
83d0: 76 65 2c 20 74 68 65 20 70 6f 72 74 65 72 20 74  ve, the porter t
83e0: 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74  okenizer extract
83f0: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
8400: 74 6f 6b 65 6e 73 3a 0a 20 20 22 72 69 67 68 74  tokens:.  "right
8410: 20 6e 6f 77 20 74 68 65 69 20 76 65 72 69 20 66   now thei veri f
8420: 72 75 73 74 72 61 74 22 2e 20 45 76 65 6e 20 74  rustrat". Even t
8430: 68 6f 75 67 68 20 73 6f 6d 65 20 6f 66 20 74 68  hough some of th
8440: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e 6f  ese terms are no
8450: 74 20 65 76 65 6e 0a 20 20 45 6e 67 6c 69 73 68  t even.  English
8460: 20 77 6f 72 64 73 2c 20 69 6e 20 73 6f 6d 65 20   words, in some 
8470: 63 61 73 65 73 20 75 73 69 6e 67 20 74 68 65 6d  cases using them
8480: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 66 75   to build the fu
8490: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73  ll-text index is
84a0: 20 6d 6f 72 65 0a 20 20 75 73 65 66 75 6c 20 74   more.  useful t
84b0: 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 69 6e 74  han the more int
84c0: 65 6c 6c 69 67 62 6c 65 20 6f 75 74 70 75 74 20  elligble output 
84d0: 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20  produced by the 
84e0: 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72  simple tokenizer
84f0: 2e 0a 20 20 55 73 69 6e 67 20 74 68 65 20 70 6f  ..  Using the po
8500: 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  rter tokenizer, 
8510: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 6e 6f 74  the document not
8520: 20 6f 6e 6c 79 20 6d 61 74 63 68 65 73 20 66 75   only matches fu
8530: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 0a  ll-text queries.
8540: 20 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48    such as "MATCH
8550: 20 27 46 72 75 73 74 72 61 74 65 64 27 22 2c 20   'Frustrated'", 
8560: 62 75 74 20 61 6c 73 6f 20 71 75 65 72 69 65 73  but also queries
8570: 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48 20   such as "MATCH 
8580: 27 46 72 75 73 74 72 61 74 69 6f 6e 27 22 2c 0a  'Frustration'",.
8590: 20 20 61 73 20 74 68 65 20 74 65 72 6d 20 22 46    as the term "F
85a0: 72 75 73 74 72 61 74 69 6f 6e 22 20 69 73 20 72  rustration" is r
85b0: 65 64 75 63 65 64 20 62 79 20 74 68 65 20 50 6f  educed by the Po
85c0: 72 74 65 72 20 73 74 65 6d 6d 65 72 20 61 6c 67  rter stemmer alg
85d0: 6f 72 69 74 68 6d 20 74 6f 20 0a 20 20 22 66 72  orithm to .  "fr
85e0: 75 73 74 72 61 74 22 20 2d 20 6a 75 73 74 20 61  ustrat" - just a
85f0: 73 20 22 46 72 75 73 74 72 61 74 65 64 22 20 69  s "Frustrated" i
8600: 73 2e 20 53 6f 2c 20 77 68 65 6e 20 75 73 69 6e  s. So, when usin
8610: 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b  g the porter tok
8620: 65 6e 69 7a 65 72 2c 0a 20 20 46 54 53 33 20 69  enizer,.  FTS3 i
8630: 73 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 6e  s able to find n
8640: 6f 74 20 6a 75 73 74 20 65 78 61 63 74 20 6d 61  ot just exact ma
8650: 74 63 68 65 73 20 66 6f 72 20 71 75 65 72 69 65  tches for querie
8660: 64 20 74 65 72 6d 73 2c 20 62 75 74 20 6d 61 74  d terms, but mat
8670: 63 68 65 73 0a 20 20 61 67 61 69 6e 73 74 20 73  ches.  against s
8680: 69 6d 69 6c 61 72 20 45 6e 67 6c 69 73 68 20 6c  imilar English l
8690: 61 6e 67 75 61 67 65 20 74 65 72 6d 73 2e 20 46  anguage terms. F
86a0: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  or more informat
86b0: 69 6f 6e 20 6f 6e 20 74 68 65 20 0a 20 20 50 6f  ion on the .  Po
86c0: 72 74 65 72 20 53 74 65 6d 6d 65 72 20 61 6c 67  rter Stemmer alg
86d0: 6f 72 69 74 68 6d 2c 20 70 6c 65 61 73 65 20 72  orithm, please r
86e0: 65 66 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  efer to the page
86f0: 20 6c 69 6e 6b 65 64 20 61 62 6f 76 65 2e 0a 0a   linked above...
8700: 3c 70 3e 0a 20 20 45 78 61 6d 70 6c 65 20 69 6c  <p>.  Example il
8710: 6c 75 73 74 72 61 74 69 6e 67 20 74 68 65 20 64  lustrating the d
8720: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
8730: 6e 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20 61  n the "simple" a
8740: 6e 64 20 22 70 6f 72 74 65 72 22 0a 20 20 74 6f  nd "porter".  to
8750: 6b 65 6e 69 7a 65 72 73 3a 0a 0a 5b 43 6f 64 65  kenizers:..[Code
8760: 20 7b 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74   {.  <i>-- Creat
8770: 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  e a table using 
8780: 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e  the simple token
8790: 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 61 20 64  izer. Insert a d
87a0: 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e  ocument into it.
87b0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
87c0: 52 54 55 41 4c 20 54 41 42 4c 45 20 73 69 6d 70  RTUAL TABLE simp
87d0: 6c 65 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f  le USING fts3(to
87e0: 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a  kenize=simple);.
87f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 69    INSERT INTO si
8800: 6d 70 6c 65 20 56 41 4c 55 45 53 28 27 52 69 67  mple VALUES('Rig
8810: 68 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20  ht now they''re 
8820: 76 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27  very frustrated'
8830: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  );..  <i>-- The 
8840: 66 69 72 73 74 20 6f 66 20 74 68 65 20 66 6f 6c  first of the fol
8850: 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69  lowing two queri
8860: 65 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 64  es matches the d
8870: 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69  ocument stored i
8880: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
8890: 62 6c 65 20 22 73 69 6d 70 6c 65 22 2e 20 54 68  ble "simple". Th
88a0: 65 20 73 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f  e second does no
88b0: 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  t.</i>.  SELECT 
88c0: 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48  * FROM simple WH
88d0: 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48  ERE simple MATCH
88e0: 20 27 46 72 75 73 74 72 61 74 65 64 27 29 3b 0a   'Frustrated');.
88f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
8900: 73 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d  simple WHERE sim
8910: 70 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73 74  ple MATCH 'Frust
8920: 72 61 74 69 6f 6e 27 29 3b 0a 0a 20 20 3c 69 3e  ration');..  <i>
8930: 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61 62 6c  -- Create a tabl
8940: 65 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74  e using the port
8950: 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e  er tokenizer. In
8960: 73 65 72 74 20 74 68 65 20 73 61 6d 65 20 64 6f  sert the same do
8970: 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 3c 2f  cument into it</
8980: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
8990: 55 41 4c 20 54 41 42 4c 45 20 70 6f 72 74 65 72  UAL TABLE porter
89a0: 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65   USING fts3(toke
89b0: 6e 69 7a 65 3d 70 6f 72 74 65 72 29 3b 0a 20 20  nize=porter);.  
89c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 6f 72 74  INSERT INTO port
89d0: 65 72 20 56 41 4c 55 45 53 28 27 52 69 67 68 74  er VALUES('Right
89e0: 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76 65   now they''re ve
89f0: 72 79 20 66 72 75 73 74 72 61 74 65 64 27 29 3b  ry frustrated');
8a00: 0a 0a 20 20 3c 69 3e 2d 2d 20 42 6f 74 68 20 6f  ..  <i>-- Both o
8a10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8a20: 71 75 65 72 69 65 73 20 6d 61 74 63 68 20 74 68  queries match th
8a30: 65 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65  e document store
8a40: 64 20 69 6e 20 74 61 62 6c 65 20 22 70 6f 72 74  d in table "port
8a50: 65 72 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  er".</i>.  SELEC
8a60: 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20  T * FROM porter 
8a70: 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54  WHERE porter MAT
8a80: 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27 29  CH 'Frustrated')
8a90: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
8aa0: 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70  M porter WHERE p
8ab0: 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75  orter MATCH 'Fru
8ac0: 73 74 72 61 74 69 6f 6e 27 29 3b 0a 7d 5d 0a 0a  stration');.}]..
8ad0: 3c 70 3e 0a 20 20 49 66 20 74 68 69 73 20 65 78  <p>.  If this ex
8ae0: 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69  tension is compi
8af0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
8b00: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 20 70  ITE_ENABLE_ICU p
8b10: 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a 20 20 73  re-processor.  s
8b20: 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2c 20 74  ymbol defined, t
8b30: 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
8b40: 20 61 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65   a built-in toke
8b50: 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22 69 63 75  nizer named "icu
8b60: 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ".  implemented 
8b70: 75 73 69 6e 67 20 74 68 65 20 49 43 55 20 6c 69  using the ICU li
8b80: 62 72 61 72 79 2e 20 54 68 65 20 66 69 72 73 74  brary. The first
8b90: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
8ba0: 20 74 6f 20 74 68 65 0a 20 20 78 43 72 65 61 74   to the.  xCreat
8bb0: 65 28 29 20 6d 65 74 68 6f 64 20 28 73 65 65 20  e() method (see 
8bc0: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68  fts3_tokenizer.h
8bd0: 29 20 6f 66 20 74 68 69 73 20 74 6f 6b 65 6e 69  ) of this tokeni
8be0: 7a 65 72 20 6d 61 79 20 62 65 0a 20 20 61 6e 20  zer may be.  an 
8bf0: 49 43 55 20 6c 6f 63 61 6c 65 20 69 64 65 6e 74  ICU locale ident
8c00: 69 66 69 65 72 2e 20 46 6f 72 20 65 78 61 6d 70  ifier. For examp
8c10: 6c 65 20 22 74 72 5f 54 52 22 20 66 6f 72 20 54  le "tr_TR" for T
8c20: 75 72 6b 69 73 68 20 61 73 20 75 73 65 64 0a 20  urkish as used. 
8c30: 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f 72 20 22   in Turkey, or "
8c40: 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e 67 6c 69  en_AU" for Engli
8c50: 73 68 20 61 73 20 75 73 65 64 20 69 6e 20 41 75  sh as used in Au
8c60: 73 74 72 61 6c 69 61 2e 20 46 6f 72 20 65 78 61  stralia. For exa
8c70: 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20  mple:..[Code {. 
8c80: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
8c90: 4c 20 54 41 42 4c 45 20 74 68 61 69 5f 74 65 78  L TABLE thai_tex
8ca0: 74 20 55 53 49 4e 47 20 66 74 73 33 28 74 65 78  t USING fts3(tex
8cb0: 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20  t, tokenize=icu 
8cc0: 74 68 5f 54 48 29 0a 7d 5d 0a 0a 3c 70 3e 0a 20  th_TH).}]..<p>. 
8cd0: 20 54 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a   The ICU tokeniz
8ce0: 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
8cf0: 6e 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65  n is very simple
8d00: 2e 20 49 74 20 73 70 6c 69 74 73 20 74 68 65 20  . It splits the 
8d10: 69 6e 70 75 74 0a 20 20 74 65 78 74 20 61 63 63  input.  text acc
8d20: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 49 43  ording to the IC
8d30: 55 20 72 75 6c 65 73 20 66 6f 72 20 66 69 6e 64  U rules for find
8d40: 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61 72  ing word boundar
8d50: 69 65 73 20 61 6e 64 20 64 69 73 63 61 72 64 73  ies and discards
8d60: 0a 20 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74 68  .  any tokens th
8d70: 61 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72  at consist entir
8d80: 65 6c 79 20 6f 66 20 77 68 69 74 65 2d 73 70 61  ely of white-spa
8d90: 63 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  ce. This may be 
8da0: 73 75 69 74 61 62 6c 65 0a 20 20 66 6f 72 20 73  suitable.  for s
8db0: 6f 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ome applications
8dc0: 20 69 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73   in some locales
8dd0: 2c 20 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20 49  , but not all. I
8de0: 66 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a 20  f more complex. 
8df0: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
8e00: 65 71 75 69 72 65 64 2c 20 66 6f 72 20 65 78 61  equired, for exa
8e10: 6d 70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  mple to implemen
8e20: 74 20 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20 20  t stemming or.  
8e30: 64 69 73 63 61 72 64 20 70 75 6e 63 74 75 61 74  discard punctuat
8e40: 69 6f 6e 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ion, this can be
8e50: 20 64 6f 6e 65 20 62 79 20 63 72 65 61 74 69 6e   done by creatin
8e60: 67 20 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20  g a tokenizer.  
8e70: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
8e80: 68 61 74 20 75 73 65 73 20 74 68 65 20 49 43 55  hat uses the ICU
8e90: 20 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70 61   tokenizer as pa
8ea0: 72 74 20 6f 66 20 69 74 73 20 69 6d 70 6c 65 6d  rt of its implem
8eb0: 65 6e 74 61 74 69 6f 6e 2e 0a 0a 5b 68 32 20 22  entation...[h2 "
8ec0: 43 75 73 74 6f 6d 20 28 55 73 65 72 20 49 6d 70  Custom (User Imp
8ed0: 6c 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69  lemented) Tokeni
8ee0: 7a 65 72 73 22 5d 0a 0a 3c 70 3e 0a 20 20 41 73  zers"]..<p>.  As
8ef0: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 75 69   well as the bui
8f00: 6c 74 2d 69 6e 20 22 73 69 6d 70 6c 65 22 2c 20  lt-in "simple", 
8f10: 22 70 6f 72 74 65 72 22 20 61 6e 64 20 28 70 6f  "porter" and (po
8f20: 73 73 69 62 6c 79 29 20 22 69 63 75 22 20 74 6f  ssibly) "icu" to
8f30: 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 46 54 53 33  kenizers,.  FTS3
8f40: 20 65 78 70 6f 72 74 73 20 61 6e 20 69 6e 74 65   exports an inte
8f50: 72 66 61 63 65 20 74 68 61 74 20 61 6c 6c 6f 77  rface that allow
8f60: 73 20 75 73 65 72 73 20 74 6f 20 69 6d 70 6c 65  s users to imple
8f70: 6d 65 6e 74 20 63 75 73 74 6f 6d 20 74 6f 6b 65  ment custom toke
8f80: 6e 69 7a 65 72 73 0a 20 20 75 73 69 6e 67 20 43  nizers.  using C
8f90: 2e 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  . The interface 
8fa0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
8fb0: 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 69   new tokenizer i
8fc0: 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20 0a 20  s defined and . 
8fd0: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
8fe0: 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
8ff0: 2e 68 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a  .h source file..
9000: 0a 3c 70 3e 0a 20 20 52 65 67 69 73 74 65 72 69  .<p>.  Registeri
9010: 6e 67 20 61 20 6e 65 77 20 46 54 53 33 20 74 6f  ng a new FTS3 to
9020: 6b 65 6e 69 7a 65 72 20 69 73 20 73 69 6d 69 6c  kenizer is simil
9030: 61 72 20 74 6f 20 72 65 67 69 73 74 65 72 69 6e  ar to registerin
9040: 67 20 61 20 6e 65 77 0a 20 20 76 69 72 74 75 61  g a new.  virtua
9050: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77  l table module w
9060: 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68 65 20  ith SQLite. The 
9070: 75 73 65 72 20 70 61 73 73 65 73 20 61 20 70 6f  user passes a po
9080: 69 6e 74 65 72 20 74 6f 20 61 0a 20 20 73 74 72  inter to a.  str
9090: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
90a0: 67 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 76 61  g pointers to va
90b0: 72 69 6f 75 73 20 63 61 6c 6c 62 61 63 6b 20 66  rious callback f
90c0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  unctions that.  
90d0: 6d 61 6b 65 20 75 70 20 74 68 65 20 69 6d 70 6c  make up the impl
90e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
90f0: 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20  e new tokenizer 
9100: 74 79 70 65 2e 20 46 6f 72 20 74 6f 6b 65 6e 69  type. For tokeni
9110: 7a 65 72 73 2c 0a 20 20 74 68 65 20 73 74 72 75  zers,.  the stru
9120: 63 74 75 72 65 20 28 64 65 66 69 6e 65 64 20 69  cture (defined i
9130: 6e 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  n fts3_tokenizer
9140: 2e 68 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  .h) is called.  
9150: 22 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a  "sqlite3_tokeniz
9160: 65 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70 3e  er_module"...<p>
9170: 0a 20 20 46 54 53 33 20 64 6f 65 73 20 6e 6f 74  .  FTS3 does not
9180: 20 65 78 70 6f 73 65 20 61 20 43 2d 66 75 6e 63   expose a C-func
9190: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 72 73 20  tion that users 
91a0: 63 61 6c 6c 20 74 6f 20 72 65 67 69 73 74 65 72  call to register
91b0: 20 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a 65 72   new.  tokenizer
91c0: 20 74 79 70 65 73 20 77 69 74 68 20 61 20 64 61   types with a da
91d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49  tabase handle. I
91e0: 6e 73 74 65 61 64 2c 20 74 68 65 20 70 6f 69 6e  nstead, the poin
91f0: 74 65 72 20 6d 75 73 74 0a 20 20 62 65 20 65 6e  ter must.  be en
9200: 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20  coded as an SQL 
9210: 62 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64 20 70  blob value and p
9220: 61 73 73 65 64 20 74 6f 20 46 54 53 33 20 74 68  assed to FTS3 th
9230: 72 6f 75 67 68 20 74 68 65 20 53 51 4c 0a 20 20  rough the SQL.  
9240: 65 6e 67 69 6e 65 20 62 79 20 65 76 61 6c 75 61  engine by evalua
9250: 74 69 6e 67 20 61 20 73 70 65 63 69 61 6c 20 73  ting a special s
9260: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c 20  calar function, 
9270: 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28  "fts3_tokenizer(
9280: 29 22 2e 0a 20 20 54 68 65 20 66 74 73 33 5f 74  )"..  The fts3_t
9290: 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74  okenizer() funct
92a0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
92b0: 64 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77  d with one or tw
92c0: 6f 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20 61  o arguments,.  a
92d0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 43 6f 64  s follows:..[Cod
92e0: 65 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 66  e {.    SELECT f
92f0: 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c  ts3_tokenizer(&l
9300: 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65  t;tokenizer-name
9310: 26 67 74 3b 29 3b 0a 20 20 20 20 53 45 4c 45 43  &gt;);.    SELEC
9320: 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
9330: 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e  (&lt;tokenizer-n
9340: 61 6d 65 26 67 74 3b 2c 20 26 6c 74 3b 73 71 6c  ame&gt;, &lt;sql
9350: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
9360: 6f 64 75 6c 65 20 70 74 72 26 67 74 3b 29 3b 0a  odule ptr&gt;);.
9370: 7d 5d 0a 0a 3c 70 3e 0a 20 20 57 68 65 72 65 20  }]..<p>.  Where 
9380: 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e  <tokenizer-name>
9390: 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 64 65   is a string ide
93a0: 6e 74 69 66 79 69 6e 67 20 74 68 65 20 74 6f 6b  ntifying the tok
93b0: 65 6e 69 7a 65 72 20 61 6e 64 0a 20 20 3c 73 71  enizer and.  <sq
93c0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
93d0: 6d 6f 64 75 6c 65 20 70 74 72 3e 20 69 73 20 61  module ptr> is a
93e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
93f0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
9400: 5f 6d 6f 64 75 6c 65 0a 20 20 73 74 72 75 63 74  _module.  struct
9410: 75 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61  ure encoded as a
9420: 6e 20 53 51 4c 20 62 6c 6f 62 2e 20 49 66 20 74  n SQL blob. If t
9430: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
9440: 6e 74 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 20  nt is present,. 
9450: 20 69 74 20 69 73 20 72 65 67 69 73 74 65 72 65   it is registere
9460: 64 20 61 73 20 74 6f 6b 65 6e 69 7a 65 72 20 3c  d as tokenizer <
9470: 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20  tokenizer-name> 
9480: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 69 74  and a copy of it
9490: 0a 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  .  returned. If 
94a0: 6f 6e 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e  only one argumen
94b0: 74 20 69 73 20 70 61 73 73 65 64 2c 20 61 20 70  t is passed, a p
94c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
94d0: 6b 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d  kenizer.  implem
94e0: 65 6e 74 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  entation current
94f0: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73  ly registered as
9500: 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65   <tokenizer-name
9510: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  > is returned,. 
9520: 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c   encoded as a bl
9530: 6f 62 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75  ob. Or, if no su
9540: 63 68 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 69  ch tokenizer exi
9550: 73 74 73 2c 20 61 6e 20 53 51 4c 20 65 78 63 65  sts, an SQL exce
9560: 70 74 69 6f 6e 0a 20 20 28 65 72 72 6f 72 29 20  ption.  (error) 
9570: 69 73 20 72 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a  is raised...<p>.
9580: 20 20 3c 62 3e 53 45 43 55 52 49 54 59 20 57 41    <b>SECURITY WA
9590: 52 4e 49 4e 47 3c 2f 62 3e 3a 20 49 66 20 74 68  RNING</b>: If th
95a0: 65 20 66 74 73 33 20 65 78 74 65 6e 73 69 6f 6e  e fts3 extension
95b0: 20 69 73 20 75 73 65 64 20 69 6e 20 61 6e 20 65   is used in an e
95c0: 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 77 68 65  nvironment.  whe
95d0: 72 65 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d  re potentially m
95e0: 61 6c 69 63 69 6f 75 73 20 75 73 65 72 73 20 6d  alicious users m
95f0: 61 79 20 65 78 65 63 75 74 65 20 61 72 62 69 74  ay execute arbit
9600: 72 61 72 79 20 53 51 4c 2c 20 74 68 65 79 20 73  rary SQL, they s
9610: 68 6f 75 6c 64 20 0a 20 20 62 65 20 70 72 65 76  hould .  be prev
9620: 65 6e 74 65 64 20 66 72 6f 6d 20 69 6e 76 6f 6b  ented from invok
9630: 69 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b  ing the fts3_tok
9640: 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f  enizer() functio
9650: 6e 2c 20 70 6f 73 73 69 62 6c 79 20 75 73 69 6e  n, possibly usin
9660: 67 20 0a 20 20 74 68 65 20 5c 5b 73 71 6c 69 74  g .  the \[sqlit
9670: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
9680: 72 28 29 7c 61 75 74 68 6f 72 69 73 61 74 69 6f  r()|authorisatio
9690: 6e 20 63 61 6c 6c 62 61 63 6b 5c 5d 2e 0a 0a 3c  n callback\]...<
96a0: 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  p>.  The followi
96b0: 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e  ng block contain
96c0: 73 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20  s an example of 
96d0: 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 74 73 33  calling the fts3
96e0: 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 0a 20 20 66  _tokenizer().  f
96f0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 43 20 63  unction from C c
9700: 6f 64 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  ode:..[Code {.  
9710: 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69 73  <i>/*.  ** Regis
9720: 74 65 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20  ter a tokenizer 
9730: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
9740: 69 74 68 20 46 54 53 33 2e 0a 20 20 2a 2f 3c 2f  ith FTS3..  */</
9750: 69 3e 0a 20 20 69 6e 74 20 72 65 67 69 73 74 65  i>.  int registe
9760: 72 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20  rTokenizer(.    
9770: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20  sqlite3 *db,.   
9780: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
9790: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
97a0: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
97b0: 20 2a 70 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   *p.  ){.    int
97c0: 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
97d0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
97e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
97f0: 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 66 74 73  ql = "SELECT fts
9800: 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 2c 20 3f  3_tokenizer(?, ?
9810: 29 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  )";..    rc = sq
9820: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
9830: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
9840: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
9850: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9860: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9870: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
9880: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
9890: 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d  t(pStmt, 1, zNam
98a0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  e, -1, SQLITE_ST
98b0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
98c0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
98d0: 6d 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a 65 6f  mt, 2, &p, sizeo
98e0: 66 28 70 29 2c 20 53 51 4c 49 54 45 5f 53 54 41  f(p), SQLITE_STA
98f0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
9900: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
9910: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
9920: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9930: 74 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e 2f 2a  t);.  }..  <i>/*
9940: 0a 20 20 2a 2a 20 51 75 65 72 79 20 46 54 53 33  .  ** Query FTS3
9950: 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a   for the tokeniz
9960: 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
9970: 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 20  n named zName.. 
9980: 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71 75   */</i>.  int qu
9990: 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  eryTokenizer(.  
99a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
99b0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a     char *zName,.
99c0: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
99d0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
99e0: 6c 65 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20 20  le **pp.  ){.   
99f0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
9a00: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9a10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9a20: 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
9a30: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
9a40: 3f 29 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d 20  ?)";..    *pp = 
9a50: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
9a60: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
9a70: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
9a80: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
9a90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9aa0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
9ab0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  c;.    }..    sq
9ac0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
9ad0: 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c  pStmt, 1, zName,
9ae0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
9af0: 49 43 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  IC);.    if( SQL
9b00: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
9b10: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
9b20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b30: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
9b40: 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  tmt, 0)==SQLITE_
9b50: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
9b60: 6d 65 6d 63 70 79 28 70 70 2c 20 73 71 6c 69 74  memcpy(pp, sqlit
9b70: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
9b80: 53 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f 66  Stmt, 0), sizeof
9b90: 28 2a 70 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a  (*pp));.      }.
9ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
9bb0: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
9bc0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d  ze(pStmt);.  }.}
9bd0: 5d 0a 0a 20 20 0a 20 20 0a 0a 5b 68 31 20 22 44  ]..  .  ..[h1 "D
9be0: 61 74 61 20 53 74 72 75 63 74 75 72 65 73 22 20  ata Structures" 
9bf0: 7b 7d 20 7b 73 65 67 6d 65 6e 74 20 62 74 72 65  {} {segment btre
9c00: 65 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20  e}]..<p>.  This 
9c10: 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65  section describe
9c20: 73 20 61 74 20 61 20 68 69 67 68 2d 6c 65 76 65  s at a high-leve
9c30: 6c 20 74 68 65 20 77 61 79 20 74 68 65 20 46 54  l the way the FT
9c40: 53 33 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73  S3 module stores
9c50: 20 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e 64   its.  index and
9c60: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
9c70: 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
9c80: 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  <b>not necessary
9c90: 20 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20 75   to read or .  u
9ca0: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61  nderstand the ma
9cb0: 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20 73  terial in this s
9cc0: 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20  ection in order 
9cd0: 74 6f 20 75 73 65 20 46 54 53 33 3c 2f 62 3e 20  to use FTS3</b> 
9ce0: 69 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61  in an .  applica
9cf0: 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69  tion. However, i
9d00: 74 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20  t may be useful 
9d10: 74 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  to application d
9d20: 65 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70  evelopers attemp
9d30: 74 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79  ting .  to analy
9d40: 7a 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e  ze and understan
9d50: 64 20 46 54 53 33 20 70 65 72 66 6f 72 6d 61 6e  d FTS3 performan
9d60: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
9d70: 63 73 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f  cs, or to develo
9d80: 70 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c  pers .  contempl
9d90: 61 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e  ating enhancemen
9da0: 74 73 20 74 6f 20 74 68 65 20 65 78 69 73 74 69  ts to the existi
9db0: 6e 67 20 46 54 53 33 20 66 65 61 74 75 72 65 20  ng FTS3 feature 
9dc0: 73 65 74 2e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  set...<p>.  For 
9dd0: 65 61 63 68 20 46 54 53 33 20 76 69 72 74 75 61  each FTS3 virtua
9de0: 6c 20 74 61 62 6c 65 20 69 6e 20 61 20 64 61 74  l table in a dat
9df0: 61 62 61 73 65 2c 20 74 68 72 65 65 20 72 65 61  abase, three rea
9e00: 6c 20 28 6e 6f 6e 2d 76 69 72 74 75 61 6c 29 20  l (non-virtual) 
9e10: 74 61 62 6c 65 73 20 0a 20 20 61 72 65 20 63 72  tables .  are cr
9e20: 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 74  eated to store t
9e30: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
9e40: 74 61 2e 20 54 68 65 20 72 65 61 6c 20 74 61 62  ta. The real tab
9e50: 6c 65 73 20 61 72 65 20 6e 61 6d 65 64 20 22 25  les are named "%
9e60: 5f 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 25 5f  _content",.  "%_
9e70: 73 65 67 64 69 72 22 20 61 6e 64 20 22 25 5f 73  segdir" and "%_s
9e80: 65 67 6d 65 6e 74 73 22 2c 20 77 68 65 72 65 20  egments", where 
9e90: 22 25 22 20 69 73 20 72 65 70 6c 61 63 65 64 20  "%" is replaced 
9ea0: 62 79 20 74 68 65 20 6e 61 6d 65 20 73 75 70 70  by the name supp
9eb0: 6c 69 65 64 20 62 79 0a 20 20 74 68 65 20 75 73  lied by.  the us
9ec0: 65 72 20 66 6f 72 20 74 68 65 20 46 54 53 33 20  er for the FTS3 
9ed0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 0a  virtual table...
9ee0: 3c 70 3e 0a 20 20 54 68 65 20 6c 65 66 74 6d 6f  <p>.  The leftmo
9ef0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
9f00: 20 22 25 5f 63 6f 6e 74 65 6e 74 22 20 74 61 62   "%_content" tab
9f10: 6c 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  le is an INTEGER
9f20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65   PRIMARY KEY fie
9f30: 6c 64 0a 20 20 6e 61 6d 65 64 20 22 64 6f 63 69  ld.  named "doci
9f40: 64 22 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  d". Following th
9f50: 69 73 20 69 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e  is is one column
9f60: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
9f70: 20 6f 66 20 74 68 65 20 46 54 53 33 0a 20 20 76   of the FTS3.  v
9f80: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 73 20  irtual table as 
9f90: 64 65 63 6c 61 72 65 64 20 62 79 20 74 68 65 20  declared by the 
9fa0: 75 73 65 72 2c 20 6e 61 6d 65 64 20 62 79 20 70  user, named by p
9fb0: 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 63 6f  repending the co
9fc0: 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 73 75 70 70  lumn name.  supp
9fd0: 6c 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72  lied by the user
9fe0: 20 77 69 74 68 20 22 63 3c 69 3e 4e 3c 2f 69 3e   with "c<i>N</i>
9ff0: 22 2c 20 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69  ", where <i>N</i
a000: 3e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  > is the index o
a010: 66 20 74 68 65 20 0a 20 20 63 6f 6c 75 6d 6e 20  f the .  column 
a020: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
a030: 2c 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20  , numbered from 
a040: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 73 74  left to right st
a050: 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20 44  arting with 1. D
a060: 61 74 61 0a 20 20 74 79 70 65 73 20 73 75 70 70  ata.  types supp
a070: 6c 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lied as part of 
a080: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
a090: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
a0a0: 65 20 6e 6f 74 20 75 73 65 64 20 61 73 0a 20 20  e not used as.  
a0b0: 70 61 72 74 20 6f 66 20 74 68 65 20 25 5f 63 6f  part of the %_co
a0c0: 6e 74 65 6e 74 20 74 61 62 6c 65 20 64 65 63 6c  ntent table decl
a0d0: 61 72 61 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61  aration. For exa
a0e0: 6d 70 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20  mple:..[Code {. 
a0f0: 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74   <i>-- Virtual t
a100: 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
a110: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
a120: 52 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20  RTUAL TABLE abc 
a130: 55 53 49 4e 47 20 46 54 53 33 28 61 20 4e 55 4d  USING FTS3(a NUM
a140: 42 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b  BER, b TEXT, c);
a150: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73  ..  <i>-- Corres
a160: 70 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e  ponding %_conten
a170: 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  t table declarat
a180: 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ion</i>.  CREATE
a190: 20 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65   TABLE abc_conte
a1a0: 6e 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52  nt(docid INTEGER
a1b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 31   PRIMARY KEY, c1
a1c0: 61 2c 20 63 32 62 2c 20 63 32 63 29 3b 0a 7d 5d  a, c2b, c2c);.}]
a1d0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f 63 6f  ..<p>.  The %_co
a1e0: 6e 74 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  ntent table cont
a1f0: 61 69 6e 73 20 74 68 65 20 75 6e 61 64 75 6c 74  ains the unadult
a200: 65 72 61 74 65 64 20 64 61 74 61 20 69 6e 73 65  erated data inse
a210: 72 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  rted by the user
a220: 20 0a 20 20 69 6e 74 6f 20 74 68 65 20 46 54 53   .  into the FTS
a230: 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  3 virtual table 
a240: 62 79 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  by the user. If 
a250: 74 68 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f  the user does no
a260: 74 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 73  t explicitly.  s
a270: 75 70 70 6c 79 20 61 20 22 64 6f 63 69 64 22 20  upply a "docid" 
a280: 76 61 6c 75 65 20 77 68 65 6e 20 69 6e 73 65 72  value when inser
a290: 74 69 6e 67 20 72 65 63 6f 72 64 73 2c 20 6f 6e  ting records, on
a2a0: 65 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 75  e is selected au
a2b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 62 79  tomatically.  by
a2c0: 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 0a 3c 70   the system...<p
a2d0: 3e 0a 20 20 54 68 65 20 74 77 6f 20 72 65 6d 61  >.  The two rema
a2e0: 69 6e 69 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f  ining tables, %_
a2f0: 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73  segments and %_s
a300: 65 67 64 69 72 2c 20 61 72 65 20 75 73 65 64 20  egdir, are used 
a310: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 0a 20 20  to store the .  
a320: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
a330: 20 43 6f 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74   Conceptually, t
a340: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 6c  his index is a l
a350: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74  ookup table that
a360: 20 6d 61 70 73 20 65 61 63 68 20 0a 20 20 74 65   maps each .  te
a370: 72 6d 20 28 77 6f 72 64 29 20 74 6f 20 74 68 65  rm (word) to the
a380: 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61   set of docid va
a390: 6c 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  lues correspondi
a3a0: 6e 67 20 74 6f 20 72 65 63 6f 72 64 73 20 69 6e  ng to records in
a3b0: 20 74 68 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e   the .  %_conten
a3c0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  t table that con
a3d0: 74 61 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  tain one or more
a3e0: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
a3f0: 74 68 65 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72  the term. To.  r
a400: 65 74 72 69 65 76 65 20 61 6c 6c 20 64 6f 63 75  etrieve all docu
a410: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
a420: 69 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 74  in a specified t
a430: 65 72 6d 2c 20 74 68 65 20 46 54 53 33 20 6d 6f  erm, the FTS3 mo
a440: 64 75 6c 65 0a 20 20 71 75 65 72 69 65 73 20 74  dule.  queries t
a450: 68 69 73 20 69 6e 64 65 78 20 74 6f 20 64 65 74  his index to det
a460: 65 72 6d 69 6e 65 20 74 68 65 20 73 65 74 20 6f  ermine the set o
a470: 66 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 66  f docid values f
a480: 6f 72 20 72 65 63 6f 72 64 73 20 74 68 61 74 0a  or records that.
a490: 20 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65    contain the te
a4a0: 72 6d 2c 20 74 68 65 6e 20 72 65 74 72 69 65 76  rm, then retriev
a4b0: 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
a4c0: 64 6f 63 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74  documents from t
a4d0: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 74  he %_content.  t
a4e0: 61 62 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73  able. Regardless
a4f0: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 6f   of the schema o
a500: 66 20 74 68 65 20 46 54 53 33 20 76 69 72 74 75  f the FTS3 virtu
a510: 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f  al table, the %_
a520: 73 65 67 6d 65 6e 74 73 0a 20 20 61 6e 64 20 25  segments.  and %
a530: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 73 20 61  _segdir tables a
a540: 72 65 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  re always create
a550: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b  d as follows:..[
a560: 43 6f 64 65 20 7b 0a 20 20 43 52 45 41 54 45 20  Code {.  CREATE 
a570: 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73  TABLE %_segments
a580: 28 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e  (.    blockid IN
a590: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a5a0: 59 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42  Y,       <i>-- B
a5b0: 2d 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69  -tree node id</i
a5c0: 3e 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62  >.    block blob
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5e0: 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42           <i>-- B
a5f0: 2d 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61 3c  -tree node data<
a600: 2f 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41  /i>.  );..  CREA
a610: 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64 69  TE TABLE %_segdi
a620: 72 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e 54  r(.    level INT
a630: 45 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49 4e  EGER,.    idx IN
a640: 54 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72 74  TEGER,.    start
a650: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20  _block INTEGER, 
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
a670: 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66  >-- Blockid of f
a680: 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73  irst node in %_s
a690: 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20  egments</i>.    
a6a0: 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
a6b0: 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20   INTEGER,       
a6c0: 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64     <i>-- Blockid
a6d0: 20 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f   of last leaf no
a6e0: 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  de in %_segments
a6f0: 3c 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f  </i>.    end_blo
a700: 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20  ck INTEGER,     
a710: 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d              <i>-
a720: 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73  - Blockid of las
a730: 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d  t node in %_segm
a740: 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f  ents</i>.    roo
a750: 74 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  t BLOB,         
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f  <i>-- B-tree roo
a780: 74 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50  t node</i>.    P
a790: 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c  RIMARY KEY(level
a7a0: 2c 20 69 64 78 29 0a 20 20 29 3b 0a 7d 5d 0a 0a  , idx).  );.}]..
a7b0: 3c 70 3e 0a 20 20 54 68 65 20 73 63 68 65 6d 61  <p>.  The schema
a7c0: 20 64 65 70 69 63 74 65 64 20 61 62 6f 76 65 20   depicted above 
a7d0: 69 73 20 6e 6f 74 20 64 65 73 69 67 6e 65 64 20  is not designed 
a7e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  to store the ful
a7f0: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 0a 20 20  l-text index .  
a800: 64 69 72 65 63 74 6c 79 2e 20 49 6e 73 74 65 61  directly. Instea
a810: 64 2c 20 69 74 20 69 73 20 75 73 65 64 20 74 6f  d, it is used to
a820: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 2d 74   one or more b-t
a830: 72 65 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ree structures. 
a840: 54 68 65 72 65 0a 20 20 69 73 20 6f 6e 65 20 62  There.  is one b
a850: 2d 74 72 65 65 20 66 6f 72 20 65 61 63 68 20 72  -tree for each r
a860: 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64  ow in the %_segd
a870: 69 72 20 74 61 62 6c 65 2e 20 54 68 65 20 25 5f  ir table. The %_
a880: 73 65 67 64 69 72 20 74 61 62 6c 65 0a 20 20 72  segdir table.  r
a890: 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
a8a0: 72 6f 6f 74 20 6e 6f 64 65 20 61 6e 64 20 76 61  root node and va
a8b0: 72 69 6f 75 73 20 6d 65 74 61 2d 64 61 74 61 20  rious meta-data 
a8c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a8d0: 74 68 65 0a 20 20 62 2d 74 72 65 65 20 73 74 72  the.  b-tree str
a8e0: 75 63 74 75 72 65 2c 20 61 6e 64 20 74 68 65 20  ucture, and the 
a8f0: 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
a900: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 6f 74   contains all ot
a910: 68 65 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29 0a 20  her (non-root). 
a920: 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 2e 20 45   b-tree nodes. E
a930: 61 63 68 20 62 2d 74 72 65 65 20 69 73 20 72 65  ach b-tree is re
a940: 66 65 72 72 65 64 20 74 6f 20 61 73 20 61 20 22  ferred to as a "
a950: 73 65 67 6d 65 6e 74 22 2e 20 4f 6e 63 65 20 69  segment". Once i
a960: 74 20 68 61 73 0a 20 20 62 65 65 6e 20 63 72 65  t has.  been cre
a970: 61 74 65 64 2c 20 61 20 73 65 67 6d 65 6e 74 20  ated, a segment 
a980: 62 2d 74 72 65 65 20 69 73 20 6e 65 76 65 72 20  b-tree is never 
a990: 75 70 64 61 74 65 64 20 28 61 6c 74 68 6f 75 67  updated (althoug
a9a0: 68 20 69 74 20 6d 61 79 20 62 65 0a 20 20 64 65  h it may be.  de
a9b0: 6c 65 74 65 64 20 61 6c 74 6f 67 65 74 68 65 72  leted altogether
a9c0: 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6b 65  )...<p>.  The ke
a9d0: 79 73 20 75 73 65 64 20 62 79 20 65 61 63 68 20  ys used by each 
a9e0: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 61  segment b-tree a
a9f0: 72 65 20 74 65 72 6d 73 20 28 77 6f 72 64 73 29  re terms (words)
aa00: 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65  . As well as the
aa10: 0a 20 20 6b 65 79 2c 20 65 61 63 68 20 73 65 67  .  key, each seg
aa20: 6d 65 6e 74 20 62 2d 74 72 65 65 20 65 6e 74 72  ment b-tree entr
aa30: 79 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  y has an associa
aa40: 74 65 64 20 22 64 6f 63 6c 69 73 74 22 20 28 64  ted "doclist" (d
aa50: 6f 63 75 6d 65 6e 74 20 6c 69 73 74 29 2e 0a 20  ocument list).. 
aa60: 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69   A doclist consi
aa70: 73 74 73 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  sts of zero or m
aa80: 6f 72 65 20 65 6e 74 72 69 65 73 2c 20 77 68 65  ore entries, whe
aa90: 72 65 20 65 61 63 68 20 65 6e 74 72 79 20 63 6f  re each entry co
aaa0: 6e 73 69 73 74 73 20 6f 66 3a 0a 0a 3c 75 6c 3e  nsists of:..<ul>
aab0: 0a 20 20 3c 6c 69 3e 20 41 20 64 6f 63 69 64 20  .  <li> A docid 
aac0: 28 64 6f 63 75 6d 65 6e 74 20 69 64 29 2c 20 61  (document id), a
aad0: 6e 64 0a 20 20 3c 6c 69 3e 20 41 20 6c 69 73 74  nd.  <li> A list
aae0: 20 6f 66 20 74 65 72 6d 20 6f 66 66 73 65 74 73   of term offsets
aaf0: 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f  , one for each o
ab00: 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65  ccurrence of the
ab10: 20 74 65 72 6d 20 77 69 74 68 69 6e 0a 20 20 20   term within.   
ab20: 20 20 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74      the document
ab30: 2e 20 41 20 74 65 72 6d 20 6f 66 66 73 65 74 20  . A term offset 
ab40: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 6e 75  indicates the nu
ab50: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 28  mber of tokens (
ab60: 77 6f 72 64 73 29 0a 20 20 20 20 20 20 20 74 68  words).       th
ab70: 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
ab80: 74 68 65 20 74 65 72 6d 20 69 6e 20 71 75 65 73  the term in ques
ab90: 74 69 6f 6e 2c 20 6e 6f 74 20 74 68 65 20 6e 75  tion, not the nu
aba0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
abb0: 72 73 0a 20 20 20 20 20 20 20 6f 72 20 62 79 74  rs.       or byt
abc0: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
abd0: 20 74 68 65 20 74 65 72 6d 20 6f 66 66 73 65 74   the term offset
abe0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 77 61   of the term "wa
abf0: 72 22 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  r" in the.      
ac00: 20 70 68 72 61 73 65 20 22 41 6e 63 65 73 74 72   phrase "Ancestr
ac10: 61 6c 20 76 6f 69 63 65 73 20 70 72 6f 70 68 65  al voices prophe
ac20: 73 79 69 6e 67 20 77 61 72 21 22 20 69 73 20 33  sying war!" is 3
ac30: 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 45  ..</ul>..<p>.  E
ac40: 6e 74 72 69 65 73 20 77 69 74 68 69 6e 20 61 20  ntries within a 
ac50: 64 6f 63 6c 69 73 74 20 61 72 65 20 73 6f 72 74  doclist are sort
ac60: 65 64 20 62 79 20 64 6f 63 69 64 2e 20 50 6f 73  ed by docid. Pos
ac70: 69 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 61 20  itions within a 
ac80: 64 6f 63 6c 69 73 74 0a 20 20 65 6e 74 72 79 20  doclist.  entry 
ac90: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 73  are stored in as
aca0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 0a  cending order...
acb0: 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65 6e  <p>.  The conten
acc0: 74 73 20 6f 66 20 74 68 65 20 6c 6f 67 69 63 61  ts of the logica
acd0: 6c 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  l full-text inde
ace0: 78 20 69 73 20 66 6f 75 6e 64 20 62 79 20 6d 65  x is found by me
acf0: 72 67 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e 74  rging the.  cont
ad00: 65 6e 74 73 20 6f 66 20 61 6c 6c 20 73 65 67 6d  ents of all segm
ad10: 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 49 66 20  ent b-trees. If 
ad20: 61 20 74 65 72 6d 20 69 73 20 70 72 65 73 65 6e  a term is presen
ad30: 74 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  t in more than o
ad40: 6e 65 0a 20 20 73 65 67 6d 65 6e 74 20 62 2d 74  ne.  segment b-t
ad50: 72 65 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 70  ree, then it map
ad60: 73 20 74 6f 20 74 68 65 20 75 6e 69 6f 6e 20 6f  s to the union o
ad70: 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  f each individua
ad80: 6c 20 64 6f 63 6c 69 73 74 2e 20 49 66 2c 0a 20  l doclist. If,. 
ad90: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
ada0: 72 6d 2c 20 74 68 65 20 73 61 6d 65 20 64 6f 63  rm, the same doc
adb0: 69 64 20 6f 63 63 75 72 73 20 69 6e 20 6d 6f 72  id occurs in mor
adc0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 6f 63 6c 69  e than one docli
add0: 73 74 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 20 20  st, then only.  
ade0: 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
adf0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
ae00: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
ae10: 65 61 74 65 64 20 73 65 67 6d 65 6e 74 20 62 2d  eated segment b-
ae20: 74 72 65 65 20 69 73 20 0a 20 20 63 6f 6e 73 69  tree is .  consi
ae30: 64 65 72 65 64 20 76 61 6c 69 64 2e 20 0a 0a 3c  dered valid. ..<
ae40: 70 3e 0a 20 20 4d 75 6c 74 69 70 6c 65 20 62 2d  p>.  Multiple b-
ae50: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20  tree structures 
ae60: 61 72 65 20 75 73 65 64 20 69 6e 73 74 65 61 64  are used instead
ae70: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 2d 74   of a single b-t
ae80: 72 65 65 20 74 6f 20 72 65 64 75 63 65 0a 20 20  ree to reduce.  
ae90: 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e 73 65  the cost of inse
aea0: 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  rting records in
aeb0: 74 6f 20 46 54 53 33 20 74 61 62 6c 65 73 2e 20  to FTS3 tables. 
aec0: 57 68 65 6e 20 61 20 6e 65 77 20 72 65 63 6f 72  When a new recor
aed0: 64 20 69 73 20 0a 20 20 69 6e 73 65 72 74 65 64  d is .  inserted
aee0: 20 69 6e 74 6f 20 61 6e 20 46 54 53 33 20 74 61   into an FTS3 ta
aef0: 62 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79  ble that already
af00: 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20   contains a lot 
af10: 6f 66 20 64 61 74 61 2c 20 69 74 20 69 73 0a 20  of data, it is. 
af20: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 6d 61 6e   likely that man
af30: 79 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 69  y of the terms i
af40: 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
af50: 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
af60: 73 65 6e 74 20 69 6e 0a 20 20 61 20 6c 61 72 67  sent in.  a larg
af70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 69 73  e number of exis
af80: 74 69 6e 67 20 72 65 63 6f 72 64 73 2e 20 49 66  ting records. If
af90: 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65   a single b-tree
afa0: 20 77 65 72 65 20 75 73 65 64 2c 20 74 68 65 6e   were used, then
afb0: 0a 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74  .  large doclist
afc0: 20 73 74 72 75 63 74 75 72 65 73 20 77 6f 75 6c   structures woul
afd0: 64 20 68 61 76 65 20 74 6f 20 62 65 20 6c 6f 61  d have to be loa
afe0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
aff0: 61 62 61 73 65 2c 0a 20 20 61 6d 65 6e 64 65 64  abase,.  amended
b000: 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
b010: 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 65  new docid and te
b020: 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 2c 20  rm-offset list, 
b030: 74 68 65 6e 20 77 72 69 74 74 65 6e 20 62 61 63  then written bac
b040: 6b 0a 20 20 74 6f 20 74 68 65 20 64 61 74 61 62  k.  to the datab
b050: 61 73 65 2e 20 55 73 69 6e 67 20 6d 75 6c 74 69  ase. Using multi
b060: 70 6c 65 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ple b-tree table
b070: 73 20 61 6c 6c 6f 77 73 20 74 68 69 73 20 74 6f  s allows this to
b080: 20 62 65 20 61 76 6f 69 64 65 64 0a 20 20 62 79   be avoided.  by
b090: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
b0a0: 62 2d 74 72 65 65 20 77 68 69 63 68 20 63 61 6e  b-tree which can
b0b0: 20 62 65 20 6d 65 72 67 65 64 20 77 69 74 68 20   be merged with 
b0c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 2d 74  the existing b-t
b0d0: 72 65 65 0a 20 20 28 6f 72 20 62 2d 74 72 65 65  ree.  (or b-tree
b0e0: 73 29 20 6c 61 74 65 72 20 6f 6e 2e 20 4d 65 72  s) later on. Mer
b0f0: 67 69 6e 67 20 6f 66 20 62 2d 74 72 65 65 20 73  ging of b-tree s
b100: 74 72 75 63 74 75 72 65 73 20 63 61 6e 20 62 65  tructures can be
b110: 20 70 65 72 66 6f 72 6d 65 64 20 61 73 0a 20 20   performed as.  
b120: 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 61 73  a background tas
b130: 6b 2c 20 6f 72 20 6f 6e 63 65 20 61 20 63 65 72  k, or once a cer
b140: 74 61 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73  tain number of s
b150: 65 70 61 72 61 74 65 20 62 2d 74 72 65 65 20 73  eparate b-tree s
b160: 74 72 75 63 74 75 72 65 73 0a 20 20 68 61 76 65  tructures.  have
b170: 20 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 65   been accumulate
b180: 64 2e 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68  d. Of course, th
b190: 69 73 20 73 63 68 65 6d 65 20 6d 61 6b 65 73 20  is scheme makes 
b1a0: 71 75 65 72 69 65 73 20 6d 6f 72 65 20 65 78 70  queries more exp
b1b0: 65 6e 73 69 76 65 0a 20 20 28 61 73 20 74 68 65  ensive.  (as the
b1c0: 20 46 54 53 33 20 63 6f 64 65 20 6d 61 79 20 68   FTS3 code may h
b1d0: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69  ave to look up i
b1e0: 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 73 20  ndividual terms 
b1f0: 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  in more than one
b200: 0a 20 20 62 2d 74 72 65 65 20 61 6e 64 20 6d 65  .  b-tree and me
b210: 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 29  rge the results)
b220: 2c 20 62 75 74 20 69 74 20 68 61 73 20 62 65 65  , but it has bee
b230: 6e 20 66 6f 75 6e 64 20 74 68 61 74 20 69 6e 20  n found that in 
b240: 70 72 61 63 74 69 63 65 20 74 68 69 73 0a 20 20  practice this.  
b250: 6f 76 65 72 68 65 61 64 20 69 73 20 6f 66 74 65  overhead is ofte
b260: 6e 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20  n negligible..  
b270: 0a 5b 68 32 20 22 56 61 72 69 61 62 6c 65 20 4c  .[h2 "Variable L
b280: 65 6e 67 74 68 20 49 6e 74 65 67 65 72 20 28 76  ength Integer (v
b290: 61 72 69 6e 74 29 20 46 6f 72 6d 61 74 22 5d 0a  arint) Format"].
b2a0: 0a 3c 70 3e 0a 20 20 49 6e 74 65 67 65 72 20 76  .<p>.  Integer v
b2b0: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20  alues stored as 
b2c0: 70 61 72 74 20 6f 66 20 73 65 67 6d 65 6e 74 20  part of segment 
b2d0: 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 61 72 65  b-tree nodes are
b2e0: 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74   encoded using t
b2f0: 68 65 0a 20 20 46 54 53 33 20 76 61 72 69 6e 74  he.  FTS3 varint
b300: 20 66 6f 72 6d 61 74 2e 20 54 68 69 73 20 65 6e   format. This en
b310: 63 6f 64 69 6e 67 20 69 73 20 73 69 6d 69 6c 61  coding is simila
b320: 72 2c 20 62 75 74 20 3c 62 3e 6e 6f 74 20 69 64  r, but <b>not id
b330: 65 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20 74 6f 20  entical</b>, to 
b340: 74 68 65 0a 20 20 74 68 65 20 3c 61 20 68 72 65  the.  the <a hre
b350: 66 3d 22 66 69 6c 65 66 6f 72 6d 61 74 2e 68 74  f="fileformat.ht
b360: 6d 6c 23 76 61 72 69 6e 74 5f 66 6f 72 6d 61 74  ml#varint_format
b370: 22 3e 53 51 4c 69 74 65 20 76 61 72 69 6e 74 20  ">SQLite varint 
b380: 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a 0a 3c 70 3e  format</a>...<p>
b390: 0a 20 20 41 6e 20 65 6e 63 6f 64 65 64 20 46 54  .  An encoded FT
b3a0: 53 33 20 76 61 72 69 6e 74 20 63 6f 6e 73 75 6d  S3 varint consum
b3b0: 65 73 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 61  es between one a
b3c0: 6e 64 20 74 65 6e 20 62 79 74 65 73 20 6f 66 20  nd ten bytes of 
b3d0: 73 70 61 63 65 2e 20 54 68 65 0a 20 20 6e 75 6d  space. The.  num
b3e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
b3f0: 75 69 72 65 64 20 69 73 20 64 65 74 65 72 6d 69  uired is determi
b400: 6e 65 64 20 62 79 20 74 68 65 20 73 69 67 6e 20  ned by the sign 
b410: 61 6e 64 20 6d 61 67 6e 69 74 75 64 65 20 6f 66  and magnitude of
b420: 20 74 68 65 0a 20 20 69 6e 74 65 67 65 72 20 76   the.  integer v
b430: 61 6c 75 65 20 65 6e 63 6f 64 65 64 2e 20 4d 6f  alue encoded. Mo
b440: 72 65 20 61 63 63 75 72 61 74 65 6c 79 2c 20 74  re accurately, t
b450: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b460: 65 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  es used to store
b470: 0a 20 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69  .  the encoded i
b480: 6e 74 65 67 65 72 20 64 65 70 65 6e 64 73 20 6f  nteger depends o
b490: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f  n the position o
b4a0: 66 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  f the most signi
b4b0: 66 69 63 61 6e 74 20 73 65 74 20 62 69 74 0a 20  ficant set bit. 
b4c0: 20 69 6e 20 74 68 65 20 36 34 2d 62 69 74 20 74   in the 64-bit t
b4d0: 77 6f 73 2d 63 6f 6d 70 6c 69 6d 65 6e 74 20 72  wos-compliment r
b4e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
b4f0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
b500: 75 65 2e 20 4e 65 67 61 74 69 76 65 0a 20 20 76  ue. Negative.  v
b510: 61 6c 75 65 73 20 61 6c 77 61 79 73 20 68 61 76  alues always hav
b520: 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  e the most signi
b530: 66 69 63 61 6e 74 20 62 69 74 20 73 65 74 20 28  ficant bit set (
b540: 74 68 65 20 73 69 67 6e 20 62 69 74 29 2c 20 61  the sign bit), a
b550: 6e 64 20 73 6f 20 61 72 65 0a 20 20 61 6c 77 61  nd so are.  alwa
b560: 79 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20  ys stored using 
b570: 74 68 65 20 66 75 6c 6c 20 74 65 6e 20 62 79 74  the full ten byt
b580: 65 73 2e 20 50 6f 73 69 74 69 76 65 20 69 6e 74  es. Positive int
b590: 65 67 65 72 20 76 61 6c 75 65 73 20 6d 61 79 20  eger values may 
b5a0: 62 65 0a 20 20 73 74 6f 72 65 64 20 75 73 69 6e  be.  stored usin
b5b0: 67 20 6c 65 73 73 20 73 70 61 63 65 2e 0a 0a 3c  g less space...<
b5c0: 70 3e 0a 20 20 54 68 65 20 66 69 6e 61 6c 20 62  p>.  The final b
b5d0: 79 74 65 20 6f 66 20 61 6e 20 65 6e 63 6f 64 65  yte of an encode
b5e0: 64 20 46 54 53 33 20 76 61 72 69 6e 74 20 68 61  d FTS3 varint ha
b5f0: 73 20 69 74 73 20 6d 6f 73 74 20 73 69 67 6e 69  s its most signi
b600: 66 69 63 61 6e 74 20 62 69 74 20 0a 20 20 63 6c  ficant bit .  cl
b610: 65 61 72 65 64 2e 20 41 6c 6c 20 70 72 65 63 65  eared. All prece
b620: 64 69 6e 67 20 62 79 74 65 73 20 68 61 76 65 20  ding bytes have 
b630: 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66 69  the most signifi
b640: 63 61 6e 74 20 62 69 74 20 73 65 74 2e 20 44 61  cant bit set. Da
b650: 74 61 0a 20 20 69 73 20 73 74 6f 72 65 64 20 69  ta.  is stored i
b660: 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  n the remaining 
b670: 73 65 76 65 6e 20 6c 65 61 73 74 20 73 69 67 6e  seven least sign
b680: 66 69 63 61 6e 74 20 62 69 74 73 20 6f 66 20 65  ficant bits of e
b690: 61 63 68 20 62 79 74 65 2e 0a 20 20 54 68 65 20  ach byte..  The 
b6a0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b6b0: 65 20 65 6e 63 6f 64 65 64 20 72 65 70 72 65 73  e encoded repres
b6c0: 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  entation contain
b6d0: 73 20 74 68 65 20 6c 65 61 73 74 20 73 69 67 6e  s the least sign
b6e0: 69 66 69 63 61 6e 74 0a 20 20 73 65 76 65 6e 20  ificant.  seven 
b6f0: 62 69 74 73 20 6f 66 20 74 68 65 20 65 6e 63 6f  bits of the enco
b700: 64 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ded integer valu
b710: 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 62 79  e. The second by
b720: 74 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65  te of the encode
b730: 64 0a 20 20 72 65 70 72 65 73 65 6e 74 61 74 69  d.  representati
b740: 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  on, if it is pre
b750: 73 65 6e 74 2c 20 63 6f 6e 74 61 69 6e 73 20 74  sent, contains t
b760: 68 65 20 73 65 76 65 6e 20 6e 65 78 74 20 6c 65  he seven next le
b770: 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  ast significant.
b780: 20 20 62 69 74 73 20 6f 66 20 74 68 65 20 69 6e    bits of the in
b790: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 61 6e 64  teger value, and
b7a0: 20 73 6f 20 6f 6e 2e 20 54 68 65 20 66 6f 6c 6c   so on. The foll
b7b0: 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74  owing table cont
b7c0: 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 0a 20 20  ains examples.  
b7d0: 6f 66 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67  of encoded integ
b7e0: 65 72 20 76 61 6c 75 65 73 3a 0a 0a 5b 54 61 62  er values:..[Tab
b7f0: 6c 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 44 65  le].  [Tr]<th>De
b800: 63 69 6d 61 6c 3c 74 68 3e 48 65 78 61 64 65 63  cimal<th>Hexadec
b810: 69 6d 61 6c 3c 74 68 20 77 69 64 74 68 3d 31 30  imal<th width=10
b820: 30 25 3e 45 6e 63 6f 64 65 64 20 52 65 70 72 65  0%>Encoded Repre
b830: 73 65 6e 74 61 74 69 6f 6e 0a 20 20 5b 54 72 5d  sentation.  [Tr]
b840: 3c 74 64 3e 34 33 3c 74 64 3e 30 78 30 30 30 30  <td>43<td>0x0000
b850: 30 30 30 30 30 30 30 30 30 30 32 42 3c 74 64 3e  00000000002B<td>
b860: 30 78 32 42 20 0a 20 20 5b 54 72 5d 3c 74 64 3e  0x2B .  [Tr]<td>
b870: 32 30 30 38 31 35 3c 74 64 3e 30 78 30 30 30 30  200815<td>0x0000
b880: 30 30 30 30 30 30 30 33 31 30 36 46 3c 74 64 3e  00000003106F<td>
b890: 30 78 39 43 20 30 78 41 30 20 30 78 30 43 0a 20  0x9C 0xA0 0x0C. 
b8a0: 20 5b 54 72 5d 3c 74 64 3e 2d 31 3c 74 64 3e 30   [Tr]<td>-1<td>0
b8b0: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
b8c0: 46 3c 74 64 3e 30 78 46 46 20 30 78 46 46 20 30  F<td>0xFF 0xFF 0
b8d0: 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
b8e0: 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
b8f0: 46 20 30 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a  F 0x01.</table>.
b900: 20 20 0a 0a 5b 68 32 20 22 53 65 67 6d 65 6e 74    ..[h2 "Segment
b910: 20 42 2d 54 72 65 65 20 46 6f 72 6d 61 74 22 5d   B-Tree Format"]
b920: 0a 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20  ..<p>.  Segment 
b930: 62 2d 74 72 65 65 73 20 61 72 65 20 70 72 65 66  b-trees are pref
b940: 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b  ix-compressed b+
b950: 2d 74 72 65 65 73 2e 20 54 68 65 72 65 20 69 73  -trees. There is
b960: 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   one segment b-t
b970: 72 65 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72  ree.  for each r
b980: 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64  ow in the %_segd
b990: 69 72 20 74 61 62 6c 65 20 28 73 65 65 20 61 62  ir table (see ab
b9a0: 6f 76 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e  ove). The root n
b9b0: 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ode of the segme
b9c0: 6e 74 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73  nt.  b-tree is s
b9d0: 74 6f 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20  tored as a blob 
b9e0: 69 6e 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69  in the "root" fi
b9f0: 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65  eld of the corre
ba00: 73 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f  sponding row.  o
ba10: 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  f the %_segdir t
ba20: 61 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20  able. All other 
ba30: 6e 6f 64 65 73 20 28 69 66 20 61 6e 79 20 65 78  nodes (if any ex
ba40: 69 73 74 29 20 61 72 65 20 73 74 6f 72 65 64 20  ist) are stored 
ba50: 69 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22  in the .  "blob"
ba60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25   column of the %
ba70: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
ba80: 20 4e 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68   Nodes within th
ba90: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
baa0: 6c 65 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66  le are.  identif
bab0: 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  ied by the integ
bac0: 65 72 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  er value in the 
bad0: 62 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66  blockid field of
bae0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
baf0: 6e 67 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f  ng.  row. The fo
bb00: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
bb10: 73 63 72 69 62 65 73 20 74 68 65 20 66 69 65 6c  scribes the fiel
bb20: 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  ds of the %_segd
bb30: 69 72 20 74 61 62 6c 65 3a 0a 0a 5b 54 61 62 6c  ir table:..[Tabl
bb40: 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 43 6f 6c  e].  [Tr]<th>Col
bb50: 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 3c 74  umn           <t
bb60: 68 20 77 69 64 74 68 3d 31 30 30 25 3e 49 6e 74  h width=100%>Int
bb70: 65 72 70 72 65 74 69 6f 6e 0a 20 20 5b 54 72 5d  erpretion.  [Tr]
bb80: 3c 74 64 3e 6c 65 76 65 6c 20 20 20 20 20 20 20  <td>level       
bb90: 20 20 20 20 20 3c 74 64 3e 20 0a 20 20 20 20 42       <td> .    B
bba0: 65 74 77 65 65 6e 20 74 68 65 6d 2c 20 74 68 65  etween them, the
bbb0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
bbc0: 20 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64   "level" and "id
bbd0: 78 22 20 66 69 65 6c 64 73 20 64 65 66 69 6e 65  x" fields define
bbe0: 20 74 68 65 0a 20 20 20 20 72 65 6c 61 74 69 76   the.    relativ
bbf0: 65 20 61 67 65 20 6f 66 20 74 68 65 20 73 65 67  e age of the seg
bc00: 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 54 68 65  ment b-tree. The
bc10: 20 73 6d 61 6c 6c 65 72 20 74 68 65 20 76 61 6c   smaller the val
bc20: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
bc30: 0a 20 20 20 20 22 6c 65 76 65 6c 22 20 66 69 65  .    "level" fie
bc40: 6c 64 2c 20 74 68 65 20 6d 6f 72 65 20 72 65 63  ld, the more rec
bc50: 65 6e 74 6c 79 20 74 68 65 20 73 65 67 6d 65 6e  ently the segmen
bc60: 74 20 62 2d 74 72 65 65 20 77 61 73 20 63 72 65  t b-tree was cre
bc70: 61 74 65 64 2e 20 49 66 20 74 77 6f 0a 20 20 20  ated. If two.   
bc80: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73   segment b-trees
bc90: 20 61 72 65 20 6f 66 20 74 68 65 20 73 61 6d 65   are of the same
bca0: 20 22 6c 65 76 65 6c 22 2c 20 74 68 65 20 73 65   "level", the se
bcb0: 67 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 6c  gment with the l
bcc0: 61 72 67 65 72 0a 20 20 20 20 76 61 6c 75 65 20  arger.    value 
bcd0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 69  stored in the "i
bce0: 64 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f  dx" column is mo
bcf0: 72 65 20 72 65 63 65 6e 74 2e 20 54 68 65 20 50  re recent. The P
bd00: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
bd10: 72 61 69 6e 74 0a 20 20 20 20 6f 6e 20 74 68 65  raint.    on the
bd20: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
bd30: 70 72 65 76 65 6e 74 73 20 61 6e 79 20 74 77 6f  prevents any two
bd40: 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 68   segments from h
bd50: 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  aving the same v
bd60: 61 6c 75 65 0a 20 20 20 20 66 6f 72 20 62 6f 74  alue.    for bot
bd70: 68 20 74 68 65 20 22 6c 65 76 65 6c 22 20 61 6e  h the "level" an
bd80: 64 20 22 69 64 78 22 20 66 69 65 6c 64 73 2e 0a  d "idx" fields..
bd90: 20 20 5b 54 72 5d 3c 74 64 3e 69 64 78 20 20 20    [Tr]<td>idx   
bda0: 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e 20             <td> 
bdb0: 53 65 65 20 61 62 6f 76 65 2e 0a 20 20 5b 54 72  See above..  [Tr
bdc0: 5d 3c 74 64 3e 73 74 61 72 74 5f 62 6c 6f 63 6b  ]<td>start_block
bdd0: 20 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 54        <td>.    T
bde0: 68 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20  he blockid that 
bdf0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
be00: 68 65 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65  he node with the
be10: 20 73 6d 61 6c 6c 65 73 74 20 62 6c 6f 63 6b 69   smallest blocki
be20: 64 20 74 68 61 74 20 0a 20 20 20 20 62 65 6c 6f  d that .    belo
be30: 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d  ngs to this segm
be40: 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a  ent b-tree. Or z
be50: 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72  ero if the entir
be60: 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
be70: 0a 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65  .    fits on the
be80: 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69   root node. If i
be90: 74 20 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e  t exists, this n
bea0: 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ode is always a 
beb0: 6c 65 61 66 20 6e 6f 64 65 2e 0a 20 20 5b 54 72  leaf node..  [Tr
bec0: 5d 3c 74 64 3e 6c 65 61 76 65 73 5f 65 6e 64 5f  ]<td>leaves_end_
bed0: 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54  block <td>.    T
bee0: 68 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20  he blockid that 
bef0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
bf00: 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 74  he leaf node wit
bf10: 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c  h the largest bl
bf20: 6f 63 6b 69 64 20 0a 20 20 20 20 74 68 61 74 20  ockid .    that 
bf30: 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20  belongs to this 
bf40: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20  segment b-tree. 
bf50: 4f 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  Or zero if the e
bf60: 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d  ntire segment b-
bf70: 74 72 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e  tree.    fits on
bf80: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a   the root node..
bf90: 20 20 5b 54 72 5d 3c 74 64 3e 65 6e 64 5f 62 6c    [Tr]<td>end_bl
bfa0: 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 65  ock <td>.    The
bfb0: 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f   blockid that co
bfc0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
bfd0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 77   interior node w
bfe0: 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
bff0: 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 74 68 61  .    blockid tha
c000: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69  t belongs to thi
c010: 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  s segment b-tree
c020: 2e 20 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68  .  Or zero if th
c030: 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74  e entire segment
c040: 0a 20 20 20 20 62 2d 74 72 65 65 20 66 69 74 73  .    b-tree fits
c050: 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
c060: 65 2e 20 49 66 20 69 74 20 65 78 69 73 74 73 2c  e. If it exists,
c070: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c   this node is al
c080: 77 61 79 73 20 61 6e 0a 20 20 20 20 69 6e 74 65  ways an.    inte
c090: 72 69 6f 72 20 6e 6f 64 65 2e 0a 20 20 5b 54 72  rior node..  [Tr
c0a0: 5d 3c 74 64 3e 72 6f 6f 74 20 20 20 20 20 20 20  ]<td>root       
c0b0: 20 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 42        <td>.    B
c0c0: 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  lob containing t
c0d0: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20  he root node of 
c0e0: 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
c0f0: 65 65 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70  ee..</table>..<p
c100: 3e 0a 20 20 41 70 61 72 74 20 66 72 6f 6d 20 74  >.  Apart from t
c110: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68  he root node, th
c120: 65 20 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 6b  e nodes that mak
c130: 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20 73 65  e up a single se
c140: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 61 72 65  gment b-tree are
c150: 0a 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  .  always stored
c160: 20 75 73 69 6e 67 20 61 20 63 6f 6e 74 69 67 75   using a contigu
c170: 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ous sequence of 
c180: 62 6c 6f 63 6b 69 64 73 2e 20 46 75 72 74 68 65  blockids. Furthe
c190: 72 6d 6f 72 65 2c 20 74 68 65 0a 20 20 6e 6f 64  rmore, the.  nod
c1a0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
c1b0: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c1c0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 61 72 65  f the b-tree are
c1d0: 20 74 68 65 6d 73 65 6c 76 65 73 20 73 74 6f 72   themselves stor
c1e0: 65 64 20 61 73 0a 20 20 61 20 63 6f 6e 74 69 67  ed as.  a contig
c1f0: 75 6f 75 73 20 62 6c 6f 63 6b 2c 20 69 6e 20 62  uous block, in b
c200: 2d 74 72 65 65 20 6f 72 64 65 72 2e 20 54 68 65  -tree order. The
c210: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
c220: 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73  ence of blockids
c230: 0a 20 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  .  used to store
c240: 20 74 68 65 20 62 2d 74 72 65 65 20 6c 65 61 76   the b-tree leav
c250: 65 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  es are allocated
c260: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
c270: 68 65 20 62 6c 6f 63 6b 69 64 0a 20 20 76 61 6c  he blockid.  val
c280: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
c290: 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 63   "start_block" c
c2a0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 72  olumn of the cor
c2b0: 72 65 73 70 6f 6e 64 69 6e 67 20 25 5f 73 65 67  responding %_seg
c2c0: 64 69 72 20 72 6f 77 2c 0a 20 20 61 6e 64 20 66  dir row,.  and f
c2d0: 69 6e 69 73 68 69 6e 67 20 61 74 20 74 68 65 20  inishing at the 
c2e0: 62 6c 6f 63 6b 69 64 20 76 61 6c 75 65 20 73 74  blockid value st
c2f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 22 6c 65 61  ored in the "lea
c300: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 0a 20  ves_end_block". 
c310: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 61   field of the sa
c320: 6d 65 20 72 6f 77 2e 20 49 74 20 69 73 20 74 68  me row. It is th
c330: 65 72 65 66 6f 72 65 20 70 6f 73 73 69 62 6c 65  erefore possible
c340: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
c350: 75 67 68 20 61 6c 6c 20 74 68 65 0a 20 20 6c 65  ugh all the.  le
c360: 61 76 65 73 20 6f 66 20 61 20 73 65 67 6d 65 6e  aves of a segmen
c370: 74 20 62 2d 74 72 65 65 2c 20 69 6e 20 6b 65 79  t b-tree, in key
c380: 20 6f 72 64 65 72 2c 20 62 79 20 74 72 61 76 65   order, by trave
c390: 72 73 69 6e 67 20 74 68 65 20 25 5f 73 65 67 6d  rsing the %_segm
c3a0: 65 6e 74 73 20 0a 20 20 74 61 62 6c 65 20 69 6e  ents .  table in
c3b0: 20 62 6c 6f 63 6b 69 64 20 6f 72 64 65 72 20 66   blockid order f
c3c0: 72 6f 6d 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b  rom "start_block
c3d0: 22 20 74 6f 20 22 6c 65 61 76 65 73 5f 65 6e 64  " to "leaves_end
c3e0: 5f 62 6c 6f 63 6b 22 2e 20 20 0a 0a 5b 68 33 20  _block".  ..[h3 
c3f0: 22 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20  "Segment B-Tree 
c400: 4c 65 61 66 20 4e 6f 64 65 73 22 5d 0a 0a 3c 70  Leaf Nodes"]..<p
c410: 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
c420: 67 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74  g diagram depict
c430: 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  s the format of 
c440: 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
c450: 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 0a 5b 46 69   leaf node...[Fi
c460: 67 20 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65  g fts3_leaf_node
c470: 2e 70 6e 67 20 22 53 65 67 6d 65 6e 74 20 42 2d  .png "Segment B-
c480: 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 20 46  Tree Leaf Node F
c490: 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 54  ormat"]..<p>.  T
c4a0: 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 74  he first term st
c4b0: 6f 72 65 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64  ored on each nod
c4c0: 65 20 28 22 54 65 72 6d 20 31 22 20 69 6e 20 74  e ("Term 1" in t
c4d0: 68 65 20 66 69 67 75 72 65 20 61 62 6f 76 65 29  he figure above)
c4e0: 20 69 73 0a 20 20 73 74 6f 72 65 64 20 76 65 72   is.  stored ver
c4f0: 62 61 74 69 6d 2e 20 45 61 63 68 20 73 75 62 73  batim. Each subs
c500: 65 71 75 65 6e 74 20 74 65 72 6d 20 69 73 20 70  equent term is p
c510: 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64  refix-compressed
c520: 20 77 69 74 68 20 72 65 73 70 65 63 74 0a 20 20   with respect.  
c530: 74 6f 20 69 74 73 20 70 72 65 64 65 63 65 73 73  to its predecess
c540: 6f 72 2e 20 54 65 72 6d 73 20 61 72 65 20 73 74  or. Terms are st
c550: 6f 72 65 64 20 77 69 74 68 69 6e 20 61 20 70 61  ored within a pa
c560: 67 65 20 69 6e 20 73 6f 72 74 65 64 20 28 6d 65  ge in sorted (me
c570: 6d 63 6d 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a  mcmp).  order...
c580: 5b 68 33 20 22 53 65 67 6d 65 6e 74 20 42 2d 54  [h3 "Segment B-T
c590: 72 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64  ree Interior Nod
c5a0: 65 73 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  es"]..<p>.  The 
c5b0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61  following diagra
c5c0: 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f  m depicts the fo
c5d0: 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e  rmat of a segmen
c5e0: 74 20 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f  t b-tree interio
c5f0: 72 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  r .  (non-leaf) 
c600: 6e 6f 64 65 2e 0a 0a 5b 46 69 67 20 66 74 73 33  node...[Fig fts3
c610: 5f 69 6e 74 65 72 69 6f 72 5f 6e 6f 64 65 2e 70  _interior_node.p
c620: 6e 67 20 22 53 65 67 6d 65 6e 74 20 42 2d 54 72  ng "Segment B-Tr
c630: 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65  ee Interior Node
c640: 20 46 6f 72 6d 61 74 22 5d 0a 0a 0a 5b 68 32 20   Format"]...[h2 
c650: 22 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74 22  "Doclist Format"
c660: 5d 0a 0a 3c 70 3e 0a 20 20 41 20 64 6f 63 6c 69  ]..<p>.  A docli
c670: 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  st consists of a
c680: 6e 20 61 72 72 61 79 20 6f 66 20 36 34 2d 62 69  n array of 64-bi
c690: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
c6a0: 73 2c 20 73 65 72 69 61 6c 69 7a 65 64 20 75 73  s, serialized us
c6b0: 69 6e 67 0a 20 20 74 68 65 20 46 54 53 33 20 76  ing.  the FTS3 v
c6c0: 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20 45 61  arint format. Ea
c6d0: 63 68 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79  ch doclist entry
c6e0: 20 69 73 20 6d 61 64 65 20 75 70 20 6f 66 20 61   is made up of a
c6f0: 20 73 65 72 69 65 73 20 6f 66 20 74 77 6f 20 0a   series of two .
c700: 20 20 6f 72 20 6d 6f 72 65 20 69 6e 74 65 67 65    or more intege
c710: 72 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  rs, as follows:.
c720: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65  .<ol>.  <li> The
c730: 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 54 68   docid value. Th
c740: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
c750: 20 61 20 64 6f 63 6c 69 73 74 20 63 6f 6e 74 61   a doclist conta
c760: 69 6e 73 20 74 68 65 20 6c 69 74 65 72 61 6c 20  ins the literal 
c770: 64 6f 63 69 64 0a 20 20 20 20 20 20 20 76 61 6c  docid.       val
c780: 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 66 69  ue. The first fi
c790: 65 6c 64 20 6f 66 20 65 61 63 68 20 73 75 62 73  eld of each subs
c7a0: 65 71 75 65 6e 74 20 64 6f 63 6c 69 73 74 20 65  equent doclist e
c7b0: 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
c7c0: 65 20 0a 20 20 20 20 20 20 20 64 69 66 66 65 72  e .       differ
c7d0: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
c7e0: 20 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74   new docid and t
c7f0: 68 65 20 70 72 65 76 69 6f 75 73 20 6f 6e 65 20  he previous one 
c800: 28 61 6c 77 61 79 73 20 61 20 70 6f 73 69 74 69  (always a positi
c810: 76 65 20 0a 20 20 20 20 20 20 20 6e 75 6d 62 65  ve .       numbe
c820: 72 29 2e 0a 20 20 3c 6c 69 3e 20 5a 65 72 6f 20  r)..  <li> Zero 
c830: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6f 66 66  or more term-off
c840: 73 65 74 20 6c 69 73 74 73 2e 20 41 20 74 65 72  set lists. A ter
c850: 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 69 73  m-offset list is
c860: 20 70 72 65 73 65 6e 74 20 66 6f 72 20 65 61 63   present for eac
c870: 68 0a 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20  h.       column 
c880: 6f 66 20 74 68 65 20 46 54 53 33 20 76 69 72 74  of the FTS3 virt
c890: 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 63  ual table that c
c8a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
c8b0: 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 0a  . A term-offset.
c8c0: 20 20 20 20 20 20 20 6c 69 73 74 20 63 6f 6e 73         list cons
c8d0: 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ists of the foll
c8e0: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 3c 6f 6c 3e  owing:.     <ol>
c8f0: 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 43 6f 6e  .       <li> Con
c900: 73 74 61 6e 74 20 76 61 6c 75 65 20 31 2e 20 54  stant value 1. T
c910: 68 69 73 20 66 69 65 6c 64 20 69 73 20 6f 6d 69  his field is omi
c920: 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72  tted for any ter
c930: 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 20 20  m-offset list.  
c940: 20 20 20 20 20 20 20 20 20 20 61 73 73 6f 63 69            associ
c950: 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ated with column
c960: 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20   0..       <li> 
c970: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  The column numbe
c980: 72 20 28 31 20 66 6f 72 20 74 68 65 20 73 65 63  r (1 for the sec
c990: 6f 6e 64 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c  ond leftmost col
c9a0: 75 6d 6e 2c 20 65 74 63 2e 29 2e 20 54 68 69 73  umn, etc.). This
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65  .            fie
c9c0: 6c 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  ld is omitted fo
c9d0: 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65  r any term-offse
c9e0: 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65  t list associate
c9f0: 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 30 2e  d with column 0.
ca00: 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 41 20 6c  .       <li> A l
ca10: 69 73 74 20 6f 66 20 74 65 72 6d 2d 6f 66 66 73  ist of term-offs
ca20: 65 74 73 2c 20 73 6f 72 74 65 64 20 66 72 6f 6d  ets, sorted from
ca30: 20 73 6d 61 6c 6c 65 73 74 20 74 6f 20 6c 61 72   smallest to lar
ca40: 67 65 73 74 2e 20 49 6e 73 74 65 61 64 0a 20 20  gest. Instead.  
ca50: 20 20 20 20 20 20 20 20 20 20 6f 66 20 73 74 6f            of sto
ca60: 72 69 6e 67 20 74 68 65 20 74 65 72 6d 2d 6f 66  ring the term-of
ca70: 66 73 65 74 20 76 61 6c 75 65 20 6c 69 74 65 72  fset value liter
ca80: 61 6c 6c 79 2c 20 65 61 63 68 20 69 6e 74 65 67  ally, each integ
ca90: 65 72 20 73 74 6f 72 65 64 20 0a 20 20 20 20 20  er stored .     
caa0: 20 20 20 20 20 20 20 69 73 20 74 68 65 20 64 69         is the di
cab0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
cac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
cad0: 6d 2d 6f 66 66 73 65 74 20 61 6e 64 20 74 68 65  m-offset and the
cae0: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 20   previous .     
caf0: 20 20 20 20 20 20 20 6f 6e 65 20 28 6f 72 20 7a         one (or z
cb00: 65 72 6f 20 69 66 20 74 68 65 20 63 75 72 72 65  ero if the curre
cb10: 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 69  nt term-offset i
cb20: 73 20 74 68 65 20 66 69 72 73 74 29 2c 20 70 6c  s the first), pl
cb30: 75 73 20 32 2e 0a 20 20 20 20 20 3c 2f 6f 6c 3e  us 2..     </ol>
cb40: 0a 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74  .  <li> Constant
cb50: 20 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f 6c 3e 0a   value 0..</ol>.
cb60: 0a 5b 46 69 67 20 66 74 73 33 5f 64 6f 63 6c 69  .[Fig fts3_docli
cb70: 73 74 32 2e 70 6e 67 20 22 46 54 53 33 20 44 6f  st2.png "FTS3 Do
cb80: 63 6c 69 73 74 20 46 6f 72 6d 61 74 22 5d 0a 0a  clist Format"]..
cb90: 5b 46 69 67 20 66 74 73 33 5f 64 6f 63 6c 69 73  [Fig fts3_doclis
cba0: 74 2e 70 6e 67 20 22 46 54 53 33 20 44 6f 63 6c  t.png "FTS3 Docl
cbb0: 69 73 74 20 45 6e 74 72 79 20 46 6f 72 6d 61 74  ist Entry Format
cbc0: 22 5d 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 64 6f  "]..<p>.  For do
cbd0: 63 6c 69 73 74 73 20 66 6f 72 20 77 68 69 63 68  clists for which
cbe0: 20 74 68 65 20 74 65 72 6d 20 61 70 70 65 61 72   the term appear
cbf0: 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s in more than o
cc00: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ne column of the
cc10: 20 46 54 53 33 0a 20 20 76 69 72 74 75 61 6c 20   FTS3.  virtual 
cc20: 74 61 62 6c 65 2c 20 74 65 72 6d 2d 6f 66 66 73  table, term-offs
cc30: 65 74 20 6c 69 73 74 73 20 77 69 74 68 69 6e 20  et lists within 
cc40: 74 68 65 20 64 6f 63 6c 69 73 74 20 61 72 65 20  the doclist are 
cc50: 73 74 6f 72 65 64 20 69 6e 20 63 6f 6c 75 6d 6e  stored in column
cc60: 20 0a 20 20 6e 75 6d 62 65 72 20 6f 72 64 65 72   .  number order
cc70: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
cc80: 68 61 74 20 74 68 65 20 74 65 72 6d 2d 6f 66 66  hat the term-off
cc90: 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61  set list associa
cca0: 74 65 64 20 77 69 74 68 20 0a 20 20 63 6f 6c 75  ted with .  colu
ccb0: 6d 6e 20 30 20 28 69 66 20 61 6e 79 29 20 69 73  mn 0 (if any) is
ccc0: 20 61 6c 77 61 79 73 20 66 69 72 73 74 2c 20 61   always first, a
ccd0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73  llowing the firs
cce0: 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20  t two fields of 
ccf0: 74 68 65 0a 20 20 74 65 72 6d 2d 6f 66 66 73 65  the.  term-offse
cd00: 74 20 6c 69 73 74 20 74 6f 20 62 65 20 6f 6d 69  t list to be omi
cd10: 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  tted in this cas
cd20: 65 2e 0a 0a 7d 0a                                e...}.