Documentation Source Text

Hex Artifact Content
Login

Artifact af9deacb24a0bf8cc3240a840131330e687c4f2832fb57bd299f8742282a9d65:


0000: 0a 3c 74 63 6c 3e 68 64 5f 6b 65 79 77 6f 72 64  .<tcl>hd_keyword
0010: 73 20 2a 66 74 73 33 20 46 54 53 33 20 7b 66 75  s *fts3 FTS3 {fu
0020: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 7d 3c  ll-text search}<
0030: 2f 74 63 6c 3e 0a 3c 74 69 74 6c 65 3e 53 51 4c  /tcl>.<title>SQL
0040: 69 74 65 20 46 54 53 33 20 61 6e 64 20 46 54 53  ite FTS3 and FTS
0050: 34 20 45 78 74 65 6e 73 69 6f 6e 73 3c 2f 74 69  4 Extensions</ti
0060: 74 6c 65 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f  tle>..<table_of_
0070: 63 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 32 20 69  contents>..<h2 i
0080: 64 3d 6f 76 65 72 76 69 65 77 20 73 74 79 6c 65  d=overview style
0090: 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 31 2e  ="margin-left:1.
00a0: 30 65 6d 22 20 6e 6f 74 6f 63 3e 20 4f 76 65 72  0em" notoc> Over
00b0: 76 69 65 77 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  view</h2>..<p>. 
00c0: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 20 61   FTS3 and FTS4 a
00d0: 72 65 20 53 51 4c 69 74 65 20 76 69 72 74 75 61  re SQLite virtua
00e0: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 73 20  l table modules 
00f0: 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 65 72  that allows user
0100: 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20 20  s to perform .  
0110: 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68  full-text search
0120: 65 73 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 64  es on a set of d
0130: 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65 20 6d 6f  ocuments. The mo
0140: 73 74 20 63 6f 6d 6d 6f 6e 20 28 61 6e 64 20 65  st common (and e
0150: 66 66 65 63 74 69 76 65 29 20 0a 20 20 77 61 79  ffective) .  way
0160: 20 74 6f 20 64 65 73 63 72 69 62 65 20 66 75 6c   to describe ful
0170: 6c 2d 74 65 78 74 20 73 65 61 72 63 68 65 73 20  l-text searches 
0180: 69 73 20 22 77 68 61 74 20 47 6f 6f 67 6c 65 2c  is "what Google,
0190: 20 59 61 68 6f 6f 2c 20 61 6e 64 20 42 69 6e 67   Yahoo, and Bing
01a0: 20 64 6f 0a 20 20 77 69 74 68 20 64 6f 63 75 6d   do.  with docum
01b0: 65 6e 74 73 20 70 6c 61 63 65 64 20 6f 6e 20 74  ents placed on t
01c0: 68 65 20 57 6f 72 6c 64 20 57 69 64 65 20 57 65  he World Wide We
01d0: 62 22 2e 20 55 73 65 72 73 20 69 6e 70 75 74 20  b". Users input 
01e0: 61 20 74 65 72 6d 2c 20 6f 72 20 73 65 72 69 65  a term, or serie
01f0: 73 20 0a 20 20 6f 66 20 74 65 72 6d 73 2c 20 70  s .  of terms, p
0200: 65 72 68 61 70 73 20 63 6f 6e 6e 65 63 74 65 64  erhaps connected
0210: 20 62 79 20 61 20 62 69 6e 61 72 79 20 6f 70 65   by a binary ope
0220: 72 61 74 6f 72 20 6f 72 20 67 72 6f 75 70 65 64  rator or grouped
0230: 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 61   together into a
0240: 20 0a 20 20 70 68 72 61 73 65 2c 20 61 6e 64 20   .  phrase, and 
0250: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  the full-text qu
0260: 65 72 79 20 73 79 73 74 65 6d 20 66 69 6e 64 73  ery system finds
0270: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
0280: 6d 65 6e 74 73 20 74 68 61 74 20 62 65 73 74 20  ments that best 
0290: 0a 20 20 6d 61 74 63 68 65 73 20 74 68 6f 73 65  .  matches those
02a0: 20 74 65 72 6d 73 20 63 6f 6e 73 69 64 65 72 69   terms consideri
02b0: 6e 67 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  ng the operators
02c0: 20 61 6e 64 20 67 72 6f 75 70 69 6e 67 73 20 74   and groupings t
02d0: 68 65 20 75 73 65 72 20 68 61 73 20 0a 20 20 73  he user has .  s
02e0: 70 65 63 69 66 69 65 64 2e 20 54 68 69 73 20 61  pecified. This a
02f0: 72 74 69 63 6c 65 20 64 65 73 63 72 69 62 65 73  rticle describes
0300: 20 74 68 65 20 64 65 70 6c 6f 79 6d 65 6e 74 20   the deployment 
0310: 61 6e 64 20 75 73 61 67 65 20 6f 66 20 46 54 53  and usage of FTS
0320: 33 20 61 6e 64 20 46 54 53 34 2e 0a 0a 3c 70 3e  3 and FTS4...<p>
0330: 0a 20 20 46 54 53 31 20 61 6e 64 20 46 54 53 32  .  FTS1 and FTS2
0340: 20 61 72 65 20 6f 62 73 6f 6c 65 74 65 20 66 75   are obsolete fu
0350: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 20 6d  ll-text search m
0360: 6f 64 75 6c 65 73 20 66 6f 72 20 53 51 4c 69 74  odules for SQLit
0370: 65 2e 20 20 54 68 65 72 65 20 61 72 65 20 6b 6e  e.  There are kn
0380: 6f 77 6e 0a 20 20 69 73 73 75 65 73 20 77 69 74  own.  issues wit
0390: 68 20 74 68 65 73 65 20 6f 6c 64 65 72 20 6d 6f  h these older mo
03a0: 64 75 6c 65 73 20 61 6e 64 20 74 68 65 69 72 20  dules and their 
03b0: 75 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 76  use should be av
03c0: 6f 69 64 65 64 2e 0a 20 20 50 6f 72 74 69 6f 6e  oided..  Portion
03d0: 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  s of the origina
03e0: 6c 20 46 54 53 33 20 63 6f 64 65 20 77 65 72 65  l FTS3 code were
03f0: 20 63 6f 6e 74 72 69 62 75 74 65 64 20 74 6f 20   contributed to 
0400: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 6a 65  the SQLite proje
0410: 63 74 20 0a 20 20 62 79 20 53 63 6f 74 74 20 48  ct .  by Scott H
0420: 65 73 73 20 6f 66 20 3c 61 20 68 72 65 66 3d 22  ess of <a href="
0430: 68 74 74 70 3a 2f 2f 77 77 77 2e 67 6f 6f 67 6c  http://www.googl
0440: 65 2e 63 6f 6d 22 3e 47 6f 6f 67 6c 65 3c 2f 61  e.com">Google</a
0450: 3e 2e 20 49 74 20 69 73 20 6e 6f 77 20 0a 20 20  >. It is now .  
0460: 64 65 76 65 6c 6f 70 65 64 20 61 6e 64 20 6d 61  developed and ma
0470: 69 6e 74 61 69 6e 65 64 20 61 73 20 70 61 72 74  intained as part
0480: 20 6f 66 20 53 51 4c 69 74 65 2e 0a 0a 3c 68 31   of SQLite...<h1
0490: 3e 49 6e 74 72 6f 64 75 63 74 69 6f 6e 20 74 6f  >Introduction to
04a0: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 3c 2f   FTS3 and FTS4</
04b0: 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46  h1>..<p>.  The F
04c0: 54 53 33 20 61 6e 64 20 46 54 53 34 20 65 78 74  TS3 and FTS4 ext
04d0: 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c 65 73 20 61  ension modules a
04e0: 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f 20 63  llows users to c
04f0: 72 65 61 74 65 20 73 70 65 63 69 61 6c 20 74 61  reate special ta
0500: 62 6c 65 73 20 77 69 74 68 20 61 20 0a 20 20 62  bles with a .  b
0510: 75 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74 65 78  uilt-in full-tex
0520: 74 20 69 6e 64 65 78 20 28 68 65 72 65 61 66 74  t index (hereaft
0530: 65 72 20 22 46 54 53 20 74 61 62 6c 65 73 22 29  er "FTS tables")
0540: 2e 20 54 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  . The full-text 
0550: 69 6e 64 65 78 0a 20 20 61 6c 6c 6f 77 73 20 74  index.  allows t
0560: 68 65 20 75 73 65 72 20 74 6f 20 65 66 66 69 63  he user to effic
0570: 69 65 6e 74 6c 79 20 71 75 65 72 79 20 74 68 65  iently query the
0580: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 61 6c   database for al
0590: 6c 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e 74  l rows that cont
05a0: 61 69 6e 0a 20 20 6f 6e 65 20 6f 72 20 6d 6f 72  ain.  one or mor
05b0: 65 20 77 6f 72 64 73 20 28 68 65 72 65 61 66 74  e words (hereaft
05c0: 65 72 20 22 74 6f 6b 65 6e 73 22 29 2c 20 65 76  er "tokens"), ev
05d0: 65 6e 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  en if the table.
05e0: 20 20 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20    contains many 
05f0: 6c 61 72 67 65 20 64 6f 63 75 6d 65 6e 74 73 2e  large documents.
0600: 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d  ..<p>.  For exam
0610: 70 6c 65 2c 20 69 66 20 65 61 63 68 20 6f 66 20  ple, if each of 
0620: 74 68 65 20 35 31 37 34 33 30 20 64 6f 63 75 6d  the 517430 docum
0630: 65 6e 74 73 20 69 6e 20 74 68 65 20 0a 20 20 22  ents in the .  "
0640: 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f  <a href="http://
0650: 77 77 77 2e 63 73 2e 63 6d 75 2e 65 64 75 2f 7e  www.cs.cmu.edu/~
0660: 65 6e 72 6f 6e 2f 22 3e 45 6e 72 6f 6e 20 45 2d  enron/">Enron E-
0670: 4d 61 69 6c 20 44 61 74 61 73 65 74 3c 2f 61 3e  Mail Dataset</a>
0680: 22 0a 20 20 69 73 20 69 6e 73 65 72 74 65 64 20  ".  is inserted 
0690: 69 6e 74 6f 20 62 6f 74 68 20 61 6e 20 46 54 53  into both an FTS
06a0: 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 6f 72   table and an or
06b0: 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61  dinary SQLite ta
06c0: 62 6c 65 0a 20 20 63 72 65 61 74 65 64 20 75 73  ble.  created us
06d0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
06e0: 67 20 53 51 4c 20 73 63 72 69 70 74 3a 0a 0a 3c  g SQL script:..<
06f0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45  codeblock>.  CRE
0700: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0710: 45 20 65 6e 72 6f 6e 64 61 74 61 31 20 55 53 49  E enrondata1 USI
0720: 4e 47 20 66 74 73 33 28 63 6f 6e 74 65 6e 74 20  NG fts3(content 
0730: 54 45 58 54 29 3b 20 20 20 20 20 2f 2a 20 46 54  TEXT);     /* FT
0740: 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 43 52  S3 table */.  CR
0750: 45 41 54 45 20 54 41 42 4c 45 20 65 6e 72 6f 6e  EATE TABLE enron
0760: 64 61 74 61 32 28 63 6f 6e 74 65 6e 74 20 54 45  data2(content TE
0770: 58 54 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  XT);            
0780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0790: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 2a 2f  rdinary table */
07a0: 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
07b0: 70 3e 0a 20 20 54 68 65 6e 20 65 69 74 68 65 72  p>.  Then either
07c0: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
07d0: 69 65 73 20 62 65 6c 6f 77 20 6d 61 79 20 62 65  ies below may be
07e0: 20 65 78 65 63 75 74 65 64 20 74 6f 20 66 69 6e   executed to fin
07f0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
0800: 20 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74    documents in t
0810: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
0820: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 77 6f 72   contain the wor
0830: 64 20 22 6c 69 6e 75 78 22 20 28 33 35 31 29 2e  d "linux" (351).
0840: 20 55 73 69 6e 67 20 6f 6e 65 0a 20 20 64 65 73   Using one.  des
0850: 6b 74 6f 70 20 50 43 20 68 61 72 64 77 61 72 65  ktop PC hardware
0860: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20   configuration, 
0870: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
0880: 20 46 54 53 33 20 74 61 62 6c 65 20 72 65 74 75   FTS3 table retu
0890: 72 6e 73 20 69 6e 0a 20 20 61 70 70 72 6f 78 69  rns in.  approxi
08a0: 6d 61 74 65 6c 79 20 30 2e 30 33 20 73 65 63 6f  mately 0.03 seco
08b0: 6e 64 73 2c 20 76 65 72 73 75 73 20 32 32 2e 35  nds, versus 22.5
08c0: 20 66 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68   for querying th
08d0: 65 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  e ordinary table
08e0: 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
08f0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
0900: 20 46 52 4f 4d 20 65 6e 72 6f 6e 64 61 74 61 31   FROM enrondata1
0910: 20 57 48 45 52 45 20 63 6f 6e 74 65 6e 74 20 4d   WHERE content M
0920: 41 54 43 48 20 27 6c 69 6e 75 78 27 3b 20 20 2f  ATCH 'linux';  /
0930: 2a 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 20 2a  * 0.03 seconds *
0940: 2f 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  /.  SELECT count
0950: 28 2a 29 20 46 52 4f 4d 20 65 6e 72 6f 6e 64 61  (*) FROM enronda
0960: 74 61 32 20 57 48 45 52 45 20 63 6f 6e 74 65 6e  ta2 WHERE conten
0970: 74 20 4c 49 4b 45 20 27 25 6c 69 6e 75 78 25 27  t LIKE '%linux%'
0980: 3b 20 2f 2a 20 32 32 2e 35 20 73 65 63 6f 6e 64  ; /* 22.5 second
0990: 73 20 2a 2f 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  s */.</codeblock
09a0: 3e 0a 0a 3c 70 3e 0a 20 20 4f 66 20 63 6f 75 72  >..<p>.  Of cour
09b0: 73 65 2c 20 74 68 65 20 74 77 6f 20 71 75 65 72  se, the two quer
09c0: 69 65 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ies above are no
09d0: 74 20 65 6e 74 69 72 65 6c 79 20 65 71 75 69 76  t entirely equiv
09e0: 61 6c 65 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70  alent. For examp
09f0: 6c 65 0a 20 20 74 68 65 20 4c 49 4b 45 20 71 75  le.  the LIKE qu
0a00: 65 72 79 20 6d 61 74 63 68 65 73 20 72 6f 77 73  ery matches rows
0a10: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65   that contain te
0a20: 72 6d 73 20 73 75 63 68 20 61 73 20 22 6c 69 6e  rms such as "lin
0a30: 75 78 6f 70 68 6f 62 65 22 0a 20 20 6f 72 20 22  uxophobe".  or "
0a40: 45 6e 74 65 72 70 72 69 73 65 4c 69 6e 75 78 22  EnterpriseLinux"
0a50: 20 28 61 73 20 69 74 20 68 61 70 70 65 6e 73 2c   (as it happens,
0a60: 20 74 68 65 20 45 6e 72 6f 6e 20 45 2d 4d 61 69   the Enron E-Mai
0a70: 6c 20 44 61 74 61 73 65 74 20 64 6f 65 73 20 6e  l Dataset does n
0a80: 6f 74 0a 20 20 61 63 74 75 61 6c 6c 79 20 63 6f  ot.  actually co
0a90: 6e 74 61 69 6e 20 61 6e 79 20 73 75 63 68 20 74  ntain any such t
0aa0: 65 72 6d 73 29 2c 20 77 68 65 72 65 61 73 20 74  erms), whereas t
0ab0: 68 65 20 4d 41 54 43 48 20 71 75 65 72 79 20 6f  he MATCH query o
0ac0: 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  n the FTS3 table
0ad0: 0a 20 20 73 65 6c 65 63 74 73 20 6f 6e 6c 79 20  .  selects only 
0ae0: 74 68 6f 73 65 20 72 6f 77 73 20 74 68 61 74 20  those rows that 
0af0: 63 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22 20  contain "linux" 
0b00: 61 73 20 61 20 64 69 73 63 72 65 74 65 20 74 6f  as a discrete to
0b10: 6b 65 6e 2e 20 42 6f 74 68 20 0a 20 20 73 65 61  ken. Both .  sea
0b20: 72 63 68 65 73 20 61 72 65 20 63 61 73 65 2d 69  rches are case-i
0b30: 6e 73 65 6e 73 69 74 69 76 65 2e 20 54 68 65 20  nsensitive. The 
0b40: 46 54 53 33 20 74 61 62 6c 65 20 63 6f 6e 73 75  FTS3 table consu
0b50: 6d 65 73 20 61 72 6f 75 6e 64 20 32 30 30 36 20  mes around 2006 
0b60: 4d 42 20 6f 6e 0a 20 20 64 69 73 6b 20 63 6f 6d  MB on.  disk com
0b70: 70 61 72 65 64 20 74 6f 20 6a 75 73 74 20 31 34  pared to just 14
0b80: 35 33 20 4d 42 20 66 6f 72 20 74 68 65 20 6f 72  53 MB for the or
0b90: 64 69 6e 61 72 79 20 74 61 62 6c 65 2e 20 55 73  dinary table. Us
0ba0: 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 68  ing the same.  h
0bb0: 61 72 64 77 61 72 65 20 63 6f 6e 66 69 67 75 72  ardware configur
0bc0: 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 70 65  ation used to pe
0bd0: 72 66 6f 72 6d 20 74 68 65 20 53 45 4c 45 43 54  rform the SELECT
0be0: 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c 20   queries above, 
0bf0: 74 68 65 20 46 54 53 33 0a 20 20 74 61 62 6c 65  the FTS3.  table
0c00: 20 74 6f 6f 6b 20 6a 75 73 74 20 75 6e 64 65 72   took just under
0c10: 20 33 31 20 6d 69 6e 75 74 65 73 20 74 6f 20 70   31 minutes to p
0c20: 6f 70 75 6c 61 74 65 2c 20 76 65 72 73 75 73 20  opulate, versus 
0c30: 32 35 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e  25 for the ordin
0c40: 61 72 79 0a 20 20 74 61 62 6c 65 2e 0a 0a 3c 68  ary.  table...<h
0c50: 32 3e 44 69 66 66 65 72 65 6e 63 65 73 20 62 65  2>Differences be
0c60: 74 77 65 65 6e 20 46 54 53 33 20 61 6e 64 20 46  tween FTS3 and F
0c70: 54 53 34 3c 2f 68 32 3e 0a 3c 74 63 6c 3e 68 64  TS4</h2>.<tcl>hd
0c80: 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 20 46  _fragment fts4 F
0c90: 54 53 34 3c 2f 74 63 6c 3e 0a 0a 3c 70 3e 0a 20  TS4</tcl>..<p>. 
0ca0: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 20 61   FTS3 and FTS4 a
0cb0: 72 65 20 6e 65 61 72 6c 79 20 69 64 65 6e 74 69  re nearly identi
0cc0: 63 61 6c 2e 20 54 68 65 79 20 73 68 61 72 65 20  cal. They share 
0cd0: 6d 6f 73 74 20 6f 66 20 74 68 65 69 72 20 63 6f  most of their co
0ce0: 64 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2c 0a 20 20  de in common,.  
0cf0: 61 6e 64 20 74 68 65 69 72 20 69 6e 74 65 72 66  and their interf
0d00: 61 63 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  aces are the sam
0d10: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
0d20: 65 73 20 61 72 65 3a 0a 0a 3c 75 6c 3e 0a 20 20  es are:..<ul>.  
0d30: 3c 6c 69 3e 20 3c 70 3e 46 54 53 34 20 63 6f 6e  <li> <p>FTS4 con
0d40: 74 61 69 6e 73 20 71 75 65 72 79 20 70 65 72 66  tains query perf
0d50: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
0d60: 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 73  tions that may s
0d70: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 20  ignificantly.   
0d80: 20 20 20 20 69 6d 70 72 6f 76 65 20 74 68 65 20      improve the 
0d90: 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 66  performance of f
0da0: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
0db0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65   that contain te
0dc0: 72 6d 73 20 74 68 61 74 20 61 72 65 0a 20 20 20  rms that are.   
0dd0: 20 20 20 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 20      very common 
0de0: 28 70 72 65 73 65 6e 74 20 69 6e 20 61 20 6c 61  (present in a la
0df0: 72 67 65 20 70 65 72 63 65 6e 74 61 67 65 20 6f  rge percentage o
0e00: 66 20 74 61 62 6c 65 20 72 6f 77 73 29 2e 0a 0a  f table rows)...
0e10: 20 20 3c 6c 69 3e 20 3c 70 3e 46 54 53 34 20 73    <li> <p>FTS4 s
0e20: 75 70 70 6f 72 74 73 20 73 6f 6d 65 20 61 64 64  upports some add
0e30: 69 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 20  itional options 
0e40: 74 68 61 74 20 6d 61 79 20 75 73 65 64 20 77 69  that may used wi
0e50: 74 68 20 74 68 65 20 5b 6d 61 74 63 68 69 6e 66  th the [matchinf
0e60: 6f 28 29 5d 0a 20 20 20 20 20 20 20 66 75 6e 63  o()].       func
0e70: 74 69 6f 6e 2e 20 0a 0a 20 20 3c 6c 69 3e 20 3c  tion. ..  <li> <
0e80: 70 3e 42 65 63 61 75 73 65 20 69 74 20 73 74 6f  p>Because it sto
0e90: 72 65 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  res extra inform
0ea0: 61 74 69 6f 6e 20 6f 6e 20 64 69 73 6b 20 69 6e  ation on disk in
0eb0: 20 74 77 6f 20 6e 65 77 20 0a 20 20 20 20 20 20   two new .      
0ec0: 20 5b 46 54 53 20 73 68 61 64 6f 77 20 74 61 62   [FTS shadow tab
0ed0: 6c 65 73 7c 73 68 61 64 6f 77 20 74 61 62 6c 65  les|shadow table
0ee0: 73 5d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  s] in order to s
0ef0: 75 70 70 6f 72 74 20 74 68 65 20 70 65 72 66 6f  upport the perfo
0f00: 72 6d 61 6e 63 65 0a 20 20 20 20 20 20 20 6f 70  rmance.       op
0f10: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 6e 64 20  timizations and 
0f20: 65 78 74 72 61 20 6d 61 74 63 68 69 6e 66 6f 28  extra matchinfo(
0f30: 29 20 6f 70 74 69 6f 6e 73 2c 20 46 54 53 34 20  ) options, FTS4 
0f40: 74 61 62 6c 65 73 20 6d 61 79 20 63 6f 6e 73 75  tables may consu
0f50: 6d 65 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 64  me more.       d
0f60: 69 73 6b 20 73 70 61 63 65 20 74 68 61 6e 20 74  isk space than t
0f70: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 61  he equivalent ta
0f80: 62 6c 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  ble created usin
0f90: 67 20 46 54 53 33 2e 20 55 73 75 61 6c 6c 79 20  g FTS3. Usually 
0fa0: 74 68 65 20 6f 76 65 72 68 65 61 64 0a 20 20 20  the overhead.   
0fb0: 20 20 20 20 69 73 20 31 2d 32 25 20 6f 72 20 6c      is 1-2% or l
0fc0: 65 73 73 2c 20 62 75 74 20 6d 61 79 20 62 65 20  ess, but may be 
0fd0: 61 73 20 68 69 67 68 20 61 73 20 31 30 25 20 69  as high as 10% i
0fe0: 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20  f the documents 
0ff0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 20 20  stored in the.  
1000: 20 20 20 20 20 46 54 53 20 74 61 62 6c 65 20 61       FTS table a
1010: 72 65 20 76 65 72 79 20 73 6d 61 6c 6c 2e 20 54  re very small. T
1020: 68 65 20 6f 76 65 72 68 65 61 64 20 6d 61 79 20  he overhead may 
1030: 62 65 20 72 65 64 75 63 65 64 20 62 79 20 73 70  be reduced by sp
1040: 65 63 69 66 79 69 6e 67 20 74 68 65 0a 20 20 20  ecifying the.   
1050: 20 20 20 20 64 69 72 65 63 74 69 76 65 20 5b 46      directive [F
1060: 54 53 34 20 6d 61 74 63 68 69 6e 66 6f 20 6f 70  TS4 matchinfo op
1070: 74 69 6f 6e 7c 22 6d 61 74 63 68 69 6e 66 6f 3d  tion|"matchinfo=
1080: 66 74 73 33 22 5d 20 61 73 20 70 61 72 74 20 6f  fts3"] as part o
1090: 66 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65  f the FTS4 table
10a0: 0a 20 20 20 20 20 20 20 64 65 63 6c 61 72 61 74  .       declarat
10b0: 69 6f 6e 2c 20 62 75 74 20 74 68 69 73 20 63 6f  ion, but this co
10c0: 6d 65 73 20 61 74 20 74 68 65 20 65 78 70 65 6e  mes at the expen
10d0: 73 65 20 6f 66 20 73 61 63 72 69 66 69 63 69 6e  se of sacrificin
10e0: 67 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  g some of the.  
10f0: 20 20 20 20 20 65 78 74 72 61 20 73 75 70 70 6f       extra suppo
1100: 72 74 65 64 20 6d 61 74 63 68 69 6e 66 6f 28 29  rted matchinfo()
1110: 20 6f 70 74 69 6f 6e 73 2e 0a 0a 20 20 3c 6c 69   options...  <li
1120: 3e 20 3c 70 3e 46 54 53 34 20 70 72 6f 76 69 64  > <p>FTS4 provid
1130: 65 73 20 68 6f 6f 6b 73 20 28 74 68 65 20 63 6f  es hooks (the co
1140: 6d 70 72 65 73 73 20 61 6e 64 20 75 6e 63 6f 6d  mpress and uncom
1150: 70 72 65 73 73 20 0a 20 20 20 20 20 20 20 5b 46  press .       [F
1160: 54 53 34 20 6f 70 74 69 6f 6e 73 7c 6f 70 74 69  TS4 options|opti
1170: 6f 6e 73 5d 29 20 61 6c 6c 6f 77 69 6e 67 20 64  ons]) allowing d
1180: 61 74 61 20 74 6f 20 62 65 20 73 74 6f 72 65 64  ata to be stored
1190: 20 69 6e 20 61 20 63 6f 6d 70 72 65 73 73 65 64   in a compressed
11a0: 20 0a 20 20 20 20 20 20 20 66 6f 72 6d 2c 20 72   .       form, r
11b0: 65 64 75 63 69 6e 67 20 64 69 73 6b 20 75 73 61  educing disk usa
11c0: 67 65 20 61 6e 64 20 49 4f 2e 0a 3c 2f 75 6c 3e  ge and IO..</ul>
11d0: 0a 0a 3c 70 3e 0a 20 20 46 54 53 34 20 69 73 20  ..<p>.  FTS4 is 
11e0: 61 6e 20 65 6e 68 61 6e 63 65 6d 65 6e 74 20 74  an enhancement t
11f0: 6f 20 46 54 53 33 2e 20 0a 20 20 46 54 53 33 20  o FTS3. .  FTS3 
1200: 68 61 73 20 62 65 65 6e 20 61 76 61 69 6c 61 62  has been availab
1210: 6c 65 20 73 69 6e 63 65 20 53 51 4c 69 74 65 20  le since SQLite 
1220: 5b 76 65 72 73 69 6f 6e 20 33 2e 35 2e 30 5d 20  [version 3.5.0] 
1230: 28 5b 64 61 74 65 6f 66 3a 33 2e 35 2e 30 5d 29  ([dateof:3.5.0])
1240: 0a 20 20 54 68 65 20 65 6e 68 61 6e 63 65 6d 65  .  The enhanceme
1250: 6e 74 73 20 66 6f 72 20 46 54 53 34 20 77 65 72  nts for FTS4 wer
1260: 65 20 61 64 64 65 64 20 77 69 74 68 20 53 51 4c  e added with SQL
1270: 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e 37  ite [version 3.7
1280: 2e 34 5d 0a 20 20 28 5b 64 61 74 65 6f 66 3a 33  .4].  ([dateof:3
1290: 2e 37 2e 34 5d 29 2e 0a 0a 3c 70 3e 0a 20 20 57  .7.4])...<p>.  W
12a0: 68 69 63 68 20 6d 6f 64 75 6c 65 2c 20 46 54 53  hich module, FTS
12b0: 33 20 6f 72 20 46 54 53 34 2c 20 73 68 6f 75 6c  3 or FTS4, shoul
12c0: 64 20 79 6f 75 20 75 73 65 20 69 6e 20 79 6f 75  d you use in you
12d0: 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 3f 20 20  r application?  
12e0: 46 54 53 34 20 69 73 0a 20 20 73 6f 6d 65 74 69  FTS4 is.  someti
12f0: 6d 65 73 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  mes significantl
1300: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 46 54  y faster than FT
1310: 53 33 2c 20 65 76 65 6e 20 6f 72 64 65 72 73 20  S3, even orders 
1320: 6f 66 20 6d 61 67 6e 69 74 75 64 65 20 66 61 73  of magnitude fas
1330: 74 65 72 0a 20 20 64 65 70 65 6e 64 69 6e 67 20  ter.  depending 
1340: 6f 6e 20 74 68 65 20 71 75 65 72 79 2c 20 74 68  on the query, th
1350: 6f 75 67 68 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ough in the comm
1360: 6f 6e 20 63 61 73 65 20 74 68 65 20 70 65 72 66  on case the perf
1370: 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 65 20 74  ormance of the t
1380: 77 6f 0a 20 20 6d 6f 64 75 6c 65 73 20 69 73 20  wo.  modules is 
1390: 73 69 6d 69 6c 61 72 2e 20 46 54 53 34 20 61 6c  similar. FTS4 al
13a0: 73 6f 20 6f 66 66 65 72 73 20 74 68 65 20 65 6e  so offers the en
13b0: 68 61 6e 63 65 64 20 5b 6d 61 74 63 68 69 6e 66  hanced [matchinf
13c0: 6f 28 29 5d 20 6f 75 74 70 75 74 73 20 77 68 69  o()] outputs whi
13d0: 63 68 0a 20 20 63 61 6e 20 62 65 20 75 73 65 66  ch.  can be usef
13e0: 75 6c 20 69 6e 20 72 61 6e 6b 69 6e 67 20 74 68  ul in ranking th
13f0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 20 5b  e results of a [
1400: 46 54 53 20 4d 41 54 43 48 7c 4d 41 54 43 48 5d  FTS MATCH|MATCH]
1410: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 20   operation.  On 
1420: 74 68 65 0a 20 20 6f 74 68 65 72 20 68 61 6e 64  the.  other hand
1430: 2c 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65  , in the absence
1440: 20 6f 66 20 61 20 5b 46 54 53 34 20 6d 61 74 63   of a [FTS4 matc
1450: 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 7c 6d 61 74  hinfo option|mat
1460: 63 68 69 6e 66 6f 3d 66 74 73 33 5d 20 64 69 72  chinfo=fts3] dir
1470: 65 63 74 69 76 65 20 46 54 53 34 20 72 65 71 75  ective FTS4 requ
1480: 69 72 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20  ires a little.  
1490: 6d 6f 72 65 20 64 69 73 6b 20 73 70 61 63 65 20  more disk space 
14a0: 74 68 61 6e 20 46 54 53 33 2c 20 74 68 6f 75 67  than FTS3, thoug
14b0: 68 20 6f 6e 6c 79 20 61 20 70 65 72 63 65 6e 74  h only a percent
14c0: 20 6f 66 20 74 77 6f 20 69 6e 20 6d 6f 73 74 20   of two in most 
14d0: 63 61 73 65 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f  cases...<p>.  Fo
14e0: 72 20 6e 65 77 65 72 20 61 70 70 6c 69 63 61 74  r newer applicat
14f0: 69 6f 6e 73 2c 20 46 54 53 34 20 69 73 20 72 65  ions, FTS4 is re
1500: 63 6f 6d 6d 65 6e 64 65 64 3b 20 74 68 6f 75 67  commended; thoug
1510: 68 20 69 66 20 63 6f 6d 70 61 74 69 62 69 6c 69  h if compatibili
1520: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 0a 20  ty with older . 
1530: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
1540: 69 74 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  ite is important
1550: 2c 20 74 68 65 6e 20 46 54 53 33 20 77 69 6c 6c  , then FTS3 will
1560: 20 75 73 75 61 6c 6c 79 20 73 65 72 76 65 20 6a   usually serve j
1570: 75 73 74 20 61 73 20 77 65 6c 6c 2e 20 20 0a 0a  ust as well.  ..
1580: 3c 68 32 3e 43 72 65 61 74 69 6e 67 20 61 6e 64  <h2>Creating and
1590: 20 44 65 73 74 72 6f 79 69 6e 67 20 46 54 53 20   Destroying FTS 
15a0: 54 61 62 6c 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  Tables</h2>..<p>
15b0: 0a 20 20 4c 69 6b 65 20 6f 74 68 65 72 20 76 69  .  Like other vi
15c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  rtual table type
15d0: 73 2c 20 6e 65 77 20 46 54 53 20 74 61 62 6c 65  s, new FTS table
15e0: 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73  s are created us
15f0: 69 6e 67 20 61 20 0a 20 20 5b 43 52 45 41 54 45  ing a .  [CREATE
1600: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 5d 20   VIRTUAL TABLE] 
1610: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6d  statement. The m
1620: 6f 64 75 6c 65 20 6e 61 6d 65 2c 20 77 68 69 63  odule name, whic
1630: 68 20 66 6f 6c 6c 6f 77 73 0a 20 20 74 68 65 20  h follows.  the 
1640: 55 53 49 4e 47 20 6b 65 79 77 6f 72 64 2c 20 69  USING keyword, i
1650: 73 20 65 69 74 68 65 72 20 22 66 74 73 33 22 20  s either "fts3" 
1660: 6f 72 20 22 66 74 73 34 22 2e 20 54 68 65 20 76  or "fts4". The v
1670: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
1680: 75 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 6d 61  ule arguments ma
1690: 79 0a 20 20 62 65 20 6c 65 66 74 20 65 6d 70 74  y.  be left empt
16a0: 79 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  y, in which case
16b0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69   an FTS table wi
16c0: 74 68 20 61 20 73 69 6e 67 6c 65 20 75 73 65 72  th a single user
16d0: 2d 64 65 66 69 6e 65 64 20 0a 20 20 63 6f 6c 75  -defined .  colu
16e0: 6d 6e 20 6e 61 6d 65 64 20 22 63 6f 6e 74 65 6e  mn named "conten
16f0: 74 22 20 69 73 20 63 72 65 61 74 65 64 2e 20 41  t" is created. A
1700: 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 74 68  lternatively, th
1710: 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  e module argumen
1720: 74 73 0a 20 20 6d 61 79 20 62 65 20 70 61 73 73  ts.  may be pass
1730: 65 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6d  ed a list of com
1740: 6d 61 20 73 65 70 61 72 61 74 65 64 20 63 6f 6c  ma separated col
1750: 75 6d 6e 20 6e 61 6d 65 73 2e 20 0a 0a 3c 70 3e  umn names. ..<p>
1760: 0a 20 20 49 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  .  If column nam
1770: 65 73 20 61 72 65 20 65 78 70 6c 69 63 69 74 6c  es are explicitl
1780: 79 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20 74  y provided for t
1790: 68 65 20 46 54 53 20 74 61 62 6c 65 20 61 73 20  he FTS table as 
17a0: 70 61 72 74 20 6f 66 0a 20 20 74 68 65 20 43 52  part of.  the CR
17b0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
17c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
17d0: 65 6e 20 61 20 64 61 74 61 74 79 70 65 20 6e 61  en a datatype na
17e0: 6d 65 20 6d 61 79 20 62 65 20 6f 70 74 69 6f 6e  me may be option
17f0: 61 6c 6c 79 20 0a 20 20 73 70 65 63 69 66 69 65  ally .  specifie
1800: 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
1810: 6e 2e 20 54 68 69 73 20 69 73 20 70 75 72 65 20  n. This is pure 
1820: 73 79 6e 74 61 63 74 69 63 20 73 75 67 61 72 2c  syntactic sugar,
1830: 20 74 68 65 0a 20 20 73 75 70 70 6c 69 65 64 20   the.  supplied 
1840: 74 79 70 65 6e 61 6d 65 73 20 61 72 65 20 6e 6f  typenames are no
1850: 74 20 75 73 65 64 20 62 79 20 46 54 53 20 6f 72  t used by FTS or
1860: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
1870: 20 66 6f 72 20 61 6e 79 0a 20 20 70 75 72 70 6f   for any.  purpo
1880: 73 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70  se. The same app
1890: 6c 69 65 73 20 74 6f 20 61 6e 79 20 63 6f 6e 73  lies to any cons
18a0: 74 72 61 69 6e 74 73 20 73 70 65 63 69 66 69 65  traints specifie
18b0: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 0a  d along with an.
18c0: 20 20 46 54 53 20 63 6f 6c 75 6d 6e 20 6e 61 6d    FTS column nam
18d0: 65 20 2d 20 74 68 65 79 20 61 72 65 20 70 61 72  e - they are par
18e0: 73 65 64 20 62 75 74 20 6e 6f 74 20 75 73 65 64  sed but not used
18f0: 20 6f 72 20 72 65 63 6f 72 64 65 64 20 62 79 20   or recorded by 
1900: 74 68 65 20 73 79 73 74 65 6d 0a 20 20 69 6e 20  the system.  in 
1910: 61 6e 79 20 77 61 79 2e 0a 0a 3c 63 6f 64 65 62  any way...<codeb
1920: 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72  lock>.  <i>-- Cr
1930: 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c  eate an FTS tabl
1940: 65 20 6e 61 6d 65 64 20 22 64 61 74 61 22 20 77  e named "data" w
1950: 69 74 68 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2d  ith one column -
1960: 20 22 63 6f 6e 74 65 6e 74 22 3a 3c 2f 69 3e 0a   "content":</i>.
1970: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1980: 20 54 41 42 4c 45 20 64 61 74 61 20 55 53 49 4e   TABLE data USIN
1990: 47 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69 3e  G fts3();..  <i>
19a0: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
19b0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61   table named "pa
19c0: 67 65 73 22 20 77 69 74 68 20 74 68 72 65 65 20  ges" with three 
19d0: 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e 0a 20 20 43  columns:</i>.  C
19e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
19f0: 42 4c 45 20 70 61 67 65 73 20 55 53 49 4e 47 20  BLE pages USING 
1a00: 66 74 73 34 28 74 69 74 6c 65 2c 20 6b 65 79 77  fts4(title, keyw
1a10: 6f 72 64 73 2c 20 62 6f 64 79 29 3b 0a 0a 20 20  ords, body);..  
1a20: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
1a30: 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  FTS table named 
1a40: 22 6d 61 69 6c 22 20 77 69 74 68 20 74 77 6f 20  "mail" with two 
1a50: 63 6f 6c 75 6d 6e 73 2e 20 44 61 74 61 74 79 70  columns. Datatyp
1a60: 65 73 0a 20 20 2d 2d 20 61 6e 64 20 63 6f 6c 75  es.  -- and colu
1a70: 6d 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  mn constraints a
1a80: 72 65 20 73 70 65 63 69 66 69 65 64 20 61 6c 6f  re specified alo
1a90: 6e 67 20 77 69 74 68 20 65 61 63 68 20 63 6f 6c  ng with each col
1aa0: 75 6d 6e 2e 20 54 68 65 73 65 0a 20 20 2d 2d 20  umn. These.  -- 
1ab0: 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
1ac0: 67 6e 6f 72 65 64 20 62 79 20 46 54 53 20 61 6e  gnored by FTS an
1ad0: 64 20 53 51 4c 69 74 65 2e 20 3c 2f 69 3e 0a 20  d SQLite. </i>. 
1ae0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1af0: 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47  TABLE mail USING
1b00: 20 66 74 73 33 28 0a 20 20 20 20 73 75 62 6a 65   fts3(.    subje
1b10: 63 74 20 56 41 52 43 48 41 52 28 32 35 36 29 20  ct VARCHAR(256) 
1b20: 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 62 6f  NOT NULL,.    bo
1b30: 64 79 20 54 45 58 54 20 43 48 45 43 4b 28 6c 65  dy TEXT CHECK(le
1b40: 6e 67 74 68 28 62 6f 64 79 29 26 6c 74 3b 31 30  ngth(body)&lt;10
1b50: 32 34 30 29 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65  240).  );.</code
1b60: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 73  block>..<p>.  As
1b70: 20 77 65 6c 6c 20 61 73 20 61 20 6c 69 73 74 20   well as a list 
1b80: 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 20  of columns, the 
1b90: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73  module arguments
1ba0: 20 70 61 73 73 65 64 20 74 6f 20 61 20 43 52 45   passed to a CRE
1bb0: 41 54 45 0a 20 20 56 49 52 54 55 41 4c 20 54 41  ATE.  VIRTUAL TA
1bc0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73  BLE statement us
1bd0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
1be0: 46 54 53 20 74 61 62 6c 65 20 6d 61 79 20 62 65  FTS table may be
1bf0: 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
1c00: 0a 20 20 61 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d  .  a [tokenizer]
1c10: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
1c20: 79 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 73  y specifying a s
1c30: 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72  tring of the for
1c40: 6d 0a 20 20 22 74 6f 6b 65 6e 69 7a 65 3d 26 6c  m.  "tokenize=&l
1c50: 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65  t;tokenizer name
1c60: 26 67 74 3b 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a  &gt; &lt;tokeniz
1c70: 65 72 20 61 72 67 73 26 67 74 3b 22 20 69 6e 20  er args&gt;" in 
1c80: 70 6c 61 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  place of a colum
1c90: 6e 0a 20 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  n.  name, where 
1ca0: 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61  &lt;tokenizer na
1cb0: 6d 65 26 67 74 3b 20 69 73 20 74 68 65 20 6e 61  me&gt; is the na
1cc0: 6d 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69  me of the tokeni
1cd0: 7a 65 72 20 74 6f 20 75 73 65 20 61 6e 64 0a 20  zer to use and. 
1ce0: 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 61   &lt;tokenizer a
1cf0: 72 67 73 26 67 74 3b 20 69 73 20 61 6e 20 6f 70  rgs&gt; is an op
1d00: 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 77  tional list of w
1d10: 68 69 74 65 73 70 61 63 65 20 73 65 70 61 72 61  hitespace separa
1d20: 74 65 64 20 71 75 61 6c 69 66 69 65 72 73 0a 20  ted qualifiers. 
1d30: 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
1d40: 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
1d50: 65 6e 74 61 74 69 6f 6e 2e 20 41 20 74 6f 6b 65  entation. A toke
1d60: 6e 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74  nizer specificat
1d70: 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 70 6c 61  ion may be.  pla
1d80: 63 65 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20  ced anywhere in 
1d90: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
1da0: 20 62 75 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65   but at most one
1db0: 20 74 6f 6b 65 6e 69 7a 65 72 20 64 65 63 6c 61   tokenizer decla
1dc0: 72 61 74 69 6f 6e 20 69 73 0a 20 20 61 6c 6c 6f  ration is.  allo
1dd0: 77 65 64 20 66 6f 72 20 65 61 63 68 20 43 52 45  wed for each CRE
1de0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1df0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 5b 74 6f  E statement. [to
1e00: 6b 65 6e 69 7a 65 72 7c 53 65 65 20 62 65 6c 6f  kenizer|See belo
1e10: 77 5d 20 66 6f 72 20 61 20 0a 20 20 64 65 74 61  w] for a .  deta
1e20: 69 6c 65 64 20 64 65 73 63 72 69 70 74 69 6f 6e  iled description
1e30: 20 6f 66 20 75 73 69 6e 67 20 28 61 6e 64 2c 20   of using (and, 
1e40: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6d  if necessary, im
1e50: 70 6c 65 6d 65 6e 74 69 6e 67 29 20 61 20 74 6f  plementing) a to
1e60: 6b 65 6e 69 7a 65 72 2e 0a 0a 3c 63 6f 64 65 62  kenizer...<codeb
1e70: 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72  lock>.  <i>-- Cr
1e80: 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c  eate an FTS tabl
1e90: 65 20 6e 61 6d 65 64 20 22 70 61 70 65 72 73 22  e named "papers"
1ea0: 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e   with two column
1eb0: 73 20 74 68 61 74 20 75 73 65 73 3c 2f 69 3e 0a  s that uses</i>.
1ec0: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 74 6f 6b 65    <i>-- the toke
1ed0: 6e 69 7a 65 72 20 22 70 6f 72 74 65 72 22 2e 3c  nizer "porter".<
1ee0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1ef0: 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72  TUAL TABLE paper
1f00: 73 20 55 53 49 4e 47 20 66 74 73 33 28 61 75 74  s USING fts3(aut
1f10: 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20 74  hor, document, t
1f20: 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 29 3b  okenize=porter);
1f30: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
1f40: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69   an FTS table wi
1f50: 74 68 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  th a single colu
1f60: 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22 20 2d  mn - "content" -
1f70: 20 74 68 61 74 20 75 73 65 73 3c 2f 69 3e 0a 20   that uses</i>. 
1f80: 20 3c 69 3e 2d 2d 20 74 68 65 20 22 73 69 6d 70   <i>-- the "simp
1f90: 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f  le" tokenizer.</
1fa0: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
1fb0: 55 41 4c 20 54 41 42 4c 45 20 64 61 74 61 20 55  UAL TABLE data U
1fc0: 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69  SING fts4(tokeni
1fd0: 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c  ze=simple);..  <
1fe0: 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46  i>-- Create an F
1ff0: 54 53 20 74 61 62 6c 65 20 77 69 74 68 20 74 77  TS table with tw
2000: 6f 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 75  o columns that u
2010: 73 65 73 20 74 68 65 20 22 69 63 75 22 20 74 6f  ses the "icu" to
2020: 6b 65 6e 69 7a 65 72 2e 3c 2f 69 3e 0a 20 20 3c  kenizer.</i>.  <
2030: 69 3e 2d 2d 20 54 68 65 20 71 75 61 6c 69 66 69  i>-- The qualifi
2040: 65 72 20 22 65 6e 5f 41 55 22 20 69 73 20 70 61  er "en_AU" is pa
2050: 73 73 65 64 20 74 6f 20 74 68 65 20 74 6f 6b 65  ssed to the toke
2060: 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
2070: 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54  tion</i>.  CREAT
2080: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2090: 6e 61 6d 65 73 20 55 53 49 4e 47 20 66 74 73 33  names USING fts3
20a0: 28 61 2c 20 62 2c 20 74 6f 6b 65 6e 69 7a 65 3d  (a, b, tokenize=
20b0: 69 63 75 20 65 6e 5f 41 55 29 3b 0a 3c 2f 63 6f  icu en_AU);.</co
20c0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
20d0: 46 54 53 20 74 61 62 6c 65 73 20 6d 61 79 20 62  FTS tables may b
20e0: 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
20f0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
2100: 67 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 5b 44  g an ordinary [D
2110: 52 4f 50 20 54 41 42 4c 45 5d 0a 20 20 73 74 61  ROP TABLE].  sta
2120: 74 65 6d 65 6e 74 2e 20 46 6f 72 20 65 78 61 6d  tement. For exam
2130: 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
2140: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
2150: 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
2160: 6c 79 20 64 72 6f 70 2c 20 61 6e 20 46 54 53 34  ly drop, an FTS4
2170: 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52   table.</i>.  CR
2180: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2190: 4c 45 20 64 61 74 61 20 55 53 49 4e 47 20 66 74  LE data USING ft
21a0: 73 34 28 29 3b 0a 20 20 44 52 4f 50 20 54 41 42  s4();.  DROP TAB
21b0: 4c 45 20 64 61 74 61 3b 0a 3c 2f 63 6f 64 65 62  LE data;.</codeb
21c0: 6c 6f 63 6b 3e 0a 0a 3c 68 32 3e 50 6f 70 75 6c  lock>..<h2>Popul
21d0: 61 74 69 6e 67 20 46 54 53 20 54 61 62 6c 65 73  ating FTS Tables
21e0: 3c 2f 68 32 3e 0a 0a 20 20 3c 70 3e 0a 20 20 20  </h2>..  <p>.   
21f0: 20 46 54 53 20 74 61 62 6c 65 73 20 61 72 65 20   FTS tables are 
2200: 70 6f 70 75 6c 61 74 65 64 20 75 73 69 6e 67 20  populated using 
2210: 5b 49 4e 53 45 52 54 5d 2c 20 5b 55 50 44 41 54  [INSERT], [UPDAT
2220: 45 5d 20 61 6e 64 20 5b 44 45 4c 45 54 45 5d 0a  E] and [DELETE].
2230: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 69      statements i
2240: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
2250: 73 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74  s ordinary SQLit
2260: 65 20 74 61 62 6c 65 73 20 61 72 65 2e 0a 0a 20  e tables are... 
2270: 20 3c 70 3e 0a 20 20 20 20 41 73 20 77 65 6c 6c   <p>.    As well
2280: 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   as the columns 
2290: 6e 61 6d 65 64 20 62 79 20 74 68 65 20 75 73 65  named by the use
22a0: 72 20 28 6f 72 20 74 68 65 20 22 63 6f 6e 74 65  r (or the "conte
22b0: 6e 74 22 20 63 6f 6c 75 6d 6e 20 69 66 20 6e 6f  nt" column if no
22c0: 0a 20 20 20 20 6d 6f 64 75 6c 65 20 61 72 67 75  .    module argu
22d0: 6d 65 6e 74 73 20 77 65 72 65 20 73 70 65 63 69  ments were speci
22e0: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
22f0: 74 68 65 20 5b 43 52 45 41 54 45 20 56 49 52 54  the [CREATE VIRT
2300: 55 41 4c 20 54 41 42 4c 45 5d 20 0a 20 20 20 20  UAL TABLE] .    
2310: 73 74 61 74 65 6d 65 6e 74 29 2c 20 65 61 63 68  statement), each
2320: 20 46 54 53 20 74 61 62 6c 65 20 68 61 73 20 61   FTS table has a
2330: 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 2e   "rowid" column.
2340: 20 54 68 65 20 72 6f 77 69 64 20 6f 66 20 61 6e   The rowid of an
2350: 20 46 54 53 0a 20 20 20 20 74 61 62 6c 65 20 62   FTS.    table b
2360: 65 68 61 76 65 73 20 69 6e 20 74 68 65 20 73 61  ehaves in the sa
2370: 6d 65 20 77 61 79 20 61 73 20 74 68 65 20 72 6f  me way as the ro
2380: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  wid column of an
2390: 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74 65   ordinary SQLite
23a0: 20 0a 20 20 20 20 74 61 62 6c 65 2c 20 65 78 63   .    table, exc
23b0: 65 70 74 20 74 68 61 74 20 74 68 65 20 76 61 6c  ept that the val
23c0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
23d0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f  e rowid column o
23e0: 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 0a  f an FTS table .
23f0: 20 20 20 20 72 65 6d 61 69 6e 20 75 6e 63 68 61      remain uncha
2400: 6e 67 65 64 20 69 66 20 74 68 65 20 64 61 74 61  nged if the data
2410: 62 61 73 65 20 69 73 20 72 65 62 75 69 6c 74 20  base is rebuilt 
2420: 75 73 69 6e 67 20 74 68 65 20 5b 56 41 43 55 55  using the [VACUU
2430: 4d 5d 20 63 6f 6d 6d 61 6e 64 2e 20 0a 20 20 20  M] command. .   
2440: 20 46 6f 72 20 46 54 53 20 74 61 62 6c 65 73 2c   For FTS tables,
2450: 20 22 64 6f 63 69 64 22 20 69 73 20 61 6c 6c 6f   "docid" is allo
2460: 77 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73 20  wed as an alias 
2470: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 75  along with the u
2480: 73 75 61 6c 20 22 72 6f 77 69 64 22 2c 0a 20 20  sual "rowid",.  
2490: 20 20 22 6f 69 64 22 20 61 6e 64 20 22 5f 6f 69    "oid" and "_oi
24a0: 64 5f 22 20 69 64 65 6e 74 69 66 69 65 72 73 2e  d_" identifiers.
24b0: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69   Attempting to i
24c0: 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65 20  nsert or update 
24d0: 61 20 72 6f 77 20 77 69 74 68 20 61 20 0a 20 20  a row with a .  
24e0: 20 20 64 6f 63 69 64 20 76 61 6c 75 65 20 74 68    docid value th
24f0: 61 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  at already exist
2500: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  s in the table i
2510: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6a 75 73 74  s an error, just
2520: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 0a 20 20   as it would .  
2530: 20 20 62 65 20 77 69 74 68 20 61 6e 20 6f 72 64    be with an ord
2540: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61 62  inary SQLite tab
2550: 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54  le...  <p>.    T
2560: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 74 68 65  here is one othe
2570: 72 20 73 75 62 74 6c 65 20 64 69 66 66 65 72 65  r subtle differe
2580: 6e 63 65 20 62 65 74 77 65 65 6e 20 22 64 6f 63  nce between "doc
2590: 69 64 22 20 61 6e 64 20 74 68 65 20 6e 6f 72 6d  id" and the norm
25a0: 61 6c 20 53 51 4c 69 74 65 0a 20 20 20 20 61 6c  al SQLite.    al
25b0: 69 61 73 65 73 20 66 6f 72 20 74 68 65 20 72 6f  iases for the ro
25c0: 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 4e 6f 72 6d  wid column. Norm
25d0: 61 6c 6c 79 2c 20 69 66 20 61 6e 20 49 4e 53 45  ally, if an INSE
25e0: 52 54 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  RT or UPDATE sta
25f0: 74 65 6d 65 6e 74 20 0a 20 20 20 20 61 73 73 69  tement .    assi
2600: 67 6e 73 20 64 69 73 63 72 65 74 65 20 76 61 6c  gns discrete val
2610: 75 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  ues to two or mo
2620: 72 65 20 61 6c 69 61 73 65 73 20 6f 66 20 74 68  re aliases of th
2630: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2c 20  e rowid column, 
2640: 53 51 4c 69 74 65 20 0a 20 20 20 20 77 72 69 74  SQLite .    writ
2650: 65 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  es the rightmost
2660: 20 6f 66 20 73 75 63 68 20 76 61 6c 75 65 73 20   of such values 
2670: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2680: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
2690: 45 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20  E.    statement 
26a0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
26b0: 20 48 6f 77 65 76 65 72 2c 20 61 73 73 69 67 6e   However, assign
26c0: 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ing a non-NULL v
26d0: 61 6c 75 65 20 74 6f 20 62 6f 74 68 0a 20 20 20  alue to both.   
26e0: 20 74 68 65 20 22 64 6f 63 69 64 22 20 61 6e 64   the "docid" and
26f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
2700: 74 68 65 20 53 51 4c 69 74 65 20 72 6f 77 69 64  the SQLite rowid
2710: 20 61 6c 69 61 73 65 73 20 77 68 65 6e 20 69 6e   aliases when in
2720: 73 65 72 74 69 6e 67 20 6f 72 0a 20 20 20 20 75  serting or.    u
2730: 70 64 61 74 69 6e 67 20 61 6e 20 46 54 53 20 74  pdating an FTS t
2740: 61 62 6c 65 20 69 73 20 63 6f 6e 73 69 64 65 72  able is consider
2750: 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 53 65 65  ed an error. See
2760: 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e 20 65 78   below for an ex
2770: 61 6d 70 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f  ample...<codeblo
2780: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61  ck>.  <i>-- Crea
2790: 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 3c  te an FTS table<
27a0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
27b0: 54 55 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73  TUAL TABLE pages
27c0: 20 55 53 49 4e 47 20 66 74 73 34 28 74 69 74 6c   USING fts4(titl
27d0: 65 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e  e, body);..  <i>
27e0: 2d 2d 20 49 6e 73 65 72 74 20 61 20 72 6f 77 20  -- Insert a row 
27f0: 77 69 74 68 20 61 20 73 70 65 63 69 66 69 63 20  with a specific 
2800: 64 6f 63 69 64 20 76 61 6c 75 65 2e 3c 2f 69 3e  docid value.</i>
2810: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
2820: 61 67 65 73 28 64 6f 63 69 64 2c 20 74 69 74 6c  ages(docid, titl
2830: 65 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28  e, body) VALUES(
2840: 35 33 2c 20 27 48 6f 6d 65 20 50 61 67 65 27 2c  53, 'Home Page',
2850: 20 27 53 51 4c 69 74 65 20 69 73 20 61 20 73 6f   'SQLite is a so
2860: 66 74 77 61 72 65 2e 2e 2e 27 29 3b 0a 0a 20 20  ftware...');..  
2870: 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20 72  <i>-- Insert a r
2880: 6f 77 20 61 6e 64 20 61 6c 6c 6f 77 20 46 54 53  ow and allow FTS
2890: 20 74 6f 20 61 73 73 69 67 6e 20 61 20 64 6f 63   to assign a doc
28a0: 69 64 20 76 61 6c 75 65 20 75 73 69 6e 67 20 74  id value using t
28b0: 68 65 20 73 61 6d 65 20 61 6c 67 6f 72 69 74 68  he same algorith
28c0: 6d 20 61 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  m as</i>.  <i>--
28d0: 20 53 51 4c 69 74 65 20 75 73 65 73 20 66 6f 72   SQLite uses for
28e0: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73   ordinary tables
28f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2900: 68 65 20 6e 65 77 20 64 6f 63 69 64 20 77 69 6c  he new docid wil
2910: 6c 20 62 65 20 35 34 2c 3c 2f 69 3e 0a 20 20 3c  l be 54,</i>.  <
2920: 69 3e 2d 2d 20 6f 6e 65 20 67 72 65 61 74 65 72  i>-- one greater
2930: 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
2940: 74 20 64 6f 63 69 64 20 63 75 72 72 65 6e 74 6c  t docid currentl
2950: 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  y present in the
2960: 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 49 4e   table.</i>.  IN
2970: 53 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73 28  SERT INTO pages(
2980: 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c  title, body) VAL
2990: 55 45 53 28 27 44 6f 77 6e 6c 6f 61 64 27 2c 20  UES('Download', 
29a0: 27 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f 75 72  'All SQLite sour
29b0: 63 65 20 63 6f 64 65 2e 2e 2e 27 29 3b 0a 0a 20  ce code...');.. 
29c0: 20 3c 69 3e 2d 2d 20 43 68 61 6e 67 65 20 74 68   <i>-- Change th
29d0: 65 20 74 69 74 6c 65 20 6f 66 20 74 68 65 20 72  e title of the r
29e0: 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
29f0: 2e 3c 2f 69 3e 0a 20 20 55 50 44 41 54 45 20 70  .</i>.  UPDATE p
2a00: 61 67 65 73 20 53 45 54 20 74 69 74 6c 65 20 3d  ages SET title =
2a10: 20 27 44 6f 77 6e 6c 6f 61 64 20 53 51 4c 69 74   'Download SQLit
2a20: 65 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  e' WHERE rowid =
2a30: 20 35 34 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 44 65   54;..  <i>-- De
2a40: 6c 65 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  lete the entire 
2a50: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 3c  table contents.<
2a60: 2f 69 3e 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  /i>.  DELETE FRO
2a70: 4d 20 70 61 67 65 73 3b 0a 0a 20 20 3c 69 3e 2d  M pages;..  <i>-
2a80: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
2a90: 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20  is an error. It 
2aa0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2ab0: 74 6f 20 61 73 73 69 67 6e 20 6e 6f 6e 2d 4e 55  to assign non-NU
2ac0: 4c 4c 20 76 61 6c 75 65 73 20 74 6f 20 62 6f 74  LL values to bot
2ad0: 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  h</i>.  <i>-- th
2ae0: 65 20 72 6f 77 69 64 20 61 6e 64 20 64 6f 63 69  e rowid and doci
2af0: 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 20  d columns of an 
2b00: 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  FTS table.</i>. 
2b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
2b20: 65 73 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 2c  es(rowid, docid,
2b30: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
2b40: 4c 55 45 53 28 31 2c 20 32 2c 20 27 41 20 74 69  LUES(1, 2, 'A ti
2b50: 74 6c 65 27 2c 20 27 41 20 64 6f 63 75 6d 65 6e  tle', 'A documen
2b60: 74 20 62 6f 64 79 27 29 3b 0a 3c 2f 63 6f 64 65  t body');.</code
2b70: 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e 0a 20 20  block>..  <p>.  
2b80: 20 20 54 6f 20 73 75 70 70 6f 72 74 20 66 75 6c    To support ful
2b90: 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 2c 20  l-text queries, 
2ba0: 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61 6e  FTS maintains an
2bb0: 20 69 6e 76 65 72 74 65 64 20 69 6e 64 65 78 20   inverted index 
2bc0: 74 68 61 74 20 6d 61 70 73 0a 20 20 20 20 66 72  that maps.    fr
2bd0: 6f 6d 20 65 61 63 68 20 75 6e 69 71 75 65 20 74  om each unique t
2be0: 65 72 6d 20 6f 72 20 77 6f 72 64 20 74 68 61 74  erm or word that
2bf0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
2c00: 64 61 74 61 73 65 74 20 74 6f 20 74 68 65 20 6c  dataset to the l
2c10: 6f 63 61 74 69 6f 6e 73 0a 20 20 20 20 69 6e 20  ocations.    in 
2c20: 77 68 69 63 68 20 69 74 20 61 70 70 65 61 72 73  which it appears
2c30: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
2c40: 65 20 63 6f 6e 74 65 6e 74 73 2e 20 46 6f 72 20  e contents. For 
2c50: 74 68 65 20 63 75 72 69 6f 75 73 2c 20 61 20 0a  the curious, a .
2c60: 20 20 20 20 63 6f 6d 70 6c 65 74 65 20 64 65 73      complete des
2c70: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
2c80: 5b 73 65 67 6d 65 6e 74 20 62 74 72 65 65 7c 64  [segment btree|d
2c90: 61 74 61 20 73 74 72 75 63 74 75 72 65 5d 20 75  ata structure] u
2ca0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 20  sed to store.   
2cb0: 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 74 68   this index with
2cc0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2cd0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 62 65 6c  file appears bel
2ce0: 6f 77 2e 20 41 20 66 65 61 74 75 72 65 20 6f 66  ow. A feature of
2cf0: 0a 20 20 20 20 74 68 69 73 20 64 61 74 61 20 73  .    this data s
2d00: 74 72 75 63 74 75 72 65 20 69 73 20 74 68 61 74  tructure is that
2d10: 20 61 74 20 61 6e 79 20 74 69 6d 65 20 74 68 65   at any time the
2d20: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 63 6f   database may co
2d30: 6e 74 61 69 6e 20 6e 6f 74 0a 20 20 20 20 6f 6e  ntain not.    on
2d40: 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20  e index b-tree, 
2d50: 62 75 74 20 73 65 76 65 72 61 6c 20 64 69 66 66  but several diff
2d60: 65 72 65 6e 74 20 62 2d 74 72 65 65 73 20 74 68  erent b-trees th
2d70: 61 74 20 61 72 65 20 69 6e 63 72 65 6d 65 6e 74  at are increment
2d80: 61 6c 6c 79 0a 20 20 20 20 6d 65 72 67 65 64 20  ally.    merged 
2d90: 61 73 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65  as rows are inse
2da0: 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 61 6e  rted, updated an
2db0: 64 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  d deleted. This 
2dc0: 74 65 63 68 6e 69 71 75 65 20 69 6d 70 72 6f 76  technique improv
2dd0: 65 73 20 0a 20 20 20 20 70 65 72 66 6f 72 6d 61  es .    performa
2de0: 6e 63 65 20 77 68 65 6e 20 77 72 69 74 69 6e 67  nce when writing
2df0: 20 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65   to an FTS table
2e00: 2c 20 62 75 74 20 63 61 75 73 65 73 20 73 6f 6d  , but causes som
2e10: 65 20 6f 76 65 72 68 65 61 64 20 66 6f 72 0a 20  e overhead for. 
2e20: 20 20 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65     full-text que
2e30: 72 69 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ries that use th
2e40: 65 20 69 6e 64 65 78 2e 20 45 76 61 6c 75 61 74  e index. Evaluat
2e50: 69 6e 67 20 74 68 65 20 73 70 65 63 69 61 6c 20  ing the special 
2e60: 5b 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f 6d 6d  ["optimize" comm
2e70: 61 6e 64 5d 2c 20 0a 20 20 20 20 61 6e 20 53 51  and], .    an SQ
2e80: 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74  L statement of t
2e90: 68 65 0a 20 20 20 20 66 6f 72 6d 20 22 49 4e 53  he.    form "INS
2ea0: 45 52 54 20 49 4e 54 4f 20 26 6c 74 3b 66 74 73  ERT INTO &lt;fts
2eb0: 2d 74 61 62 6c 65 26 67 74 3b 28 26 6c 74 3b 66  -table&gt;(&lt;f
2ec0: 74 73 2d 74 61 62 6c 65 26 67 74 3b 29 20 56 41  ts-table&gt;) VA
2ed0: 4c 55 45 53 28 27 6f 70 74 69 6d 69 7a 65 27 29  LUES('optimize')
2ee0: 22 2c 0a 20 20 20 20 63 61 75 73 65 73 20 46 54  ",.    causes FT
2ef0: 53 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 65  S to merge all e
2f00: 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 62 2d  xisting index b-
2f10: 74 72 65 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  trees into a sin
2f20: 67 6c 65 20 6c 61 72 67 65 0a 20 20 20 20 62 2d  gle large.    b-
2f30: 74 72 65 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tree containing 
2f40: 74 68 65 20 65 6e 74 69 72 65 20 69 6e 64 65 78  the entire index
2f50: 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 6e  . This can be an
2f60: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
2f70: 74 69 6f 6e 2c 0a 20 20 20 20 62 75 74 20 6d 61  tion,.    but ma
2f80: 79 20 73 70 65 65 64 20 75 70 20 66 75 74 75 72  y speed up futur
2f90: 65 20 71 75 65 72 69 65 73 2e 20 0a 0a 20 20 3c  e queries. ..  <
2fa0: 70 3e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  p>.    For examp
2fb0: 6c 65 2c 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  le, to optimize 
2fc0: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
2fd0: 64 65 78 20 66 6f 72 20 61 6e 20 46 54 53 20 74  dex for an FTS t
2fe0: 61 62 6c 65 20 6e 61 6d 65 64 0a 20 20 20 20 22  able named.    "
2ff0: 64 6f 63 73 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  docs":..<codeblo
3000: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 4f 70 74 69  ck>.  <i>-- Opti
3010: 6d 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61  mize the interna
3020: 6c 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 46  l structure of F
3030: 54 53 20 74 61 62 6c 65 20 22 64 6f 63 73 22 2e  TS table "docs".
3040: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
3050: 54 4f 20 64 6f 63 73 28 64 6f 63 73 29 20 56 41  TO docs(docs) VA
3060: 4c 55 45 53 28 27 6f 70 74 69 6d 69 7a 65 27 29  LUES('optimize')
3070: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
3080: 20 20 3c 70 3e 0a 20 20 20 20 54 68 65 20 73 74    <p>.    The st
3090: 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 20 6d 61  atement above ma
30a0: 79 20 61 70 70 65 61 72 20 73 79 6e 74 61 63 74  y appear syntact
30b0: 69 63 61 6c 6c 79 20 69 6e 63 6f 72 72 65 63 74  ically incorrect
30c0: 20 74 6f 20 73 6f 6d 65 2e 20 52 65 66 65 72 20   to some. Refer 
30d0: 74 6f 0a 20 20 20 20 74 68 65 20 73 65 63 74 69  to.    the secti
30e0: 6f 6e 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  on describing th
30f0: 65 20 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75  e [simple fts qu
3100: 65 72 69 65 73 5d 20 66 6f 72 20 61 6e 20 65 78  eries] for an ex
3110: 70 6c 61 6e 61 74 69 6f 6e 2e 0a 0a 20 20 3c 70  planation...  <p
3120: 3e 0a 20 20 20 20 54 68 65 72 65 20 69 73 20 61  >.    There is a
3130: 6e 6f 74 68 65 72 2c 20 64 65 70 72 65 63 61 74  nother, deprecat
3140: 65 64 2c 20 6d 65 74 68 6f 64 20 66 6f 72 20 69  ed, method for i
3150: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 6f 70 74 69  nvoking the opti
3160: 6d 69 7a 65 20 0a 20 20 20 20 6f 70 65 72 61 74  mize .    operat
3170: 69 6f 6e 20 75 73 69 6e 67 20 61 20 53 45 4c 45  ion using a SELE
3180: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 4e 65  CT statement. Ne
3190: 77 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 75 73  w code should us
31a0: 65 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  e statements.   
31b0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
31c0: 49 4e 53 45 52 54 20 61 62 6f 76 65 20 74 6f 20  INSERT above to 
31d0: 6f 70 74 69 6d 69 7a 65 20 46 54 53 20 73 74 72  optimize FTS str
31e0: 75 63 74 75 72 65 73 2e 0a 0a 3c 68 32 20 74 61  uctures...<h2 ta
31f0: 67 73 3d 22 73 69 6d 70 6c 65 20 66 74 73 20 71  gs="simple fts q
3200: 75 65 72 69 65 73 22 3e 53 69 6d 70 6c 65 20 46  ueries">Simple F
3210: 54 53 20 51 75 65 72 69 65 73 3c 2f 68 32 3e 0a  TS Queries</h2>.
3220: 0a 3c 70 3e 0a 20 20 41 73 20 66 6f 72 20 61 6c  .<p>.  As for al
3230: 6c 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74  l other SQLite t
3240: 61 62 6c 65 73 2c 20 76 69 72 74 75 61 6c 20 6f  ables, virtual o
3250: 72 20 6f 74 68 65 72 77 69 73 65 2c 20 64 61 74  r otherwise, dat
3260: 61 20 69 73 20 72 65 74 72 69 65 76 65 64 0a 20  a is retrieved. 
3270: 20 66 72 6f 6d 20 46 54 53 20 74 61 62 6c 65 73   from FTS tables
3280: 20 75 73 69 6e 67 20 61 20 5b 53 45 4c 45 43 54   using a [SELECT
3290: 5d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 3c 70  ] statement...<p
32a0: 3e 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20 63  >.  FTS tables c
32b0: 61 6e 20 62 65 20 71 75 65 72 69 65 64 20 65 66  an be queried ef
32c0: 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e 67 20  ficiently using 
32d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
32e0: 73 20 6f 66 20 74 77 6f 0a 20 20 64 69 66 66 65  s of two.  diffe
32f0: 72 65 6e 74 20 66 6f 72 6d 73 3a 0a 0a 3c 75 6c  rent forms:..<ul
3300: 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20  >.  <li><p>.    
3310: 3c 62 3e 51 75 65 72 79 20 62 79 20 72 6f 77 69  <b>Query by rowi
3320: 64 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20 57 48  d</b>. If the WH
3330: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
3340: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3350: 6e 74 0a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20  nt.    contains 
3360: 61 20 73 75 62 2d 63 6c 61 75 73 65 20 6f 66 20  a sub-clause of 
3370: 74 68 65 20 66 6f 72 6d 20 22 72 6f 77 69 64 20  the form "rowid 
3380: 3d 20 3f 22 2c 20 77 68 65 72 65 20 3f 20 69 73  = ?", where ? is
3390: 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69   an SQL expressi
33a0: 6f 6e 2c 0a 20 20 20 20 46 54 53 20 69 73 20 61  on,.    FTS is a
33b0: 62 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  ble to retrieve 
33c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 6f  the requested ro
33d0: 77 20 64 69 72 65 63 74 6c 79 20 75 73 69 6e 67  w directly using
33e0: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
33f0: 0a 20 20 20 20 6f 66 20 61 6e 20 53 51 4c 69 74  .    of an SQLit
3400: 65 20 5b 49 4e 54 45 47 45 52 20 50 52 49 4d 41  e [INTEGER PRIMA
3410: 52 59 20 4b 45 59 5d 20 69 6e 64 65 78 2e 0a 0a  RY KEY] index...
3420: 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20 3c 62    <li><p>.    <b
3430: 3e 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79  >Full-text query
3440: 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20 57 48 45  </b>. If the WHE
3450: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
3460: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3470: 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 61  t contains.    a
3480: 20 73 75 62 2d 63 6c 61 75 73 65 20 6f 66 20 74   sub-clause of t
3490: 68 65 20 66 6f 72 6d 20 22 26 6c 74 3b 63 6f 6c  he form "&lt;col
34a0: 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20 3f 22  umn&gt; MATCH ?"
34b0: 2c 20 46 54 53 20 69 73 20 61 62 6c 65 20 74 6f  , FTS is able to
34c0: 20 75 73 65 20 0a 20 20 20 20 74 68 65 20 62 75   use .    the bu
34d0: 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74 65 78 74  ilt-in full-text
34e0: 20 69 6e 64 65 78 20 74 6f 20 72 65 73 74 72 69   index to restri
34f0: 63 74 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ct the search to
3500: 20 74 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73   those documents
3510: 20 0a 20 20 20 20 74 68 61 74 20 6d 61 74 63 68   .    that match
3520: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
3530: 75 65 72 79 20 73 74 72 69 6e 67 20 73 70 65 63  uery string spec
3540: 69 66 69 65 64 20 61 73 20 74 68 65 20 72 69 67  ified as the rig
3550: 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 0a  ht-hand operand.
3560: 20 20 20 20 6f 66 20 74 68 65 20 4d 41 54 43 48      of the MATCH
3570: 20 63 6c 61 75 73 65 2e 0a 3c 2f 75 6c 3e 0a 0a   clause..</ul>..
3580: 3c 70 3e 0a 20 20 49 66 20 6e 65 69 74 68 65 72  <p>.  If neither
3590: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 71 75   of these two qu
35a0: 65 72 79 20 73 74 72 61 74 65 67 69 65 73 20 63  ery strategies c
35b0: 61 6e 20 62 65 20 75 73 65 64 2c 20 61 6c 6c 0a  an be used, all.
35c0: 20 20 71 75 65 72 69 65 73 20 6f 6e 20 46 54 53    queries on FTS
35d0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6d 70 6c   tables are impl
35e0: 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 20  emented using a 
35f0: 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 74  linear scan of t
3600: 68 65 20 65 6e 74 69 72 65 0a 20 20 74 61 62 6c  he entire.  tabl
3610: 65 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  e. If the table 
3620: 63 6f 6e 74 61 69 6e 73 20 6c 61 72 67 65 20 61  contains large a
3630: 6d 6f 75 6e 74 73 20 6f 66 20 64 61 74 61 2c 20  mounts of data, 
3640: 74 68 69 73 20 6d 61 79 20 62 65 20 61 6e 20 0a  this may be an .
3650: 20 20 69 6d 70 72 61 63 74 69 63 61 6c 20 61 70    impractical ap
3660: 70 72 6f 61 63 68 20 28 74 68 65 20 66 69 72 73  proach (the firs
3670: 74 20 65 78 61 6d 70 6c 65 20 6f 6e 20 74 68 69  t example on thi
3680: 73 20 70 61 67 65 20 73 68 6f 77 73 20 74 68 61  s page shows tha
3690: 74 20 61 20 6c 69 6e 65 61 72 0a 20 20 73 63 61  t a linear.  sca
36a0: 6e 20 6f 66 20 31 2e 35 20 47 42 20 6f 66 20 64  n of 1.5 GB of d
36b0: 61 74 61 20 74 61 6b 65 73 20 61 72 6f 75 6e 64  ata takes around
36c0: 20 33 30 20 73 65 63 6f 6e 64 73 20 75 73 69 6e   30 seconds usin
36d0: 67 20 61 20 6d 6f 64 65 72 6e 20 50 43 29 2e 0a  g a modern PC)..
36e0: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
36f0: 69 3e 2d 2d 20 54 68 65 20 65 78 61 6d 70 6c 65  i>-- The example
3700: 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  s in this block 
3710: 61 73 73 75 6d 65 20 74 68 65 20 66 6f 6c 6c 6f  assume the follo
3720: 77 69 6e 67 20 46 54 53 20 74 61 62 6c 65 3a 3c  wing FTS table:<
3730: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
3740: 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20  TUAL TABLE mail 
3750: 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65  USING fts3(subje
3760: 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 53 45  ct, body);..  SE
3770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
3780: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
3790: 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5;              
37a0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 52 6f    <i>-- Fast. Ro
37b0: 77 69 64 20 6c 6f 6f 6b 75 70 2e 3c 2f 69 3e 0a  wid lookup.</i>.
37c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
37d0: 6d 61 69 6c 20 57 48 45 52 45 20 62 6f 64 79 20  mail WHERE body 
37e0: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20  MATCH 'sqlite'; 
37f0: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73 74        <i>-- Fast
3800: 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  . Full-text quer
3810: 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
3820: 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  * FROM mail WHER
3830: 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 73 65  E mail MATCH 'se
3840: 61 72 63 68 27 3b 20 20 20 20 20 20 20 3c 69 3e  arch';       <i>
3850: 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65  -- Fast. Full-te
3860: 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20  xt query.</i>.  
3870: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
3880: 69 6c 20 57 48 45 52 45 20 72 6f 77 69 64 20 42  il WHERE rowid B
3890: 45 54 57 45 45 4e 20 31 35 20 41 4e 44 20 32 30  ETWEEN 15 AND 20
38a0: 3b 20 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20  ;   <i>-- Fast. 
38b0: 52 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e 3c 2f 69  Rowid lookup.</i
38c0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
38d0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 73 75 62  M mail WHERE sub
38e0: 6a 65 63 74 20 3d 20 27 64 61 74 61 62 61 73 65  ject = 'database
38f0: 27 3b 20 20 20 20 20 20 3c 69 3e 2d 2d 20 53 6c  ';      <i>-- Sl
3900: 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e 2e  ow. Linear scan.
3910: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
3920: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
3930: 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27 64  subject MATCH 'd
3940: 61 74 61 62 61 73 65 27 3b 20 20 3c 69 3e 2d 2d  atabase';  <i>--
3950: 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74   Fast. Full-text
3960: 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 3c 2f 63 6f   query.</i>.</co
3970: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
3980: 49 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 75  In all of the fu
3990: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 20  ll-text queries 
39a0: 61 62 6f 76 65 2c 20 74 68 65 20 72 69 67 68 74  above, the right
39b0: 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66  -hand operand of
39c0: 20 74 68 65 20 4d 41 54 43 48 0a 20 20 6f 70 65   the MATCH.  ope
39d0: 72 61 74 6f 72 20 69 73 20 61 20 73 74 72 69 6e  rator is a strin
39e0: 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  g consisting of 
39f0: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 2e 20 49  a single term. I
3a00: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
3a10: 20 4d 41 54 43 48 0a 20 20 65 78 70 72 65 73 73   MATCH.  express
3a20: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
3a30: 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 6f   true for all do
3a40: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
3a50: 74 61 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  tain one or more
3a60: 20 0a 20 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   .  instances of
3a70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 77   the specified w
3a80: 6f 72 64 20 28 22 73 71 6c 69 74 65 22 2c 20 22  ord ("sqlite", "
3a90: 73 65 61 72 63 68 22 20 6f 72 20 22 64 61 74 61  search" or "data
3aa0: 62 61 73 65 22 2c 20 64 65 70 65 6e 64 69 6e 67  base", depending
3ab0: 20 0a 20 20 6f 6e 20 77 68 69 63 68 20 65 78 61   .  on which exa
3ac0: 6d 70 6c 65 20 79 6f 75 20 6c 6f 6f 6b 20 61 74  mple you look at
3ad0: 29 2e 20 53 70 65 63 69 66 79 69 6e 67 20 61 20  ). Specifying a 
3ae0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 61 73 20 74  single term as t
3af0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20  he right-hand.  
3b00: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d  operand of the M
3b10: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 72 65  ATCH operator re
3b20: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 73 69 6d  sults in the sim
3b30: 70 6c 65 73 74 20 61 6e 64 20 6d 6f 73 74 20 63  plest and most c
3b40: 6f 6d 6d 6f 6e 20 74 79 70 65 20 0a 20 20 6f 66  ommon type .  of
3b50: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
3b60: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
3b70: 65 72 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61  er more complica
3b80: 74 65 64 20 71 75 65 72 69 65 73 20 61 72 65 20  ted queries are 
3b90: 70 6f 73 73 69 62 6c 65 2c 0a 20 20 69 6e 63 6c  possible,.  incl
3ba0: 75 64 69 6e 67 20 70 68 72 61 73 65 20 73 65 61  uding phrase sea
3bb0: 72 63 68 65 73 2c 20 74 65 72 6d 2d 70 72 65 66  rches, term-pref
3bc0: 69 78 20 73 65 61 72 63 68 65 73 20 61 6e 64 20  ix searches and 
3bd0: 73 65 61 72 63 68 65 73 20 66 6f 72 20 64 6f 63  searches for doc
3be0: 75 6d 65 6e 74 73 20 0a 20 20 63 6f 6e 74 61 69  uments .  contai
3bf0: 6e 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ning combination
3c00: 73 20 6f 66 20 74 65 72 6d 73 20 6f 63 63 75 72  s of terms occur
3c10: 72 69 6e 67 20 77 69 74 68 69 6e 20 61 20 64 65  ring within a de
3c20: 66 69 6e 65 64 20 70 72 6f 78 69 6d 69 74 79 20  fined proximity 
3c30: 6f 66 20 65 61 63 68 0a 20 20 6f 74 68 65 72 2e  of each.  other.
3c40: 20 54 68 65 20 76 61 72 69 6f 75 73 20 77 61 79   The various way
3c50: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 66  s in which the f
3c60: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6d  ull-text index m
3c70: 61 79 20 62 65 20 71 75 65 72 69 65 64 20 61 72  ay be queried ar
3c80: 65 0a 20 20 5b 46 54 53 20 4d 41 54 43 48 7c 64  e.  [FTS MATCH|d
3c90: 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 5d 2e  escribed below].
3ca0: 0a 0a 3c 70 3e 0a 20 20 4e 6f 72 6d 61 6c 6c 79  ..<p>.  Normally
3cb0: 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  , full-text quer
3cc0: 69 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73  ies are case-ins
3cd0: 65 6e 73 69 74 69 76 65 2e 20 48 6f 77 65 76 65  ensitive. Howeve
3ce0: 72 2c 20 74 68 69 73 0a 20 20 69 73 20 64 65 70  r, this.  is dep
3cf0: 65 6e 64 65 6e 74 20 6f 6e 20 74 68 65 20 73 70  endent on the sp
3d00: 65 63 69 66 69 63 20 5b 74 6f 6b 65 6e 69 7a 65  ecific [tokenize
3d10: 72 5d 20 75 73 65 64 20 62 79 20 74 68 65 20 46  r] used by the F
3d20: 54 53 20 74 61 62 6c 65 0a 20 20 62 65 69 6e 67  TS table.  being
3d30: 20 71 75 65 72 69 65 64 2e 20 52 65 66 65 72 20   queried. Refer 
3d40: 74 6f 20 74 68 65 20 73 65 63 74 69 6f 6e 20 6f  to the section o
3d50: 6e 20 5b 74 6f 6b 65 6e 69 7a 65 72 7c 74 6f 6b  n [tokenizer|tok
3d60: 65 6e 69 7a 65 72 73 5d 20 66 6f 72 20 64 65 74  enizers] for det
3d70: 61 69 6c 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ails...<p>.  The
3d80: 20 70 61 72 61 67 72 61 70 68 20 61 62 6f 76 65   paragraph above
3d90: 20 6e 6f 74 65 73 20 74 68 61 74 20 61 20 4d 41   notes that a MA
3da0: 54 43 48 20 6f 70 65 72 61 74 6f 72 20 77 69 74  TCH operator wit
3db0: 68 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20  h a simple term 
3dc0: 61 73 20 74 68 65 0a 20 20 72 69 67 68 74 2d 68  as the.  right-h
3dd0: 61 6e 64 20 6f 70 65 72 61 6e 64 20 65 76 61 6c  and operand eval
3de0: 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 66 6f  uates to true fo
3df0: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
3e00: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
3e10: 0a 20 20 73 70 65 63 69 66 69 65 64 20 74 65 72  .  specified ter
3e20: 6d 2e 20 49 6e 20 74 68 69 73 20 63 6f 6e 74 65  m. In this conte
3e30: 78 74 2c 20 74 68 65 20 22 64 6f 63 75 6d 65 6e  xt, the "documen
3e40: 74 22 20 6d 61 79 20 72 65 66 65 72 20 74 6f 20  t" may refer to 
3e50: 65 69 74 68 65 72 20 74 68 65 20 0a 20 20 64 61  either the .  da
3e60: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  ta stored in a s
3e70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
3e80: 61 20 72 6f 77 20 6f 66 20 61 6e 20 46 54 53 20  a row of an FTS 
3e90: 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65  table, or to the
3ea0: 20 63 6f 6e 74 65 6e 74 73 0a 20 20 6f 66 20 61   contents.  of a
3eb0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ll columns in a 
3ec0: 73 69 6e 67 6c 65 20 72 6f 77 2c 20 64 65 70 65  single row, depe
3ed0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 69 64 65  nding on the ide
3ee0: 6e 74 69 66 69 65 72 20 75 73 65 64 20 61 73 20  ntifier used as 
3ef0: 74 68 65 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20  the.  left-hand 
3f00: 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20 4d  operand to the M
3f10: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 49  ATCH operator. I
3f20: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
3f30: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 20   specified as.  
3f40: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70  the left-hand op
3f50: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d 41 54  erand of the MAT
3f60: 43 48 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  CH operator is a
3f70: 6e 20 46 54 53 20 74 61 62 6c 65 20 63 6f 6c 75  n FTS table colu
3f80: 6d 6e 20 6e 61 6d 65 2c 0a 20 20 74 68 65 6e 20  mn name,.  then 
3f90: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74 68 61  the document tha
3fa0: 74 20 74 68 65 20 73 65 61 72 63 68 20 74 65 72  t the search ter
3fb0: 6d 20 6d 75 73 74 20 62 65 20 63 6f 6e 74 61 69  m must be contai
3fc0: 6e 65 64 20 69 6e 20 69 73 20 74 68 65 20 76 61  ned in is the va
3fd0: 6c 75 65 0a 20 20 73 74 6f 72 65 64 20 69 6e 20  lue.  stored in 
3fe0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
3ff0: 6c 75 6d 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69  lumn. However, i
4000: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
4010: 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 20 20 6f   is the name.  o
4020: 66 20 74 68 65 20 46 54 53 20 3c 69 3e 74 61 62  f the FTS <i>tab
4030: 6c 65 3c 2f 69 3e 20 69 74 73 65 6c 66 2c 20 74  le</i> itself, t
4040: 68 65 6e 20 74 68 65 20 4d 41 54 43 48 20 6f 70  hen the MATCH op
4050: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
4060: 20 74 6f 20 74 72 75 65 0a 20 20 66 6f 72 20 65   to true.  for e
4070: 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 46  ach row of the F
4080: 54 53 20 74 61 62 6c 65 20 66 6f 72 20 77 68 69  TS table for whi
4090: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 63 6f  ch any column co
40a0: 6e 74 61 69 6e 73 20 74 68 65 20 73 65 61 72 63  ntains the searc
40b0: 68 20 0a 20 20 74 65 72 6d 2e 20 54 68 65 20 66  h .  term. The f
40c0: 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65  ollowing example
40d0: 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68   demonstrates th
40e0: 69 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  is:..<codeblock>
40f0: 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65  .  <i>-- Example
4100: 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52   schema</i>.  CR
4110: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
4120: 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74  LE mail USING ft
4130: 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64 79  s3(subject, body
4140: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d  );..  <i>-- Exam
4150: 70 6c 65 20 74 61 62 6c 65 20 70 6f 70 75 6c 61  ple table popula
4160: 74 69 6f 6e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52  tion</i>.  INSER
4170: 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69  T INTO mail(doci
4180: 64 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79  d, subject, body
4190: 29 20 56 41 4c 55 45 53 28 31 2c 20 27 73 6f 66  ) VALUES(1, 'sof
41a0: 74 77 61 72 65 20 66 65 65 64 62 61 63 6b 27 2c  tware feedback',
41b0: 20 27 66 6f 75 6e 64 20 69 74 20 74 6f 6f 20 73   'found it too s
41c0: 6c 6f 77 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  low');.  INSERT 
41d0: 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c  INTO mail(docid,
41e0: 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20   subject, body) 
41f0: 56 41 4c 55 45 53 28 32 2c 20 27 73 6f 66 74 77  VALUES(2, 'softw
4200: 61 72 65 20 66 65 65 64 62 61 63 6b 27 2c 20 27  are feedback', '
4210: 6e 6f 20 66 65 65 64 62 61 63 6b 27 29 3b 0a 20  no feedback');. 
4220: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
4230: 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74  l(docid, subject
4240: 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 33  , body) VALUES(3
4250: 2c 20 27 73 6c 6f 77 20 6c 75 6e 63 68 20 6f 72  , 'slow lunch or
4260: 64 65 72 27 2c 20 20 27 77 61 73 20 61 20 73 6f  der',  'was a so
4270: 66 74 77 61 72 65 20 70 72 6f 62 6c 65 6d 27 29  ftware problem')
4280: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70  ;..  <i>-- Examp
4290: 6c 65 20 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20  le queries</i>. 
42a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
42b0: 61 69 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63  ail WHERE subjec
42c0: 74 20 4d 41 54 43 48 20 27 73 6f 66 74 77 61 72  t MATCH 'softwar
42d0: 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  e';    <i>-- Sel
42e0: 65 63 74 73 20 72 6f 77 73 20 31 20 61 6e 64 20  ects rows 1 and 
42f0: 32 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  2</i>.  SELECT *
4300: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
4310: 20 62 6f 64 79 20 20 20 20 4d 41 54 43 48 20 27   body    MATCH '
4320: 66 65 65 64 62 61 63 6b 27 3b 20 20 20 20 3c 69  feedback';    <i
4330: 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 20  >-- Selects row 
4340: 32 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  2</i>.  SELECT *
4350: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
4360: 20 6d 61 69 6c 20 20 20 20 4d 41 54 43 48 20 27   mail    MATCH '
4370: 73 6f 66 74 77 61 72 65 27 3b 20 20 20 20 3c 69  software';    <i
4380: 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73  >-- Selects rows
4390: 20 31 2c 20 32 20 61 6e 64 20 33 3c 2f 69 3e 0a   1, 2 and 3</i>.
43a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
43b0: 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20  mail WHERE mail 
43c0: 20 20 20 4d 41 54 43 48 20 27 73 6c 6f 77 27 3b     MATCH 'slow';
43d0: 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 53 65          <i>-- Se
43e0: 6c 65 63 74 73 20 72 6f 77 73 20 31 20 61 6e 64  lects rows 1 and
43f0: 20 33 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f   3</i>.</codeblo
4400: 63 6b 3e 0a 20 20 0a 3c 70 3e 0a 20 20 41 74 20  ck>.  .<p>.  At 
4410: 66 69 72 73 74 20 67 6c 61 6e 63 65 2c 20 74 68  first glance, th
4420: 65 20 66 69 6e 61 6c 20 74 77 6f 20 66 75 6c 6c  e final two full
4430: 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 69 6e  -text queries in
4440: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
4450: 76 65 20 73 65 65 6d 0a 20 20 74 6f 20 62 65 20  ve seem.  to be 
4460: 73 79 6e 74 61 63 74 69 63 61 6c 6c 79 20 69 6e  syntactically in
4470: 63 6f 72 72 65 63 74 2c 20 61 73 20 74 68 65 72  correct, as ther
4480: 65 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  e is a table nam
4490: 65 20 28 22 6d 61 69 6c 22 29 20 75 73 65 64 20  e ("mail") used 
44a0: 61 73 0a 20 20 61 6e 20 53 51 4c 20 65 78 70 72  as.  an SQL expr
44b0: 65 73 73 69 6f 6e 2e 20 54 68 65 20 72 65 61 73  ession. The reas
44c0: 6f 6e 20 74 68 69 73 20 69 73 20 61 63 63 65 70  on this is accep
44d0: 74 61 62 6c 65 20 69 73 20 74 68 61 74 20 65 61  table is that ea
44e0: 63 68 20 46 54 53 20 74 61 62 6c 65 0a 20 20 61  ch FTS table.  a
44f0: 63 74 75 61 6c 6c 79 20 68 61 73 20 61 20 5b 73  ctually has a [s
4500: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
4510: 74 61 62 7c 48 49 44 44 45 4e 5d 20 63 6f 6c 75  tab|HIDDEN] colu
4520: 6d 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  mn with the same
4530: 20 6e 61 6d 65 0a 20 20 61 73 20 74 68 65 20 74   name.  as the t
4540: 61 62 6c 65 20 69 74 73 65 6c 66 20 28 69 6e 20  able itself (in 
4550: 74 68 69 73 20 63 61 73 65 2c 20 22 6d 61 69 6c  this case, "mail
4560: 22 29 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74  "). The value st
4570: 6f 72 65 64 20 69 6e 20 74 68 69 73 0a 20 20 63  ored in this.  c
4580: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61  olumn is not mea
4590: 6e 69 6e 67 66 75 6c 20 74 6f 20 74 68 65 20 61  ningful to the a
45a0: 70 70 6c 69 63 61 74 69 6f 6e 2c 20 62 75 74 20  pplication, but 
45b0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
45c0: 68 65 20 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20  he .  left-hand 
45d0: 6f 70 65 72 61 6e 64 20 74 6f 20 61 20 4d 41 54  operand to a MAT
45e0: 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 69  CH operator. Thi
45f0: 73 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e  s special column
4600: 20 6d 61 79 20 61 6c 73 6f 20 62 65 0a 20 20 70   may also be.  p
4610: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
4620: 6d 65 6e 74 20 74 6f 20 74 68 65 20 5b 73 6e 69  ment to the [sni
4630: 70 70 65 74 28 29 7c 46 54 53 20 61 75 78 69 6c  ppet()|FTS auxil
4640: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 5d 2e  iary functions].
4650: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
4660: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
4670: 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 61 62  lustrates the ab
4680: 6f 76 65 2e 20 54 68 65 20 65 78 70 72 65 73 73  ove. The express
4690: 69 6f 6e 73 20 22 64 6f 63 73 22 2c 20 0a 20 20  ions "docs", .  
46a0: 22 64 6f 63 73 2e 64 6f 63 73 22 20 61 6e 64 20  "docs.docs" and 
46b0: 22 6d 61 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 22  "main.docs.docs"
46c0: 20 61 6c 6c 20 72 65 66 65 72 20 74 6f 20 63 6f   all refer to co
46d0: 6c 75 6d 6e 20 22 64 6f 63 73 22 2e 20 48 6f 77  lumn "docs". How
46e0: 65 76 65 72 2c 20 74 68 65 20 0a 20 20 65 78 70  ever, the .  exp
46f0: 72 65 73 73 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f  ression "main.do
4700: 63 73 22 20 64 6f 65 73 20 6e 6f 74 20 72 65 66  cs" does not ref
4710: 65 72 20 74 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e  er to any column
4720: 2e 20 49 74 20 63 6f 75 6c 64 20 62 65 20 75 73  . It could be us
4730: 65 64 20 74 6f 20 0a 20 20 72 65 66 65 72 20 74  ed to .  refer t
4740: 6f 20 61 20 74 61 62 6c 65 2c 20 62 75 74 20 61  o a table, but a
4750: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
4760: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  ot allowed in th
4770: 65 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  e context in whi
4780: 63 68 0a 20 20 69 74 20 69 73 20 75 73 65 64 20  ch.  it is used 
4790: 62 65 6c 6f 77 2e 0a 0a 3c 63 6f 64 65 62 6c 6f  below...<codeblo
47a0: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d  ck>.  <i>-- Exam
47b0: 70 6c 65 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20  ple schema</i>. 
47c0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
47d0: 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47  TABLE docs USING
47e0: 20 66 74 73 34 28 63 6f 6e 74 65 6e 74 29 3b 0a   fts4(content);.
47f0: 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65  .  <i>-- Example
4800: 20 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53   queries</i>.  S
4810: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
4820: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
4830: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
4840: 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
4850: 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  OK.</i>.  SELECT
4860: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
4870: 52 45 20 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54  RE docs.docs MAT
4880: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
4890: 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f       <i>-- OK.</
48a0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
48b0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 6d 61  OM docs WHERE ma
48c0: 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54  in.docs.docs MAT
48d0: 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20  CH 'sqlite';    
48e0: 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20  <i>-- OK.</i>.  
48f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
4900: 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f  cs WHERE main.do
4910: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
4920: 27 3b 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d  ';         <i>--
4930: 20 45 72 72 6f 72 2e 3c 2f 69 3e 0a 3c 2f 63 6f   Error.</i>.</co
4940: 64 65 62 6c 6f 63 6b 3e 0a 20 0a 3c 68 32 3e 53  deblock>. .<h2>S
4950: 75 6d 6d 61 72 79 3c 2f 68 32 3e 0a 0a 3c 70 3e  ummary</h2>..<p>
4960: 0a 20 20 46 72 6f 6d 20 74 68 65 20 75 73 65 72  .  From the user
4970: 73 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c  s point of view,
4980: 20 46 54 53 20 74 61 62 6c 65 73 20 61 72 65 20   FTS tables are 
4990: 73 69 6d 69 6c 61 72 20 74 6f 20 6f 72 64 69 6e  similar to ordin
49a0: 61 72 79 20 53 51 4c 69 74 65 0a 20 20 74 61 62  ary SQLite.  tab
49b0: 6c 65 73 20 69 6e 20 6d 61 6e 79 20 77 61 79 73  les in many ways
49c0: 2e 20 44 61 74 61 20 6d 61 79 20 62 65 20 61 64  . Data may be ad
49d0: 64 65 64 20 74 6f 2c 20 6d 6f 64 69 66 69 65 64  ded to, modified
49e0: 20 77 69 74 68 69 6e 20 61 6e 64 20 72 65 6d 6f   within and remo
49f0: 76 65 64 20 0a 20 20 66 72 6f 6d 20 46 54 53 20  ved .  from FTS 
4a00: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
4a10: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
4a20: 61 6e 64 20 44 45 4c 45 54 45 20 63 6f 6d 6d 61  and DELETE comma
4a30: 6e 64 73 20 6a 75 73 74 20 61 73 20 0a 20 20 69  nds just as .  i
4a40: 74 20 6d 61 79 20 62 65 20 77 69 74 68 20 6f 72  t may be with or
4a50: 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 53  dinary tables. S
4a60: 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 53 45  imilarly, the SE
4a70: 4c 45 43 54 20 63 6f 6d 6d 61 6e 64 20 6d 61 79  LECT command may
4a80: 20 62 65 20 75 73 65 64 20 0a 20 20 74 6f 20 71   be used .  to q
4a90: 75 65 72 79 20 64 61 74 61 2e 20 54 68 65 20 66  uery data. The f
4aa0: 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20 73 75  ollowing list su
4ab0: 6d 6d 61 72 69 7a 65 73 20 74 68 65 20 64 69 66  mmarizes the dif
4ac0: 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e  ferences between
4ad0: 20 46 54 53 0a 20 20 61 6e 64 20 6f 72 64 69 6e   FTS.  and ordin
4ae0: 61 72 79 20 74 61 62 6c 65 73 3a 0a 0a 3c 6f 6c  ary tables:..<ol
4af0: 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  >.  <li><p> .   
4b00: 20 41 73 20 77 69 74 68 20 61 6c 6c 20 76 69 72   As with all vir
4b10: 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 73  tual table types
4b20: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
4b30: 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 69  ible to create i
4b40: 6e 64 69 63 65 73 20 6f 72 0a 20 20 20 20 74 72  ndices or.    tr
4b50: 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64 20  iggers attached 
4b60: 74 6f 20 46 54 53 20 74 61 62 6c 65 73 2e 20 4e  to FTS tables. N
4b70: 6f 72 20 69 73 20 69 74 20 70 6f 73 73 69 62 6c  or is it possibl
4b80: 65 20 74 6f 20 75 73 65 20 74 68 65 20 41 4c 54  e to use the ALT
4b90: 45 52 20 54 41 42 4c 45 0a 20 20 20 20 63 6f 6d  ER TABLE.    com
4ba0: 6d 61 6e 64 20 74 6f 20 61 64 64 20 65 78 74 72  mand to add extr
4bb0: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 46 54 53  a columns to FTS
4bc0: 20 74 61 62 6c 65 73 20 28 61 6c 74 68 6f 75 67   tables (althoug
4bd0: 68 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  h it is possible
4be0: 20 74 6f 20 75 73 65 0a 20 20 20 20 41 4c 54 45   to use.    ALTE
4bf0: 52 20 54 41 42 4c 45 20 74 6f 20 72 65 6e 61 6d  R TABLE to renam
4c00: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 29 2e  e an FTS table).
4c10: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
4c20: 20 44 61 74 61 2d 74 79 70 65 73 20 73 70 65 63   Data-types spec
4c30: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
4c40: 20 74 68 65 20 22 43 52 45 41 54 45 20 56 49 52   the "CREATE VIR
4c50: 54 55 41 4c 20 54 41 42 4c 45 22 20 73 74 61 74  TUAL TABLE" stat
4c60: 65 6d 65 6e 74 0a 20 20 20 20 75 73 65 64 20 74  ement.    used t
4c70: 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 20  o create an FTS 
4c80: 74 61 62 6c 65 20 61 72 65 20 69 67 6e 6f 72 65  table are ignore
4c90: 64 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 20 49 6e  d completely. In
4ca0: 73 74 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20  stead of the.   
4cb0: 20 6e 6f 72 6d 61 6c 20 72 75 6c 65 73 20 66 6f   normal rules fo
4cc0: 72 20 61 70 70 6c 79 69 6e 67 20 74 79 70 65 20  r applying type 
4cd0: 5b 61 66 66 69 6e 69 74 79 5d 20 74 6f 20 69 6e  [affinity] to in
4ce0: 73 65 72 74 65 64 20 76 61 6c 75 65 73 2c 20 61  serted values, a
4cf0: 6c 6c 0a 20 20 20 20 76 61 6c 75 65 73 20 69 6e  ll.    values in
4d00: 73 65 72 74 65 64 20 69 6e 74 6f 20 46 54 53 20  serted into FTS 
4d10: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 28 65  table columns (e
4d20: 78 63 65 70 74 20 74 68 65 20 73 70 65 63 69 61  xcept the specia
4d30: 6c 20 72 6f 77 69 64 0a 20 20 20 20 63 6f 6c 75  l rowid.    colu
4d40: 6d 6e 29 20 61 72 65 20 63 6f 6e 76 65 72 74 65  mn) are converte
4d50: 64 20 74 6f 20 74 79 70 65 20 54 45 58 54 20 62  d to type TEXT b
4d60: 65 66 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72  efore being stor
4d70: 65 64 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a  ed...  <li><p> .
4d80: 20 20 20 20 46 54 53 20 74 61 62 6c 65 73 20 70      FTS tables p
4d90: 65 72 6d 69 74 20 74 68 65 20 73 70 65 63 69 61  ermit the specia
4da0: 6c 20 61 6c 69 61 73 20 22 64 6f 63 69 64 22 20  l alias "docid" 
4db0: 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
4dc0: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 72  fer to the.    r
4dd0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 73 75 70 70  owid column supp
4de0: 6f 72 74 65 64 20 62 79 20 61 6c 6c 20 5b 76 69  orted by all [vi
4df0: 72 74 75 61 6c 20 74 61 62 6c 65 73 5d 2e 0a 0a  rtual tables]...
4e00: 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54    <li><p> .    T
4e10: 68 65 20 5b 46 54 53 20 4d 41 54 43 48 5d 20 6f  he [FTS MATCH] o
4e20: 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f  perator is suppo
4e30: 72 74 65 64 20 66 6f 72 20 71 75 65 72 69 65 73  rted for queries
4e40: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
4e50: 69 6c 74 2d 69 6e 0a 20 20 20 20 66 75 6c 6c 2d  ilt-in.    full-
4e60: 74 65 78 74 20 69 6e 64 65 78 2e 20 0a 0a 20 20  text index. ..  
4e70: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65  <li><p> .    The
4e80: 20 5b 46 54 53 20 61 75 78 69 6c 69 61 72 79 20   [FTS auxiliary 
4e90: 66 75 6e 63 74 69 6f 6e 73 5d 2c 20 5b 73 6e 69  functions], [sni
4ea0: 70 70 65 74 28 29 5d 2c 20 5b 6f 66 66 73 65 74  ppet()], [offset
4eb0: 73 28 29 5d 2c 20 61 6e 64 20 5b 6d 61 74 63 68  s()], and [match
4ec0: 69 6e 66 6f 28 29 5d 20 61 72 65 20 0a 20 20 20  info()] are .   
4ed0: 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 73 75   available to su
4ee0: 70 70 6f 72 74 20 66 75 6c 6c 2d 74 65 78 74 20  pport full-text 
4ef0: 71 75 65 72 69 65 73 2e 0a 0a 20 20 3c 6c 69 3e  queries...  <li>
4f00: 3c 70 3e 0a 20 20 20 20 3c 74 63 6c 3e 68 64 5f  <p>.    <tcl>hd_
4f10: 66 72 61 67 6d 65 6e 74 20 68 69 64 64 65 6e 63  fragment hiddenc
4f20: 6f 6c 20 7b 46 54 53 20 68 69 64 64 65 6e 20 63  ol {FTS hidden c
4f30: 6f 6c 75 6d 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20  olumn}</tcl>.   
4f40: 20 45 76 65 72 79 20 46 54 53 20 74 61 62 6c 65   Every FTS table
4f50: 20 68 61 73 20 61 20 5b 68 69 64 64 65 6e 20 63   has a [hidden c
4f60: 6f 6c 75 6d 6e 5d 20 77 69 74 68 20 74 68 65 20  olumn] with the 
4f70: 0a 20 20 20 20 73 61 6d 65 20 6e 61 6d 65 20 61  .    same name a
4f80: 73 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  s the table itse
4f90: 6c 66 2e 20 54 68 65 20 76 61 6c 75 65 20 63 6f  lf. The value co
4fa0: 6e 74 61 69 6e 65 64 20 69 6e 20 65 61 63 68 20  ntained in each 
4fb0: 72 6f 77 20 66 6f 72 20 74 68 65 0a 20 20 20 20  row for the.    
4fc0: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 69 73  hidden column is
4fd0: 20 61 20 62 6c 6f 62 20 74 68 61 74 20 69 73 20   a blob that is 
4fe0: 6f 6e 6c 79 20 75 73 65 66 75 6c 20 61 73 20 74  only useful as t
4ff0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
5000: 6f 66 20 61 0a 20 20 20 20 5b 46 54 53 20 4d 41  of a.    [FTS MA
5010: 54 43 48 7c 4d 41 54 43 48 5d 20 6f 70 65 72 61  TCH|MATCH] opera
5020: 74 6f 72 2c 20 6f 72 20 61 73 20 74 68 65 20 6c  tor, or as the l
5030: 65 66 74 2d 6d 6f 73 74 20 61 72 67 75 6d 65 6e  eft-most argumen
5040: 74 20 74 6f 20 6f 6e 65 0a 20 20 20 20 6f 66 20  t to one.    of 
5050: 74 68 65 20 5b 46 54 53 20 61 75 78 69 6c 69 61  the [FTS auxilia
5060: 72 79 20 66 75 6e 63 74 69 6f 6e 73 5d 2e 0a 20  ry functions].. 
5070: 20 20 20 0a 0a 3c 2f 6f 6c 3e 0a 0a 0a 3c 68 31     ..</ol>...<h1
5080: 20 74 61 67 73 3d 22 63 6f 6d 70 69 6c 65 20 66   tags="compile f
5090: 74 73 22 3e 43 6f 6d 70 69 6c 69 6e 67 20 61 6e  ts">Compiling an
50a0: 64 20 45 6e 61 62 6c 69 6e 67 20 46 54 53 33 20  d Enabling FTS3 
50b0: 61 6e 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a 3c  and FTS4</h1>..<
50c0: 70 3e 0a 20 20 41 6c 74 68 6f 75 67 68 20 46 54  p>.  Although FT
50d0: 53 33 20 61 6e 64 20 46 54 53 34 20 61 72 65 20  S3 and FTS4 are 
50e0: 69 6e 63 6c 75 64 65 64 20 77 69 74 68 20 74 68  included with th
50f0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 73 6f  e SQLite core so
5100: 75 72 63 65 20 63 6f 64 65 2c 20 74 68 65 79 20  urce code, they 
5110: 61 72 65 20 6e 6f 74 0a 20 20 65 6e 61 62 6c 65  are not.  enable
5120: 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 54 6f  d by default. To
5130: 20 62 75 69 6c 64 20 53 51 4c 69 74 65 20 77 69   build SQLite wi
5140: 74 68 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  th FTS functiona
5150: 6c 69 74 79 20 65 6e 61 62 6c 65 64 2c 20 64 65  lity enabled, de
5160: 66 69 6e 65 0a 20 20 74 68 65 20 70 72 65 70 72  fine.  the prepr
5170: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 5b 53  ocessor macro [S
5180: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
5190: 33 5d 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  3] when compilin
51a0: 67 2e 20 4e 65 77 20 61 70 70 6c 69 63 61 74 69  g. New applicati
51b0: 6f 6e 73 0a 20 20 73 68 6f 75 6c 64 20 61 6c 73  ons.  should als
51c0: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 5b 53 51  o define the [SQ
51d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
51e0: 5f 50 41 52 45 4e 54 48 45 53 49 53 5d 20 6d 61  _PARENTHESIS] ma
51f0: 63 72 6f 20 74 6f 20 65 6e 61 62 6c 65 20 74 68  cro to enable th
5200: 65 0a 20 20 5b 65 6e 68 61 6e 63 65 64 20 71 75  e.  [enhanced qu
5210: 65 72 79 20 73 79 6e 74 61 78 5d 20 28 73 65 65  ery syntax] (see
5220: 20 62 65 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79   below). Usually
5230: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
5240: 79 20 61 64 64 69 6e 67 20 74 68 65 20 0a 20 20  y adding the .  
5250: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77  following two sw
5260: 69 74 63 68 65 73 20 74 6f 20 74 68 65 20 63 6f  itches to the co
5270: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
5280: 69 6e 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ine:..<codeblock
5290: 3e 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  >.  -DSQLITE_ENA
52a0: 42 4c 45 5f 46 54 53 33 0a 20 20 2d 44 53 51 4c  BLE_FTS3.  -DSQL
52b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
52c0: 50 41 52 45 4e 54 48 45 53 49 53 0a 3c 2f 63 6f  PARENTHESIS.</co
52d0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
52e0: 4e 6f 74 65 20 74 68 61 74 20 65 6e 61 62 6c 69  Note that enabli
52f0: 6e 67 20 46 54 53 33 20 61 6c 73 6f 20 6d 61 6b  ng FTS3 also mak
5300: 65 73 20 46 54 53 34 20 61 76 61 69 6c 61 62 6c  es FTS4 availabl
5310: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74  e.  There is not
5320: 20 61 20 73 65 70 61 72 61 74 65 0a 20 20 53 51   a separate.  SQ
5330: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
5340: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5350: 74 69 6f 6e 2e 20 20 41 20 62 75 69 6c 64 20 6f  tion.  A build o
5360: 66 20 53 51 4c 69 74 65 20 65 69 74 68 65 72 20  f SQLite either 
5370: 73 75 70 70 6f 72 74 73 0a 20 20 62 6f 74 68 20  supports.  both 
5380: 46 54 53 33 20 61 6e 64 20 46 54 53 34 20 6f 72  FTS3 and FTS4 or
5390: 20 69 74 20 73 75 70 70 6f 72 74 73 20 6e 65 69   it supports nei
53a0: 74 68 65 72 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20  ther...<p>.  If 
53b0: 75 73 69 6e 67 20 74 68 65 20 61 6d 61 6c 67 61  using the amalga
53c0: 6d 61 74 69 6f 6e 20 61 75 74 6f 63 6f 6e 66 20  mation autoconf 
53d0: 62 61 73 65 64 20 62 75 69 6c 64 20 73 79 73 74  based build syst
53e0: 65 6d 2c 20 73 65 74 74 69 6e 67 20 74 68 65 20  em, setting the 
53f0: 43 50 50 46 4c 41 47 53 0a 20 20 65 6e 76 69 72  CPPFLAGS.  envir
5400: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
5410: 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
5420: 65 20 27 63 6f 6e 66 69 67 75 72 65 27 20 73 63  e 'configure' sc
5430: 72 69 70 74 20 69 73 20 61 6e 20 65 61 73 79 0a  ript is an easy.
5440: 20 20 77 61 79 20 74 6f 20 73 65 74 20 74 68 65    way to set the
5450: 73 65 20 6d 61 63 72 6f 73 2e 20 46 6f 72 20 65  se macros. For e
5460: 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  xample, the foll
5470: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 0a  owing command:..
5480: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 50  <codeblock>.  CP
5490: 50 46 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45  PFLAGS="-DSQLITE
54a0: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53  _ENABLE_FTS3 -DS
54b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
54c0: 33 5f 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e  3_PARENTHESIS" .
54d0: 2f 63 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63  /configure &lt;c
54e0: 6f 6e 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73  onfigure options
54f0: 26 67 74 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  &gt;.</codeblock
5500: 3e 0a 0a 3c 70 3e 0a 20 20 77 68 65 72 65 20 3c  >..<p>.  where <
5510: 69 3e 26 6c 74 3b 63 6f 6e 66 69 67 75 72 65 20  i>&lt;configure 
5520: 6f 70 74 69 6f 6e 73 26 67 74 3b 3c 2f 69 3e 20  options&gt;</i> 
5530: 61 72 65 20 74 68 6f 73 65 20 6f 70 74 69 6f 6e  are those option
5540: 73 20 6e 6f 72 6d 61 6c 6c 79 20 70 61 73 73 65  s normally passe
5550: 64 20 74 6f 0a 20 20 74 68 65 20 63 6f 6e 66 69  d to.  the confi
5560: 67 75 72 65 20 73 63 72 69 70 74 2c 20 69 66 20  gure script, if 
5570: 61 6e 79 2e 0a 0a 3c 70 3e 0a 20 20 42 65 63 61  any...<p>.  Beca
5580: 75 73 65 20 46 54 53 33 20 61 6e 64 20 46 54 53  use FTS3 and FTS
5590: 34 20 61 72 65 20 76 69 72 74 75 61 6c 20 74 61  4 are virtual ta
55a0: 62 6c 65 73 2c 20 54 68 65 20 5b 53 51 4c 49 54  bles, The [SQLIT
55b0: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5d 20 63  E_ENABLE_FTS3] c
55c0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
55d0: 6f 6e 0a 20 20 69 73 20 69 6e 63 6f 6d 70 61 74  on.  is incompat
55e0: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 5b 53  ible with the [S
55f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
5600: 41 4c 54 41 42 4c 45 5d 20 6f 70 74 69 6f 6e 2e  ALTABLE] option.
5610: 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 20 62 75 69  ..<p>.  If a bui
5620: 6c 64 20 6f 66 20 53 51 4c 69 74 65 20 64 6f 65  ld of SQLite doe
5630: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
5640: 65 20 46 54 53 20 6d 6f 64 75 6c 65 73 2c 20 74  e FTS modules, t
5650: 68 65 6e 20 61 6e 79 20 61 74 74 65 6d 70 74 20  hen any attempt 
5660: 74 6f 20 70 72 65 70 61 72 65 20 61 6e 0a 20 20  to prepare an.  
5670: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
5680: 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 33 20   create an FTS3 
5690: 6f 72 20 46 54 53 34 20 74 61 62 6c 65 20 6f 72  or FTS4 table or
56a0: 20 74 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65   to drop or acce
56b0: 73 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a  ss an existing .
56c0: 20 20 46 54 53 20 74 61 62 6c 65 20 69 6e 20 61    FTS table in a
56d0: 6e 79 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c  ny way will fail
56e0: 2e 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73  . The error mess
56f0: 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
5700: 6c 20 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20  l be similar .  
5710: 74 6f 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75  to "no such modu
5720: 6c 65 3a 20 66 74 73 4e 22 20 28 77 68 65 72 65  le: ftsN" (where
5730: 20 4e 20 69 73 20 65 69 74 68 65 72 20 33 20 6f   N is either 3 o
5740: 72 20 34 29 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20  r 4)...<p>.  If 
5750: 74 68 65 20 43 20 76 65 72 73 69 6f 6e 20 6f 66  the C version of
5760: 20 74 68 65 20 3c 61 20 68 72 65 66 3d 68 74 74   the <a href=htt
5770: 70 3a 2f 2f 73 69 74 65 2e 69 63 75 2d 70 72 6f  p://site.icu-pro
5780: 6a 65 63 74 2e 6f 72 67 2f 3e 49 43 55 20 6c 69  ject.org/>ICU li
5790: 62 72 61 72 79 3c 2f 61 3e 0a 20 20 69 73 20 61  brary</a>.  is a
57a0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 46  vailable, then F
57b0: 54 53 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 63  TS may also be c
57c0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
57d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
57e0: 43 55 0a 20 20 70 72 65 2d 70 72 6f 63 65 73 73  CU.  pre-process
57f0: 6f 72 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  or macro defined
5800: 2e 20 43 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  . Compiling with
5810: 20 74 68 69 73 20 6d 61 63 72 6f 20 65 6e 61 62   this macro enab
5820: 6c 65 73 20 61 6e 20 46 54 53 0a 20 20 5b 74 6f  les an FTS.  [to
5830: 6b 65 6e 69 7a 65 72 5d 20 74 68 61 74 20 75 73  kenizer] that us
5840: 65 73 20 74 68 65 20 49 43 55 20 6c 69 62 72 61  es the ICU libra
5850: 72 79 20 74 6f 20 73 70 6c 69 74 20 61 20 64 6f  ry to split a do
5860: 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d  cument into term
5870: 73 0a 20 20 28 77 6f 72 64 73 29 20 75 73 69 6e  s.  (words) usin
5880: 67 20 74 68 65 20 63 6f 6e 76 65 6e 74 69 6f 6e  g the convention
5890: 73 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 65  s for a specifie
58a0: 64 20 6c 61 6e 67 75 61 67 65 20 61 6e 64 20 6c  d language and l
58b0: 6f 63 61 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f  ocale...<codeblo
58c0: 63 6b 3e 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45  ck>.  -DSQLITE_E
58d0: 4e 41 42 4c 45 5f 49 43 55 0a 3c 2f 63 6f 64 65  NABLE_ICU.</code
58e0: 62 6c 6f 63 6b 3e 0a 20 20 0a 0a 3c 68 31 20 74  block>.  ..<h1 t
58f0: 61 67 73 3d 22 46 54 53 20 4d 41 54 43 48 22 3e  ags="FTS MATCH">
5900: 46 75 6c 6c 2d 74 65 78 74 20 49 6e 64 65 78 20  Full-text Index 
5910: 51 75 65 72 69 65 73 3c 2f 68 31 3e 0a 0a 3c 70  Queries</h1>..<p
5920: 3e 0a 20 20 54 68 65 20 6d 6f 73 74 20 75 73 65  >.  The most use
5930: 66 75 6c 20 74 68 69 6e 67 20 61 62 6f 75 74 20  ful thing about 
5940: 46 54 53 20 74 61 62 6c 65 73 20 69 73 20 74 68  FTS tables is th
5950: 65 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  e queries that m
5960: 61 79 20 62 65 20 0a 20 20 70 65 72 66 6f 72 6d  ay be .  perform
5970: 65 64 20 75 73 69 6e 67 20 74 68 65 20 62 75 69  ed using the bui
5980: 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20  lt-in full-text 
5990: 69 6e 64 65 78 2e 20 46 75 6c 6c 2d 74 65 78 74  index. Full-text
59a0: 20 71 75 65 72 69 65 73 20 61 72 65 20 0a 20 20   queries are .  
59b0: 70 65 72 66 6f 72 6d 65 64 20 62 79 20 73 70 65  performed by spe
59c0: 63 69 66 79 69 6e 67 20 61 20 63 6c 61 75 73 65  cifying a clause
59d0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20   of the form .  
59e0: 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20  "&lt;column&gt; 
59f0: 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74  MATCH &lt;full-t
5a00: 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65 73  ext query expres
5a10: 73 69 6f 6e 26 67 74 3b 22 20 61 73 20 70 61 72  sion&gt;" as par
5a20: 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 0a  t of the WHERE .
5a30: 20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45    clause of a SE
5a40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
5a50: 68 61 74 20 72 65 61 64 73 20 64 61 74 61 20 66  hat reads data f
5a60: 72 6f 6d 20 61 6e 20 46 54 53 20 74 61 62 6c 65  rom an FTS table
5a70: 2e 20 0a 20 20 5b 73 69 6d 70 6c 65 20 66 74 73  . .  [simple fts
5a80: 20 71 75 65 72 69 65 73 7c 53 69 6d 70 6c 65 20   queries|Simple 
5a90: 46 54 53 20 71 75 65 72 69 65 73 5d 20 74 68 61  FTS queries] tha
5aa0: 74 20 72 65 74 75 72 6e 20 61 6c 6c 20 64 6f 63  t return all doc
5ab0: 75 6d 65 6e 74 73 20 74 68 61 74 20 0a 20 20 63  uments that .  c
5ac0: 6f 6e 74 61 69 6e 20 61 20 67 69 76 65 6e 20 74  ontain a given t
5ad0: 65 72 6d 20 61 72 65 20 64 65 73 63 72 69 62 65  erm are describe
5ae0: 64 20 61 62 6f 76 65 2e 20 49 6e 20 74 68 61 74  d above. In that
5af0: 20 64 69 73 63 75 73 73 69 6f 6e 20 74 68 65 20   discussion the 
5b00: 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65  right-hand.  ope
5b10: 72 61 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43  rand of the MATC
5b20: 48 20 6f 70 65 72 61 74 6f 72 20 77 61 73 20 61  H operator was a
5b30: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 20 73  ssumed to be a s
5b40: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67  tring consisting
5b50: 20 6f 66 20 61 0a 20 20 73 69 6e 67 6c 65 20 74   of a.  single t
5b60: 65 72 6d 2e 20 54 68 69 73 20 73 65 63 74 69 6f  erm. This sectio
5b70: 6e 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  n describes the 
5b80: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 71 75 65  more complex que
5b90: 72 79 20 74 79 70 65 73 20 73 75 70 70 6f 72 74  ry types support
5ba0: 65 64 20 0a 20 20 62 79 20 46 54 53 20 74 61 62  ed .  by FTS tab
5bb0: 6c 65 73 2c 20 61 6e 64 20 68 6f 77 20 74 68 65  les, and how the
5bc0: 79 20 6d 61 79 20 62 65 20 75 74 69 6c 69 7a 65  y may be utilize
5bd0: 64 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20  d by specifying 
5be0: 61 20 6d 6f 72 65 0a 20 20 63 6f 6d 70 6c 65 78  a more.  complex
5bf0: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
5c00: 6e 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68  n as the right-h
5c10: 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  and operand of a
5c20: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
5c30: 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 74 61 62 6c  ..<p>.  FTS tabl
5c40: 65 73 20 73 75 70 70 6f 72 74 20 74 68 72 65 65  es support three
5c50: 20 62 61 73 69 63 20 71 75 65 72 79 20 74 79 70   basic query typ
5c60: 65 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 74 63 6c  es:..<ul>.  <tcl
5c70: 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 74 65 72  >hd_fragment ter
5c80: 6d 70 72 65 66 69 78 20 7b 70 72 65 66 69 78 20  mprefix {prefix 
5c90: 71 75 65 72 79 7d 20 7b 70 72 65 66 69 78 20 71  query} {prefix q
5ca0: 75 65 72 69 65 73 7d 3c 2f 74 63 6c 3e 0a 20 20  ueries}</tcl>.  
5cb0: 3c 6c 69 3e 3c 70 3e 3c 62 3e 54 6f 6b 65 6e 20  <li><p><b>Token 
5cc0: 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 20  or token prefix 
5cd0: 71 75 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20  queries</b>. .  
5ce0: 20 20 41 6e 20 46 54 53 20 74 61 62 6c 65 20 6d    An FTS table m
5cf0: 61 79 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  ay be queried fo
5d00: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
5d10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 73  that contain a s
5d20: 70 65 63 69 66 69 65 64 0a 20 20 20 20 74 65 72  pecified.    ter
5d30: 6d 20 28 74 68 65 20 5b 73 69 6d 70 6c 65 20 66  m (the [simple f
5d40: 74 73 20 71 75 65 72 69 65 73 7c 73 69 6d 70 6c  ts queries|simpl
5d50: 65 20 63 61 73 65 5d 20 64 65 73 63 72 69 62 65  e case] describe
5d60: 64 20 61 62 6f 76 65 29 2c 20 6f 72 20 66 6f 72  d above), or for
5d70: 0a 20 20 20 20 61 6c 6c 20 64 6f 63 75 6d 65 6e  .    all documen
5d80: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
5d90: 61 20 74 65 72 6d 20 77 69 74 68 20 61 20 73 70  a term with a sp
5da0: 65 63 69 66 69 65 64 20 70 72 65 66 69 78 2e 20  ecified prefix. 
5db0: 41 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 73  As we have.    s
5dc0: 65 65 6e 2c 20 74 68 65 20 71 75 65 72 79 20 65  een, the query e
5dd0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
5de0: 73 70 65 63 69 66 69 63 20 74 65 72 6d 20 69 73  specific term is
5df0: 20 73 69 6d 70 6c 79 20 74 68 65 20 74 65 72 6d   simply the term
5e00: 20 69 74 73 65 6c 66 2e 0a 20 20 20 20 54 68 65   itself..    The
5e10: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
5e20: 6e 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68  n used to search
5e30: 20 66 6f 72 20 61 20 74 65 72 6d 20 70 72 65 66   for a term pref
5e40: 69 78 20 69 73 20 74 68 65 20 70 72 65 66 69 78  ix is the prefix
5e50: 0a 20 20 20 20 69 74 73 65 6c 66 20 77 69 74 68  .    itself with
5e60: 20 61 20 27 2a 27 20 63 68 61 72 61 63 74 65 72   a '*' character
5e70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 2e   appended to it.
5e80: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f   For example:.</
5e90: 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ul>..<codeblock>
5ea0: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
5eb0: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
5ec0: 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  on</i>.  CREATE 
5ed0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f  VIRTUAL TABLE do
5ee0: 63 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69  cs USING fts3(ti
5ef0: 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c  tle, body);..  <
5f00: 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 61  i>-- Query for a
5f10: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e  ll documents con
5f20: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
5f30: 20 22 6c 69 6e 75 78 22 3a 3c 2f 69 3e 0a 20 20   "linux":</i>.  
5f40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
5f50: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
5f60: 54 43 48 20 27 6c 69 6e 75 78 27 3b 0a 0a 20 20  TCH 'linux';..  
5f70: 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20  <i>-- Query for 
5f80: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f  all documents co
5f90: 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 72 6d 20  ntaining a term 
5fa0: 77 69 74 68 20 74 68 65 20 70 72 65 66 69 78 20  with the prefix 
5fb0: 22 6c 69 6e 22 2e 20 54 68 69 73 20 77 69 6c 6c  "lin". This will
5fc0: 20 6d 61 74 63 68 3c 2f 69 3e 0a 20 20 3c 69 3e   match</i>.  <i>
5fd0: 2d 2d 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  -- all documents
5fe0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 22 6c   that contain "l
5ff0: 69 6e 75 78 22 2c 20 62 75 74 20 61 6c 73 6f 20  inux", but also 
6000: 74 68 6f 73 65 20 74 68 61 74 20 63 6f 6e 74 61  those that conta
6010: 69 6e 20 74 65 72 6d 73 20 22 6c 69 6e 65 61 72  in terms "linear
6020: 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 22 6c  ",</i>.  <i>--"l
6030: 69 6e 6b 65 72 22 2c 20 22 6c 69 6e 67 75 69 73  inker", "linguis
6040: 74 69 63 22 20 61 6e 64 20 73 6f 20 6f 6e 2e 3c  tic" and so on.<
6050: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
6060: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
6070: 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 6e 2a 27  ocs MATCH 'lin*'
6080: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
6090: 3c 75 6c 3e 0a 20 20 3c 6c 69 20 73 74 79 6c 65  <ul>.  <li style
60a0: 3d 22 6c 69 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e  ="list-style:non
60b0: 65 22 3e 3c 70 3e 0a 20 20 20 20 4e 6f 72 6d 61  e"><p>.    Norma
60c0: 6c 6c 79 2c 20 61 20 74 6f 6b 65 6e 20 6f 72 20  lly, a token or 
60d0: 74 6f 6b 65 6e 20 70 72 65 66 69 78 20 71 75 65  token prefix que
60e0: 72 79 20 69 73 20 6d 61 74 63 68 65 64 20 61 67  ry is matched ag
60f0: 61 69 6e 73 74 20 74 68 65 20 46 54 53 20 74 61  ainst the FTS ta
6100: 62 6c 65 20 0a 20 20 20 20 63 6f 6c 75 6d 6e 20  ble .    column 
6110: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
6120: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
6130: 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  of the MATCH ope
6140: 72 61 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  rator. Or, if th
6150: 65 0a 20 20 20 20 73 70 65 63 69 61 6c 20 63 6f  e.    special co
6160: 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20 73 61  lumn with the sa
6170: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 46  me name as the F
6180: 54 53 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20  TS table itself 
6190: 69 73 20 73 70 65 63 69 66 69 65 64 2c 0a 20 20  is specified,.  
61a0: 20 20 61 67 61 69 6e 73 74 20 61 6c 6c 20 63 6f    against all co
61b0: 6c 75 6d 6e 73 2e 20 54 68 69 73 20 6d 61 79 20  lumns. This may 
61c0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
61d0: 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 63 6f   specifying a co
61e0: 6c 75 6d 6e 2d 6e 61 6d 65 0a 20 20 20 20 66 6f  lumn-name.    fo
61f0: 6c 6c 6f 77 65 64 20 62 79 20 61 20 22 3a 22 20  llowed by a ":" 
6200: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
6210: 20 61 20 62 61 73 69 63 20 74 65 72 6d 20 71 75   a basic term qu
6220: 65 72 79 2e 20 54 68 65 72 65 20 6d 61 79 20 62  ery. There may b
6230: 65 20 73 70 61 63 65 0a 20 20 20 20 62 65 74 77  e space.    betw
6240: 65 65 6e 20 74 68 65 20 22 3a 22 20 61 6e 64 20  een the ":" and 
6250: 74 68 65 20 74 65 72 6d 20 74 6f 20 71 75 65 72  the term to quer
6260: 79 20 66 6f 72 2c 20 62 75 74 20 6e 6f 74 20 62  y for, but not b
6270: 65 74 77 65 65 6e 20 74 68 65 20 63 6f 6c 75 6d  etween the colum
6280: 6e 2d 6e 61 6d 65 0a 20 20 20 20 61 6e 64 20 74  n-name.    and t
6290: 68 65 20 22 3a 22 20 63 68 61 72 61 63 74 65 72  he ":" character
62a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c  . For example:.<
62b0: 2f 75 6c 3e 0a 20 20 20 0a 3c 63 6f 64 65 62 6c  /ul>.   .<codebl
62c0: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  ock>.  <i>-- Que
62d0: 72 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ry the database 
62e0: 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20 66 6f  for documents fo
62f0: 72 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d  r which the term
6300: 20 22 6c 69 6e 75 78 22 20 61 70 70 65 61 72 73   "linux" appears
6310: 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   in</i>.  <i>-- 
6320: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74 69 74  the document tit
6330: 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 65 72 6d  le, and the term
6340: 20 22 70 72 6f 62 6c 65 6d 73 22 20 61 70 70 65   "problems" appe
6350: 61 72 73 20 69 6e 20 65 69 74 68 65 72 20 74 68  ars in either th
6360: 65 20 74 69 74 6c 65 3c 2f 69 3e 0a 20 20 3c 69  e title</i>.  <i
6370: 3e 2d 2d 20 6f 72 20 62 6f 64 79 20 6f 66 20 74  >-- or body of t
6380: 68 65 20 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e  he document.</i>
6390: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
63a0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
63b0: 20 4d 41 54 43 48 20 27 74 69 74 6c 65 3a 6c 69   MATCH 'title:li
63c0: 6e 75 78 20 70 72 6f 62 6c 65 6d 73 27 3b 0a 0a  nux problems';..
63d0: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 74 68    <i>-- Query th
63e0: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 64  e database for d
63f0: 6f 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68 69  ocuments for whi
6400: 63 68 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e  ch the term "lin
6410: 75 78 22 20 61 70 70 65 61 72 73 20 69 6e 3c 2f  ux" appears in</
6420: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64  i>.  <i>-- the d
6430: 6f 63 75 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61  ocument title, a
6440: 6e 64 20 74 68 65 20 74 65 72 6d 20 22 64 72 69  nd the term "dri
6450: 76 65 72 22 20 61 70 70 65 61 72 73 20 69 6e 20  ver" appears in 
6460: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
6470: 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c  document</i>.  <
6480: 69 3e 2d 2d 20 28 22 64 72 69 76 65 72 22 20 6d  i>-- ("driver" m
6490: 61 79 20 61 6c 73 6f 20 61 70 70 65 61 72 20 69  ay also appear i
64a0: 6e 20 74 68 65 20 74 69 74 6c 65 2c 20 62 75 74  n the title, but
64b0: 20 74 68 69 73 20 61 6c 6f 6e 65 20 77 69 6c 6c   this alone will
64c0: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
64d0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 71 75 65  </i>.  <i>-- que
64e0: 72 79 20 63 72 69 74 65 72 69 61 29 2e 3c 2f 69  ry criteria).</i
64f0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
6500: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 62 6f 64  M docs WHERE bod
6510: 79 20 4d 41 54 43 48 20 27 74 69 74 6c 65 3a 6c  y MATCH 'title:l
6520: 69 6e 75 78 20 64 72 69 76 65 72 27 3b 0a 3c 2f  inux driver';.</
6530: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e  codeblock>..<ul>
6540: 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69  .  <li style="li
6550: 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c  st-style:none"><
6560: 70 3e 0a 20 20 20 20 49 66 20 74 68 65 20 46 54  p>.    If the FT
6570: 53 20 74 61 62 6c 65 20 69 73 20 61 6e 20 46 54  S table is an FT
6580: 53 34 20 74 61 62 6c 65 20 28 6e 6f 74 20 46 54  S4 table (not FT
6590: 53 33 29 2c 20 61 20 74 6f 6b 65 6e 20 6d 61 79  S3), a token may
65a0: 20 61 6c 73 6f 20 62 65 20 70 72 65 66 69 78 65   also be prefixe
65b0: 64 0a 20 20 20 20 77 69 74 68 20 61 20 22 26 23  d.    with a "&#
65c0: 39 34 3b 22 20 63 68 61 72 61 63 74 65 72 2e 20  94;" character. 
65d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 6e  In this case, in
65e0: 20 6f 72 64 65 72 20 74 6f 20 6d 61 74 63 68 20   order to match 
65f0: 74 68 65 20 74 6f 6b 65 6e 20 6d 75 73 74 0a 20  the token must. 
6600: 20 20 20 61 70 70 65 61 72 20 61 73 20 74 68 65     appear as the
6610: 20 76 65 72 79 20 66 69 72 73 74 20 74 6f 6b 65   very first toke
6620: 6e 20 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  n in any column 
6630: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
6640: 72 6f 77 2e 20 45 78 61 6d 70 6c 65 73 3a 0a 3c  row. Examples:.<
6650: 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  /ul>..<codeblock
6660: 3e 0a 20 20 3c 69 3e 2d 2d 20 41 6c 6c 20 64 6f  >.  <i>-- All do
6670: 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68 69 63  cuments for whic
6680: 68 20 22 6c 69 6e 75 78 22 20 69 73 20 74 68 65  h "linux" is the
6690: 20 66 69 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20   first token of 
66a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 3c 2f 69 3e  at least one</i>
66b0: 0a 20 20 3c 69 3e 2d 2d 20 63 6f 6c 75 6d 6e 2e  .  <i>-- column.
66c0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
66d0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
66e0: 64 6f 63 73 20 4d 41 54 43 48 20 27 26 23 39 34  docs MATCH '&#94
66f0: 3b 6c 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d  ;linux';..  <i>-
6700: 2d 20 41 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  - All documents 
6710: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
6720: 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 63 6f 6c  rst token in col
6730: 75 6d 6e 20 22 74 69 74 6c 65 22 20 62 65 67 69  umn "title" begi
6740: 6e 73 20 77 69 74 68 20 22 6c 69 6e 22 2e 3c 2f  ns with "lin".</
6750: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
6760: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 62 6f  OM docs WHERE bo
6770: 64 79 20 4d 41 54 43 48 20 27 74 69 74 6c 65 3a  dy MATCH 'title:
6780: 20 26 23 39 34 3b 6c 69 6e 2a 27 3b 0a 3c 2f 63   &#94;lin*';.</c
6790: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e  odeblock>..<tcl>
67a0: 68 64 5f 66 72 61 67 6d 65 6e 74 20 70 68 72 61  hd_fragment phra
67b0: 73 65 20 7b 70 68 72 61 73 65 20 71 75 65 72 69  se {phrase queri
67c0: 65 73 7d 3c 2f 74 63 6c 3e 0a 3c 75 6c 3e 0a 20  es}</tcl>.<ul>. 
67d0: 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 50 68 72 61 73   <li><p><b>Phras
67e0: 65 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20  e queries</b>.. 
67f0: 20 20 20 41 20 70 68 72 61 73 65 20 71 75 65 72     A phrase quer
6800: 79 20 69 73 20 61 20 71 75 65 72 79 20 74 68 61  y is a query tha
6810: 74 20 72 65 74 72 69 65 76 65 73 20 61 6c 6c 20  t retrieves all 
6820: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
6830: 6f 6e 74 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d  ontain a.    nom
6840: 69 6e 61 74 65 64 20 73 65 74 20 6f 66 20 74 65  inated set of te
6850: 72 6d 73 20 6f 72 20 74 65 72 6d 20 70 72 65 66  rms or term pref
6860: 69 78 65 73 20 69 6e 20 61 20 73 70 65 63 69 66  ixes in a specif
6870: 69 65 64 20 6f 72 64 65 72 20 77 69 74 68 20 6e  ied order with n
6880: 6f 0a 20 20 20 20 69 6e 74 65 72 76 65 6e 69 6e  o.    intervenin
6890: 67 20 74 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65  g tokens. Phrase
68a0: 20 71 75 65 72 69 65 73 20 61 72 65 20 73 70 65   queries are spe
68b0: 63 69 66 69 65 64 20 62 79 20 65 6e 63 6c 6f 73  cified by enclos
68c0: 69 6e 67 20 61 20 73 70 61 63 65 0a 20 20 20 20  ing a space.    
68d0: 73 65 70 61 72 61 74 65 64 20 73 65 71 75 65 6e  separated sequen
68e0: 63 65 20 6f 66 20 74 65 72 6d 73 20 6f 72 20 74  ce of terms or t
68f0: 65 72 6d 20 70 72 65 66 69 78 65 73 20 69 6e 20  erm prefixes in 
6900: 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 20 28 22  double quotes ("
6910: 29 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  )..    For examp
6920: 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65  le:.</ul>..<code
6930: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51  block>.  <i>-- Q
6940: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
6950: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
6960: 61 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 22  ain the phrase "
6970: 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f  linux applicatio
6980: 6e 73 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ns".</i>.  SELEC
6990: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
69a0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
69b0: 22 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69  "linux applicati
69c0: 6f 6e 73 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ons"';..  <i>-- 
69d0: 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f  Query for all do
69e0: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
69f0: 74 61 69 6e 20 61 20 70 68 72 61 73 65 20 74 68  tain a phrase th
6a00: 61 74 20 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a  at matches "lin*
6a10: 20 61 70 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20   app*". As well 
6a20: 61 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  as</i>.  <i>-- "
6a30: 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f  linux applicatio
6a40: 6e 73 22 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d  ns", this will m
6a50: 61 74 63 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61  atch common phra
6a60: 73 65 73 20 73 75 63 68 20 61 73 20 22 6c 69 6e  ses such as "lin
6a70: 6f 6c 65 75 6d 20 61 70 70 6c 69 61 6e 63 65 73  oleum appliances
6a80: 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72  "</i>.  <i>-- or
6a90: 20 22 6c 69 6e 6b 20 61 70 70 72 65 6e 74 69 63   "link apprentic
6aa0: 65 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  e".</i>.  SELECT
6ab0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
6ac0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
6ad0: 6c 69 6e 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63  lin* app*"';.</c
6ae0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e  odeblock>..<tcl>
6af0: 68 64 5f 66 72 61 67 6d 65 6e 74 20 6e 65 61 72  hd_fragment near
6b00: 20 7b 4e 45 41 52 20 71 75 65 72 69 65 73 7d 3c   {NEAR queries}<
6b10: 2f 74 63 6c 3e 0a 3c 75 6c 3e 0a 20 20 3c 6c 69  /tcl>.<ul>.  <li
6b20: 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20 71 75 65 72  ><p><b>NEAR quer
6b30: 69 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 20  ies</b>. .    A 
6b40: 4e 45 41 52 20 71 75 65 72 79 20 69 73 20 61 20  NEAR query is a 
6b50: 71 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72  query that retur
6b60: 6e 73 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ns documents tha
6b70: 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 77 6f 20  t contain a two 
6b80: 6f 72 0a 20 20 20 20 6d 6f 72 65 20 6e 6f 6d 69  or.    more nomi
6b90: 6e 61 74 65 64 20 74 65 72 6d 73 20 6f 72 20 70  nated terms or p
6ba0: 68 72 61 73 65 73 20 77 69 74 68 69 6e 20 61 20  hrases within a 
6bb0: 73 70 65 63 69 66 69 65 64 20 70 72 6f 78 69 6d  specified proxim
6bc0: 69 74 79 20 6f 66 20 65 61 63 68 20 0a 20 20 20  ity of each .   
6bd0: 20 6f 74 68 65 72 20 28 62 79 20 64 65 66 61 75   other (by defau
6be0: 6c 74 20 77 69 74 68 20 31 30 20 6f 72 20 6c 65  lt with 10 or le
6bf0: 73 73 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74  ss intervening t
6c00: 65 72 6d 73 29 2e 20 41 20 4e 45 41 52 20 71 75  erms). A NEAR qu
6c10: 65 72 79 20 69 73 20 0a 20 20 20 20 73 70 65 63  ery is .    spec
6c20: 69 66 69 65 64 20 62 79 20 70 75 74 74 69 6e 67  ified by putting
6c30: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 22 4e 45   the keyword "NE
6c40: 41 52 22 20 62 65 74 77 65 65 6e 20 74 77 6f 20  AR" between two 
6c50: 70 68 72 61 73 65 2c 20 74 6f 6b 65 6e 20 6f 72  phrase, token or
6c60: 20 0a 20 20 20 20 74 6f 6b 65 6e 20 70 72 65 66   .    token pref
6c70: 69 78 20 71 75 65 72 69 65 73 2e 20 54 6f 20 73  ix queries. To s
6c80: 70 65 63 69 66 79 20 61 20 70 72 6f 78 69 6d 69  pecify a proximi
6c90: 74 79 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ty other than th
6ca0: 65 20 64 65 66 61 75 6c 74 2c 0a 20 20 20 20 61  e default,.    a
6cb0: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
6cc0: 65 20 66 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e  e form "NEAR/<i>
6cd0: 26 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d  &lt;N&gt;</i>" m
6ce0: 61 79 20 62 65 20 75 73 65 64 2c 20 77 68 65 72  ay be used, wher
6cf0: 65 0a 20 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67  e.    <i>&lt;N&g
6d00: 74 3b 3c 2f 69 3e 20 69 73 20 74 68 65 20 6d 61  t;</i> is the ma
6d10: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6d20: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d  intervening term
6d30: 73 20 61 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46  s allowed..    F
6d40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c  or example:.</ul
6d50: 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >..<codeblock>. 
6d60: 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74   <i>-- Virtual t
6d70: 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
6d80: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
6d90: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63  IRTUAL TABLE doc
6da0: 73 20 55 53 49 4e 47 20 66 74 73 34 28 29 3b 0a  s USING fts4();.
6db0: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
6dc0: 20 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f 69 3e   table data.</i>
6dd0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
6de0: 6f 63 73 20 56 41 4c 55 45 53 28 27 53 51 4c 69  ocs VALUES('SQLi
6df0: 74 65 20 69 73 20 61 6e 20 41 43 49 44 20 63 6f  te is an ACID co
6e00: 6d 70 6c 69 61 6e 74 20 65 6d 62 65 64 64 65 64  mpliant embedded
6e10: 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61   relational data
6e20: 62 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20  base management 
6e30: 73 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e  system');..  <i>
6e40: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
6e50: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
6e60: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73  ntains the terms
6e70: 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64   "sqlite" and "d
6e80: 61 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69  atabase" with</i
6e90: 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f  >.  <i>-- not mo
6ea0: 72 65 20 74 68 61 6e 20 31 30 20 69 6e 74 65 72  re than 10 inter
6eb0: 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68  vening terms. Th
6ec0: 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 6f  is matches the o
6ed0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c  nly document in<
6ee0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c  /i>.  <i>-- tabl
6ef0: 65 20 64 6f 63 73 20 28 73 69 6e 63 65 20 74 68  e docs (since th
6f00: 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 73 69 78  ere are only six
6f10: 20 74 65 72 6d 73 20 62 65 74 77 65 65 6e 20 22   terms between "
6f20: 53 51 4c 69 74 65 22 20 61 6e 64 20 22 64 61 74  SQLite" and "dat
6f30: 61 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20 3c 69  abase"</i> .  <i
6f40: 3e 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  >-- in the docum
6f50: 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c 45  ent)</i>..  SELE
6f60: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
6f70: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
6f80: 27 73 71 6c 69 74 65 20 4e 45 41 52 20 64 61 74  'sqlite NEAR dat
6f90: 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  abase';..  <i>--
6fa0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f   Search for a do
6fb0: 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74  cument that cont
6fc0: 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22  ains the terms "
6fd0: 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74  sqlite" and "dat
6fe0: 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a  abase" with</i>.
6ff0: 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65    <i>-- not more
7000: 20 74 68 61 6e 20 36 20 69 6e 74 65 72 76 65 6e   than 6 interven
7010: 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20  ing terms. This 
7020: 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 74 68 65  also matches the
7030: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69   only document i
7040: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
7050: 62 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65 20 74  ble docs. Note t
7060: 68 61 74 20 74 68 65 20 6f 72 64 65 72 20 69 6e  hat the order in
7070: 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d 73   which the terms
7080: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 64   appear in the d
7090: 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69  ocument</i>.  <i
70a0: 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  >-- does not hav
70b0: 65 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  e to be the same
70c0: 20 61 73 20 74 68 65 20 6f 72 64 65 72 20 69 6e   as the order in
70d0: 20 77 68 69 63 68 20 74 68 65 79 20 61 70 70 65   which they appe
70e0: 61 72 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ar in the query.
70f0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
7100: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7110: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
7120: 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71 6c 69  base NEAR/6 sqli
7130: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  te';..  <i>-- Se
7140: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
7150: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
7160: 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c  s the terms "sql
7170: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
7180: 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c  se" with</i>.  <
7190: 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68  i>-- not more th
71a0: 61 6e 20 35 20 69 6e 74 65 72 76 65 6e 69 6e 67  an 5 intervening
71b0: 20 74 65 72 6d 73 2e 20 54 68 69 73 20 71 75 65   terms. This que
71c0: 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f  ry matches no do
71d0: 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 53  cuments.</i>.  S
71e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
71f0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
7200: 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 45 41  CH 'database NEA
7210: 52 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20  R/5 sqlite';..  
7220: 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72  <i>-- Search for
7230: 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74   a document that
7240: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 68   contains the ph
7250: 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d 70 6c  rase "ACID compl
7260: 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20 74 65  iant" and the te
7270: 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  rm</i>.  <i>-- "
7280: 64 61 74 61 62 61 73 65 22 20 77 69 74 68 20 6e  database" with n
7290: 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20 74  ot more than 2 t
72a0: 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67 20  erms separating 
72b0: 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20 6d 61  the two. This ma
72c0: 74 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a 20 20  tches the</i>.  
72d0: 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 20 73  <i>-- document s
72e0: 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64  tored in table d
72f0: 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ocs.</i>.  SELEC
7300: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
7310: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
7320: 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 32 20  database NEAR/2 
7330: 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22  "ACID compliant"
7340: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72  ';..  <i>-- Sear
7350: 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e  ch for a documen
7360: 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  t that contains 
7370: 74 68 65 20 70 68 72 61 73 65 20 22 41 43 49 44  the phrase "ACID
7380: 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20   compliant" and 
7390: 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c  the term</i>.  <
73a0: 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 77 69  i>-- "sqlite" wi
73b0: 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e  th not more than
73c0: 20 32 20 74 65 72 6d 73 20 73 65 70 61 72 61 74   2 terms separat
73d0: 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69  ing the two. Thi
73e0: 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 3c 2f  s also matches</
73f0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 6f  i>.  <i>-- the o
7400: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f  nly document sto
7410: 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f 63  red in table doc
7420: 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  s.</i>.  SELECT 
7430: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
7440: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 41  E docs MATCH '"A
7450: 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 4e  CID compliant" N
7460: 45 41 52 2f 32 20 73 71 6c 69 74 65 27 3b 0a 3c  EAR/2 sqlite';.<
7470: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c  /codeblock>..<ul
7480: 3e 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c  >.  <li style="l
7490: 69 73 74 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65 22  ist-style: none"
74a0: 3e 3c 70 3e 0a 20 20 20 20 4d 6f 72 65 20 74 68  ><p>.    More th
74b0: 61 6e 20 6f 6e 65 20 4e 45 41 52 20 6f 70 65 72  an one NEAR oper
74c0: 61 74 6f 72 20 6d 61 79 20 61 70 70 65 61 72 20  ator may appear 
74d0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 71 75 65 72  in a single quer
74e0: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
74f0: 65 61 63 68 0a 20 20 20 20 70 61 69 72 20 6f 66  each.    pair of
7500: 20 74 65 72 6d 73 20 6f 72 20 70 68 72 61 73 65   terms or phrase
7510: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
7520: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d   NEAR operator m
7530: 75 73 74 20 61 70 70 65 61 72 20 77 69 74 68 69  ust appear withi
7540: 6e 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 66  n the.    specif
7550: 69 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66  ied proximity of
7560: 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
7570: 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 55 73 69  he document. Usi
7580: 6e 67 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  ng the same tabl
7590: 65 20 61 6e 64 0a 20 20 20 20 64 61 74 61 20 61  e and.    data a
75a0: 73 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f  s in the block o
75b0: 66 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76 65  f examples above
75c0: 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c  :.</ul>..<codebl
75d0: 6f 63 6b 3e 20 0a 20 20 3c 69 3e 2d 2d 20 54 68  ock> .  <i>-- Th
75e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
75f0: 79 20 73 65 6c 65 63 74 73 20 64 6f 63 75 6d 65  y selects docume
7600: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7610: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
7620: 20 74 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a 20   the term </i>. 
7630: 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20   <i>-- "sqlite" 
7640: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77 6f  separated by two
7650: 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 20   or fewer terms 
7660: 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65  from an instance
7670: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61 63   of the term "ac
7680: 69 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  id",</i>.  <i>--
7690: 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 75 72   which is in tur
76a0: 6e 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  n separated by t
76b0: 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
76c0: 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e  s from an instan
76d0: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 3c 2f  ce of the term</
76e0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c 61  i>.  <i>-- "rela
76f0: 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a 20 20 53  tional".</i>.  S
7700: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
7710: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
7720: 43 48 20 27 73 71 6c 69 74 65 20 4e 45 41 52 2f  CH 'sqlite NEAR/
7730: 32 20 61 63 69 64 20 4e 45 41 52 2f 32 20 72 65  2 acid NEAR/2 re
7740: 6c 61 74 69 6f 6e 61 6c 27 3b 0a 0a 20 20 3c 69  lational';..  <i
7750: 3e 2d 2d 20 54 68 69 73 20 71 75 65 72 79 20 6d  >-- This query m
7760: 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d 65  atches no docume
7770: 6e 74 73 2e 20 54 68 65 72 65 20 69 73 20 61 6e  nts. There is an
7780: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7790: 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22 20 77   term "sqlite" w
77a0: 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ith</i>.  <i>-- 
77b0: 73 75 66 66 69 63 69 65 6e 74 20 70 72 6f 78 69  sufficient proxi
77c0: 6d 69 74 79 20 74 6f 20 61 6e 20 69 6e 73 74 61  mity to an insta
77d0: 6e 63 65 20 6f 66 20 22 61 63 69 64 22 20 62 75  nce of "acid" bu
77e0: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  t it is not suff
77f0: 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65 3c 2f  iciently close</
7800: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20 61 6e  i>.  <i>-- to an
7810: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7820: 20 74 65 72 6d 20 22 72 65 6c 61 74 69 6f 6e 61   term "relationa
7830: 6c 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  l".</i>.  SELECT
7840: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
7850: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 61  RE docs MATCH 'a
7860: 63 69 64 20 4e 45 41 52 2f 32 20 73 71 6c 69 74  cid NEAR/2 sqlit
7870: 65 20 4e 45 41 52 2f 32 20 72 65 6c 61 74 69 6f  e NEAR/2 relatio
7880: 6e 61 6c 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  nal';.</codebloc
7890: 6b 3e 0a 0a 3c 70 3e 0a 20 20 50 68 72 61 73 65  k>..<p>.  Phrase
78a0: 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65   and NEAR querie
78b0: 73 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d  s may not span m
78c0: 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 20  ultiple columns 
78d0: 77 69 74 68 69 6e 20 61 20 72 6f 77 2e 0a 0a 3c  within a row...<
78e0: 70 3e 0a 20 20 54 68 65 20 74 68 72 65 65 20 62  p>.  The three b
78f0: 61 73 69 63 20 71 75 65 72 79 20 74 79 70 65 73  asic query types
7900: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
7910: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
7920: 71 75 65 72 79 20 74 68 65 20 66 75 6c 6c 2d 74  query the full-t
7930: 65 78 74 0a 20 20 69 6e 64 65 78 20 66 6f 72 20  ext.  index for 
7940: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
7950: 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20  ents that match 
7960: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 72  the specified cr
7970: 69 74 65 72 69 61 2e 20 55 73 69 6e 67 20 74 68  iteria. Using th
7980: 65 0a 20 20 46 54 53 20 71 75 65 72 79 20 65 78  e.  FTS query ex
7990: 70 72 65 73 73 69 6f 6e 20 6c 61 6e 67 75 61 67  pression languag
79a0: 65 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  e it is possible
79b0: 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69   to perform vari
79c0: 6f 75 73 20 73 65 74 20 0a 20 20 6f 70 65 72 61  ous set .  opera
79d0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 72 65 73  tions on the res
79e0: 75 6c 74 73 20 6f 66 20 62 61 73 69 63 20 71 75  ults of basic qu
79f0: 65 72 69 65 73 2e 20 54 68 65 72 65 20 61 72 65  eries. There are
7a00: 20 63 75 72 72 65 6e 74 6c 79 20 74 68 72 65 65   currently three
7a10: 20 0a 20 20 73 75 70 70 6f 72 74 65 64 20 6f 70   .  supported op
7a20: 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a  erations:..<ul>.
7a30: 20 20 3c 6c 69 3e 20 54 68 65 20 41 4e 44 20 6f    <li> The AND o
7a40: 70 65 72 61 74 6f 72 20 64 65 74 65 72 6d 69 6e  perator determin
7a50: 65 73 20 74 68 65 20 3c 62 3e 69 6e 74 65 72 73  es the <b>inters
7a60: 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77  ection</b> of tw
7a70: 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65  o sets of docume
7a80: 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65  nts...  <li> The
7a90: 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 63 61 6c   OR operator cal
7aa0: 63 75 6c 61 74 65 73 20 74 68 65 20 3c 62 3e 75  culates the <b>u
7ab0: 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77 6f 20  nion</b> of two 
7ac0: 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74  sets of document
7ad0: 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65 20 4e  s...  <li> The N
7ae0: 4f 54 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 2c  OT operator (or,
7af0: 20 69 66 20 75 73 69 6e 67 20 74 68 65 20 73 74   if using the st
7b00: 61 6e 64 61 72 64 20 73 79 6e 74 61 78 2c 20 61  andard syntax, a
7b10: 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72 61   unary "-" opera
7b20: 74 6f 72 29 0a 20 20 20 20 20 20 20 6d 61 79 20  tor).       may 
7b30: 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
7b40: 74 65 20 74 68 65 20 3c 62 3e 72 65 6c 61 74 69  te the <b>relati
7b50: 76 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 3c 2f 62  ve complement</b
7b60: 3e 20 6f 66 20 6f 6e 65 20 73 65 74 20 6f 66 0a  > of one set of.
7b70: 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 73         documents
7b80: 20 77 69 74 68 20 72 65 73 70 65 63 74 20 74 6f   with respect to
7b90: 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f 75 6c 3e 0a   another..</ul>.
7ba0: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 20 6d  .<p>.  The FTS m
7bb0: 6f 64 75 6c 65 73 20 6d 61 79 20 62 65 20 63 6f  odules may be co
7bc0: 6d 70 69 6c 65 64 20 74 6f 20 75 73 65 20 6f 6e  mpiled to use on
7bd0: 65 20 6f 66 20 74 77 6f 20 73 6c 69 67 68 74 6c  e of two slightl
7be0: 79 20 64 69 66 66 65 72 65 6e 74 20 76 65 72 73  y different vers
7bf0: 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65 20 66 75  ions.  of the fu
7c00: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 79  ll-text query sy
7c10: 6e 74 61 78 2c 20 74 68 65 20 22 73 74 61 6e 64  ntax, the "stand
7c20: 61 72 64 22 20 71 75 65 72 79 20 73 79 6e 74 61  ard" query synta
7c30: 78 20 61 6e 64 20 74 68 65 20 22 65 6e 68 61 6e  x and the "enhan
7c40: 63 65 64 22 20 0a 20 20 71 75 65 72 79 20 73 79  ced" .  query sy
7c50: 6e 74 61 78 2e 20 54 68 65 20 62 61 73 69 63 20  ntax. The basic 
7c60: 74 65 72 6d 2c 20 74 65 72 6d 2d 70 72 65 66 69  term, term-prefi
7c70: 78 2c 20 70 68 72 61 73 65 20 61 6e 64 20 4e 45  x, phrase and NE
7c80: 41 52 20 71 75 65 72 69 65 73 20 64 65 73 63 72  AR queries descr
7c90: 69 62 65 64 20 0a 20 20 61 62 6f 76 65 20 61 72  ibed .  above ar
7ca0: 65 20 74 68 65 20 73 61 6d 65 20 69 6e 20 62 6f  e the same in bo
7cb0: 74 68 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  th versions of t
7cc0: 68 65 20 73 79 6e 74 61 78 2e 20 54 68 65 20 77  he syntax. The w
7cd0: 61 79 20 69 6e 20 77 68 69 63 68 20 73 65 74 20  ay in which set 
7ce0: 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  .  operations ar
7cf0: 65 20 73 70 65 63 69 66 69 65 64 20 69 73 20 73  e specified is s
7d00: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
7d10: 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
7d20: 20 74 77 6f 20 73 75 62 2d 73 65 63 74 69 6f 6e   two sub-section
7d30: 73 20 0a 20 20 64 65 73 63 72 69 62 65 20 74 68  s .  describe th
7d40: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 77  e part of the tw
7d50: 6f 20 71 75 65 72 79 20 73 79 6e 74 61 78 65 73  o query syntaxes
7d60: 20 74 68 61 74 20 70 65 72 74 61 69 6e 73 20 74   that pertains t
7d70: 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  o set operations
7d80: 2e 20 0a 20 20 52 65 66 65 72 20 74 6f 20 74 68  . .  Refer to th
7d90: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
7da0: 20 68 6f 77 20 74 6f 20 5b 63 6f 6d 70 69 6c 65   how to [compile
7db0: 20 66 74 73 5d 20 66 6f 72 20 63 6f 6d 70 69 6c   fts] for compil
7dc0: 61 74 69 6f 6e 20 6e 6f 74 65 73 2e 0a 0a 3c 68  ation notes...<h
7dd0: 32 20 74 61 67 73 3d 22 65 6e 68 61 6e 63 65 64  2 tags="enhanced
7de0: 20 71 75 65 72 79 20 73 79 6e 74 61 78 22 3e 0a   query syntax">.
7df0: 20 20 53 65 74 20 4f 70 65 72 61 74 69 6f 6e 73    Set Operations
7e00: 20 55 73 69 6e 67 20 54 68 65 20 45 6e 68 61 6e   Using The Enhan
7e10: 63 65 64 20 51 75 65 72 79 20 53 79 6e 74 61 78  ced Query Syntax
7e20: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h2>..<p>.  The
7e30: 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20   enhanced query 
7e40: 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20  syntax supports 
7e50: 74 68 65 20 41 4e 44 2c 20 4f 52 20 61 6e 64 20  the AND, OR and 
7e60: 4e 4f 54 20 62 69 6e 61 72 79 20 73 65 74 20 6f  NOT binary set o
7e70: 70 65 72 61 74 6f 72 73 2e 0a 20 20 45 61 63 68  perators..  Each
7e80: 20 6f 66 20 74 68 65 20 74 77 6f 20 6f 70 65 72   of the two oper
7e90: 61 6e 64 73 20 74 6f 20 61 6e 20 6f 70 65 72 61  ands to an opera
7ea0: 74 6f 72 20 6d 61 79 20 62 65 20 61 20 62 61 73  tor may be a bas
7eb0: 69 63 20 46 54 53 20 71 75 65 72 79 2c 20 6f 72  ic FTS query, or
7ec0: 20 74 68 65 0a 20 20 72 65 73 75 6c 74 20 6f 66   the.  result of
7ed0: 20 61 6e 6f 74 68 65 72 20 41 4e 44 2c 20 4f 52   another AND, OR
7ee0: 20 6f 72 20 4e 4f 54 20 73 65 74 20 6f 70 65 72   or NOT set oper
7ef0: 61 74 69 6f 6e 2e 20 4f 70 65 72 61 74 6f 72 73  ation. Operators
7f00: 20 6d 75 73 74 20 62 65 20 65 6e 74 65 72 65 64   must be entered
7f10: 0a 20 20 75 73 69 6e 67 20 63 61 70 69 74 61 6c  .  using capital
7f20: 20 6c 65 74 74 65 72 73 2e 20 4f 74 68 65 72 77   letters. Otherw
7f30: 69 73 65 2c 20 74 68 65 79 20 61 72 65 20 69 6e  ise, they are in
7f40: 74 65 72 70 72 65 74 65 64 20 61 73 20 62 61 73  terpreted as bas
7f50: 69 63 20 74 65 72 6d 20 71 75 65 72 69 65 73 0a  ic term queries.
7f60: 20 20 69 6e 73 74 65 61 64 20 6f 66 20 73 65 74    instead of set
7f70: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 0a 3c 70 3e   operators...<p>
7f80: 0a 20 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  .  The AND opera
7f90: 74 6f 72 20 6d 61 79 20 62 65 20 69 6d 70 6c 69  tor may be impli
7fa0: 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2e  citly specified.
7fb0: 20 49 66 20 74 77 6f 20 62 61 73 69 63 20 71 75   If two basic qu
7fc0: 65 72 69 65 73 20 61 70 70 65 61 72 20 0a 20 20  eries appear .  
7fd0: 77 69 74 68 20 6e 6f 20 6f 70 65 72 61 74 6f 72  with no operator
7fe0: 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65 6d   separating them
7ff0: 20 69 6e 20 61 6e 20 46 54 53 20 71 75 65 72 79   in an FTS query
8000: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 72 65 73   string, the res
8010: 75 6c 74 73 20 61 72 65 0a 20 20 74 68 65 20 73  ults are.  the s
8020: 61 6d 65 20 61 73 20 69 66 20 74 68 65 20 74 77  ame as if the tw
8030: 6f 20 62 61 73 69 63 20 71 75 65 72 69 65 73 20  o basic queries 
8040: 77 65 72 65 20 73 65 70 61 72 61 74 65 64 20 62  were separated b
8050: 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
8060: 72 2e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  r..  For example
8070: 2c 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  , the query expr
8080: 65 73 73 69 6f 6e 20 22 69 6d 70 6c 69 63 69 74  ession "implicit
8090: 20 6f 70 65 72 61 74 6f 72 22 20 69 73 20 61 20   operator" is a 
80a0: 6d 6f 72 65 20 73 75 63 63 69 6e 63 74 0a 20 20  more succinct.  
80b0: 76 65 72 73 69 6f 6e 20 6f 66 20 22 69 6d 70 6c  version of "impl
80c0: 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f  icit AND operato
80d0: 72 22 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  r"...<codeblock>
80e0: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
80f0: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
8100: 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  on</i>.  CREATE 
8110: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f  VIRTUAL TABLE do
8120: 63 73 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b  cs USING fts3();
8130: 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61  ..  <i>-- Virtua
8140: 6c 20 74 61 62 6c 65 20 64 61 74 61 3c 2f 69 3e  l table data</i>
8150: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
8160: 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74 65  ocs(docid, conte
8170: 6e 74 29 20 56 41 4c 55 45 53 28 31 2c 20 27 61  nt) VALUES(1, 'a
8180: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 73   database is a s
8190: 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 27 29  oftware system')
81a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
81b0: 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74  docs(docid, cont
81c0: 65 6e 74 29 20 56 41 4c 55 45 53 28 32 2c 20 27  ent) VALUES(2, '
81d0: 73 71 6c 69 74 65 20 69 73 20 61 20 73 6f 66 74  sqlite is a soft
81e0: 77 61 72 65 20 73 79 73 74 65 6d 27 29 3b 0a 20  ware system');. 
81f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63   INSERT INTO doc
8200: 73 28 64 6f 63 69 64 2c 20 63 6f 6e 74 65 6e 74  s(docid, content
8210: 29 20 56 41 4c 55 45 53 28 33 2c 20 27 73 71 6c  ) VALUES(3, 'sql
8220: 69 74 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ite is a databas
8230: 65 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 52 65  e');..  <i>-- Re
8240: 74 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66 20  turn the set of 
8250: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
8260: 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20  ontain the term 
8270: 22 73 71 6c 69 74 65 22 2c 20 61 6e 64 20 74 68  "sqlite", and th
8280: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65  e</i>.  <i>-- te
8290: 72 6d 20 22 64 61 74 61 62 61 73 65 22 2e 20 54  rm "database". T
82a0: 68 69 73 20 71 75 65 72 79 20 77 69 6c 6c 20 72  his query will r
82b0: 65 74 75 72 6e 20 74 68 65 20 64 6f 63 75 6d 65  eturn the docume
82c0: 6e 74 20 77 69 74 68 20 64 6f 63 69 64 20 33 20  nt with docid 3 
82d0: 6f 6e 6c 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  only.</i>.  SELE
82e0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
82f0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
8300: 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61  'sqlite AND data
8310: 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  base';..  <i>-- 
8320: 41 67 61 69 6e 2c 20 72 65 74 75 72 6e 20 74 68  Again, return th
8330: 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
8340: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
8350: 62 6f 74 68 20 22 73 71 6c 69 74 65 22 20 61 6e  both "sqlite" an
8360: 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64  d</i>.  <i>-- "d
8370: 61 74 61 62 61 73 65 22 2e 20 54 68 69 73 20 74  atabase". This t
8380: 69 6d 65 2c 20 75 73 65 20 61 6e 20 69 6d 70 6c  ime, use an impl
8390: 69 63 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f  icit AND operato
83a0: 72 2e 20 41 67 61 69 6e 2c 20 64 6f 63 75 6d 65  r. Again, docume
83b0: 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 33  nt</i>.  <i>-- 3
83c0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
83d0: 75 6d 65 6e 74 20 6d 61 74 63 68 65 64 20 62 79  ument matched by
83e0: 20 74 68 69 73 20 71 75 65 72 79 2e 20 3c 2f 69   this query. </i
83f0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
8400: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
8410: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
8420: 65 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c 69  e sqlite';..  <i
8430: 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 74 68  >-- Query for th
8440: 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
8450: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ts that contains
8460: 20 65 69 74 68 65 72 20 22 73 71 6c 69 74 65 22   either "sqlite"
8470: 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2e 3c   or "database".<
8480: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 41 6c 6c 20  /i>.  <i>-- All 
8490: 74 68 72 65 65 20 64 6f 63 75 6d 65 6e 74 73 20  three documents 
84a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
84b0: 61 72 65 20 6d 61 74 63 68 65 64 20 62 79 20 74  are matched by t
84c0: 68 69 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20  his query.</i>. 
84d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
84e0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
84f0: 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f 52 20  ATCH 'sqlite OR 
8500: 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69  database';..  <i
8510: 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72 20 61 6c  >-- Query for al
8520: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
8530: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72   contain the ter
8540: 6d 20 22 64 61 74 61 62 61 73 65 22 2c 20 62 75  m "database", bu
8550: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
8560: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
8570: 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22 2e 20   term "sqlite". 
8580: 44 6f 63 75 6d 65 6e 74 20 31 20 69 73 20 74 68  Document 1 is th
8590: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20  e only document 
85a0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 69  that matches thi
85b0: 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e 0a  s criteria.</i>.
85c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
85d0: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
85e0: 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20  MATCH 'database 
85f0: 4e 4f 54 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20  NOT sqlite';..  
8600: 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77  <i>-- The follow
8610: 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63 68 65  ing query matche
8620: 73 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20  s no documents. 
8630: 42 65 63 61 75 73 65 20 22 61 6e 64 22 20 69 73  Because "and" is
8640: 20 69 6e 20 6c 6f 77 65 72 63 61 73 65 20 6c 65   in lowercase le
8650: 74 74 65 72 73 2c 3c 2f 69 3e 0a 20 20 3c 69 3e  tters,</i>.  <i>
8660: 2d 2d 20 69 74 20 69 73 20 69 6e 74 65 72 70 72  -- it is interpr
8670: 65 74 65 64 20 61 73 20 61 20 62 61 73 69 63 20  eted as a basic 
8680: 74 65 72 6d 20 71 75 65 72 79 20 69 6e 73 74 65  term query inste
8690: 61 64 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 6f  ad of an operato
86a0: 72 2e 20 4f 70 65 72 61 74 6f 72 73 20 6d 75 73  r. Operators mus
86b0: 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 62 65  t</i>.  <i>-- be
86c0: 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67   specified using
86d0: 20 63 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73   capital letters
86e0: 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 20 74  . In practice, t
86f0: 68 69 73 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  his query will m
8700: 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65 6e  atch any documen
8710: 74 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  ts</i>.  <i>-- t
8720: 68 61 74 20 63 6f 6e 74 61 69 6e 20 65 61 63 68  hat contain each
8730: 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 74 65   of the three te
8740: 72 6d 73 20 22 64 61 74 61 62 61 73 65 22 2c 20  rms "database", 
8750: 22 61 6e 64 22 20 61 6e 64 20 22 73 71 6c 69 74  "and" and "sqlit
8760: 65 22 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  e" at least once
8770: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 4e 6f  .</i>.  <i>-- No
8780: 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68   documents in th
8790: 65 20 65 78 61 6d 70 6c 65 20 64 61 74 61 20 61  e example data a
87a0: 62 6f 76 65 20 6d 61 74 63 68 20 74 68 69 73 20  bove match this 
87b0: 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e 0a 20 20  criteria.</i>.  
87c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
87d0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
87e0: 54 43 48 20 27 64 61 74 61 62 61 73 65 20 61 6e  TCH 'database an
87f0: 64 20 73 71 6c 69 74 65 27 3b 0a 3c 2f 63 6f 64  d sqlite';.</cod
8800: 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
8810: 68 65 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76  he examples abov
8820: 65 20 61 6c 6c 20 75 73 65 20 62 61 73 69 63 20  e all use basic 
8830: 66 75 6c 6c 2d 74 65 78 74 20 74 65 72 6d 20 71  full-text term q
8840: 75 65 72 69 65 73 20 61 73 20 62 6f 74 68 20 6f  ueries as both o
8850: 70 65 72 61 6e 64 73 20 6f 66 20 0a 20 20 74 68  perands of .  th
8860: 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  e set operations
8870: 20 64 65 6d 6f 6e 73 74 72 61 74 65 64 2e 20 50   demonstrated. P
8880: 68 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20 71  hrase and NEAR q
8890: 75 65 72 69 65 73 20 6d 61 79 20 61 6c 73 6f 20  ueries may also 
88a0: 62 65 20 75 73 65 64 2c 0a 20 20 61 73 20 6d 61  be used,.  as ma
88b0: 79 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  y the results of
88c0: 20 6f 74 68 65 72 20 73 65 74 20 6f 70 65 72 61   other set opera
88d0: 74 69 6f 6e 73 2e 20 57 68 65 6e 20 6d 6f 72 65  tions. When more
88e0: 20 74 68 61 6e 20 6f 6e 65 20 73 65 74 20 6f 70   than one set op
88f0: 65 72 61 74 69 6f 6e 0a 20 20 69 73 20 70 72 65  eration.  is pre
8900: 73 65 6e 74 20 69 6e 20 61 6e 20 46 54 53 20 71  sent in an FTS q
8910: 75 65 72 79 2c 20 74 68 65 20 70 72 65 63 65 64  uery, the preced
8920: 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72  ence of operator
8930: 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
8940: 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
8950: 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70  =1>.  <tr><th>Op
8960: 65 72 61 74 6f 72 3c 74 68 3e 45 6e 68 61 6e 63  erator<th>Enhanc
8970: 65 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 20  ed Query Syntax 
8980: 50 72 65 63 65 64 65 6e 63 65 0a 20 20 3c 74 72  Precedence.  <tr
8990: 3e 3c 74 64 3e 4e 4f 54 20 3c 74 64 3e 20 48 69  ><td>NOT <td> Hi
89a0: 67 68 65 73 74 20 70 72 65 63 65 64 65 6e 63 65  ghest precedence
89b0: 20 28 74 69 67 68 74 65 73 74 20 67 72 6f 75 70   (tightest group
89c0: 69 6e 67 29 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ing)..  <tr><td>
89d0: 41 4e 44 20 3c 74 64 3e 0a 20 20 3c 74 72 3e 3c  AND <td>.  <tr><
89e0: 74 64 3e 4f 52 20 20 3c 74 64 3e 20 4c 6f 77 65  td>OR  <td> Lowe
89f0: 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28 6c  st precedence (l
8a00: 6f 6f 73 65 73 74 20 67 72 6f 75 70 69 6e 67 29  oosest grouping)
8a10: 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
8a20: 20 20 57 68 65 6e 20 75 73 69 6e 67 20 74 68 65    When using the
8a30: 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20   enhanced query 
8a40: 73 79 6e 74 61 78 2c 20 70 61 72 65 6e 74 68 65  syntax, parenthe
8a50: 73 69 73 20 6d 61 79 20 62 65 20 75 73 65 64 20  sis may be used 
8a60: 74 6f 20 6f 76 65 72 72 69 64 65 0a 20 20 74 68  to override.  th
8a70: 65 20 64 65 66 61 75 6c 74 20 70 72 65 63 65 64  e default preced
8a80: 65 6e 63 65 20 6f 66 20 74 68 65 20 76 61 72 69  ence of the vari
8a90: 6f 75 73 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  ous operators. F
8aa0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  or example:..<co
8ab0: 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 69 3e 2d  deblock>..  <i>-
8ac0: 2d 20 52 65 74 75 72 6e 20 74 68 65 20 64 6f 63  - Return the doc
8ad0: 69 64 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  id values associ
8ae0: 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 64 6f  ated with all do
8af0: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
8b00: 74 61 69 6e 20 74 68 65 3c 2f 69 3e 0a 20 20 3c  tain the</i>.  <
8b10: 69 3e 2d 2d 20 74 77 6f 20 74 65 72 6d 73 20 22  i>-- two terms "
8b20: 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74  sqlite" and "dat
8b30: 61 62 61 73 65 22 2c 20 61 6e 64 2f 6f 72 20 63  abase", and/or c
8b40: 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20  ontain the term 
8b50: 22 6c 69 62 72 61 72 79 22 2e 3c 2f 69 3e 0a 20  "library".</i>. 
8b60: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
8b70: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
8b80: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
8b90: 20 41 4e 44 20 64 61 74 61 62 61 73 65 20 4f 52   AND database OR
8ba0: 20 6c 69 62 72 61 72 79 27 3b 0a 0a 20 20 3c 69   library';..  <i
8bb0: 3e 2d 2d 20 54 68 69 73 20 71 75 65 72 79 20 69  >-- This query i
8bc0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
8bd0: 74 68 65 20 61 62 6f 76 65 2e 3c 2f 69 3e 0a 20  the above.</i>. 
8be0: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
8bf0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
8c00: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
8c10: 20 41 4e 44 20 64 61 74 61 62 61 73 65 27 0a 20   AND database'. 
8c20: 20 20 20 55 4e 49 4f 4e 0a 20 20 53 45 4c 45 43     UNION.  SELEC
8c30: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
8c40: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
8c50: 43 48 20 27 6c 69 62 72 61 72 79 27 3b 0a 0a 20  CH 'library';.. 
8c60: 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f 72   <i>-- Query for
8c70: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
8c80: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
8c90: 69 6e 73 20 74 68 65 20 74 65 72 6d 20 22 6c 69  ins the term "li
8ca0: 6e 75 78 22 2c 20 61 6e 64 20 61 74 20 6c 65 61  nux", and at lea
8cb0: 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f  st</i>.  <i>-- o
8cc0: 6e 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  ne of the phrase
8cd0: 73 20 22 73 71 6c 69 74 65 20 64 61 74 61 62 61  s "sqlite databa
8ce0: 73 65 22 20 61 6e 64 20 22 73 71 6c 69 74 65 20  se" and "sqlite 
8cf0: 6c 69 62 72 61 72 79 22 2e 3c 2f 69 3e 0a 20 20  library".</i>.  
8d00: 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
8d10: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
8d20: 73 20 4d 41 54 43 48 20 27 28 22 73 71 6c 69 74  s MATCH '("sqlit
8d30: 65 20 64 61 74 61 62 61 73 65 22 20 4f 52 20 22  e database" OR "
8d40: 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22 29  sqlite library")
8d50: 20 41 4e 44 20 6c 69 6e 75 78 27 3b 0a 0a 20 20   AND linux';..  
8d60: 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65 72 79  <i>-- This query
8d70: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
8d80: 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c 2f 69 3e  o the above.</i>
8d90: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
8da0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8db0: 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 6e 75  docs MATCH 'linu
8dc0: 78 27 0a 20 20 20 20 49 4e 54 45 52 53 45 43 54  x'.    INTERSECT
8dd0: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
8de0: 46 52 4f 4d 20 28 0a 20 20 20 20 53 45 4c 45 43  FROM (.    SELEC
8df0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
8e00: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
8e10: 43 48 20 27 22 73 71 6c 69 74 65 20 6c 69 62 72  CH '"sqlite libr
8e20: 61 72 79 22 27 0a 20 20 20 20 20 20 55 4e 49 4f  ary"'.      UNIO
8e30: 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  N.    SELECT doc
8e40: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45  id FROM docs WHE
8e50: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
8e60: 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 22  sqlite database"
8e70: 27 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  '.  );.</codeblo
8e80: 63 6b 3e 0a 0a 0a 3c 68 32 3e 53 65 74 20 4f 70  ck>...<h2>Set Op
8e90: 65 72 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54  erations Using T
8ea0: 68 65 20 53 74 61 6e 64 61 72 64 20 51 75 65 72  he Standard Quer
8eb0: 79 20 53 79 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c  y Syntax</h2>..<
8ec0: 70 3e 0a 20 20 46 54 53 20 71 75 65 72 79 20 73  p>.  FTS query s
8ed0: 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 75 73  et operations us
8ee0: 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72 64  ing the standard
8ef0: 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 61 72   query syntax ar
8f00: 65 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 0a 20  e similar, but. 
8f10: 20 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 2c 20   not identical, 
8f20: 74 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e  to set operation
8f30: 73 20 77 69 74 68 20 74 68 65 20 65 6e 68 61 6e  s with the enhan
8f40: 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78  ced query syntax
8f50: 2e 20 54 68 65 72 65 0a 20 20 61 72 65 20 66 6f  . There.  are fo
8f60: 75 72 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  ur differences, 
8f70: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c  as follows:..<ol
8f80: 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 31 3e  >.  <li value=1>
8f90: 3c 70 3e 20 4f 6e 6c 79 20 74 68 65 20 69 6d 70  <p> Only the imp
8fa0: 6c 69 63 69 74 20 76 65 72 73 69 6f 6e 20 6f 66  licit version of
8fb0: 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   the AND operato
8fc0: 72 20 69 73 20 73 75 70 70 6f 72 74 65 64 2e 0a  r is supported..
8fd0: 20 20 20 20 53 70 65 63 69 66 79 69 6e 67 20 74      Specifying t
8fe0: 68 65 20 73 74 72 69 6e 67 20 22 41 4e 44 22 20  he string "AND" 
8ff0: 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 74 61  as part of a sta
9000: 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e 74  ndard query synt
9010: 61 78 20 71 75 65 72 79 20 69 73 0a 20 20 20 20  ax query is.    
9020: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
9030: 20 74 65 72 6d 20 71 75 65 72 79 20 66 6f 72 20   term query for 
9040: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
9050: 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ents containing 
9060: 74 68 65 20 74 65 72 6d 20 0a 20 20 20 20 22 61  the term .    "a
9070: 6e 64 22 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c 3e  nd"..</ol>..<ol>
9080: 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 32 3e 3c  .  <li value=2><
9090: 70 3e 20 50 61 72 65 6e 74 68 65 73 69 73 20 61  p> Parenthesis a
90a0: 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
90b0: 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20  ..</ol>..<ol>.  
90c0: 3c 6c 69 20 76 61 6c 75 65 3d 33 3e 3c 70 3e 20  <li value=3><p> 
90d0: 54 68 65 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72  The NOT operator
90e0: 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
90f0: 64 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68  d. Instead of th
9100: 65 20 4e 4f 54 20 0a 20 20 20 20 6f 70 65 72 61  e NOT .    opera
9110: 74 6f 72 2c 20 74 68 65 20 73 74 61 6e 64 61 72  tor, the standar
9120: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 73  d query syntax s
9130: 75 70 70 6f 72 74 73 20 61 20 75 6e 61 72 79 20  upports a unary 
9140: 22 2d 22 20 6f 70 65 72 61 74 6f 72 20 74 68 61  "-" operator tha
9150: 74 0a 20 20 20 20 6d 61 79 20 62 65 20 61 70 70  t.    may be app
9160: 6c 69 65 64 20 74 6f 20 62 61 73 69 63 20 74 65  lied to basic te
9170: 72 6d 20 61 6e 64 20 74 65 72 6d 2d 70 72 65 66  rm and term-pref
9180: 69 78 20 71 75 65 72 69 65 73 20 28 62 75 74 20  ix queries (but 
9190: 6e 6f 74 20 74 6f 20 70 68 72 61 73 65 0a 20 20  not to phrase.  
91a0: 20 20 6f 72 20 4e 45 41 52 20 71 75 65 72 69 65    or NEAR querie
91b0: 73 29 2e 20 41 20 74 65 72 6d 20 6f 72 20 74 65  s). A term or te
91c0: 72 6d 2d 70 72 65 66 69 78 20 74 68 61 74 20 68  rm-prefix that h
91d0: 61 73 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f  as a unary "-" o
91e0: 70 65 72 61 74 6f 72 0a 20 20 20 20 61 74 74 61  perator.    atta
91f0: 63 68 65 64 20 74 6f 20 69 74 20 6d 61 79 20 6e  ched to it may n
9200: 6f 74 20 61 70 70 65 61 72 20 61 73 20 61 6e 20  ot appear as an 
9210: 6f 70 65 72 61 6e 64 20 74 6f 20 61 6e 20 4f 52  operand to an OR
9220: 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 20 46 54   operator. An FT
9230: 53 0a 20 20 20 20 71 75 65 72 79 20 6d 61 79 20  S.    query may 
9240: 6e 6f 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69  not consist enti
9250: 72 65 6c 79 20 6f 66 20 74 65 72 6d 73 20 6f 72  rely of terms or
9260: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65   term-prefix que
9270: 72 69 65 73 20 77 69 74 68 20 75 6e 61 72 79 0a  ries with unary.
9280: 20 20 20 20 22 2d 22 20 6f 70 65 72 61 74 6f 72      "-" operator
9290: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
92a0: 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f 64 65  em..</ol>..<code
92b0: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 53  block>.  <i>-- S
92c0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 73 65  earch for the se
92d0: 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74  t of documents t
92e0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  hat contain the 
92f0: 74 65 72 6d 20 22 73 71 6c 69 74 65 22 20 62 75  term "sqlite" bu
9300: 74 20 64 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  t do</i>.  <i>--
9310: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65   not contain the
9320: 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22   term "database"
9330: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
9340: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
9350: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
9360: 69 74 65 20 2d 64 61 74 61 62 61 73 65 27 3b 0a  ite -database';.
9370: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 6f  </codeblock>..<o
9380: 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 34  l>.  <li value=4
9390: 3e 3c 70 3e 20 54 68 65 20 72 65 6c 61 74 69 76  ><p> The relativ
93a0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  e precedence of 
93b0: 74 68 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f  the set operatio
93c0: 6e 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 2e  ns is different.
93d0: 20 0a 20 20 20 49 6e 20 70 61 72 74 69 63 75 6c   .   In particul
93e0: 61 72 2c 20 75 73 69 6e 67 20 74 68 65 20 73 74  ar, using the st
93f0: 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e  andard query syn
9400: 74 61 78 20 74 68 65 20 22 4f 52 22 20 6f 70 65  tax the "OR" ope
9410: 72 61 74 6f 72 20 68 61 73 20 61 0a 20 20 20 68  rator has a.   h
9420: 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63 65  igher precedence
9430: 20 74 68 61 6e 20 22 41 4e 44 22 2e 20 54 68 65   than "AND". The
9440: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 6f   precedence of o
9450: 70 65 72 61 74 6f 72 73 20 77 68 65 6e 20 75 73  perators when us
9460: 69 6e 67 20 74 68 65 0a 20 20 20 73 74 61 6e 64  ing the.   stand
9470: 61 72 64 20 71 75 65 72 79 20 73 79 6e 74 61 78  ard query syntax
9480: 20 69 73 3a 20 0a 3c 2f 6f 6c 3e 0a 0a 3c 74 61   is: .</ol>..<ta
9490: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
94a0: 20 3c 74 72 3e 3c 74 68 3e 4f 70 65 72 61 74 6f   <tr><th>Operato
94b0: 72 3c 74 68 3e 53 74 61 6e 64 61 72 64 20 51 75  r<th>Standard Qu
94c0: 65 72 79 20 53 79 6e 74 61 78 20 50 72 65 63 65  ery Syntax Prece
94d0: 64 65 6e 63 65 0a 20 20 3c 74 72 3e 3c 74 64 3e  dence.  <tr><td>
94e0: 55 6e 61 72 79 20 22 2d 22 20 3c 74 64 3e 20 48  Unary "-" <td> H
94f0: 69 67 68 65 73 74 20 70 72 65 63 65 64 65 6e 63  ighest precedenc
9500: 65 20 28 74 69 67 68 74 65 73 74 20 67 72 6f 75  e (tightest grou
9510: 70 69 6e 67 29 2e 0a 20 20 3c 74 72 3e 3c 74 64  ping)..  <tr><td
9520: 3e 4f 52 20 20 3c 74 64 3e 0a 20 20 3c 74 72 3e  >OR  <td>.  <tr>
9530: 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 20 4c 6f 77  <td>AND <td> Low
9540: 65 73 74 20 70 72 65 63 65 64 65 6e 63 65 20 28  est precedence (
9550: 6c 6f 6f 73 65 73 74 20 67 72 6f 75 70 69 6e 67  loosest grouping
9560: 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 6f 6c  )..</table>..<ol
9570: 3e 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74  ><li style="list
9580: 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 0a 20 20  -style:none">.  
9590: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  The following ex
95a0: 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65  ample illustrate
95b0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  s precedence of 
95c0: 6f 70 65 72 61 74 6f 72 73 20 75 73 69 6e 67 20  operators using 
95d0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 0a 20 20  the standard .  
95e0: 71 75 65 72 79 20 73 79 6e 74 61 78 3a 0a 3c 2f  query syntax:.</
95f0: 6f 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ol>..<codeblock>
9600: 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20  .  <i>-- Search 
9610: 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  for documents th
9620: 61 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  at contain at le
9630: 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
9640: 65 72 6d 73 20 22 64 61 74 61 62 61 73 65 22 3c  erms "database"<
9650: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6e 64 20  /i>.  <i>-- and 
9660: 22 73 71 6c 69 74 65 22 2c 20 61 6e 64 20 61 6c  "sqlite", and al
9670: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  so contain the t
9680: 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 20 42  erm "library". B
9690: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 64 69  ecause of the di
96a0: 66 66 65 72 65 6e 63 65 73 3c 2f 69 3e 0a 20 20  fferences</i>.  
96b0: 3c 69 3e 2d 2d 20 69 6e 20 6f 70 65 72 61 74 6f  <i>-- in operato
96c0: 72 20 70 72 65 63 65 64 65 6e 63 65 73 2c 20 74  r precedences, t
96d0: 68 69 73 20 71 75 65 72 79 20 77 6f 75 6c 64 20  his query would 
96e0: 68 61 76 65 20 61 20 64 69 66 66 65 72 65 6e 74  have a different
96f0: 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
9700: 75 73 69 6e 67 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  using</i>.  <i>-
9710: 2d 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 71  - the enhanced q
9720: 75 65 72 79 20 73 79 6e 74 61 78 2e 3c 2f 69 3e  uery syntax.</i>
9730: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
9740: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
9750: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f   MATCH 'sqlite O
9760: 52 20 64 61 74 61 62 61 73 65 20 6c 69 62 72 61  R database libra
9770: 72 79 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ry';.</codeblock
9780: 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  >..<tcl>hd_fragm
9790: 65 6e 74 20 73 6e 69 70 70 65 74 20 7b 46 54 53  ent snippet {FTS
97a0: 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
97b0: 69 6f 6e 73 7d 3c 2f 74 63 6c 3e 0a 3c 68 31 3e  ions}</tcl>.<h1>
97c0: 41 75 78 69 6c 69 61 72 79 20 46 75 6e 63 74 69  Auxiliary Functi
97d0: 6f 6e 73 20 2d 20 53 6e 69 70 70 65 74 2c 20 4f  ons - Snippet, O
97e0: 66 66 73 65 74 73 20 61 6e 64 20 4d 61 74 63 68  ffsets and Match
97f0: 69 6e 66 6f 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20  info</h1>..<p>. 
9800: 20 54 68 65 20 46 54 53 33 20 61 6e 64 20 46 54   The FTS3 and FT
9810: 53 34 20 6d 6f 64 75 6c 65 73 20 70 72 6f 76 69  S4 modules provi
9820: 64 65 20 74 68 72 65 65 20 73 70 65 63 69 61 6c  de three special
9830: 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
9840: 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 62  tions that may b
9850: 65 20 75 73 65 66 75 6c 0a 20 20 74 6f 20 74 68  e useful.  to th
9860: 65 20 64 65 76 65 6c 6f 70 65 72 73 20 6f 66 20  e developers of 
9870: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
9880: 73 79 73 74 65 6d 73 3a 20 22 73 6e 69 70 70 65  systems: "snippe
9890: 74 22 2c 20 22 6f 66 66 73 65 74 73 22 20 61 6e  t", "offsets" an
98a0: 64 0a 20 20 22 6d 61 74 63 68 69 6e 66 6f 22 2e  d.  "matchinfo".
98b0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
98c0: 74 68 65 20 22 73 6e 69 70 70 65 74 22 20 61 6e  the "snippet" an
98d0: 64 20 22 6f 66 66 73 65 74 73 22 20 66 75 6e 63  d "offsets" func
98e0: 74 69 6f 6e 73 20 69 73 20 74 6f 20 61 6c 6c 6f  tions is to allo
98f0: 77 0a 20 20 74 68 65 20 75 73 65 72 20 74 6f 20  w.  the user to 
9900: 69 64 65 6e 74 69 66 79 20 74 68 65 20 6c 6f 63  identify the loc
9910: 61 74 69 6f 6e 20 6f 66 20 71 75 65 72 69 65 64  ation of queried
9920: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
9930: 74 75 72 6e 65 64 20 64 6f 63 75 6d 65 6e 74 73  turned documents
9940: 2e 0a 20 20 54 68 65 20 22 6d 61 74 63 68 69 6e  ..  The "matchin
9950: 66 6f 22 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f  fo" function pro
9960: 76 69 64 65 73 20 74 68 65 20 75 73 65 72 20 77  vides the user w
9970: 69 74 68 20 6d 65 74 72 69 63 73 20 74 68 61 74  ith metrics that
9980: 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20   may be useful. 
9990: 20 66 6f 72 20 66 69 6c 74 65 72 69 6e 67 20 6f   for filtering o
99a0: 72 20 73 6f 72 74 69 6e 67 20 71 75 65 72 79 20  r sorting query 
99b0: 72 65 73 75 6c 74 73 20 61 63 63 6f 72 64 69 6e  results accordin
99c0: 67 20 74 6f 20 72 65 6c 65 76 61 6e 63 65 2e 0a  g to relevance..
99d0: 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 72 73 74  .<p>.  The first
99e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6c 6c   argument to all
99f0: 20 74 68 72 65 65 20 73 70 65 63 69 61 6c 20 53   three special S
9a00: 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  QL scalar functi
9a10: 6f 6e 73 0a 20 20 6d 75 73 74 20 62 65 20 74 68  ons.  must be th
9a20: 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f  e [FTS hidden co
9a30: 6c 75 6d 6e 5d 20 6f 66 20 74 68 65 20 46 54 53  lumn] of the FTS
9a40: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
9a50: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 61 70  function is.  ap
9a60: 70 6c 69 65 64 20 74 6f 2e 20 20 54 68 65 20 5b  plied to.  The [
9a70: 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d  FTS hidden colum
9a80: 6e 5d 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  n] is an automat
9a90: 69 63 61 6c 6c 79 2d 67 65 6e 65 72 61 74 65 64  ically-generated
9aa0: 20 63 6f 6c 75 6d 6e 20 66 6f 75 6e 64 20 6f 6e   column found on
9ab0: 0a 20 20 61 6c 6c 20 46 54 53 20 74 61 62 6c 65  .  all FTS table
9ac0: 73 20 74 68 61 74 20 68 61 73 20 74 68 65 20 73  s that has the s
9ad0: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
9ae0: 46 54 53 20 74 61 62 6c 65 20 69 74 73 65 6c 66  FTS table itself
9af0: 2e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ..  For example,
9b00: 20 67 69 76 65 6e 20 61 6e 20 46 54 53 20 74 61   given an FTS ta
9b10: 62 6c 65 20 6e 61 6d 65 64 20 22 6d 61 69 6c 22  ble named "mail"
9b20: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
9b30: 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28   SELECT offsets(
9b40: 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20  mail) FROM mail 
9b50: 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48  WHERE mail MATCH
9b60: 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71   &lt;full-text q
9b70: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26  uery expression&
9b80: 67 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20 73 6e  gt;;.  SELECT sn
9b90: 69 70 70 65 74 28 6d 61 69 6c 29 20 46 52 4f 4d  ippet(mail) FROM
9ba0: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
9bb0: 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d   MATCH &lt;full-
9bc0: 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65  text query expre
9bd0: 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45 4c  ssion&gt;;.  SEL
9be0: 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 6d 61  ECT matchinfo(ma
9bf0: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
9c00: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26  ERE mail MATCH &
9c10: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
9c20: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
9c30: 3b 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ;;.</codeblock>.
9c40: 0a 3c 70 3e 0a 20 20 54 68 65 20 74 68 72 65 65  .<p>.  The three
9c50: 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
9c60: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 75 73  ions are only us
9c70: 65 66 75 6c 20 77 69 74 68 69 6e 20 61 20 53 45  eful within a SE
9c80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
9c90: 68 61 74 0a 20 20 75 73 65 73 20 74 68 65 20 46  hat.  uses the F
9ca0: 54 53 20 74 61 62 6c 65 27 73 20 66 75 6c 6c 2d  TS table's full-
9cb0: 74 65 78 74 20 69 6e 64 65 78 2e 20 5e 49 66 20  text index. ^If 
9cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 53 45  used within a SE
9cd0: 4c 45 43 54 20 74 68 61 74 20 75 73 65 73 0a 20  LECT that uses. 
9ce0: 20 74 68 65 20 22 71 75 65 72 79 20 62 79 20 72   the "query by r
9cf0: 6f 77 69 64 22 20 6f 72 20 22 6c 69 6e 65 61 72  owid" or "linear
9d00: 20 73 63 61 6e 22 20 73 74 72 61 74 65 67 69 65   scan" strategie
9d10: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6e 69 70  s, then the snip
9d20: 70 65 74 20 61 6e 64 0a 20 20 6f 66 66 73 65 74  pet and.  offset
9d30: 73 20 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e  s both return an
9d40: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 61   empty string, a
9d50: 6e 64 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  nd the matchinfo
9d60: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9d70: 73 0a 20 20 61 20 62 6c 6f 62 20 76 61 6c 75 65  s.  a blob value
9d80: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
9d90: 69 7a 65 2e 0a 0a 3c 70 20 69 64 3d 6d 61 74 63  ize...<p id=matc
9da0: 68 61 62 6c 65 3e 0a 20 20 41 6c 6c 20 74 68 72  hable>.  All thr
9db0: 65 65 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e  ee auxiliary fun
9dc0: 63 74 69 6f 6e 73 20 65 78 74 72 61 63 74 20 61  ctions extract a
9dd0: 20 73 65 74 20 6f 66 20 22 6d 61 74 63 68 61 62   set of "matchab
9de0: 6c 65 20 70 68 72 61 73 65 73 22 20 66 72 6f 6d  le phrases" from
9df0: 0a 20 20 74 68 65 20 46 54 53 20 71 75 65 72 79  .  the FTS query
9e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 77   expression to w
9e10: 6f 72 6b 20 77 69 74 68 2e 20 54 68 65 20 73 65  ork with. The se
9e20: 74 20 6f 66 20 6d 61 74 63 68 61 62 6c 65 20 70  t of matchable p
9e30: 68 72 61 73 65 73 20 66 6f 72 0a 20 20 61 20 67  hrases for.  a g
9e40: 69 76 65 6e 20 71 75 65 72 79 20 63 6f 6e 73 69  iven query consi
9e50: 73 74 73 20 6f 66 20 61 6c 6c 20 70 68 72 61 73  sts of all phras
9e60: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 75 6e  es (including un
9e70: 71 75 6f 74 65 64 20 74 6f 6b 65 6e 73 20 61 6e  quoted tokens an
9e80: 64 0a 20 20 74 6f 6b 65 6e 20 70 72 65 66 69 78  d.  token prefix
9e90: 65 73 29 20 69 6e 20 74 68 65 20 65 78 70 72 65  es) in the expre
9ea0: 73 73 69 6f 6e 20 65 78 63 65 70 74 20 74 68 6f  ssion except tho
9eb0: 73 65 20 74 68 61 74 20 61 72 65 20 70 72 65 66  se that are pref
9ec0: 69 78 65 64 20 77 69 74 68 0a 20 20 61 20 75 6e  ixed with.  a un
9ed0: 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72  ary "-" operator
9ee0: 20 28 73 74 61 6e 64 61 72 64 20 73 79 6e 74 61   (standard synta
9ef0: 78 29 20 6f 72 20 61 72 65 20 70 61 72 74 20 6f  x) or are part o
9f00: 66 20 61 20 73 75 62 2d 65 78 70 72 65 73 73 69  f a sub-expressi
9f10: 6f 6e 20 0a 20 20 74 68 61 74 20 69 73 20 75 73  on .  that is us
9f20: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ed as the right-
9f30: 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20  hand operand of 
9f40: 61 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 2e 0a  a NOT operator..
9f50: 0a 3c 70 3e 0a 20 20 57 69 74 68 20 74 68 65 20  .<p>.  With the 
9f60: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 76 69 73  following provis
9f70: 6f 73 2c 20 65 61 63 68 20 73 65 72 69 65 73 20  os, each series 
9f80: 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  of tokens in the
9f90: 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 0a   FTS table that.
9fa0: 20 20 6d 61 74 63 68 65 73 20 6f 6e 65 20 6f 66    matches one of
9fb0: 20 74 68 65 20 6d 61 74 63 68 61 62 6c 65 20 70   the matchable p
9fc0: 68 72 61 73 65 73 20 69 6e 20 74 68 65 20 71 75  hrases in the qu
9fd0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
9fe0: 73 20 6b 6e 6f 77 6e 20 61 73 20 61 0a 20 20 22  s known as a.  "
9ff0: 70 68 72 61 73 65 20 6d 61 74 63 68 22 3a 0a 0a  phrase match":..
a000: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 49 66 20 61  <ol>.  <li> If a
a010: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
a020: 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  e is part of a s
a030: 65 72 69 65 73 20 6f 66 20 70 68 72 61 73 65 73  eries of phrases
a040: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
a050: 20 20 20 20 20 4e 45 41 52 20 6f 70 65 72 61 74       NEAR operat
a060: 6f 72 73 20 69 6e 20 74 68 65 20 46 54 53 20 71  ors in the FTS q
a070: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
a080: 20 74 68 65 6e 20 65 61 63 68 20 70 68 72 61 73   then each phras
a090: 65 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20 6d  e match.       m
a0a0: 75 73 74 20 62 65 20 73 75 66 66 69 63 69 65 6e  ust be sufficien
a0b0: 74 6c 79 20 63 6c 6f 73 65 20 74 6f 20 6f 74 68  tly close to oth
a0c0: 65 72 20 70 68 72 61 73 65 20 6d 61 74 63 68 65  er phrase matche
a0d0: 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e  s of the relevan
a0e0: 74 0a 20 20 20 20 20 20 20 74 79 70 65 73 20 74  t.       types t
a0f0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4e 45  o satisfy the NE
a100: 41 52 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 0a 20  AR condition... 
a110: 20 3c 6c 69 3e 20 49 66 20 74 68 65 20 6d 61 74   <li> If the mat
a120: 63 68 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e  chable phrase in
a130: 20 74 68 65 20 46 54 53 20 71 75 65 72 79 20 69   the FTS query i
a140: 73 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20  s restricted to 
a150: 6d 61 74 63 68 69 6e 67 0a 20 20 20 20 20 20 20  matching.       
a160: 64 61 74 61 20 69 6e 20 61 20 73 70 65 63 69 66  data in a specif
a170: 69 65 64 20 46 54 53 20 74 61 62 6c 65 20 63 6f  ied FTS table co
a180: 6c 75 6d 6e 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  lumn, then only 
a190: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74  phrase matches t
a1a0: 68 61 74 20 0a 20 20 20 20 20 20 20 6f 63 63 75  hat .       occu
a1b0: 72 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f  r within that co
a1c0: 6c 75 6d 6e 20 61 72 65 20 63 6f 6e 73 69 64 65  lumn are conside
a1d0: 72 65 64 2e 0a 3c 2f 6f 6c 3e 0a 20 0a 3c 74 63  red..</ol>. .<tc
a1e0: 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 6f 66  l>hd_fragment of
a1f0: 66 73 65 74 73 20 6f 66 66 73 65 74 73 3c 2f 74  fsets offsets</t
a200: 63 6c 3e 0a 3c 68 32 3e 54 68 65 20 4f 66 66 73  cl>.<h2>The Offs
a210: 65 74 73 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32  ets Function</h2
a220: 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 61 20 53  >..<p>.  For a S
a230: 45 4c 45 43 54 20 71 75 65 72 79 20 74 68 61 74  ELECT query that
a240: 20 75 73 65 73 20 74 68 65 20 66 75 6c 6c 2d 74   uses the full-t
a250: 65 78 74 20 69 6e 64 65 78 2c 20 74 68 65 20 6f  ext index, the o
a260: 66 66 73 65 74 73 28 29 20 66 75 6e 63 74 69 6f  ffsets() functio
a270: 6e 20 0a 20 20 72 65 74 75 72 6e 73 20 61 20 74  n .  returns a t
a280: 65 78 74 20 76 61 6c 75 65 20 63 6f 6e 74 61 69  ext value contai
a290: 6e 69 6e 67 20 61 20 73 65 72 69 65 73 20 6f 66  ning a series of
a2a0: 20 73 70 61 63 65 2d 73 65 70 61 72 61 74 65 64   space-separated
a2b0: 20 69 6e 74 65 67 65 72 73 2e 20 46 6f 72 0a 20   integers. For. 
a2c0: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 65 61   each term in ea
a2d0: 63 68 20 3c 61 20 68 72 65 66 3d 23 6d 61 74 63  ch <a href=#matc
a2e0: 68 61 62 6c 65 3e 70 68 72 61 73 65 20 6d 61 74  hable>phrase mat
a2f0: 63 68 3c 2f 61 3e 20 6f 66 20 74 68 65 20 63 75  ch</a> of the cu
a300: 72 72 65 6e 74 20 72 6f 77 2c 20 0a 20 20 74 68  rrent row, .  th
a310: 65 72 65 20 61 72 65 20 66 6f 75 72 20 69 6e 74  ere are four int
a320: 65 67 65 72 73 20 69 6e 20 74 68 65 20 72 65 74  egers in the ret
a330: 75 72 6e 65 64 20 6c 69 73 74 2e 20 45 61 63 68  urned list. Each
a340: 20 73 65 74 20 6f 66 20 66 6f 75 72 20 69 6e 74   set of four int
a350: 65 67 65 72 73 20 69 73 20 0a 20 20 69 6e 74 65  egers is .  inte
a360: 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
a370: 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69  ws:..<table stri
a380: 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68  ped=1>.  <tr><th
a390: 3e 49 6e 74 65 67 65 72 20 3c 74 68 3e 49 6e 74  >Integer <th>Int
a3a0: 65 72 70 72 65 74 61 74 69 6f 6e 0a 20 20 3c 74  erpretation.  <t
a3b0: 72 3e 3c 74 64 3e 30 20 0a 20 20 20 20 20 20 3c  r><td>0 .      <
a3c0: 74 64 3e 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  td>The column nu
a3d0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 20 74 65  mber that the te
a3e0: 72 6d 20 69 6e 73 74 61 6e 63 65 20 6f 63 63 75  rm instance occu
a3f0: 72 73 20 69 6e 20 28 30 20 66 6f 72 20 74 68 65  rs in (0 for the
a400: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 66 74 6d  .          leftm
a410: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
a420: 65 20 46 54 53 20 74 61 62 6c 65 2c 20 31 20 66  e FTS table, 1 f
a430: 6f 72 20 74 68 65 20 6e 65 78 74 20 6c 65 66 74  or the next left
a440: 6d 6f 73 74 2c 20 65 74 63 2e 29 2e 0a 20 20 3c  most, etc.)..  <
a450: 74 72 3e 3c 74 64 3e 31 0a 20 20 20 20 20 20 3c  tr><td>1.      <
a460: 74 64 3e 54 68 65 20 74 65 72 6d 20 6e 75 6d 62  td>The term numb
a470: 65 72 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  er of the matchi
a480: 6e 67 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ng term within t
a490: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  he full-text que
a4a0: 72 79 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ry.          exp
a4b0: 72 65 73 73 69 6f 6e 2e 20 54 65 72 6d 73 20 77  ression. Terms w
a4c0: 69 74 68 69 6e 20 61 20 71 75 65 72 79 20 65 78  ithin a query ex
a4d0: 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6e 75 6d  pression are num
a4e0: 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 0a 20  bered starting. 
a4f0: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 30 20           from 0 
a500: 69 6e 20 74 68 65 20 6f 72 64 65 72 20 74 68 61  in the order tha
a510: 74 20 74 68 65 79 20 6f 63 63 75 72 2e 0a 20 20  t they occur..  
a520: 3c 74 72 3e 3c 74 64 3e 32 0a 20 20 20 20 20 20  <tr><td>2.      
a530: 3c 74 64 3e 54 68 65 20 62 79 74 65 20 6f 66 66  <td>The byte off
a540: 73 65 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68  set of the match
a550: 69 6e 67 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ing term within 
a560: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 3c 74  the column..  <t
a570: 72 3e 3c 74 64 3e 33 0a 20 20 20 20 20 20 3c 74  r><td>3.      <t
a580: 64 3e 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d>The size of th
a590: 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20  e matching term 
a5a0: 69 6e 20 62 79 74 65 73 2e 0a 3c 2f 74 61 62 6c  in bytes..</tabl
a5b0: 65 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f  e>..<p>.  The fo
a5c0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
a5d0: 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 20  ntains examples 
a5e0: 74 68 61 74 20 75 73 65 20 74 68 65 20 6f 66 66  that use the off
a5f0: 73 65 74 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a  sets function...
a600: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52  <codeblock>.  CR
a610: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
a620: 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74  LE mail USING ft
a630: 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64 79  s3(subject, body
a640: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
a650: 20 6d 61 69 6c 20 56 41 4c 55 45 53 28 27 68 65   mail VALUES('he
a660: 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20 27 54 68 69  llo world', 'Thi
a670: 73 20 6d 65 73 73 61 67 65 20 69 73 20 61 20 68  s message is a h
a680: 65 6c 6c 6f 20 77 6f 72 6c 64 20 6d 65 73 73 61  ello world messa
a690: 67 65 2e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ge.');.  INSERT 
a6a0: 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55 45 53  INTO mail VALUES
a6b0: 28 27 75 72 67 65 6e 74 3a 20 73 65 72 69 6f 75  ('urgent: seriou
a6c0: 73 27 2c 20 27 54 68 69 73 20 6d 61 69 6c 20 69  s', 'This mail i
a6d0: 73 20 73 65 65 6e 20 61 73 20 61 20 6d 6f 72 65  s seen as a more
a6e0: 20 73 65 72 69 6f 75 73 20 6d 61 69 6c 27 29 3b   serious mail');
a6f0: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
a700: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
a710: 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  turns a single r
a720: 6f 77 20 28 61 73 20 69 74 20 6d 61 74 63 68 65  ow (as it matche
a730: 73 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  s only the first
a740: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 65 6e 74  </i>.  <i>-- ent
a750: 72 79 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69  ry in table "mai
a760: 6c 22 2e 20 54 68 65 20 74 65 78 74 20 72 65 74  l". The text ret
a770: 75 72 6e 65 64 20 62 79 20 74 68 65 20 6f 66 66  urned by the off
a780: 73 65 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  sets function is
a790: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 30 20  </i>.  <i>-- "0 
a7a0: 30 20 36 20 35 20 31 20 30 20 32 34 20 35 22 2e  0 6 5 1 0 24 5".
a7b0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
a7c0: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72  .  <i>-- The fir
a7d0: 73 74 20 73 65 74 20 6f 66 20 66 6f 75 72 20 69  st set of four i
a7e0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 72  ntegers in the r
a7f0: 65 73 75 6c 74 20 69 6e 64 69 63 61 74 65 20 74  esult indicate t
a800: 68 61 74 20 63 6f 6c 75 6d 6e 20 30 3c 2f 69 3e  hat column 0</i>
a810: 0a 20 20 3c 69 3e 2d 2d 20 63 6f 6e 74 61 69 6e  .  <i>-- contain
a820: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
a830: 20 74 65 72 6d 20 30 20 28 22 77 6f 72 6c 64 22   term 0 ("world"
a840: 29 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  ) at byte offset
a850: 20 36 2e 20 54 68 65 20 74 65 72 6d 20 69 6e 73   6. The term ins
a860: 74 61 6e 63 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  tance</i>.  <i>-
a870: 2d 20 69 73 20 35 20 62 79 74 65 73 20 69 6e 20  - is 5 bytes in 
a880: 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64  size. The second
a890: 20 73 65 74 20 6f 66 20 66 6f 75 72 20 69 6e 74   set of four int
a8a0: 65 67 65 72 73 20 73 68 6f 77 73 20 74 68 61 74  egers shows that
a8b0: 20 63 6f 6c 75 6d 6e 20 31 3c 2f 69 3e 0a 20 20   column 1</i>.  
a8c0: 3c 69 3e 2d 2d 20 6f 66 20 74 68 65 20 6d 61 74  <i>-- of the mat
a8d0: 63 68 65 64 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ched row contain
a8e0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
a8f0: 20 74 65 72 6d 20 30 20 28 22 77 6f 72 6c 64 22   term 0 ("world"
a900: 29 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  ) at byte offset
a910: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 32 34 2e  </i>.  <i>-- 24.
a920: 20 41 67 61 69 6e 2c 20 74 68 65 20 74 65 72 6d   Again, the term
a930: 20 69 6e 73 74 61 6e 63 65 20 69 73 20 35 20 62   instance is 5 b
a940: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 3c 2f 69  ytes in size.</i
a950: 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65  >.  SELECT offse
a960: 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61  ts(mail) FROM ma
a970: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
a980: 54 43 48 20 27 77 6f 72 6c 64 27 3b 0a 0a 20 20  TCH 'world';..  
a990: 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77  <i>-- The follow
a9a0: 69 6e 67 20 71 75 65 72 79 20 72 65 74 75 72 6e  ing query return
a9b0: 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 6f  s also matches o
a9c0: 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 72 6f  nly the first ro
a9d0: 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c  w in table "mail
a9e0: 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 49  ".</i>.  <i>-- I
a9f0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
aa00: 72 65 74 75 72 6e 65 64 20 74 65 78 74 20 69 73  returned text is
aa10: 20 22 31 20 30 20 35 20 37 20 31 20 30 20 33 30   "1 0 5 7 1 0 30
aa20: 20 37 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43   7".</i>.  SELEC
aa30: 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20  T offsets(mail) 
aa40: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
aa50: 6d 61 69 6c 20 4d 41 54 43 48 20 27 6d 65 73 73  mail MATCH 'mess
aa60: 61 67 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  age';..  <i>-- T
aa70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
aa80: 72 79 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  ry matches the s
aa90: 65 63 6f 6e 64 20 72 6f 77 20 69 6e 20 74 61 62  econd row in tab
aaa0: 6c 65 20 22 6d 61 69 6c 22 2e 20 49 74 20 72 65  le "mail". It re
aab0: 74 75 72 6e 73 20 74 68 65 3c 2f 69 3e 0a 20 20  turns the</i>.  
aac0: 3c 69 3e 2d 2d 20 74 65 78 74 20 22 31 20 30 20  <i>-- text "1 0 
aad0: 32 38 20 37 20 31 20 31 20 33 36 20 34 22 2e 20  28 7 1 1 36 4". 
aae0: 4f 6e 6c 79 20 74 68 6f 73 65 20 6f 63 63 75 72  Only those occur
aaf0: 72 65 6e 63 65 73 20 6f 66 20 74 65 72 6d 73 20  rences of terms 
ab00: 22 73 65 72 69 6f 75 73 22 20 61 6e 64 20 22 6d  "serious" and "m
ab10: 61 69 6c 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ail"</i>.  <i>--
ab20: 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
ab30: 66 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  f an instance of
ab40: 20 74 68 65 20 70 68 72 61 73 65 20 22 73 65 72   the phrase "ser
ab50: 69 6f 75 73 20 6d 61 69 6c 22 20 61 72 65 20 69  ious mail" are i
ab60: 64 65 6e 74 69 66 69 65 64 3b 20 74 68 65 3c 2f  dentified; the</
ab70: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 74 68 65 72  i>.  <i>-- other
ab80: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
ab90: 22 73 65 72 69 6f 75 73 22 20 61 6e 64 20 22 6d  "serious" and "m
aba0: 61 69 6c 22 20 61 72 65 20 69 67 6e 6f 72 65 64  ail" are ignored
abb0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 6f  .</i>.  SELECT o
abc0: 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f  ffsets(mail) FRO
abd0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
abe0: 6c 20 4d 41 54 43 48 20 27 22 73 65 72 69 6f 75  l MATCH '"seriou
abf0: 73 20 6d 61 69 6c 22 27 3b 0a 3c 2f 63 6f 64 65  s mail"';.</code
ac00: 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  block>..<tcl>hd_
ac10: 66 72 61 67 6d 65 6e 74 20 73 6e 69 70 70 65 74  fragment snippet
ac20: 20 73 6e 69 70 70 65 74 3c 2f 74 63 6c 3e 0a 3c   snippet</tcl>.<
ac30: 68 32 3e 54 68 65 20 53 6e 69 70 70 65 74 20 46  h2>The Snippet F
ac40: 75 6e 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70  unction</h2>..<p
ac50: 3e 0a 20 20 54 68 65 20 73 6e 69 70 70 65 74 20  >.  The snippet 
ac60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ac70: 20 74 6f 20 63 72 65 61 74 65 20 66 6f 72 6d 61   to create forma
ac80: 74 74 65 64 20 66 72 61 67 6d 65 6e 74 73 20 6f  tted fragments o
ac90: 66 20 64 6f 63 75 6d 65 6e 74 20 74 65 78 74 0a  f document text.
aca0: 20 20 66 6f 72 20 64 69 73 70 6c 61 79 20 61 73    for display as
acb0: 20 70 61 72 74 20 6f 66 20 61 20 66 75 6c 6c 2d   part of a full-
acc0: 74 65 78 74 20 71 75 65 72 79 20 72 65 73 75 6c  text query resul
acd0: 74 73 20 72 65 70 6f 72 74 2e 20 54 68 65 20 73  ts report. The s
ace0: 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20  nippet function 
acf0: 0a 20 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  .  may be passed
ad00: 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 61 6e 64   between one and
ad10: 20 73 69 78 20 61 72 67 75 6d 65 6e 74 73 2c 20   six arguments, 
ad20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61  as follows:..<ta
ad30: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
ad40: 20 3c 74 72 3e 3c 74 68 3e 41 72 67 75 6d 65 6e   <tr><th>Argumen
ad50: 74 20 3c 74 68 3e 44 65 66 61 75 6c 74 20 56 61  t <th>Default Va
ad60: 6c 75 65 20 3c 74 68 3e 44 65 73 63 72 69 70 74  lue <th>Descript
ad70: 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 30 20  ion.  <tr><td>0 
ad80: 3c 74 64 3e 4e 2f 41 0a 20 20 20 20 20 20 3c 74  <td>N/A.      <t
ad90: 64 3e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d> The first arg
ada0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 6e 69  ument to the sni
adb0: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ppet function mu
adc0: 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
add0: 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c   [FTS hidden col
ade0: 75 6d 6e 5d 0a 20 20 20 20 20 20 20 20 20 20 20  umn].           
adf0: 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  of the FTS table
ae00: 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 61   being queried a
ae10: 6e 64 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  nd from which th
ae20: 65 20 73 6e 69 70 70 65 74 20 69 73 20 74 6f 20  e snippet is to 
ae30: 62 65 20 74 61 6b 65 6e 2e 20 20 54 68 65 0a 20  be taken.  The. 
ae40: 20 20 20 20 20 20 20 20 20 20 5b 46 54 53 20 68            [FTS h
ae50: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 69 73  idden column] is
ae60: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   an automaticall
ae70: 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 6c 75  y generated colu
ae80: 6d 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  mn with the same
ae90: 20 6e 61 6d 65 20 61 73 20 74 68 65 0a 20 20 20   name as the.   
aea0: 20 20 20 20 20 20 20 20 46 54 53 20 74 61 62 6c          FTS tabl
aeb0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 3c 74 72 3e  e itself..  <tr>
aec0: 3c 74 64 3e 31 20 3c 74 64 3e 22 26 6c 74 3b 62  <td>1 <td>"&lt;b
aed0: 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e  &gt;".      <td>
aee0: 20 54 68 65 20 22 73 74 61 72 74 20 6d 61 74 63   The "start matc
aef0: 68 22 20 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c  h" text..  <tr><
af00: 74 64 3e 32 20 3c 74 64 3e 22 26 6c 74 3b 2f 62  td>2 <td>"&lt;/b
af10: 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e  &gt;".      <td>
af20: 20 54 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22   The "end match"
af30: 20 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c 74 64   text..  <tr><td
af40: 3e 33 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67 74  >3 <td>"&lt;b&gt
af50: 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 0a  ;...&lt;/b&gt;".
af60: 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22        <td> The "
af70: 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74 2e 0a  ellipses" text..
af80: 20 20 3c 74 72 3e 3c 74 64 3e 34 20 3c 74 64 3e    <tr><td>4 <td>
af90: 2d 31 0a 20 20 20 20 20 20 3c 74 64 3e 20 54 68  -1.      <td> Th
afa0: 65 20 46 54 53 20 74 61 62 6c 65 20 63 6f 6c 75  e FTS table colu
afb0: 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20 65 78 74  mn number to ext
afc0: 72 61 63 74 20 74 68 65 20 72 65 74 75 72 6e 65  ract the returne
afd0: 64 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 0a 20  d fragments of. 
afe0: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 66            text f
aff0: 72 6f 6d 2e 20 43 6f 6c 75 6d 6e 73 20 61 72 65  rom. Columns are
b000: 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c   numbered from l
b010: 65 66 74 20 74 6f 20 72 69 67 68 74 20 73 74 61  eft to right sta
b020: 72 74 69 6e 67 20 77 69 74 68 0a 20 20 20 20 20  rting with.     
b030: 20 20 20 20 20 20 7a 65 72 6f 2e 20 41 20 6e 65        zero. A ne
b040: 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64  gative value ind
b050: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
b060: 74 65 78 74 20 6d 61 79 20 62 65 20 65 78 74 72  text may be extr
b070: 61 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  acted.          
b080: 20 66 72 6f 6d 20 61 6e 79 20 63 6f 6c 75 6d 6e   from any column
b090: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 35 20 3c 74  ..  <tr><td>5 <t
b0a0: 64 3e 2d 31 35 0a 20 20 20 20 20 20 3c 74 64 3e  d>-15.      <td>
b0b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
b0c0: 6c 75 65 20 6f 66 20 74 68 69 73 20 69 6e 74 65  lue of this inte
b0d0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ger argument is 
b0e0: 75 73 65 64 20 61 73 20 74 68 65 20 0a 20 20 20  used as the .   
b0f0: 20 20 20 20 20 20 20 20 28 61 70 70 72 6f 78 69          (approxi
b100: 6d 61 74 65 29 20 6e 75 6d 62 65 72 20 6f 66 20  mate) number of 
b110: 74 6f 6b 65 6e 73 20 74 6f 20 69 6e 63 6c 75 64  tokens to includ
b120: 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
b130: 64 20 74 65 78 74 20 0a 20 20 20 20 20 20 20 20  d text .        
b140: 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20 6d 61     value. The ma
b150: 78 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  ximum allowable 
b160: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69  absolute value i
b170: 73 20 36 34 2e 20 54 68 65 20 76 61 6c 75 65 20  s 64. The value 
b180: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20 74 68  of.           th
b190: 69 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  is argument is r
b1a0: 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 3c 69  eferred to as <i
b1b0: 3e 4e 3c 2f 69 3e 20 69 6e 20 74 68 65 20 64 69  >N</i> in the di
b1c0: 73 63 75 73 73 69 6f 6e 20 62 65 6c 6f 77 2e 0a  scussion below..
b1d0: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
b1e0: 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  The snippet func
b1f0: 74 69 6f 6e 20 66 69 72 73 74 20 61 74 74 65 6d  tion first attem
b200: 70 74 73 20 74 6f 20 66 69 6e 64 20 61 20 66 72  pts to find a fr
b210: 61 67 6d 65 6e 74 20 6f 66 20 74 65 78 74 20 63  agment of text c
b220: 6f 6e 73 69 73 74 69 6e 67 0a 20 20 6f 66 20 3c  onsisting.  of <
b230: 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73  i>|N|</i> tokens
b240: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
b250: 65 6e 74 20 72 6f 77 20 74 68 61 74 20 63 6f 6e  ent row that con
b260: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
b270: 6e 65 20 70 68 72 61 73 65 20 0a 20 20 6d 61 74  ne phrase .  mat
b280: 63 68 20 66 6f 72 20 65 61 63 68 20 6d 61 74 63  ch for each matc
b290: 68 61 62 6c 65 20 70 68 72 61 73 65 20 6d 61 74  hable phrase mat
b2a0: 63 68 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  ched somewhere i
b2b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
b2c0: 77 2c 20 0a 20 20 77 68 65 72 65 20 3c 69 3e 7c  w, .  where <i>|
b2d0: 4e 7c 3c 2f 69 3e 20 69 73 20 74 68 65 20 61 62  N|</i> is the ab
b2e0: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
b2f0: 74 68 65 20 73 69 78 74 68 20 61 72 67 75 6d 65  the sixth argume
b300: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
b310: 0a 20 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74  .  snippet funct
b320: 69 6f 6e 2e 20 49 66 20 74 68 65 20 74 65 78 74  ion. If the text
b330: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e   stored in a sin
b340: 67 6c 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  gle column conta
b350: 69 6e 73 20 6c 65 73 73 20 74 68 61 6e 0a 20 20  ins less than.  
b360: 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e  <i>|N|</i> token
b370: 73 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  s, then the enti
b380: 72 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  re column value 
b390: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 54  is considered. T
b3a0: 65 78 74 20 66 72 61 67 6d 65 6e 74 73 20 0a 20  ext fragments . 
b3b0: 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d 75   may not span mu
b3c0: 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 0a  ltiple columns..
b3d0: 0a 3c 70 3e 0a 20 20 49 66 20 73 75 63 68 20 61  .<p>.  If such a
b3e0: 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74 20 63   text fragment c
b3f0: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 69 74 20  an be found, it 
b400: 69 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  is returned with
b410: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
b420: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 3a 0a   modifications:.
b430: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 49 66 20  .<ul>.  <li> If 
b440: 74 68 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e  the text fragmen
b450: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
b460: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
b470: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
b480: 0a 20 20 20 20 20 20 20 74 68 65 20 22 65 6c 6c  .       the "ell
b490: 69 70 73 65 73 22 20 74 65 78 74 20 69 73 20 70  ipses" text is p
b4a0: 72 65 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a  repended to it..
b4b0: 20 20 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65    <li> If the te
b4c0: 78 74 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73  xt fragment does
b4d0: 20 6e 6f 74 20 66 69 6e 69 73 68 20 61 74 20 74   not finish at t
b4e0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 6c 75  he end of a colu
b4f0: 6d 6e 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  mn value,.      
b500: 20 74 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20   the "ellipses" 
b510: 74 65 78 74 20 69 73 20 61 70 70 65 6e 64 65 64  text is appended
b520: 20 74 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 46   to it..  <li> F
b530: 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
b540: 20 74 68 65 20 74 65 78 74 20 66 72 61 67 6d 65   the text fragme
b550: 6e 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  nt that is part 
b560: 6f 66 20 61 20 70 68 72 61 73 65 20 6d 61 74 63  of a phrase matc
b570: 68 2c 0a 20 20 20 20 20 20 20 74 68 65 20 22 73  h,.       the "s
b580: 74 61 72 74 20 6d 61 74 63 68 22 20 74 65 78 74  tart match" text
b590: 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
b5a0: 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 20 62  o the fragment b
b5b0: 65 66 6f 72 65 20 74 68 65 20 74 6f 6b 65 6e 2c  efore the token,
b5c0: 0a 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20  .       and the 
b5d0: 22 65 6e 64 20 6d 61 74 63 68 22 20 74 65 78 74  "end match" text
b5e0: 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6d 6d   is inserted imm
b5f0: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69  ediately after i
b600: 74 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  t..</ul>..<p>.  
b610: 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  If more than one
b620: 20 73 75 63 68 20 66 72 61 67 6d 65 6e 74 20 63   such fragment c
b630: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 74 68 65  an be found, the
b640: 6e 20 66 72 61 67 6d 65 6e 74 73 20 74 68 61 74  n fragments that
b650: 20 63 6f 6e 74 61 69 6e 0a 20 20 61 20 6c 61 72   contain.  a lar
b660: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 65  ger number of "e
b670: 78 74 72 61 22 20 70 68 72 61 73 65 20 6d 61 74  xtra" phrase mat
b680: 63 68 65 73 20 61 72 65 20 66 61 76 6f 72 65 64  ches are favored
b690: 2e 20 54 68 65 20 73 74 61 72 74 20 6f 66 0a 20  . The start of. 
b6a0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 74 65   the selected te
b6b0: 78 74 20 66 72 61 67 6d 65 6e 74 20 6d 61 79 20  xt fragment may 
b6c0: 62 65 20 6d 6f 76 65 64 20 61 20 66 65 77 20 74  be moved a few t
b6d0: 6f 6b 65 6e 73 20 66 6f 72 77 61 72 64 20 6f 72  okens forward or
b6e0: 20 62 61 63 6b 77 61 72 64 0a 20 20 74 6f 20 61   backward.  to a
b6f0: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 63 65 6e  ttempt to concen
b700: 74 72 61 74 65 20 74 68 65 20 70 68 72 61 73 65  trate the phrase
b710: 20 6d 61 74 63 68 65 73 20 74 6f 77 61 72 64 20   matches toward 
b720: 74 68 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68  the center of th
b730: 65 0a 20 20 66 72 61 67 6d 65 6e 74 2e 0a 0a 3c  e.  fragment...<
b740: 70 3e 0a 20 20 41 73 73 75 6d 69 6e 67 20 3c 69  p>.  Assuming <i
b750: 3e 4e 3c 2f 69 3e 20 69 73 20 61 20 70 6f 73 69  >N</i> is a posi
b760: 74 69 76 65 20 76 61 6c 75 65 2c 20 69 66 20 6e  tive value, if n
b770: 6f 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 20  o fragments can 
b780: 62 65 20 66 6f 75 6e 64 20 74 68 61 74 0a 20 20  be found that.  
b790: 63 6f 6e 74 61 69 6e 20 61 20 70 68 72 61 73 65  contain a phrase
b7a0: 20 6d 61 74 63 68 20 63 6f 72 72 65 73 70 6f 6e   match correspon
b7b0: 64 69 6e 67 20 74 6f 20 65 61 63 68 20 6d 61 74  ding to each mat
b7c0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 2c 20 74  chable phrase, t
b7d0: 68 65 20 73 6e 69 70 70 65 74 0a 20 20 66 75 6e  he snippet.  fun
b7e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
b7f0: 6f 20 66 69 6e 64 20 74 77 6f 20 66 72 61 67 6d  o find two fragm
b800: 65 6e 74 73 20 6f 66 20 61 70 70 72 6f 78 69 6d  ents of approxim
b810: 61 74 65 6c 79 20 3c 69 3e 4e 3c 2f 69 3e 2f 32  ately <i>N</i>/2
b820: 20 74 6f 6b 65 6e 73 0a 20 20 74 68 61 74 20 62   tokens.  that b
b830: 65 74 77 65 65 6e 20 74 68 65 6d 20 63 6f 6e 74  etween them cont
b840: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
b850: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 66 6f   phrase match fo
b860: 72 20 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65  r each matchable
b870: 20 70 68 72 61 73 65 0a 20 20 6d 61 74 63 68 65   phrase.  matche
b880: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
b890: 20 72 6f 77 2e 20 49 66 20 74 68 69 73 20 66 61   row. If this fa
b8a0: 69 6c 73 2c 20 61 74 74 65 6d 70 74 73 20 61 72  ils, attempts ar
b8b0: 65 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 74  e made to find t
b8c0: 68 72 65 65 0a 20 20 66 72 61 67 6d 65 6e 74 73  hree.  fragments
b8d0: 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 33 20 74   of <i>N</i>/3 t
b8e0: 6f 6b 65 6e 73 20 65 61 63 68 20 61 6e 64 20 66  okens each and f
b8f0: 69 6e 61 6c 6c 79 20 66 6f 75 72 20 3c 69 3e 4e  inally four <i>N
b900: 3c 2f 69 3e 2f 34 20 74 6f 6b 65 6e 0a 20 20 66  </i>/4 token.  f
b910: 72 61 67 6d 65 6e 74 73 2e 20 49 66 20 61 20 73  ragments. If a s
b920: 65 74 20 6f 66 20 66 6f 75 72 20 66 72 61 67 6d  et of four fragm
b930: 65 6e 74 73 20 63 61 6e 6e 6f 74 20 62 65 20 66  ents cannot be f
b940: 6f 75 6e 64 20 74 68 61 74 20 65 6e 63 6f 6d 70  ound that encomp
b950: 61 73 73 65 73 20 74 68 65 0a 20 20 72 65 71 75  asses the.  requ
b960: 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74 63  ired phrase matc
b970: 68 65 73 2c 20 74 68 65 20 66 6f 75 72 20 66 72  hes, the four fr
b980: 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c  agments of <i>N<
b990: 2f 69 3e 2f 34 20 74 6f 6b 65 6e 73 20 74 68 61  /i>/4 tokens tha
b9a0: 74 20 70 72 6f 76 69 64 65 0a 20 20 74 68 65 20  t provide.  the 
b9b0: 62 65 73 74 20 63 6f 76 65 72 61 67 65 20 61 72  best coverage ar
b9c0: 65 20 73 65 6c 65 63 74 65 64 2e 0a 0a 3c 70 3e  e selected...<p>
b9d0: 0a 20 20 49 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69  .  If <i>N</i> i
b9e0: 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  s a negative val
b9f0: 75 65 2c 20 61 6e 64 20 6e 6f 20 73 69 6e 67 6c  ue, and no singl
ba00: 65 20 66 72 61 67 6d 65 6e 74 20 63 61 6e 20 62  e fragment can b
ba10: 65 20 66 6f 75 6e 64 20 0a 20 20 63 6f 6e 74 61  e found .  conta
ba20: 69 6e 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  ining the requir
ba30: 65 64 20 70 68 72 61 73 65 20 6d 61 74 63 68 65  ed phrase matche
ba40: 73 2c 20 74 68 65 20 73 6e 69 70 70 65 74 20 66  s, the snippet f
ba50: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
ba60: 0a 20 20 66 6f 72 20 74 77 6f 20 66 72 61 67 6d  .  for two fragm
ba70: 65 6e 74 73 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f  ents of <i>|N|</
ba80: 69 3e 20 74 6f 6b 65 6e 73 20 65 61 63 68 2c 20  i> tokens each, 
ba90: 74 68 65 6e 20 74 68 72 65 65 2c 20 74 68 65 6e  then three, then
baa0: 20 66 6f 75 72 2e 20 49 6e 0a 20 20 6f 74 68 65   four. In.  othe
bab0: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
bac0: 73 70 65 63 69 66 69 65 64 20 76 61 6c 75 65 20  specified value 
bad0: 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 6e  of <i>N</i> is n
bae0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 73 69 7a  egative, the siz
baf0: 65 73 0a 20 20 6f 66 20 74 68 65 20 66 72 61 67  es.  of the frag
bb00: 6d 65 6e 74 73 20 69 73 20 6e 6f 74 20 64 65 63  ments is not dec
bb10: 72 65 61 73 65 64 20 69 66 20 6d 6f 72 65 20 74  reased if more t
bb20: 68 61 6e 20 6f 6e 65 20 66 72 61 67 6d 65 6e 74  han one fragment
bb30: 20 69 73 20 72 65 71 75 69 72 65 64 0a 20 20 74   is required.  t
bb40: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 64 65  o provide the de
bb50: 73 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74  sired phrase mat
bb60: 63 68 20 63 6f 76 65 72 61 67 65 2e 0a 0a 3c 70  ch coverage...<p
bb70: 3e 0a 20 20 41 66 74 65 72 20 74 68 65 20 3c 69  >.  After the <i
bb80: 3e 4d 3c 2f 69 3e 20 66 72 61 67 6d 65 6e 74 73  >M</i> fragments
bb90: 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 63 61 74   have been locat
bba0: 65 64 2c 20 77 68 65 72 65 20 3c 69 3e 4d 3c 2f  ed, where <i>M</
bbb0: 69 3e 20 69 73 20 62 65 74 77 65 65 6e 0a 20 20  i> is between.  
bbc0: 74 77 6f 20 61 6e 64 20 66 6f 75 72 20 61 73 20  two and four as 
bbd0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
bbe0: 20 70 61 72 61 67 72 61 70 68 73 20 61 62 6f 76   paragraphs abov
bbf0: 65 2c 20 74 68 65 79 20 61 72 65 20 6a 6f 69 6e  e, they are join
bc00: 65 64 20 74 6f 67 65 74 68 65 72 0a 20 20 69 6e  ed together.  in
bc10: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 77 69   sorted order wi
bc20: 74 68 20 74 68 65 20 22 65 6c 6c 69 70 73 65 73  th the "ellipses
bc30: 22 20 74 65 78 74 20 73 65 70 61 72 61 74 69 6e  " text separatin
bc40: 67 20 74 68 65 6d 2e 20 54 68 65 20 74 68 72 65  g them. The thre
bc50: 65 20 0a 20 20 6d 6f 64 69 66 69 63 61 74 69 6f  e .  modificatio
bc60: 6e 73 20 65 6e 75 6d 65 72 61 74 65 64 20 65 61  ns enumerated ea
bc70: 72 6c 69 65 72 20 61 72 65 20 70 65 72 66 6f 72  rlier are perfor
bc80: 6d 65 64 20 6f 6e 20 74 68 65 20 74 65 78 74 20  med on the text 
bc90: 62 65 66 6f 72 65 20 69 74 20 69 73 20 0a 20 20  before it is .  
bca0: 72 65 74 75 72 6e 65 64 2e 0a 0a 3c 63 6f 64 65  returned...<code
bcb0: 62 6c 6f 63 6b 3e 0a 20 20 3c 62 3e 4e 6f 74 65  block>.  <b>Note
bcc0: 3a 20 49 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  : In this block 
bcd0: 6f 66 20 65 78 61 6d 70 6c 65 73 2c 20 6e 65 77  of examples, new
bce0: 6c 69 6e 65 73 20 61 6e 64 20 77 68 69 74 65 73  lines and whites
bcf0: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 73 20  pace characters 
bd00: 68 61 76 65 0a 20 20 62 65 65 6e 20 69 6e 73 65  have.  been inse
bd10: 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 64 6f  rted into the do
bd20: 63 75 6d 65 6e 74 20 69 6e 73 65 72 74 65 64 20  cument inserted 
bd30: 69 6e 74 6f 20 74 68 65 20 46 54 53 20 74 61 62  into the FTS tab
bd40: 6c 65 2c 20 61 6e 64 20 74 68 65 20 65 78 70 65  le, and the expe
bd50: 63 74 65 64 0a 20 20 72 65 73 75 6c 74 73 20 64  cted.  results d
bd60: 65 73 63 72 69 62 65 64 20 69 6e 20 53 51 4c 20  escribed in SQL 
bd70: 63 6f 6d 6d 65 6e 74 73 2e 20 54 68 69 73 20 69  comments. This i
bd80: 73 20 64 6f 6e 65 20 74 6f 20 65 6e 68 61 6e 63  s done to enhanc
bd90: 65 20 72 65 61 64 61 62 69 6c 69 74 79 20 6f 6e  e readability on
bda0: 6c 79 2c 0a 20 20 74 68 65 79 20 77 6f 75 6c 64  ly,.  they would
bdb0: 20 6e 6f 74 20 62 65 20 70 72 65 73 65 6e 74 20   not be present 
bdc0: 69 6e 20 61 63 74 75 61 6c 20 53 51 4c 69 74 65  in actual SQLite
bdd0: 20 63 6f 6d 6d 61 6e 64 73 20 6f 72 20 6f 75 74   commands or out
bde0: 70 75 74 2e 3c 2f 62 3e 0a 0a 20 20 3c 69 3e 2d  put.</b>..  <i>-
bdf0: 2d 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70  - Create and pop
be00: 75 6c 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  ulate an FTS tab
be10: 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  le.</i>.  CREATE
be20: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
be30: 65 78 74 20 55 53 49 4e 47 20 66 74 73 34 28 29  ext USING fts4()
be40: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
be50: 74 65 78 74 20 56 41 4c 55 45 53 28 27 0a 20 20  text VALUES('.  
be60: 20 20 44 75 72 69 6e 67 20 33 30 20 4e 6f 76 2d    During 30 Nov-
be70: 31 20 44 65 63 2c 20 32 2d 33 6f 43 20 64 72 6f  1 Dec, 2-3oC dro
be80: 70 73 2e 20 43 6f 6f 6c 20 69 6e 20 74 68 65 20  ps. Cool in the 
be90: 75 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 6d  upper portion, m
bea0: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
beb0: 72 65 20 31 34 2d 31 36 6f 43 20 0a 20 20 20 20  re 14-16oC .    
bec0: 61 6e 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68 65  and cool elsewhe
bed0: 72 65 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70  re, minimum temp
bee0: 65 72 61 74 75 72 65 20 31 37 2d 32 30 6f 43 2e  erature 17-20oC.
bef0: 20 43 6f 6c 64 20 74 6f 20 76 65 72 79 20 63 6f   Cold to very co
bf00: 6c 64 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f  ld on mountainto
bf10: 70 73 2c 20 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  ps, .    minimum
bf20: 20 74 65 6d 70 65 72 61 74 75 72 65 20 36 2d 31   temperature 6-1
bf30: 32 6f 43 2e 20 4e 6f 72 74 68 65 61 73 74 65 72  2oC. Northeaster
bf40: 6c 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b  ly winds 15-30 k
bf50: 6d 2f 68 72 2e 20 41 66 74 65 72 20 74 68 61 74  m/hr. After that
bf60: 2c 20 74 65 6d 70 65 72 61 74 75 72 65 20 0a 20  , temperature . 
bf70: 20 20 20 69 6e 63 72 65 61 73 65 73 2e 20 4e 6f     increases. No
bf80: 72 74 68 65 61 73 74 65 72 6c 79 20 77 69 6e 64  rtheasterly wind
bf90: 73 20 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 20  s 15-30 km/hr.  
bfa0: 20 20 20 0a 20 20 27 29 3b 0a 0a 20 20 3c 69 3e     .  ');..  <i>
bfb0: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
bfc0: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 74   query returns t
bfd0: 68 65 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f  he text value:</
bfe0: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
bff0: 20 3c 69 3e 2d 2d 20 20 20 22 26 6c 74 3b 62 26   <i>--   "&lt;b&
c000: 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b  gt;...&lt;/b&gt;
c010: 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20  cool elsewhere, 
c020: 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74  minimum temperat
c030: 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 26 6c 74  ure 17-20oC. &lt
c040: 3b 62 26 67 74 3b 43 6f 6c 64 26 6c 74 3b 2f 62  ;b&gt;Cold&lt;/b
c050: 26 67 74 3b 20 74 6f 20 76 65 72 79 20 3c 2f 69  &gt; to very </i
c060: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 26 6c 74  >.  <i>--    &lt
c070: 3b 62 26 67 74 3b 63 6f 6c 64 26 6c 74 3b 2f 62  ;b&gt;cold&lt;/b
c080: 26 67 74 3b 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e  &gt; on mountain
c090: 74 6f 70 73 2c 20 6d 69 6e 69 6d 75 6d 20 74 65  tops, minimum te
c0a0: 6d 70 65 72 61 74 75 72 65 20 36 26 6c 74 3b 62  mperature 6&lt;b
c0b0: 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74  &gt;...&lt;/b&gt
c0c0: 3b 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ;".</i>.  <i>--<
c0d0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 73 6e 69  /i>.  SELECT sni
c0e0: 70 70 65 74 28 74 65 78 74 29 20 46 52 4f 4d 20  ppet(text) FROM 
c0f0: 74 65 78 74 20 57 48 45 52 45 20 74 65 78 74 20  text WHERE text 
c100: 4d 41 54 43 48 20 27 63 6f 6c 64 27 3b 0a 0a 20  MATCH 'cold';.. 
c110: 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
c120: 77 69 6e 67 20 71 75 65 72 79 20 72 65 74 75 72  wing query retur
c130: 6e 73 20 74 68 65 20 74 65 78 74 20 76 61 6c 75  ns the text valu
c140: 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  e:</i>.  <i>--</
c150: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 22 2e 2e  i>.  <i>--   "..
c160: 2e 74 68 65 20 75 70 70 65 72 20 70 6f 72 74 69  .the upper porti
c170: 6f 6e 2c 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d  on, &#91;minimum
c180: 26 23 39 33 3b 20 26 23 39 31 3b 74 65 6d 70 65  &#93; &#91;tempe
c190: 72 61 74 75 72 65 26 23 39 33 3b 20 31 34 2d 31  rature&#93; 14-1
c1a0: 36 6f 43 20 61 6e 64 20 63 6f 6f 6c 20 65 6c 73  6oC and cool els
c1b0: 65 77 68 65 72 65 2c 3c 2f 69 3e 0a 20 20 3c 69  ewhere,</i>.  <i
c1c0: 3e 2d 2d 20 20 20 20 26 23 39 31 3b 6d 69 6e 69  >--    &#91;mini
c1d0: 6d 75 6d 26 23 39 33 3b 20 26 23 39 31 3b 74 65  mum&#93; &#91;te
c1e0: 6d 70 65 72 61 74 75 72 65 26 23 39 33 3b 20 31  mperature&#93; 1
c1f0: 37 2d 32 30 6f 43 2e 20 43 6f 6c 64 2e 2e 2e 22  7-20oC. Cold..."
c200: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
c210: 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65  .  SELECT snippe
c220: 74 28 74 65 78 74 2c 20 27 26 23 39 31 3b 27 2c  t(text, '&#91;',
c230: 20 27 26 23 39 33 3b 27 2c 20 27 2e 2e 2e 27 29   '&#93;', '...')
c240: 20 46 52 4f 4d 20 74 65 78 74 20 57 48 45 52 45   FROM text WHERE
c250: 20 74 65 78 74 20 4d 41 54 43 48 20 27 22 6d 69   text MATCH '"mi
c260: 6e 2a 20 74 65 6d 2a 22 27 0a 3c 2f 63 6f 64 65  n* tem*"'.</code
c270: 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 20 69 64 3d 6d  block>..<h2 id=m
c280: 61 74 63 68 69 6e 66 6f 20 74 61 67 73 3d 6d 61  atchinfo tags=ma
c290: 74 63 68 69 6e 66 6f 3e 54 68 65 20 4d 61 74 63  tchinfo>The Matc
c2a0: 68 69 6e 66 6f 20 46 75 6e 63 74 69 6f 6e 3c 2f  hinfo Function</
c2b0: 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  h2>..<p>.  The m
c2c0: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
c2d0: 6e 20 72 65 74 75 72 6e 73 20 61 20 62 6c 6f 62  n returns a blob
c2e0: 20 76 61 6c 75 65 2e 20 49 66 20 69 74 20 69 73   value. If it is
c2f0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 71   used within a q
c300: 75 65 72 79 0a 20 20 74 68 61 74 20 64 6f 65 73  uery.  that does
c310: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 66 75 6c   not use the ful
c320: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 28 61 20  l-text index (a 
c330: 22 71 75 65 72 79 20 62 79 20 72 6f 77 69 64 22  "query by rowid"
c340: 20 6f 72 20 22 6c 69 6e 65 61 72 20 73 63 61 6e   or "linear scan
c350: 22 29 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 62  "),.  then the b
c360: 6c 6f 62 20 69 73 20 7a 65 72 6f 20 62 79 74 65  lob is zero byte
c370: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
c380: 77 69 73 65 2c 20 74 68 65 20 62 6c 6f 62 20 63  wise, the blob c
c390: 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 0a  onsists of zero.
c3a0: 20 20 6f 72 20 6d 6f 72 65 20 33 32 2d 62 69 74    or more 32-bit
c3b0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
c3c0: 72 73 20 69 6e 20 6d 61 63 68 69 6e 65 20 62 79  rs in machine by
c3d0: 74 65 2d 6f 72 64 65 72 2e 20 54 68 65 20 65 78  te-order. The ex
c3e0: 61 63 74 20 6e 75 6d 62 65 72 0a 20 20 6f 66 20  act number.  of 
c3f0: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
c400: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 64  returned array d
c410: 65 70 65 6e 64 73 20 6f 6e 20 62 6f 74 68 20 74  epends on both t
c420: 68 65 20 71 75 65 72 79 20 61 6e 64 20 74 68 65  he query and the
c430: 20 76 61 6c 75 65 0a 20 20 6f 66 20 74 68 65 20   value.  of the 
c440: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c450: 28 69 66 20 61 6e 79 29 20 70 61 73 73 65 64 20  (if any) passed 
c460: 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  to the matchinfo
c470: 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a   function...<p>.
c480: 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20    The matchinfo 
c490: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c4a0: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 6f  ed with either o
c4b0: 6e 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65  ne or two argume
c4c0: 6e 74 73 2e 20 41 73 20 66 6f 72 0a 20 20 61 6c  nts. As for.  al
c4d0: 6c 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  l auxiliary func
c4e0: 74 69 6f 6e 73 2c 20 74 68 65 20 66 69 72 73 74  tions, the first
c4f0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
c500: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 0a 20  e the special . 
c510: 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c   [FTS hidden col
c520: 75 6d 6e 5d 2e 20 54 68 65 20 73 65 63 6f 6e 64  umn]. The second
c530: 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 69 74   argument, if it
c540: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6d   is specified, m
c550: 75 73 74 20 62 65 20 61 20 74 65 78 74 20 76 61  ust be a text va
c560: 6c 75 65 0a 20 20 63 6f 6d 70 72 69 73 65 64 20  lue.  comprised 
c570: 6f 6e 6c 79 20 6f 66 20 74 68 65 20 63 68 61 72  only of the char
c580: 61 63 74 65 72 73 20 27 70 27 2c 20 27 63 27 2c  acters 'p', 'c',
c590: 20 27 6e 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'n', 'a', 'l', 
c5a0: 27 73 27 2c 20 27 78 27 2c 20 27 79 27 20 61 6e  's', 'x', 'y' an
c5b0: 64 20 27 62 27 2e 0a 20 20 49 66 20 6e 6f 20 73  d 'b'..  If no s
c5c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
c5d0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 73 75 70  s explicitly sup
c5e0: 70 6c 69 65 64 2c 20 69 74 20 64 65 66 61 75 6c  plied, it defaul
c5f0: 74 73 20 74 6f 20 22 70 63 78 22 2e 20 54 68 65  ts to "pcx". The
c600: 0a 20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  .  second argume
c610: 6e 74 20 69 73 20 72 65 66 65 72 72 65 64 20 74  nt is referred t
c620: 6f 20 61 73 20 74 68 65 20 22 66 6f 72 6d 61 74  o as the "format
c630: 20 73 74 72 69 6e 67 22 20 62 65 6c 6f 77 2e 0a   string" below..
c640: 0a 3c 70 3e 0a 20 20 43 68 61 72 61 63 74 65 72  .<p>.  Character
c650: 73 20 69 6e 20 74 68 65 20 6d 61 74 63 68 69 6e  s in the matchin
c660: 66 6f 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  fo format string
c670: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
c680: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
c690: 74 2e 20 0a 20 20 45 61 63 68 20 63 68 61 72 61  t. .  Each chara
c6a0: 63 74 65 72 20 69 6e 20 74 68 65 20 66 6f 72 6d  cter in the form
c6b0: 61 74 20 73 74 72 69 6e 67 20 63 61 75 73 65 73  at string causes
c6c0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 33 32 2d   one or more 32-
c6d0: 62 69 74 20 75 6e 73 69 67 6e 65 64 0a 20 20 69  bit unsigned.  i
c6e0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f  nteger values to
c6f0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
c700: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 2e   returned array.
c710: 20 54 68 65 20 22 76 61 6c 75 65 73 22 20 63 6f   The "values" co
c720: 6c 75 6d 6e 20 69 6e 0a 20 20 74 68 65 20 66 6f  lumn in.  the fo
c730: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f  llowing table co
c740: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
c750: 72 20 6f 66 20 69 6e 74 65 67 65 72 20 76 61 6c  r of integer val
c760: 75 65 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ues appended to 
c770: 74 68 65 0a 20 20 6f 75 74 70 75 74 20 62 75 66  the.  output buf
c780: 66 65 72 20 66 6f 72 20 65 61 63 68 20 73 75 70  fer for each sup
c790: 70 6f 72 74 65 64 20 66 6f 72 6d 61 74 20 73 74  ported format st
c7a0: 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 2e 20  ring character. 
c7b0: 49 6e 20 74 68 65 20 66 6f 72 6d 75 6c 61 0a 20  In the formula. 
c7c0: 20 67 69 76 65 6e 2c 20 3c 69 3e 63 6f 6c 73 3c   given, <i>cols<
c7d0: 2f 69 3e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  /i> is the numbe
c7e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c7f0: 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c 20 61  the FTS table, a
c800: 6e 64 20 0a 20 20 3c 69 3e 70 68 72 61 73 65 73  nd .  <i>phrases
c810: 3c 2f 69 3e 20 69 73 20 74 68 65 20 6e 75 6d 62  </i> is the numb
c820: 65 72 20 6f 66 20 3c 61 20 68 72 65 66 3d 23 6d  er of <a href=#m
c830: 61 74 63 68 61 62 6c 65 3e 6d 61 74 63 68 61 62  atchable>matchab
c840: 6c 65 20 70 68 72 61 73 65 73 3c 2f 61 3e 20 69  le phrases</a> i
c850: 6e 20 0a 20 20 74 68 65 20 71 75 65 72 79 2e 20  n .  the query. 
c860: 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
c870: 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 68  =1>.  <tr><th>Ch
c880: 61 72 61 63 74 65 72 3c 74 68 3e 56 61 6c 75 65  aracter<th>Value
c890: 73 3c 74 68 3e 44 65 73 63 72 69 70 74 69 6f 6e  s<th>Description
c8a0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 70 20 3c 74 64  .  <tr><td>p <td
c8b0: 3e 31 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65  >1 <td>The numbe
c8c0: 72 20 6f 66 20 6d 61 74 63 68 61 62 6c 65 20 70  r of matchable p
c8d0: 68 72 61 73 65 73 20 69 6e 20 74 68 65 20 71 75  hrases in the qu
c8e0: 65 72 79 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63  ery..  <tr><td>c
c8f0: 20 3c 74 64 3e 31 20 3c 74 64 3e 54 68 65 20 6e   <td>1 <td>The n
c900: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
c910: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  fined columns in
c920: 20 74 68 65 20 46 54 53 0a 20 20 20 20 74 61 62   the FTS.    tab
c930: 6c 65 20 28 69 2e 65 2e 20 6e 6f 74 20 69 6e 63  le (i.e. not inc
c940: 6c 75 64 69 6e 67 20 74 68 65 20 64 6f 63 69 64  luding the docid
c950: 20 6f 72 20 74 68 65 20 5b 46 54 53 20 68 69 64   or the [FTS hid
c960: 64 65 6e 20 63 6f 6c 75 6d 6e 5d 29 2e 0a 20 20  den column])..  
c970: 3c 74 72 3e 3c 74 64 3e 78 20 3c 74 64 20 73 74  <tr><td>x <td st
c980: 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65  yle="white-space
c990: 3a 6e 6f 77 72 61 70 22 3e 33 20 2a 20 3c 69 3e  :nowrap">3 * <i>
c9a0: 63 6f 6c 73 3c 2f 69 3e 20 2a 20 3c 69 3e 70 68  cols</i> * <i>ph
c9b0: 72 61 73 65 73 3c 2f 69 3e 20 0a 20 20 20 20 3c  rases</i> .    <
c9c0: 74 64 3e 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  td><tcl>hd_fragm
c9d0: 65 6e 74 20 6d 61 74 63 68 69 6e 66 6f 2d 78 20  ent matchinfo-x 
c9e0: 7b 6d 61 74 63 68 69 6e 66 6f 20 78 20 66 6c 61  {matchinfo x fla
c9f0: 67 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 20 20 46  g}</tcl>.      F
ca00: 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
ca10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
ca20: 61 20 70 68 72 61 73 65 20 61 6e 64 20 74 61 62  a phrase and tab
ca30: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 0a 20  le column, the. 
ca40: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 74       following t
ca50: 68 72 65 65 20 76 61 6c 75 65 73 3a 0a 20 20 20  hree values:.   
ca60: 20 20 20 3c 75 6c 3e 0a 20 20 20 20 20 20 20 20     <ul>.        
ca70: 3c 6c 69 3e 20 49 6e 20 74 68 65 20 63 75 72 72  <li> In the curr
ca80: 65 6e 74 20 72 6f 77 2c 20 74 68 65 20 6e 75 6d  ent row, the num
ca90: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65  ber of times the
caa0: 20 70 68 72 61 73 65 20 61 70 70 65 61 72 73 20   phrase appears 
cab0: 69 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  in .            
cac0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20   the column..   
cad0: 20 20 20 20 20 3c 6c 69 3e 20 54 68 65 20 74 6f       <li> The to
cae0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  tal number of ti
caf0: 6d 65 73 20 74 68 65 20 70 68 72 61 73 65 20 61  mes the phrase a
cb00: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 63 6f  ppears in the co
cb10: 6c 75 6d 6e 20 69 6e 0a 20 20 20 20 20 20 20 20  lumn in.        
cb20: 20 20 20 20 20 61 6c 6c 20 72 6f 77 73 20 69 6e       all rows in
cb30: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a   the FTS table..
cb40: 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 54 68 65          <li> The
cb50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
cb60: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53   rows in the FTS
cb70: 20 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68   table for which
cb80: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
cb90: 20 20 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69     column contai
cba0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
cbb0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
cbc0: 70 68 72 61 73 65 2e 0a 20 20 20 20 20 20 3c 2f  phrase..      </
cbd0: 75 6c 3e 0a 20 20 20 20 20 20 54 68 65 20 66 69  ul>.      The fi
cbe0: 72 73 74 20 73 65 74 20 6f 66 20 74 68 72 65 65  rst set of three
cbf0: 20 76 61 6c 75 65 73 20 63 6f 72 72 65 73 70 6f   values correspo
cc00: 6e 64 73 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  nds to the left-
cc10: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  most column.    
cc20: 20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28    of the table (
cc30: 63 6f 6c 75 6d 6e 20 30 29 20 61 6e 64 20 74 68  column 0) and th
cc40: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6d 61 74 63  e left-most matc
cc50: 68 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e 20  hable phrase in 
cc60: 74 68 65 0a 20 20 20 20 20 20 71 75 65 72 79 20  the.      query 
cc70: 28 70 68 72 61 73 65 20 30 29 2e 20 49 66 20 74  (phrase 0). If t
cc80: 68 65 20 74 61 62 6c 65 20 68 61 73 20 6d 6f 72  he table has mor
cc90: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
cca0: 6e 2c 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  n, the second.  
ccb0: 20 20 20 20 73 65 74 20 6f 66 20 74 68 72 65 65      set of three
ccc0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6f   values in the o
ccd0: 75 74 70 75 74 20 61 72 72 61 79 20 63 6f 72 72  utput array corr
cce0: 65 73 70 6f 6e 64 20 74 6f 20 70 68 72 61 73 65  espond to phrase
ccf0: 20 30 20 61 6e 64 0a 20 20 20 20 20 20 63 6f 6c   0 and.      col
cd00: 75 6d 6e 20 31 2e 20 46 6f 6c 6c 6f 77 65 64 20  umn 1. Followed 
cd10: 62 79 20 70 68 72 61 73 65 20 30 2c 20 63 6f 6c  by phrase 0, col
cd20: 75 6d 6e 20 32 20 61 6e 64 20 73 6f 20 6f 6e 20  umn 2 and so on 
cd30: 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
cd40: 6f 66 0a 20 20 20 20 20 20 74 68 65 20 74 61 62  of.      the tab
cd50: 6c 65 2e 20 41 6e 64 20 73 6f 20 6f 6e 20 66 6f  le. And so on fo
cd60: 72 20 70 68 72 61 73 65 20 31 2c 20 63 6f 6c 75  r phrase 1, colu
cd70: 6d 6e 20 30 2c 20 74 68 65 6e 20 70 68 72 61 73  mn 0, then phras
cd80: 65 20 31 2c 20 63 6f 6c 75 6d 6e 20 31 0a 20 20  e 1, column 1.  
cd90: 20 20 20 20 65 74 63 2e 20 49 6e 20 6f 74 68 65      etc. In othe
cda0: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 64 61 74  r words, the dat
cdb0: 61 20 66 6f 72 20 6f 63 63 75 72 72 65 6e 63 65  a for occurrence
cdc0: 73 20 6f 66 20 70 68 72 61 73 65 20 3c 69 3e 70  s of phrase <i>p
cdd0: 3c 2f 69 3e 20 69 6e 0a 20 20 20 20 20 20 63 6f  </i> in.      co
cde0: 6c 75 6d 6e 20 3c 69 3e 63 3c 2f 69 3e 20 6d 61  lumn <i>c</i> ma
cdf0: 79 20 62 65 20 66 6f 75 6e 64 20 75 73 69 6e 67  y be found using
ce00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
ce10: 6f 72 6d 75 6c 61 3a 0a 3c 70 72 65 3e 0a 20 20  ormula:.<pre>.  
ce20: 20 20 20 20 20 20 20 20 68 69 74 73 5f 74 68 69          hits_thi
ce30: 73 5f 72 6f 77 20 20 3d 20 61 72 72 61 79 26 23  s_row  = array&#
ce40: 39 31 3b 33 20 2a 20 28 63 20 2b 20 70 2a 63 6f  91;3 * (c + p*co
ce50: 6c 73 29 20 2b 20 30 26 23 39 33 3b 0a 20 20 20  ls) + 0&#93;.   
ce60: 20 20 20 20 20 20 20 68 69 74 73 5f 61 6c 6c 5f         hits_all_
ce70: 72 6f 77 73 20 20 3d 20 61 72 72 61 79 26 23 39  rows  = array&#9
ce80: 31 3b 33 20 2a 20 28 63 20 2b 20 70 2a 63 6f 6c  1;3 * (c + p*col
ce90: 73 29 20 2b 20 31 26 23 39 33 3b 0a 20 20 20 20  s) + 1&#93;.    
cea0: 20 20 20 20 20 20 64 6f 63 73 5f 77 69 74 68 5f        docs_with_
ceb0: 68 69 74 73 20 3d 20 61 72 72 61 79 26 23 39 31  hits = array&#91
cec0: 3b 33 20 2a 20 28 63 20 2b 20 70 2a 63 6f 6c 73  ;3 * (c + p*cols
ced0: 29 20 2b 20 32 26 23 39 33 3b 0a 3c 2f 70 72 65  ) + 2&#93;.</pre
cee0: 3e 0a 20 20 3c 74 72 3e 3c 74 64 3e 79 3c 74 64  >.  <tr><td>y<td
cef0: 20 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70   style="white-sp
cf00: 61 63 65 3a 6e 6f 77 72 61 70 22 3e 3c 69 3e 63  ace:nowrap"><i>c
cf10: 6f 6c 73 3c 2f 69 3e 20 2a 20 3c 69 3e 70 68 72  ols</i> * <i>phr
cf20: 61 73 65 73 3c 2f 69 3e 20 0a 20 20 20 20 3c 74  ases</i> .    <t
cf30: 64 3e 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65  d><tcl>hd_fragme
cf40: 6e 74 20 6d 61 74 63 68 69 6e 66 6f 2d 79 20 7b  nt matchinfo-y {
cf50: 6d 61 74 63 68 69 6e 66 6f 20 79 20 66 6c 61 67  matchinfo y flag
cf60: 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 20 20 46 6f  }</tcl>.      Fo
cf70: 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74 20  r each distinct 
cf80: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61  combination of a
cf90: 20 70 68 72 61 73 65 20 61 6e 64 20 74 61 62 6c   phrase and tabl
cfa0: 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 0a 20 20  e column, the.  
cfb0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 75 73      number of us
cfc0: 61 62 6c 65 20 70 68 72 61 73 65 20 6d 61 74 63  able phrase matc
cfd0: 68 65 73 20 74 68 61 74 20 61 70 70 65 61 72 20  hes that appear 
cfe0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 54  in the column. T
cff0: 68 69 73 20 69 73 0a 20 20 20 20 20 20 75 73 75  his is.      usu
d000: 61 6c 6c 79 20 69 64 65 6e 74 69 63 61 6c 20 74  ally identical t
d010: 6f 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 75  o the first valu
d020: 65 20 69 6e 20 65 61 63 68 20 73 65 74 20 6f 66  e in each set of
d030: 20 74 68 72 65 65 20 72 65 74 75 72 6e 65 64 20   three returned 
d040: 62 79 20 74 68 65 0a 20 20 20 20 20 20 5b 6d 61  by the.      [ma
d050: 74 63 68 69 6e 66 6f 20 27 78 27 20 66 6c 61 67  tchinfo 'x' flag
d060: 5d 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  ]. However, the 
d070: 6e 75 6d 62 65 72 20 6f 66 20 68 69 74 73 20 72  number of hits r
d080: 65 70 6f 72 74 65 64 20 62 79 20 74 68 65 0a 20  eported by the. 
d090: 20 20 20 20 20 27 79 27 20 66 6c 61 67 20 69 73       'y' flag is
d0a0: 20 7a 65 72 6f 20 66 6f 72 20 61 6e 79 20 70 68   zero for any ph
d0b0: 72 61 73 65 20 74 68 61 74 20 69 73 20 70 61 72  rase that is par
d0c0: 74 20 6f 66 20 61 20 73 75 62 2d 65 78 70 72 65  t of a sub-expre
d0d0: 73 73 69 6f 6e 0a 20 20 20 20 20 20 74 68 61 74  ssion.      that
d0e0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
d0f0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
d100: 20 54 68 69 73 20 6d 61 6b 65 73 20 61 20 64 69   This makes a di
d110: 66 66 65 72 65 6e 63 65 20 66 6f 72 0a 20 20 20  fference for.   
d120: 20 20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74     expressions t
d130: 68 61 74 20 63 6f 6e 74 61 69 6e 20 41 4e 44 20  hat contain AND 
d140: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 61  operators that a
d150: 72 65 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f  re descendants o
d160: 66 20 4f 52 0a 20 20 20 20 20 20 6f 70 65 72 61  f OR.      opera
d170: 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
d180: 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  e, consider the 
d190: 65 78 70 72 65 73 73 69 6f 6e 3a 20 0a 3c 70 72  expression: .<pr
d1a0: 65 3e 0a 20 20 20 20 20 20 20 20 20 20 61 20 4f  e>.          a O
d1b0: 52 20 28 62 20 41 4e 44 20 63 29 0a 3c 2f 70 72  R (b AND c).</pr
d1c0: 65 3e 0a 20 20 20 20 20 20 61 6e 64 20 74 68 65  e>.      and the
d1d0: 20 64 6f 63 75 6d 65 6e 74 3a 0a 3c 70 72 65 3e   document:.<pre>
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 22 61 20 63 20  .          "a c 
d1f0: 64 22 0a 3c 2f 70 72 65 3e 0a 20 20 20 20 20 20  d".</pre>.      
d200: 54 68 65 20 5b 6d 61 74 63 68 69 6e 66 6f 20 27  The [matchinfo '
d210: 78 27 20 66 6c 61 67 5d 20 77 6f 75 6c 64 20 72  x' flag] would r
d220: 65 70 6f 72 74 20 61 20 73 69 6e 67 6c 65 20 68  eport a single h
d230: 69 74 20 66 6f 72 20 74 68 65 20 70 68 72 61 73  it for the phras
d240: 65 73 20 22 61 22 20 61 6e 64 20 22 63 22 2e 0a  es "a" and "c"..
d250: 20 20 20 20 20 20 48 6f 77 65 76 65 72 2c 20 74        However, t
d260: 68 65 20 27 79 27 20 64 69 72 65 63 74 69 76 65  he 'y' directive
d270: 20 72 65 70 6f 72 74 73 20 74 68 65 20 6e 75 6d   reports the num
d280: 62 65 72 20 6f 66 20 68 69 74 73 20 66 6f 72 20  ber of hits for 
d290: 22 63 22 20 61 73 20 7a 65 72 6f 2c 20 61 73 0a  "c" as zero, as.
d2a0: 20 20 20 20 20 20 69 74 20 69 73 20 70 61 72 74        it is part
d2b0: 20 6f 66 20 61 20 73 75 62 2d 65 78 70 72 65 73   of a sub-expres
d2c0: 73 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 6e  sion that does n
d2d0: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 64 6f 63  ot match the doc
d2e0: 75 6d 65 6e 74 20 2d 20 28 62 20 41 4e 44 20 63  ument - (b AND c
d2f0: 29 2e 0a 20 20 20 20 20 20 46 6f 72 20 71 75 65  )..      For que
d300: 72 69 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ries that do not
d310: 20 63 6f 6e 74 61 69 6e 20 41 4e 44 20 6f 70 65   contain AND ope
d320: 72 61 74 6f 72 73 20 64 65 73 63 65 6e 64 65 64  rators descended
d330: 20 66 72 6f 6d 20 4f 52 0a 20 20 20 20 20 20 6f   from OR.      o
d340: 70 65 72 61 74 6f 72 73 2c 20 74 68 65 20 72 65  perators, the re
d350: 73 75 6c 74 20 76 61 6c 75 65 73 20 72 65 74 75  sult values retu
d360: 72 6e 65 64 20 62 79 20 27 79 27 20 61 72 65 20  rned by 'y' are 
d370: 61 6c 77 61 79 73 20 74 68 65 20 73 61 6d 65 20  always the same 
d380: 61 73 0a 20 20 20 20 20 20 74 68 6f 73 65 20 72  as.      those r
d390: 65 74 75 72 6e 65 64 20 62 79 20 27 78 27 2e 0a  eturned by 'x'..
d3a0: 0a 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67 69  .<p style="margi
d3b0: 6e 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e 2d  n-left:0;margin-
d3c0: 72 69 67 68 74 3a 30 22 3e 0a 20 20 20 20 20 20  right:0">.      
d3d0: 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20  The first value 
d3e0: 69 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  in the array of 
d3f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 63  integer values c
d400: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
d410: 65 0a 20 20 20 20 20 20 6c 65 66 74 6d 6f 73 74  e.      leftmost
d420: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
d430: 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 20 30 29 20  able (column 0) 
d440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 68  and the first ph
d450: 72 61 73 65 20 69 6e 20 74 68 65 20 71 75 65 72  rase in the quer
d460: 79 0a 20 20 20 20 20 20 28 70 68 72 61 73 65 20  y.      (phrase 
d470: 30 29 2e 20 54 68 65 20 76 61 6c 75 65 73 20 63  0). The values c
d480: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
d490: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 2f 70 68 72  other column/phr
d4a0: 61 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ase combinations
d4b0: 0a 20 20 20 20 20 20 6d 61 79 20 62 65 20 6c 6f  .      may be lo
d4c0: 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  cated using the 
d4d0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 75 6c  following formul
d4e0: 61 3a 0a 0a 3c 70 72 65 3e 0a 20 20 20 20 20 20  a:..<pre>.      
d4f0: 20 20 20 20 68 69 74 73 5f 66 6f 72 5f 70 68 72      hits_for_phr
d500: 61 73 65 5f 70 5f 63 6f 6c 75 6d 6e 5f 63 20 20  ase_p_column_c  
d510: 3d 20 61 72 72 61 79 26 23 39 31 3b 63 20 2b 20  = array&#91;c + 
d520: 70 2a 63 6f 6c 73 26 23 39 33 3b 0a 3c 2f 70 72  p*cols&#93;.</pr
d530: 65 3e 0a 20 20 20 20 20 20 46 6f 72 20 71 75 65  e>.      For que
d540: 72 69 65 73 20 74 68 61 74 20 75 73 65 20 4f 52  ries that use OR
d550: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 6f 72   expressions, or
d560: 20 74 68 6f 73 65 20 74 68 61 74 20 75 73 65 20   those that use 
d570: 4c 49 4d 49 54 20 6f 72 20 72 65 74 75 72 6e 0a  LIMIT or return.
d580: 20 20 20 20 20 20 6d 61 6e 79 20 72 6f 77 73 2c        many rows,
d590: 20 74 68 65 20 27 79 27 20 6d 61 74 63 68 69 6e   the 'y' matchin
d5a0: 66 6f 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65  fo option may be
d5b0: 20 66 61 73 74 65 72 20 74 68 61 6e 20 27 78 27   faster than 'x'
d5c0: 2e 0a 0a 3c 74 72 3e 3c 74 64 3e 62 3c 74 64 20  ...<tr><td>b<td 
d5d0: 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61  style="white-spa
d5e0: 63 65 3a 6e 6f 77 72 61 70 22 3e 3c 69 3e 28 28  ce:nowrap"><i>((
d5f0: 63 6f 6c 73 2b 33 31 29 2f 33 32 29 3c 2f 69 3e  cols+31)/32)</i>
d600: 20 2a 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69   * <i>phrases</i
d610: 3e 20 0a 3c 74 64 3e 3c 74 63 6c 3e 68 64 5f 66  > .<td><tcl>hd_f
d620: 72 61 67 6d 65 6e 74 20 6d 61 74 63 68 69 6e 66  ragment matchinf
d630: 6f 2d 62 20 7b 6d 61 74 63 68 69 6e 66 6f 20 62  o-b {matchinfo b
d640: 20 66 6c 61 67 7d 3c 2f 74 63 6c 3e 0a 0a 20 20   flag}</tcl>..  
d650: 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 27 62  The matchinfo 'b
d660: 27 20 66 6c 61 67 20 70 72 6f 76 69 64 65 73 20  ' flag provides 
d670: 73 69 6d 69 6c 61 72 20 69 6e 66 6f 72 6d 61 74  similar informat
d680: 69 6f 6e 20 74 6f 20 74 68 65 0a 20 20 5b 6d 61  ion to the.  [ma
d690: 74 63 68 69 6e 66 6f 20 27 79 27 20 66 6c 61 67  tchinfo 'y' flag
d6a0: 5d 2c 20 62 75 74 20 69 6e 20 61 20 6d 6f 72 65  ], but in a more
d6b0: 0a 20 20 63 6f 6d 70 61 63 74 20 66 6f 72 6d 2e  .  compact form.
d6c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
d6d0: 70 72 65 63 69 73 65 20 6e 75 6d 62 65 72 20 6f  precise number o
d6e0: 66 20 68 69 74 73 2c 20 27 62 27 20 70 72 6f 76  f hits, 'b' prov
d6f0: 69 64 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  ides a single.  
d700: 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 20 66 6f 72  boolean flag for
d710: 20 65 61 63 68 20 70 68 72 61 73 65 2f 63 6f 6c   each phrase/col
d720: 75 6d 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  umn combination.
d730: 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20 69   If the phrase i
d740: 73 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 74  s present in.  t
d750: 68 65 20 63 6f 6c 75 6d 6e 20 61 74 20 6c 65 61  he column at lea
d760: 73 74 20 6f 6e 63 65 20 28 69 2e 65 2e 20 69 66  st once (i.e. if
d770: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d780: 6e 67 20 69 6e 74 65 67 65 72 20 6f 75 74 70 75  ng integer outpu
d790: 74 20 6f 66 20 27 79 27 20 77 6f 75 6c 64 0a 20  t of 'y' would. 
d7a0: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 29 2c 20 74   be non-zero), t
d7b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d7c0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 4f 74   flag is set. Ot
d7d0: 68 65 72 77 69 73 65 20 63 6c 65 61 72 65 64 2e  herwise cleared.
d7e0: 0a 0a 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67  ..<p style="marg
d7f0: 69 6e 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e  in-left:0;margin
d800: 2d 72 69 67 68 74 3a 30 22 3e 0a 20 20 49 66 20  -right:0">.  If 
d810: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 33 32  the table has 32
d820: 20 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e   or fewer column
d830: 73 2c 20 61 20 73 69 6e 67 6c 65 20 75 6e 73 69  s, a single unsi
d840: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 69 73 20  gned integer is 
d850: 6f 75 74 70 75 74 20 66 6f 72 0a 20 20 65 61 63  output for.  eac
d860: 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  h phrase in the 
d870: 71 75 65 72 79 2e 20 54 68 65 20 6c 65 61 73 74  query. The least
d880: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
d890: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
d8a0: 69 73 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  is set if the.  
d8b0: 70 68 72 61 73 65 20 61 70 70 65 61 72 73 20 61  phrase appears a
d8c0: 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 69 6e 20  t least once in 
d8d0: 63 6f 6c 75 6d 6e 20 30 2e 20 54 68 65 20 73 65  column 0. The se
d8e0: 63 6f 6e 64 20 6c 65 61 73 74 20 73 69 67 6e 69  cond least signi
d8f0: 66 69 63 61 6e 74 20 62 69 74 20 69 73 0a 20 20  ficant bit is.  
d900: 73 65 74 20 69 66 20 74 68 65 20 70 68 72 61 73  set if the phras
d910: 65 20 61 70 70 65 61 72 73 20 6f 6e 63 65 20 6f  e appears once o
d920: 72 20 6d 6f 72 65 20 69 6e 20 63 6f 6c 75 6d 6e  r more in column
d930: 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 0a   1. And so on...
d940: 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e  <p style="margin
d950: 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e 2d 72  -left:0;margin-r
d960: 69 67 68 74 3a 30 22 3e 0a 20 20 49 66 20 74 68  ight:0">.  If th
d970: 65 20 74 61 62 6c 65 20 68 61 73 20 6d 6f 72 65  e table has more
d980: 20 74 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73   than 32 columns
d990: 2c 20 61 6e 20 65 78 74 72 61 20 69 6e 74 65 67  , an extra integ
d9a0: 65 72 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  er is added to t
d9b0: 68 65 20 6f 75 74 70 75 74 0a 20 20 6f 66 20 65  he output.  of e
d9c0: 61 63 68 20 70 68 72 61 73 65 20 66 6f 72 20 65  ach phrase for e
d9d0: 61 63 68 20 65 78 74 72 61 20 33 32 20 63 6f 6c  ach extra 32 col
d9e0: 75 6d 6e 73 20 6f 72 20 70 61 72 74 20 74 68 65  umns or part the
d9f0: 72 65 6f 66 2e 20 49 6e 74 65 67 65 72 73 0a 20  reof. Integers. 
da00: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
da10: 6f 20 74 68 65 20 73 61 6d 65 20 70 68 72 61 73  o the same phras
da20: 65 20 61 72 65 20 63 6c 75 6d 70 65 64 20 74 6f  e are clumped to
da30: 67 65 74 68 65 72 2e 20 46 6f 72 20 65 78 61 6d  gether. For exam
da40: 70 6c 65 2c 20 69 66 20 61 20 74 61 62 6c 65 0a  ple, if a table.
da50: 20 20 77 69 74 68 20 34 35 20 63 6f 6c 75 6d 6e    with 45 column
da60: 73 20 69 73 20 71 75 65 72 69 65 64 20 66 6f 72  s is queried for
da70: 20 74 77 6f 20 70 68 72 61 73 65 73 2c 20 34 20   two phrases, 4 
da80: 69 6e 74 65 67 65 72 73 20 61 72 65 20 6f 75 74  integers are out
da90: 70 75 74 2e 20 54 68 65 20 66 69 72 73 74 0a 20  put. The first. 
daa0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
dab0: 70 68 72 61 73 65 20 30 20 61 6e 64 20 63 6f 6c  phrase 0 and col
dac0: 75 6d 6e 73 20 30 2d 33 31 20 6f 66 20 74 68 65  umns 0-31 of the
dad0: 20 74 61 62 6c 65 2e 20 54 68 65 20 73 65 63 6f   table. The seco
dae0: 6e 64 20 69 6e 74 65 67 65 72 0a 20 20 63 6f 6e  nd integer.  con
daf0: 74 61 69 6e 73 20 64 61 74 61 20 66 6f 72 20 70  tains data for p
db00: 68 72 61 73 65 20 30 20 61 6e 64 20 63 6f 6c 75  hrase 0 and colu
db10: 6d 6e 73 20 33 32 2d 34 34 2c 20 61 6e 64 20 73  mns 32-44, and s
db20: 6f 20 6f 6e 2e 0a 0a 3c 70 20 73 74 79 6c 65 3d  o on...<p style=
db30: 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 30 3b 6d  "margin-left:0;m
db40: 61 72 67 69 6e 2d 72 69 67 68 74 3a 30 22 3e 0a  argin-right:0">.
db50: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
db60: 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  f nCol is the nu
db70: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
db80: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 74 6f  in the table, to
db90: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20   determine if.  
dba0: 70 68 72 61 73 65 20 70 20 69 73 20 70 72 65 73  phrase p is pres
dbb0: 65 6e 74 20 69 6e 20 63 6f 6c 75 6d 6e 20 63 3a  ent in column c:
dbc0: 0a 0a 3c 70 72 65 3e 0a 20 20 20 20 70 5f 69 73  ..<pre>.    p_is
dbd0: 5f 69 6e 5f 63 20 3d 20 61 72 72 61 79 26 23 39  _in_c = array&#9
dbe0: 31 3b 70 20 2a 20 28 28 6e 43 6f 6c 2b 33 31 29  1;p * ((nCol+31)
dbf0: 2f 33 32 29 26 23 39 33 3b 20 26 20 28 31 20 26  /32)&#93; & (1 &
dc00: 6c 74 3b 26 6c 74 3b 20 28 63 20 25 20 33 32 29  lt;&lt; (c % 32)
dc10: 29 0a 3c 2f 70 72 65 3e 0a 0a 20 20 3c 74 72 3e  ).</pre>..  <tr>
dc20: 3c 74 64 3e 6e 20 3c 74 64 3e 31 20 3c 74 64 3e  <td>n <td>1 <td>
dc30: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
dc40: 77 73 20 69 6e 20 74 68 65 20 46 54 53 34 20 74  ws in the FTS4 t
dc50: 61 62 6c 65 2e 20 54 68 69 73 20 76 61 6c 75 65  able. This value
dc60: 20 69 73 0a 20 20 20 20 6f 6e 6c 79 20 61 76 61   is.    only ava
dc70: 69 6c 61 62 6c 65 20 77 68 65 6e 20 71 75 65 72  ilable when quer
dc80: 79 69 6e 67 20 46 54 53 34 20 74 61 62 6c 65 73  ying FTS4 tables
dc90: 2c 20 6e 6f 74 20 46 54 53 33 2e 0a 20 20 3c 74  , not FTS3..  <t
dca0: 72 3e 3c 74 64 3e 61 20 3c 74 64 3e 3c 69 3e 63  r><td>a <td><i>c
dcb0: 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20  ols</i> <td>For 
dcc0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  each column, the
dcd0: 20 61 76 65 72 61 67 65 20 6e 75 6d 62 65 72 20   average number 
dce0: 6f 66 0a 20 20 20 20 74 6f 6b 65 6e 73 20 69 6e  of.    tokens in
dcf0: 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 73   the text values
dd00: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
dd10: 6f 6c 75 6d 6e 20 28 63 6f 6e 73 69 64 65 72 69  olumn (consideri
dd20: 6e 67 20 61 6c 6c 20 72 6f 77 73 20 69 6e 0a 20  ng all rows in. 
dd30: 20 20 20 74 68 65 20 46 54 53 34 20 74 61 62 6c     the FTS4 tabl
dd40: 65 29 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  e). This value i
dd50: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
dd60: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 46   when querying F
dd70: 54 53 34 20 74 61 62 6c 65 73 2c 0a 20 20 20 20  TS4 tables,.    
dd80: 6e 6f 74 20 46 54 53 33 2e 20 20 0a 20 20 3c 74  not FTS3.  .  <t
dd90: 72 3e 3c 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e 63  r><td>l <td><i>c
dda0: 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20 20  ols</i> <td>.   
ddb0: 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   For each column
ddc0: 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  , the length of 
ddd0: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
dde0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
ddf0: 72 6f 77 20 6f 66 20 74 68 65 0a 20 20 20 20 46  row of the.    F
de00: 54 53 34 20 74 61 62 6c 65 2c 20 69 6e 20 74 6f  TS4 table, in to
de10: 6b 65 6e 73 2e 20 20 54 68 69 73 20 76 61 6c 75  kens.  This valu
de20: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
de30: 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e  ble when queryin
de40: 67 0a 20 20 20 20 46 54 53 34 20 74 61 62 6c 65  g.    FTS4 table
de50: 73 2c 20 6e 6f 74 20 46 54 53 33 2e 20 41 6e 64  s, not FTS3. And
de60: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 22 6d 61   only if the "ma
de70: 74 63 68 69 6e 66 6f 3d 66 74 73 33 22 20 64 69  tchinfo=fts3" di
de80: 72 65 63 74 69 76 65 20 77 61 73 20 6e 6f 74 0a  rective was not.
de90: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
dea0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 43 52   part of the "CR
deb0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
dec0: 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20 75 73  LE" statement us
ded0: 65 64 20 74 6f 20 63 72 65 61 74 65 0a 20 20 20  ed to create.   
dee0: 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e   the FTS4 table.
def0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 73 20 3c 74 64  .  <tr><td>s <td
df00: 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64  ><i>cols</i> <td
df10: 3e 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e  >For each column
df20: 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  , the length of 
df30: 74 68 65 20 6c 6f 6e 67 65 73 74 20 0a 20 20 20  the longest .   
df40: 20 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20   subsequence of 
df50: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74  phrase matches t
df60: 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  hat the column v
df70: 61 6c 75 65 20 68 61 73 20 69 6e 20 63 6f 6d 6d  alue has in comm
df80: 6f 6e 0a 20 20 20 20 77 69 74 68 20 74 68 65 20  on.    with the 
df90: 71 75 65 72 79 20 74 65 78 74 2e 20 46 6f 72 20  query text. For 
dfa0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 74 61  example, if a ta
dfb0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  ble column conta
dfc0: 69 6e 73 20 74 68 65 20 74 65 78 74 0a 20 20 20  ins the text.   
dfd0: 20 27 61 20 62 20 63 20 64 20 65 27 20 61 6e 64   'a b c d e' and
dfe0: 20 74 68 65 20 71 75 65 72 79 20 69 73 20 27 61   the query is 'a
dff0: 20 63 20 22 64 20 65 22 27 2c 20 74 68 65 6e 20   c "d e"', then 
e000: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
e010: 65 20 6c 6f 6e 67 65 73 74 0a 20 20 20 20 63 6f  e longest.    co
e020: 6d 6d 6f 6e 20 73 75 62 73 65 71 75 65 6e 63 65  mmon subsequence
e030: 20 69 73 20 32 20 28 70 68 72 61 73 65 20 22 63   is 2 (phrase "c
e040: 22 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68  " followed by ph
e050: 72 61 73 65 20 22 64 20 65 22 29 2e 0a 20 20 20  rase "d e")..   
e060: 20 0a 20 20 20 20 0a 3c 2f 74 61 62 6c 65 3e 0a   .    .</table>.
e070: 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70  .<p>.  For examp
e080: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
e090: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
e0a0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
e0b0: 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20  FTS4 table with 
e0c0: 74 77 6f 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e  two columns:</i>
e0d0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
e0e0: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
e0f0: 20 66 74 73 34 28 61 2c 20 62 29 3b 0a 20 20 49   fts4(a, b);.  I
e100: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e110: 4c 55 45 53 28 27 74 72 61 6e 73 61 63 74 69 6f  LUES('transactio
e120: 6e 20 64 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73  n default models
e130: 20 64 65 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20   default', 'Non 
e140: 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 61 64  transaction read
e150: 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  s');.  INSERT IN
e160: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 68  TO t1 VALUES('th
e170: 65 20 64 65 66 61 75 6c 74 20 74 72 61 6e 73 61  e default transa
e180: 63 74 69 6f 6e 27 2c 20 27 74 68 65 73 65 20 73  ction', 'these s
e190: 65 6d 61 6e 74 69 63 73 20 70 72 65 73 65 6e 74  emantics present
e1a0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
e1b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 73 69 6e  O t1 VALUES('sin
e1c0: 67 6c 65 20 72 65 71 75 65 73 74 27 2c 20 27 64  gle request', 'd
e1d0: 65 66 61 75 6c 74 20 64 61 74 61 27 29 3b 0a 0a  efault data');..
e1e0: 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 65 20 66    <i>-- In the f
e1f0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 2c 20  ollowing query, 
e200: 6e 6f 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  no format string
e210: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 6e   is specified an
e220: 64 20 73 6f 20 69 74 20 64 65 66 61 75 6c 74 73  d so it defaults
e230: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20  </i>.  <i>-- to 
e240: 22 70 63 78 22 2e 20 49 74 20 74 68 65 72 65 66  "pcx". It theref
e250: 6f 72 65 20 72 65 74 75 72 6e 73 20 61 20 73 69  ore returns a si
e260: 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 73 69 73 74  ngle row consist
e270: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
e280: 62 6c 6f 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  blob</i>.  <i>--
e290: 20 76 61 6c 75 65 20 38 30 20 62 79 74 65 73 20   value 80 bytes 
e2a0: 69 6e 20 73 69 7a 65 20 28 32 30 20 33 32 2d 62  in size (20 32-b
e2b0: 69 74 20 69 6e 74 65 67 65 72 73 20 2d 20 31 20  it integers - 1 
e2c0: 66 6f 72 20 22 70 22 2c 20 31 20 66 6f 72 20 22  for "p", 1 for "
e2d0: 63 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e  c" and</i>.  <i>
e2e0: 2d 2d 20 33 2a 32 2a 33 20 66 6f 72 20 22 78 22  -- 3*2*3 for "x"
e2f0: 29 2e 20 49 66 20 65 61 63 68 20 62 6c 6f 63 6b  ). If each block
e300: 20 6f 66 20 34 20 62 79 74 65 73 20 69 6e 3c 2f   of 4 bytes in</
e310: 69 3e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 69  i> the blob is i
e320: 6e 74 65 72 70 72 65 74 65 64 3c 2f 69 3e 20 0a  nterpreted</i> .
e330: 20 20 3c 69 3e 2d 2d 20 61 73 20 61 6e 20 75 6e    <i>-- as an un
e340: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 69  signed integer i
e350: 6e 20 6d 61 63 68 69 6e 65 20 62 79 74 65 2d 6f  n machine byte-o
e360: 72 64 65 72 2c 20 74 68 65 20 76 61 6c 75 65 73  rder, the values
e370: 20 77 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20   will be:</i>.  
e380: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
e390: 2d 20 20 20 20 20 33 20 32 20 20 31 20 33 20 32  -     3 2  1 3 2
e3a0: 20 20 30 20 31 20 31 20 20 31 20 32 20 32 20 20    0 1 1  1 2 2  
e3b0: 30 20 31 20 31 20 20 30 20 30 20 30 20 20 31 20  0 1 1  0 0 0  1 
e3c0: 31 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  1 1</i>.  <i>--<
e3d0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  /i>.  <i>-- The 
e3e0: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 63 6f 72  row returned cor
e3f0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
e400: 73 65 63 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73  second entry ins
e410: 65 72 74 65 64 20 69 6e 74 6f 20 74 61 62 6c 65  erted into table
e420: 20 74 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   t1.</i>.  <i>--
e430: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 69   The first two i
e440: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 62  ntegers in the b
e450: 6c 6f 62 20 73 68 6f 77 20 74 68 61 74 20 74 68  lob show that th
e460: 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 65  e query containe
e470: 64 20 74 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69  d three</i>.  <i
e480: 3e 2d 2d 20 70 68 72 61 73 65 73 20 61 6e 64 20  >-- phrases and 
e490: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
e4a0: 71 75 65 72 69 65 64 20 68 61 73 20 74 77 6f 20  queried has two 
e4b0: 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78  columns. The nex
e4c0: 74 20 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20  t block of</i>. 
e4d0: 20 3c 69 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74   <i>-- three int
e4e0: 65 67 65 72 73 20 64 65 73 63 72 69 62 65 73 20  egers describes 
e4f0: 63 6f 6c 75 6d 6e 20 30 20 28 69 6e 20 74 68 69  column 0 (in thi
e500: 73 20 63 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61  s case column "a
e510: 22 29 20 61 6e 64 20 70 68 72 61 73 65 3c 2f 69  ") and phrase</i
e520: 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20  >.  <i>-- 0 (in 
e530: 74 68 69 73 20 63 61 73 65 20 22 64 65 66 61 75  this case "defau
e540: 6c 74 22 29 2e 20 54 68 65 20 63 75 72 72 65 6e  lt"). The curren
e550: 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31  t row contains 1
e560: 20 68 69 74 20 66 6f 72 20 22 64 65 66 61 75 6c   hit for "defaul
e570: 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69  t"</i>.  <i>-- i
e580: 6e 20 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61  n column 0, of a
e590: 20 74 6f 74 61 6c 20 6f 66 20 33 20 68 69 74 73   total of 3 hits
e5a0: 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22 20 74   for "default" t
e5b0: 68 61 74 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c  hat occur in col
e5c0: 75 6d 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  umn</i>.  <i>-- 
e5d0: 30 20 6f 66 20 61 6e 79 20 74 61 62 6c 65 20 72  0 of any table r
e5e0: 6f 77 2e 20 54 68 65 20 33 20 68 69 74 73 20 61  ow. The 3 hits a
e5f0: 72 65 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  re spread across
e600: 20 32 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   2 different row
e610: 73 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  s.</i>.  <i>--</
e620: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e  i>.  <i>-- The n
e630: 65 78 74 20 73 65 74 20 6f 66 20 74 68 72 65 65  ext set of three
e640: 20 69 6e 74 65 67 65 72 73 20 28 30 20 31 20 31   integers (0 1 1
e650: 29 20 70 65 72 74 61 69 6e 20 74 6f 20 74 68 65  ) pertain to the
e660: 20 68 69 74 73 20 66 6f 72 20 22 64 65 66 61 75   hits for "defau
e670: 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  lt"</i>.  <i>-- 
e680: 69 6e 20 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74  in column 1 of t
e690: 68 65 20 74 61 62 6c 65 20 28 30 20 69 6e 20 74  he table (0 in t
e6a0: 68 69 73 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c  his row, 1 in al
e6b0: 6c 20 72 6f 77 73 2c 20 73 70 72 65 61 64 20 61  l rows, spread a
e6c0: 63 72 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e  cross </i>.  <i>
e6d0: 2d 2d 20 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a  -- 1 rows).</i>.
e6e0: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45    <i>--</i>.  SE
e6f0: 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74  LECT matchinfo(t
e700: 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  1) FROM t1 WHERE
e710: 20 74 31 20 4d 41 54 43 48 20 27 64 65 66 61 75   t1 MATCH 'defau
e720: 6c 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22  lt transaction "
e730: 74 68 65 73 65 20 73 65 6d 61 6e 74 69 63 73 22  these semantics"
e740: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
e750: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f  format string fo
e760: 72 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  r this query is 
e770: 22 6e 73 22 2e 20 54 68 65 20 6f 75 74 70 75 74  "ns". The output
e780: 20 61 72 72 61 79 20 77 69 6c 6c 20 74 68 65 72   array will ther
e790: 65 66 6f 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  efore</i>.  <i>-
e7a0: 2d 20 63 6f 6e 74 61 69 6e 20 33 20 69 6e 74 65  - contain 3 inte
e7b0: 67 65 72 20 76 61 6c 75 65 73 20 2d 20 31 20 66  ger values - 1 f
e7c0: 6f 72 20 22 6e 22 20 61 6e 64 20 32 20 66 6f 72  or "n" and 2 for
e7d0: 20 22 73 22 2e 20 54 68 65 20 71 75 65 72 79 20   "s". The query 
e7e0: 72 65 74 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c 69  returns</i>.  <i
e7f0: 3e 2d 2d 20 74 77 6f 20 72 6f 77 73 20 28 74 68  >-- two rows (th
e800: 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73  e first two rows
e810: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6d 61   in the table ma
e820: 74 63 68 29 2e 20 54 68 65 20 76 61 6c 75 65 73  tch). The values
e830: 20 72 65 74 75 72 6e 65 64 20 61 72 65 3a 3c 2f   returned are:</
e840: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
e850: 20 3c 69 3e 2d 2d 20 20 20 20 20 33 20 20 31 20   <i>--     3  1 
e860: 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  1</i>.  <i>--   
e870: 20 20 33 20 20 32 20 30 3c 2f 69 3e 0a 20 20 3c    3  2 0</i>.  <
e880: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
e890: 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
e8a0: 20 69 6e 20 74 68 65 20 6d 61 74 63 68 69 6e 66   in the matchinf
e8b0: 6f 20 61 72 72 61 79 20 72 65 74 75 72 6e 65 64  o array returned
e8c0: 20 66 6f 72 20 62 6f 74 68 20 72 6f 77 73 20 69   for both rows i
e8d0: 73 20 33 20 28 74 68 65 20 3c 2f 69 3e 0a 20 20  s 3 (the </i>.  
e8e0: 3c 69 3e 2d 2d 20 6e 75 6d 62 65 72 20 6f 66 20  <i>-- number of 
e8f0: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
e900: 65 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e). The followin
e910: 67 20 74 77 6f 20 76 61 6c 75 65 73 20 61 72 65  g two values are
e920: 20 74 68 65 20 6c 65 6e 67 74 68 73 20 3c 2f 69   the lengths </i
e930: 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65  >.  <i>-- of the
e940: 20 6c 6f 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e 20   longest common 
e950: 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70  subsequence of p
e960: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 69 6e  hrase matches in
e970: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f 69   each column.</i
e980: 3e 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68  >.  SELECT match
e990: 69 6e 66 6f 28 74 31 2c 20 27 6e 73 27 29 20 46  info(t1, 'ns') F
e9a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
e9b0: 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74 20 74  MATCH 'default t
e9c0: 72 61 6e 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f 63  ransaction';.</c
e9d0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
e9e0: 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   The matchinfo f
e9f0: 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20  unction is much 
ea00: 66 61 73 74 65 72 20 74 68 61 6e 20 65 69 74 68  faster than eith
ea10: 65 72 20 74 68 65 20 73 6e 69 70 70 65 74 20 6f  er the snippet o
ea20: 72 20 6f 66 66 73 65 74 73 0a 20 20 66 75 6e 63  r offsets.  func
ea30: 74 69 6f 6e 73 2e 20 54 68 69 73 20 69 73 20 62  tions. This is b
ea40: 65 63 61 75 73 65 20 74 68 65 20 69 6d 70 6c 65  ecause the imple
ea50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74  mentation of bot
ea60: 68 20 73 6e 69 70 70 65 74 20 61 6e 64 20 6f 66  h snippet and of
ea70: 66 73 65 74 73 0a 20 20 69 73 20 72 65 71 75 69  fsets.  is requi
ea80: 72 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  red to retrieve 
ea90: 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 62 65  the documents be
eaa0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f  ing analyzed fro
eab0: 6d 20 64 69 73 6b 2c 20 77 68 65 72 65 61 73 0a  m disk, whereas.
eac0: 20 20 61 6c 6c 20 64 61 74 61 20 72 65 71 75 69    all data requi
ead0: 72 65 64 20 62 79 20 6d 61 74 63 68 69 6e 66 6f  red by matchinfo
eae0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 73   is available as
eaf0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d   part of the sam
eb00: 65 20 70 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20  e portions.  of 
eb10: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
eb20: 64 65 78 20 74 68 61 74 20 61 72 65 20 72 65 71  dex that are req
eb30: 75 69 72 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  uired to impleme
eb40: 6e 74 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  nt the full-text
eb50: 20 71 75 65 72 79 0a 20 20 69 74 73 65 6c 66 2e   query.  itself.
eb60: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
eb70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
eb80: 67 20 74 77 6f 20 71 75 65 72 69 65 73 2c 20 74  g two queries, t
eb90: 68 65 20 66 69 72 73 74 20 6d 61 79 20 62 65 0a  he first may be.
eba0: 20 20 61 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61    an order of ma
ebb0: 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 20 74  gnitude faster t
ebc0: 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a  han the second:.
ebd0: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53  .<codeblock>.  S
ebe0: 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6d 61 74  ELECT docid, mat
ebf0: 63 68 69 6e 66 6f 28 74 62 6c 29 20 46 52 4f 4d  chinfo(tbl) FROM
ec00: 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d   tbl WHERE tbl M
ec10: 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65  ATCH &lt;query e
ec20: 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20  xpression&gt;;. 
ec30: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6f   SELECT docid, o
ec40: 66 66 73 65 74 73 28 74 62 6c 29 20 46 52 4f 4d  ffsets(tbl) FROM
ec50: 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d   tbl WHERE tbl M
ec60: 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65  ATCH &lt;query e
ec70: 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c  xpression&gt;;.<
ec80: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
ec90: 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
eca0: 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64   function provid
ecb0: 65 73 20 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72  es all the infor
ecc0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
ecd0: 74 6f 20 63 61 6c 63 75 6c 61 74 65 0a 20 20 70  to calculate.  p
ece0: 72 6f 62 61 62 69 6c 69 73 74 69 63 20 22 62 61  robabilistic "ba
ecf0: 67 2d 6f 66 2d 77 6f 72 64 73 22 20 72 65 6c 65  g-of-words" rele
ed00: 76 61 6e 63 79 20 73 63 6f 72 65 73 20 73 75 63  vancy scores suc
ed10: 68 20 61 73 20 0a 20 20 3c 61 20 68 72 65 66 3d  h as .  <a href=
ed20: 68 74 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65  http://en.wikipe
ed30: 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61  dia.org/wiki/Oka
ed40: 70 69 5f 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d  pi_BM25>Okapi BM
ed50: 32 35 2f 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61  25/BM25F</a> tha
ed60: 74 20 6d 61 79 0a 20 20 62 65 20 75 73 65 64 20  t may.  be used 
ed70: 74 6f 20 6f 72 64 65 72 20 72 65 73 75 6c 74 73  to order results
ed80: 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   in a full-text 
ed90: 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69  search applicati
eda0: 6f 6e 2e 20 41 70 70 65 6e 64 69 78 20 41 20 6f  on. Appendix A o
edb0: 66 20 74 68 69 73 20 0a 20 20 64 6f 63 75 6d 65  f this .  docume
edc0: 6e 74 2c 20 22 5b 73 65 61 72 63 68 20 61 70 70  nt, "[search app
edd0: 6c 69 63 61 74 69 6f 6e 20 74 69 70 73 5d 22 2c  lication tips]",
ede0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61   contains an exa
edf0: 6d 70 6c 65 20 6f 66 20 75 73 69 6e 67 20 74 68  mple of using th
ee00: 65 0a 20 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  e.  matchinfo() 
ee10: 66 75 6e 63 74 69 6f 6e 20 65 66 66 69 63 69 65  function efficie
ee20: 6e 74 6c 79 2e 0a 0a 3c 68 31 20 69 64 3d 66 74  ntly...<h1 id=ft
ee30: 73 34 61 75 78 20 74 61 67 73 3d 22 66 74 73 34  s4aux tags="fts4
ee40: 61 75 78 22 3e 46 74 73 34 61 75 78 20 2d 20 44  aux">Fts4aux - D
ee50: 69 72 65 63 74 20 41 63 63 65 73 73 20 74 6f 20  irect Access to 
ee60: 74 68 65 20 46 75 6c 6c 2d 54 65 78 74 20 49 6e  the Full-Text In
ee70: 64 65 78 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  dex</h1>..<p>.  
ee80: 41 73 20 6f 66 20 5b 76 65 72 73 69 6f 6e 20 33  As of [version 3
ee90: 2e 37 2e 36 5d 20 28 5b 64 61 74 65 6f 66 3a 33  .7.6] ([dateof:3
eea0: 2e 37 2e 36 5d 29 2c 20 0a 20 20 53 51 4c 69 74  .7.6]), .  SQLit
eeb0: 65 20 69 6e 63 6c 75 64 65 73 20 61 20 6e 65 77  e includes a new
eec0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
eed0: 6f 64 75 6c 65 20 63 61 6c 6c 65 64 20 0a 20 20  odule called .  
eee0: 22 66 74 73 34 61 75 78 22 2c 20 77 68 69 63 68  "fts4aux", which
eef0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
ef00: 69 6e 73 70 65 63 74 20 74 68 65 20 66 75 6c 6c  inspect the full
ef10: 2d 74 65 78 74 20 69 6e 64 65 78 20 6f 66 20 61  -text index of a
ef20: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 46 54 53  n existing.  FTS
ef30: 20 74 61 62 6c 65 20 64 69 72 65 63 74 6c 79 2e   table directly.
ef40: 20 44 65 73 70 69 74 65 20 69 74 73 20 6e 61 6d   Despite its nam
ef50: 65 2c 20 66 74 73 34 61 75 78 20 77 6f 72 6b 73  e, fts4aux works
ef60: 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 77 69   just as well wi
ef70: 74 68 20 46 54 53 33 0a 20 20 74 61 62 6c 65 73  th FTS3.  tables
ef80: 20 61 73 20 69 74 20 64 6f 65 73 20 77 69 74 68   as it does with
ef90: 20 46 54 53 34 20 74 61 62 6c 65 73 2e 20 46 74   FTS4 tables. Ft
efa0: 73 34 61 75 78 20 74 61 62 6c 65 73 20 61 72 65  s4aux tables are
efb0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 54 68 65 20   read-only. The 
efc0: 6f 6e 6c 79 0a 20 20 77 61 79 20 74 6f 20 6d 6f  only.  way to mo
efd0: 64 69 66 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  dify the content
efe0: 73 20 6f 66 20 61 6e 20 66 74 73 34 61 75 78 20  s of an fts4aux 
eff0: 74 61 62 6c 65 20 69 73 20 62 79 20 6d 6f 64 69  table is by modi
f000: 66 79 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e 74  fying the.  cont
f010: 65 6e 74 73 20 6f 66 20 74 68 65 20 61 73 73 6f  ents of the asso
f020: 63 69 61 74 65 64 20 46 54 53 20 74 61 62 6c 65  ciated FTS table
f030: 2e 20 54 68 65 20 66 74 73 34 61 75 78 20 6d 6f  . The fts4aux mo
f040: 64 75 6c 65 20 69 73 20 61 75 74 6f 6d 61 74 69  dule is automati
f050: 63 61 6c 6c 79 0a 20 20 69 6e 63 6c 75 64 65 64  cally.  included
f060: 20 69 6e 20 61 6c 6c 20 5b 63 6f 6d 70 69 6c 65   in all [compile
f070: 20 66 74 73 7c 62 75 69 6c 64 73 20 74 68 61 74   fts|builds that
f080: 20 69 6e 63 6c 75 64 65 20 46 54 53 5d 2e 0a 0a   include FTS]...
f090: 3c 70 3e 0a 20 20 41 6e 20 66 74 73 34 61 75 78  <p>.  An fts4aux
f0a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
f0b0: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 77 69  s constructed wi
f0c0: 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72  th one or two ar
f0d0: 67 75 6d 65 6e 74 73 2e 20 20 57 68 65 6e 0a 20  guments.  When. 
f0e0: 20 75 73 65 64 20 77 69 74 68 20 61 20 73 69 6e   used with a sin
f0f0: 67 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  gle argument, th
f100: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  at argument is t
f110: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  he unqualified n
f120: 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 46 54 53  ame of the.  FTS
f130: 20 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 77   table that it w
f140: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 61  ill be used to a
f150: 63 63 65 73 73 2e 20 20 54 6f 20 61 63 63 65 73  ccess.  To acces
f160: 73 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20 64  s a table in a d
f170: 69 66 66 65 72 65 6e 74 0a 20 20 64 61 74 61 62  ifferent.  datab
f180: 61 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ase (for example
f190: 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 54 45  , to create a TE
f1a0: 4d 50 20 66 74 73 34 61 75 78 20 74 61 62 6c 65  MP fts4aux table
f1b0: 20 74 68 61 74 20 77 69 6c 6c 20 61 63 63 65 73   that will acces
f1c0: 73 20 61 6e 0a 20 20 46 54 53 33 20 74 61 62 6c  s an.  FTS3 tabl
f1d0: 65 20 69 6e 20 74 68 65 20 4d 41 49 4e 20 64 61  e in the MAIN da
f1e0: 74 61 62 61 73 65 29 20 75 73 65 20 74 68 65 20  tabase) use the 
f1f0: 74 77 6f 2d 61 72 67 75 6d 65 6e 74 20 66 6f 72  two-argument for
f200: 6d 20 61 6e 64 20 67 69 76 65 20 74 68 65 0a 20  m and give the. 
f210: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 72   name of the tar
f220: 67 65 74 20 64 61 74 61 62 61 73 65 20 28 65 78  get database (ex
f230: 3a 20 22 6d 61 69 6e 22 29 20 69 6e 20 74 68 65  : "main") in the
f240: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
f250: 61 6e 64 20 74 68 65 20 6e 61 6d 65 0a 20 20 6f  and the name.  o
f260: 66 20 74 68 65 20 46 54 53 33 2f 34 20 74 61 62  f the FTS3/4 tab
f270: 6c 65 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  le as the second
f280: 20 61 72 67 75 6d 65 6e 74 2e 20 20 28 54 68 65   argument.  (The
f290: 20 74 77 6f 2d 61 72 67 75 6d 65 6e 74 20 66 6f   two-argument fo
f2a0: 72 6d 20 6f 66 20 0a 20 20 66 74 73 34 61 75 78  rm of .  fts4aux
f2b0: 20 77 61 73 20 61 64 64 65 64 20 66 6f 72 20 53   was added for S
f2c0: 51 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33  QLite [version 3
f2d0: 2e 37 2e 31 37 5d 20 28 5b 64 61 74 65 6f 66 3a  .7.17] ([dateof:
f2e0: 33 2e 37 2e 31 37 5d 29 0a 20 20 61 6e 64 20 77  3.7.17]).  and w
f2f0: 69 6c 6c 20 74 68 72 6f 77 20 61 6e 20 65 72 72  ill throw an err
f300: 6f 72 20 69 6e 20 70 72 69 6f 72 20 72 65 6c 65  or in prior rele
f310: 61 73 65 73 2e 29 0a 20 20 46 6f 72 20 65 78 61  ases.).  For exa
f320: 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
f330: 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  k>.  <i>-- Creat
f340: 65 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 3c  e an FTS4 table<
f350: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
f360: 54 55 41 4c 20 54 41 42 4c 45 20 66 74 20 55 53  TUAL TABLE ft US
f370: 49 4e 47 20 66 74 73 34 28 78 2c 20 79 29 3b 0a  ING fts4(x, y);.
f380: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
f390: 61 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65  an fts4aux table
f3a0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
f3b0: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66  ull-text index f
f3c0: 6f 72 20 74 61 62 6c 65 20 22 66 74 22 3c 2f 69  or table "ft"</i
f3d0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
f3e0: 41 4c 20 54 41 42 4c 45 20 66 74 5f 74 65 72 6d  AL TABLE ft_term
f3f0: 73 20 55 53 49 4e 47 20 66 74 73 34 61 75 78 28  s USING fts4aux(
f400: 66 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  ft);..  <i>-- Cr
f410: 65 61 74 65 20 61 20 54 45 4d 50 20 66 74 73 34  eate a TEMP fts4
f420: 61 75 78 20 74 61 62 6c 65 20 61 63 63 65 73 73  aux table access
f430: 69 6e 67 20 74 68 65 20 22 66 74 22 20 74 61 62  ing the "ft" tab
f440: 6c 65 20 69 6e 20 22 6d 61 69 6e 22 3c 2f 69 3e  le in "main"</i>
f450: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
f460: 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 66 74 5f  L TABLE temp.ft_
f470: 74 65 72 6d 73 5f 32 20 55 53 49 4e 47 20 66 74  terms_2 USING ft
f480: 73 34 61 75 78 28 6d 61 69 6e 2c 66 74 29 3b 0a  s4aux(main,ft);.
f490: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
f4a0: 3e 0a 20 20 46 6f 72 20 65 61 63 68 20 74 65 72  >.  For each ter
f4b0: 6d 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  m present in the
f4c0: 20 46 54 53 20 74 61 62 6c 65 2c 20 74 68 65 72   FTS table, ther
f4d0: 65 20 61 72 65 20 62 65 74 77 65 65 6e 20 32 20  e are between 2 
f4e0: 61 6e 64 20 4e 2b 31 20 72 6f 77 73 0a 20 20 69  and N+1 rows.  i
f4f0: 6e 20 74 68 65 20 66 74 73 34 61 75 78 20 74 61  n the fts4aux ta
f500: 62 6c 65 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ble, where N is 
f510: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
f520: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
f530: 6e 73 20 69 6e 0a 20 20 74 68 65 20 61 73 73 6f  ns in.  the asso
f540: 63 69 61 74 65 64 20 46 54 53 20 74 61 62 6c 65  ciated FTS table
f550: 2e 20 41 6e 20 66 74 73 34 61 75 78 20 74 61 62  . An fts4aux tab
f560: 6c 65 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  le always has th
f570: 65 20 73 61 6d 65 20 66 6f 75 72 20 63 6f 6c 75  e same four colu
f580: 6d 6e 73 2c 20 0a 20 20 61 73 20 66 6f 6c 6c 6f  mns, .  as follo
f590: 77 73 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ws, from left to
f5a0: 20 72 69 67 68 74 3a 0a 0a 3c 74 61 62 6c 65 20   right:..<table 
f5b0: 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72  striped=1>.  <tr
f5c0: 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20 4e 61 6d 65  ><th>Column Name
f5d0: 3c 74 68 3e 43 6f 6c 75 6d 6e 20 43 6f 6e 74 65  <th>Column Conte
f5e0: 6e 74 73 0a 20 20 3c 74 72 3e 3c 74 64 3e 74 65  nts.  <tr><td>te
f5f0: 72 6d 3c 74 64 3e 20 0a 20 20 20 20 43 6f 6e 74  rm<td> .    Cont
f600: 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66  ains the text of
f610: 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68   the term for th
f620: 69 73 20 72 6f 77 2e 0a 20 20 3c 74 72 3e 3c 74  is row..  <tr><t
f630: 64 3e 63 6f 6c 3c 74 64 3e 20 0a 20 20 20 20 54  d>col<td> .    T
f640: 68 69 73 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 63  his column may c
f650: 6f 6e 74 61 69 6e 20 65 69 74 68 65 72 20 74 68  ontain either th
f660: 65 20 74 65 78 74 20 76 61 6c 75 65 20 27 2a 27  e text value '*'
f670: 20 28 69 2e 65 2e 20 61 20 73 69 6e 67 6c 65 20   (i.e. a single 
f680: 0a 20 20 20 20 63 68 61 72 61 63 74 65 72 2c 20  .    character, 
f690: 55 2b 30 30 32 61 29 20 6f 72 20 61 6e 20 69 6e  U+002a) or an in
f6a0: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 30 20  teger between 0 
f6b0: 61 6e 64 20 4e 2d 31 2c 20 77 68 65 72 65 20 4e  and N-1, where N
f6c0: 20 69 73 0a 20 20 20 20 61 67 61 69 6e 20 74 68   is.    again th
f6d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
f6e0: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73  -defined columns
f6f0: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   in the correspo
f700: 6e 64 69 6e 67 20 46 54 53 20 74 61 62 6c 65 2e  nding FTS table.
f710: 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 64 6f 63 75  ..  <tr><td>docu
f720: 6d 65 6e 74 73 3c 74 64 3e 0a 20 20 20 20 54 68  ments<td>.    Th
f730: 69 73 20 63 6f 6c 75 6d 6e 20 61 6c 77 61 79 73  is column always
f740: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74   contains an int
f750: 65 67 65 72 20 76 61 6c 75 65 20 67 72 65 61 74  eger value great
f760: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20  er than zero..  
f770: 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49    <br><br>.    I
f780: 66 20 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75  f the "col" colu
f790: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  mn contains the 
f7a0: 76 61 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20  value '*', then 
f7b0: 74 68 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  this column.    
f7c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
f7d0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 74  ber of rows of t
f7e0: 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 68 61  he FTS table tha
f7f0: 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  t contain at lea
f800: 73 74 20 6f 6e 65 0a 20 20 20 20 69 6e 73 74 61  st one.    insta
f810: 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  nce of the term 
f820: 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e  (in any column).
f830: 20 49 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73   If col contains
f840: 20 61 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20   an integer.    
f850: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73  value, then this
f860: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
f870: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f880: 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53 20 74  ows of the FTS t
f890: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 63 6f  able that.    co
f8a0: 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
f8b0: 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
f8c0: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 63  he term in the c
f8d0: 6f 6c 75 6d 6e 20 69 64 65 6e 74 69 66 69 65 64  olumn identified
f8e0: 20 62 79 0a 20 20 20 20 74 68 65 20 63 6f 6c 20   by.    the col 
f8f0: 76 61 6c 75 65 2e 20 41 73 20 75 73 75 61 6c 2c  value. As usual,
f900: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
f910: 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 61 72  the FTS table ar
f920: 65 20 6e 75 6d 62 65 72 65 64 0a 20 20 20 20 66  e numbered.    f
f930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
f940: 74 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  t, starting with
f950: 20 7a 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c 74   zero...  <tr><t
f960: 64 3e 6f 63 63 75 72 72 65 6e 63 65 73 3c 74 64  d>occurrences<td
f970: 3e 0a 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d  >.    This colum
f980: 6e 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 63 6f  n also always co
f990: 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65  ntains an intege
f9a0: 72 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20  r value greater 
f9b0: 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c  than zero..    <
f9c0: 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20 74  br><br>.    If t
f9d0: 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20  he "col" column 
f9e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
f9f0: 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68 69  ue '*', then thi
fa00: 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e  s column.    con
fa10: 74 61 69 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  tains the total 
fa20: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e  number of instan
fa30: 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ces of the term 
fa40: 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  in all rows of t
fa50: 68 65 20 0a 20 20 20 20 46 54 53 20 74 61 62 6c  he .    FTS tabl
fa60: 65 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e  e (in any column
fa70: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ). Otherwise, if
fa80: 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e   col contains an
fa90: 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61 6c   integer.    val
faa0: 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  ue, then this co
fab0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  lumn contains th
fac0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
fad0: 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
fae0: 68 65 0a 20 20 20 20 74 65 72 6d 20 74 68 61 74  he.    term that
faf0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
fb00: 54 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  TS table column 
fb10: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
fb20: 65 20 63 6f 6c 0a 20 20 20 20 76 61 6c 75 65 2e  e col.    value.
fb30: 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 61 6e 67  ..  <tr><td>lang
fb40: 75 61 67 65 69 64 20 3c 69 3e 28 68 69 64 64 65  uageid <i>(hidde
fb50: 6e 29 3c 2f 69 3e 3c 74 64 3e 0a 20 20 20 20 3c  n)</i><td>.    <
fb60: 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20  tcl>hd_fragment 
fb70: 66 34 61 6c 69 64 20 7b 66 74 73 34 61 75 78 20  f4alid {fts4aux 
fb80: 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d  languageid colum
fb90: 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 54 68 69  n}</tcl>.    Thi
fba0: 73 20 63 6f 6c 75 6d 6e 20 64 65 74 65 72 6d 69  s column determi
fbb0: 6e 65 73 20 77 68 69 63 68 20 5b 6c 61 6e 67 75  nes which [langu
fbc0: 61 67 65 69 64 5d 20 69 73 20 75 73 65 64 20 74  ageid] is used t
fbd0: 6f 0a 20 20 20 20 65 78 74 72 61 63 74 20 76 6f  o.    extract vo
fbe0: 63 61 62 75 6c 61 72 79 20 66 72 6f 6d 20 74 68  cabulary from th
fbf0: 65 20 46 54 53 33 2f 34 20 74 61 62 6c 65 2e 0a  e FTS3/4 table..
fc00: 20 20 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20      <br><br>.   
fc10: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
fc20: 75 65 20 66 6f 72 20 6c 61 6e 67 75 61 67 65 69  ue for languagei
fc30: 64 20 69 73 20 30 2e 20 20 49 66 20 61 6e 20 61  d is 0.  If an a
fc40: 6c 74 65 72 6e 61 74 69 76 65 20 6c 61 6e 67 75  lternative langu
fc50: 61 67 65 0a 20 20 20 20 69 73 20 73 70 65 63 69  age.    is speci
fc60: 66 69 65 64 20 69 6e 20 57 48 45 52 45 20 63 6c  fied in WHERE cl
fc70: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
fc80: 2c 20 74 68 65 6e 20 74 68 61 74 20 61 6c 74 65  , then that alte
fc90: 72 6e 61 74 69 76 65 20 69 73 0a 20 20 20 20 75  rnative is.    u
fca0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 30  sed instead of 0
fcb0: 2e 20 20 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c  .  There can onl
fcc0: 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 61  y be a single la
fcd0: 6e 67 75 61 67 65 69 64 20 70 65 72 20 71 75 65  nguageid per que
fce0: 72 79 2e 0a 20 20 20 20 49 6e 20 6f 74 68 65 72  ry..    In other
fcf0: 20 77 6f 72 64 73 2c 20 74 68 65 20 57 48 45 52   words, the WHER
fd00: 45 20 63 6c 61 75 73 65 20 63 61 6e 6e 6f 74 20  E clause cannot 
fd10: 63 6f 6e 74 61 69 6e 20 61 20 72 61 6e 67 65 20  contain a range 
fd20: 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 6f  constraint.    o
fd30: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 6e  r IN operator on
fd40: 20 74 68 65 20 6c 61 6e 67 75 61 67 65 69 64 2e   the languageid.
fd50: 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20  .</table>..<p>. 
fd60: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73   For example, us
fd70: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 63  ing the tables c
fd80: 72 65 61 74 65 64 20 61 62 6f 76 65 3a 0a 0a 3c  reated above:..<
fd90: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e 53  codeblock>.  INS
fda0: 45 52 54 20 49 4e 54 4f 20 66 74 28 78 2c 20 79  ERT INTO ft(x, y
fdb0: 29 20 56 41 4c 55 45 53 28 27 41 70 70 6c 65 20  ) VALUES('Apple 
fdc0: 62 61 6e 61 6e 61 27 2c 20 27 43 68 65 72 72 79  banana', 'Cherry
fdd0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
fde0: 4f 20 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45  O ft(x, y) VALUE
fdf0: 53 28 27 42 61 6e 61 6e 61 20 44 61 74 65 20 44  S('Banana Date D
fe00: 61 74 65 27 2c 20 27 63 68 65 72 72 79 27 29 3b  ate', 'cherry');
fe10: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
fe20: 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28 27  t(x, y) VALUES('
fe30: 43 68 65 72 72 79 20 45 6c 64 65 72 62 65 72 72  Cherry Elderberr
fe40: 79 27 2c 20 27 45 6c 64 65 72 62 65 72 72 79 27  y', 'Elderberry'
fe50: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  );..  <i>-- The 
fe60: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20  following query 
fe70: 72 65 74 75 72 6e 73 20 74 68 69 73 20 64 61 74  returns this dat
fe80: 61 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  a:</i>.  <i>--</
fe90: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61  i>.  <i>--     a
fea0: 70 70 6c 65 20 20 20 20 20 20 20 7c 20 20 2a 20  pple       |  * 
feb0: 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a   |  1  |  1</i>.
fec0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c    <i>--     appl
fed0: 65 20 20 20 20 20 20 20 7c 20 20 30 20 20 7c 20  e       |  0  | 
fee0: 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c   1  |  1</i>.  <
fef0: 69 3e 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20  i>--     banana 
ff00: 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 32 20       |  *  |  2 
ff10: 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   |  2</i>.  <i>-
ff20: 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20 20  -     banana    
ff30: 20 20 7c 20 20 30 20 20 7c 20 20 32 20 20 7c 20    |  0  |  2  | 
ff40: 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   2</i>.  <i>--  
ff50: 20 20 20 63 68 65 72 72 79 20 20 20 20 20 20 7c     cherry      |
ff60: 20 20 2a 20 20 7c 20 20 33 20 20 7c 20 20 33 3c    *  |  3  |  3<
ff70: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
ff80: 63 68 65 72 72 79 20 20 20 20 20 20 7c 20 20 30  cherry      |  0
ff90: 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e    |  1  |  1</i>
ffa0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65  .  <i>--     che
ffb0: 72 72 79 20 20 20 20 20 20 7c 20 20 31 20 20 7c  rry      |  1  |
ffc0: 20 20 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20    2  |  2</i>.  
ffd0: 3c 69 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20  <i>--     date  
ffe0: 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 31        |  *  |  1
fff0: 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e    |  2</i>.  <i>
10000 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20 20 20  --     date     
10010 20 20 20 7c 20 20 30 20 20 7c 20 20 31 20 20 7c     |  0  |  1  |
10020 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20    2</i>.  <i>-- 
10030 20 20 20 20 65 6c 64 65 72 62 65 72 72 79 20 20      elderberry  
10040 7c 20 20 2a 20 20 7c 20 20 31 20 20 7c 20 20 32  |  *  |  1  |  2
10050 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
10060 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20   elderberry  |  
10070 30 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69  0  |  1  |  1</i
10080 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c  >.  <i>--     el
10090 64 65 72 62 65 72 72 79 20 20 7c 20 20 31 20 20  derberry  |  1  
100a0 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
100b0 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c   <i>--</i>.  SEL
100c0 45 43 54 20 74 65 72 6d 2c 20 63 6f 6c 2c 20 64  ECT term, col, d
100d0 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72  ocuments, occurr
100e0 65 6e 63 65 73 20 46 52 4f 4d 20 66 74 5f 74 65  ences FROM ft_te
100f0 72 6d 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  rms;.</codeblock
10100 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 74 68 65 20  >..<p>.  In the 
10110 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76 61 6c  example, the val
10120 75 65 73 20 69 6e 20 74 68 65 20 22 74 65 72 6d  ues in the "term
10130 22 20 63 6f 6c 75 6d 6e 20 61 72 65 20 61 6c 6c  " column are all
10140 20 6c 6f 77 65 72 20 63 61 73 65 2c 20 0a 20 20   lower case, .  
10150 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
10160 20 77 65 72 65 20 69 6e 73 65 72 74 65 64 20 69   were inserted i
10170 6e 74 6f 20 74 61 62 6c 65 20 22 66 74 22 20 69  nto table "ft" i
10180 6e 20 6d 69 78 65 64 20 63 61 73 65 2e 20 54 68  n mixed case. Th
10190 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20  is is because.  
101a0 61 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65  an fts4aux table
101b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
101c0 72 6d 73 20 61 73 20 65 78 74 72 61 63 74 65 64  rms as extracted
101d0 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65   from the docume
101e0 6e 74 20 74 65 78 74 0a 20 20 62 79 20 74 68 65  nt text.  by the
101f0 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49 6e   [tokenizer]. In
10200 20 74 68 69 73 20 63 61 73 65 2c 20 73 69 6e 63   this case, sinc
10210 65 20 74 61 62 6c 65 20 22 66 74 22 20 75 73 65  e table "ft" use
10220 73 20 74 68 65 20 0a 20 20 5b 74 6f 6b 65 6e 69  s the .  [tokeni
10230 7a 65 72 7c 73 69 6d 70 6c 65 20 74 6f 6b 65 6e  zer|simple token
10240 69 7a 65 72 5d 2c 20 74 68 69 73 20 6d 65 61 6e  izer], this mean
10250 73 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65  s all terms have
10260 20 62 65 65 6e 20 66 6f 6c 64 65 64 20 74 6f 0a   been folded to.
10270 20 20 6c 6f 77 65 72 20 63 61 73 65 2e 20 41 6c    lower case. Al
10280 73 6f 2c 20 74 68 65 72 65 20 69 73 20 28 66 6f  so, there is (fo
10290 72 20 65 78 61 6d 70 6c 65 29 20 6e 6f 20 72 6f  r example) no ro
102a0 77 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 22 74  w with column "t
102b0 65 72 6d 22 0a 20 20 73 65 74 20 74 6f 20 22 61  erm".  set to "a
102c0 70 70 6c 65 22 20 61 6e 64 20 63 6f 6c 75 6d 6e  pple" and column
102d0 20 22 63 6f 6c 22 20 73 65 74 20 74 6f 20 31 2e   "col" set to 1.
102e0 20 53 69 6e 63 65 20 74 68 65 72 65 20 61 72 65   Since there are
102f0 20 6e 6f 20 69 6e 73 74 61 6e 63 65 73 0a 20 20   no instances.  
10300 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61 70 70  of the term "app
10310 6c 65 22 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 2c  le" in column 1,
10320 20 6e 6f 20 72 6f 77 20 69 73 20 70 72 65 73 65   no row is prese
10330 6e 74 20 69 6e 20 74 68 65 20 66 74 73 34 61 75  nt in the fts4au
10340 78 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20  x table...<p>.  
10350 44 75 72 69 6e 67 20 61 20 74 72 61 6e 73 61 63  During a transac
10360 74 69 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20 74 68  tion, some of th
10370 65 20 64 61 74 61 20 77 72 69 74 74 65 6e 20 74  e data written t
10380 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d  o an FTS table m
10390 61 79 20 62 65 20 0a 20 20 63 61 63 68 65 64 20  ay be .  cached 
103a0 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72  in memory and wr
103b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
103c0 61 62 61 73 65 20 6f 6e 6c 79 20 77 68 65 6e 20  abase only when 
103d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
103e0 69 73 20 0a 20 20 63 6f 6d 6d 69 74 74 65 64 2e  is .  committed.
103f0 20 48 6f 77 65 76 65 72 20 74 68 65 20 69 6d 70   However the imp
10400 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10410 68 65 20 66 74 73 34 61 75 78 20 6d 6f 64 75 6c  he fts4aux modul
10420 65 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 0a  e is only able .
10430 20 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66    to read data f
10440 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
10450 2e 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  . In practice th
10460 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  is means that if
10470 20 61 6e 20 66 74 73 34 61 75 78 20 0a 20 20 74   an fts4aux .  t
10480 61 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20  able is queried 
10490 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
104a0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 77 68 69  ansaction in whi
104b0 63 68 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ch the associate
104c0 64 20 0a 20 20 46 54 53 20 74 61 62 6c 65 20 68  d .  FTS table h
104d0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
104e0 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  , the results of
104f0 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6c   the query are l
10500 69 6b 65 6c 79 20 74 6f 20 72 65 66 6c 65 63 74  ikely to reflect
10510 20 0a 20 20 6f 6e 6c 79 20 61 20 28 70 6f 73 73   .  only a (poss
10520 69 62 6c 79 20 65 6d 70 74 79 29 20 73 75 62 73  ibly empty) subs
10530 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  et of the change
10540 73 20 6d 61 64 65 2e 0a 0a 3c 68 31 20 69 64 3d  s made...<h1 id=
10550 66 74 73 34 5f 6f 70 74 69 6f 6e 73 20 74 61 67  fts4_options tag
10560 73 3d 22 46 54 53 34 20 6f 70 74 69 6f 6e 73 22  s="FTS4 options"
10570 3e 46 54 53 34 20 4f 70 74 69 6f 6e 73 3c 2f 68  >FTS4 Options</h
10580 31 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65  1>..<p>.  If the
10590 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
105a0 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e   TABLE" statemen
105b0 74 20 73 70 65 63 69 66 69 65 73 20 6d 6f 64 75  t specifies modu
105c0 6c 65 20 46 54 53 34 20 28 6e 6f 74 20 46 54 53  le FTS4 (not FTS
105d0 33 29 2c 20 0a 20 20 74 68 65 6e 20 73 70 65 63  3), .  then spec
105e0 69 61 6c 20 64 69 72 65 63 74 69 76 65 73 20 2d  ial directives -
105f0 20 46 54 53 34 20 6f 70 74 69 6f 6e 73 20 2d 20   FTS4 options - 
10600 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22  similar to the "
10610 74 6f 6b 65 6e 69 7a 65 3d 2a 22 20 6f 70 74 69  tokenize=*" opti
10620 6f 6e 0a 20 20 6d 61 79 20 61 6c 73 6f 20 61 70  on.  may also ap
10630 70 65 61 72 20 69 6e 20 70 6c 61 63 65 20 6f 66  pear in place of
10640 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 41   column names. A
10650 6e 20 46 54 53 34 20 6f 70 74 69 6f 6e 20 63 6f  n FTS4 option co
10660 6e 73 69 73 74 73 20 6f 66 20 74 68 65 0a 20 20  nsists of the.  
10670 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 66 6f 6c  option name, fol
10680 6c 6f 77 65 64 20 62 79 20 61 6e 20 22 3d 22 20  lowed by an "=" 
10690 63 68 61 72 61 63 74 65 72 2c 20 66 6f 6c 6c 6f  character, follo
106a0 77 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6f  wed by the optio
106b0 6e 20 76 61 6c 75 65 2e 0a 20 20 54 68 65 20 6f  n value..  The o
106c0 70 74 69 6f 6e 20 76 61 6c 75 65 20 6d 61 79 20  ption value may 
106d0 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 65 6e  optionally be en
106e0 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65  closed in single
106f0 20 6f 72 20 64 6f 75 62 6c 65 20 71 75 6f 74 65   or double quote
10700 73 2c 20 77 69 74 68 0a 20 20 65 6d 62 65 64 64  s, with.  embedd
10710 65 64 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ed quote charact
10720 65 72 73 20 65 73 63 61 70 65 64 20 69 6e 20 74  ers escaped in t
10730 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 66  he same way as f
10740 6f 72 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 2e  or SQL literals.
10750 20 54 68 65 72 65 0a 20 20 6d 61 79 20 6e 6f 74   There.  may not
10760 20 62 65 20 77 68 69 74 65 73 70 61 63 65 20 6f   be whitespace o
10770 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
10780 20 74 68 65 20 22 3d 22 20 63 68 61 72 61 63 74   the "=" charact
10790 65 72 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  er. For example,
107a0 0a 20 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  .  to create an 
107b0 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20  FTS4 table with 
107c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6f 70 74  the value of opt
107d0 69 6f 6e 20 22 6d 61 74 63 68 69 6e 66 6f 22 20  ion "matchinfo" 
107e0 73 65 74 20 74 6f 20 22 66 74 73 33 22 3a 0a 0a  set to "fts3":..
107f0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
10800 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 72 65 64  >-- Create a red
10810 75 63 65 64 2d 66 6f 6f 74 70 72 69 6e 74 20 46  uced-footprint F
10820 54 53 34 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  TS4 table.</i>. 
10830 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
10840 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49  TABLE papers USI
10850 4e 47 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20  NG fts4(author, 
10860 64 6f 63 75 6d 65 6e 74 2c 20 6d 61 74 63 68 69  document, matchi
10870 6e 66 6f 3d 66 74 73 33 29 3b 0a 3c 2f 63 6f 64  nfo=fts3);.</cod
10880 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46  eblock>..<p>.  F
10890 54 53 34 20 63 75 72 72 65 6e 74 6c 79 20 73 75  TS4 currently su
108a0 70 70 6f 72 74 73 20 74 68 65 20 66 6f 6c 6c 6f  pports the follo
108b0 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 0a 0a 3c  wing options:..<
108c0 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e  table striped=1>
108d0 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 74 69 6f  .  <tr><th>Optio
108e0 6e 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74  n<th>Interpretat
108f0 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f  ion.  <tr><td>co
10900 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20 20 20 5e  mpress<td>.    ^
10910 54 68 65 20 63 6f 6d 70 72 65 73 73 20 6f 70 74  The compress opt
10920 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
10930 70 65 63 69 66 79 20 74 68 65 20 63 6f 6d 70 72  pecify the compr
10940 65 73 73 20 66 75 6e 63 74 69 6f 6e 2e 20 5e 49  ess function. ^I
10950 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
10960 0a 20 20 20 20 73 70 65 63 69 66 79 20 61 20 63  .    specify a c
10970 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e  ompress function
10980 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70   without also sp
10990 65 63 69 66 79 69 6e 67 20 61 6e 20 75 6e 63 6f  ecifying an unco
109a0 6d 70 72 65 73 73 0a 20 20 20 20 66 75 6e 63 74  mpress.    funct
109b0 69 6f 6e 2e 20 5b 66 74 73 34 20 63 6f 6d 70 72  ion. [fts4 compr
109c0 65 73 73 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62  ess option|See b
109d0 65 6c 6f 77 5d 20 66 6f 72 20 64 65 74 61 69 6c  elow] for detail
109e0 73 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f  s...  <tr><td>co
109f0 6e 74 65 6e 74 3c 74 64 3e 0a 20 20 20 20 5e 54  ntent<td>.    ^T
10a00 68 65 20 63 6f 6e 74 65 6e 74 20 61 6c 6c 6f 77  he content allow
10a10 73 20 74 68 65 20 74 65 78 74 20 62 65 69 6e 67  s the text being
10a20 20 69 6e 64 65 78 65 64 20 74 6f 20 62 65 0a 20   indexed to be. 
10a30 20 20 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73     stored in a s
10a40 65 70 61 72 61 74 65 20 74 61 62 6c 65 20 64 69  eparate table di
10a50 73 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20  stinct from the 
10a60 46 54 53 34 20 74 61 62 6c 65 2c 0a 20 20 20 20  FTS4 table,.    
10a70 6f 72 20 65 76 65 6e 20 6f 75 74 73 69 64 65 20  or even outside 
10a80 6f 66 20 53 51 4c 69 74 65 2e 0a 0a 20 20 3c 74  of SQLite...  <t
10a90 72 3e 3c 74 64 3e 6c 61 6e 67 75 61 67 65 69 64  r><td>languageid
10aa0 3c 74 64 3e 0a 20 20 20 20 5e 54 68 65 20 6c 61  <td>.    ^The la
10ab0 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20  nguageid option 
10ac0 63 61 75 73 65 73 20 74 68 65 20 46 54 53 34 20  causes the FTS4 
10ad0 74 61 62 6c 65 20 74 6f 20 68 61 76 65 20 61 6e  table to have an
10ae0 20 61 64 64 69 74 69 6f 6e 61 6c 20 68 69 64 64   additional hidd
10af0 65 6e 0a 20 20 20 20 69 6e 74 65 67 65 72 20 63  en.    integer c
10b00 6f 6c 75 6d 6e 20 74 68 61 74 20 69 64 65 6e 74  olumn that ident
10b10 69 66 69 65 73 20 74 68 65 20 6c 61 6e 67 75 61  ifies the langua
10b20 67 65 20 6f 66 20 74 68 65 20 74 65 78 74 20 63  ge of the text c
10b30 6f 6e 74 61 69 6e 65 64 20 69 6e 0a 20 20 20 20  ontained in.    
10b40 65 61 63 68 20 72 6f 77 2e 20 20 54 68 65 20 75  each row.  The u
10b50 73 65 20 6f 66 20 74 68 65 20 6c 61 6e 67 75 61  se of the langua
10b60 67 65 69 64 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f  geid option allo
10b70 77 73 20 74 68 65 20 73 61 6d 65 20 46 54 53 34  ws the same FTS4
10b80 20 74 61 62 6c 65 0a 20 20 20 20 74 6f 20 68 6f   table.    to ho
10b90 6c 64 20 74 65 78 74 20 69 6e 20 6d 75 6c 74 69  ld text in multi
10ba0 70 6c 65 20 6c 61 6e 67 75 61 67 65 73 20 6f 72  ple languages or
10bb0 20 73 63 72 69 70 74 73 2c 20 65 61 63 68 20 77   scripts, each w
10bc0 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 74 6f  ith different to
10bd0 6b 65 6e 69 7a 65 72 0a 20 20 20 20 72 75 6c 65  kenizer.    rule
10be0 73 2c 20 61 6e 64 20 74 6f 20 71 75 65 72 79 20  s, and to query 
10bf0 65 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 6e  each language in
10c00 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
10c10 68 65 20 6f 74 68 65 72 73 2e 0a 20 20 20 20 0a  he others..    .
10c20 20 20 3c 74 72 3e 3c 74 64 3e 6d 61 74 63 68 69    <tr><td>matchi
10c30 6e 66 6f 3c 74 64 3e 20 0a 20 20 20 20 57 68 65  nfo<td> .    Whe
10c40 6e 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  n set to the val
10c50 75 65 20 22 66 74 73 33 22 2c 20 74 68 65 20 6d  ue "fts3", the m
10c60 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 20  atchinfo option 
10c70 72 65 64 75 63 65 73 20 74 68 65 20 61 6d 6f 75  reduces the amou
10c80 6e 74 20 6f 66 0a 20 20 20 20 69 6e 66 6f 72 6d  nt of.    inform
10c90 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 62 79 20  ation stored by 
10ca0 46 54 53 34 20 77 69 74 68 20 74 68 65 20 63 6f  FTS4 with the co
10cb0 6e 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 74  nsequence that t
10cc0 68 65 20 22 6c 22 20 6f 70 74 69 6f 6e 20 6f 66  he "l" option of
10cd0 0a 20 20 20 20 5b 6d 61 74 63 68 69 6e 66 6f 28  .    [matchinfo(
10ce0 29 5d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  )] is no longer 
10cf0 61 76 61 69 6c 61 62 6c 65 2e 0a 0a 20 20 3c 74  available...  <t
10d00 72 3e 3c 74 64 3e 6e 6f 74 69 6e 64 65 78 65 64  r><td>notindexed
10d10 3c 74 64 3e 20 0a 20 20 20 20 54 68 69 73 20 6f  <td> .    This o
10d20 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ption is used to
10d30 20 73 70 65 63 69 66 79 20 74 68 65 20 6e 61 6d   specify the nam
10d40 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 66 6f  e of a column fo
10d50 72 20 77 68 69 63 68 20 64 61 74 61 20 69 73 0a  r which data is.
10d60 20 20 20 20 6e 6f 74 20 69 6e 64 65 78 65 64 2e      not indexed.
10d70 20 56 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   Values stored i
10d80 6e 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  n columns that a
10d90 72 65 20 6e 6f 74 20 69 6e 64 65 78 65 64 20 61  re not indexed a
10da0 72 65 20 6e 6f 74 0a 20 20 20 20 6d 61 74 63 68  re not.    match
10db0 65 64 20 62 79 20 4d 41 54 43 48 20 71 75 65 72  ed by MATCH quer
10dc0 69 65 73 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ies. Nor are the
10dd0 79 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20  y recognized by 
10de0 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69  auxiliary functi
10df0 6f 6e 73 2e 0a 20 20 20 20 41 20 73 69 6e 67 6c  ons..    A singl
10e00 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
10e10 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
10e20 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 6e 75   may have any nu
10e30 6d 62 65 72 20 6f 66 20 6e 6f 74 69 6e 64 65 78  mber of notindex
10e40 65 64 20 0a 20 20 20 20 6f 70 74 69 6f 6e 73 2e  ed .    options.
10e50 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 6f 72 64 65  ..  <tr><td>orde
10e60 72 3c 74 64 3e 0a 20 20 20 20 3c 74 63 6c 3e 68  r<td>.    <tcl>h
10e70 64 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 6f  d_fragment fts4o
10e80 72 64 65 72 20 7b 46 54 53 34 20 6f 72 64 65 72  rder {FTS4 order
10e90 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 20   option}</tcl>. 
10ea0 20 20 20 5e 54 68 65 20 22 6f 72 64 65 72 22 20     ^The "order" 
10eb0 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 65  option may be se
10ec0 74 20 74 6f 20 65 69 74 68 65 72 20 22 44 45 53  t to either "DES
10ed0 43 22 20 6f 72 20 22 41 53 43 22 20 28 69 6e 20  C" or "ASC" (in 
10ee0 75 70 70 65 72 20 6f 72 0a 20 20 20 20 6c 6f 77  upper or.    low
10ef0 65 72 20 63 61 73 65 29 2e 20 5e 49 66 20 69 74  er case). ^If it
10f00 20 69 73 20 73 65 74 20 74 6f 20 22 44 45 53 43   is set to "DESC
10f10 22 2c 20 74 68 65 6e 20 46 54 53 34 20 73 74 6f  ", then FTS4 sto
10f20 72 65 73 20 69 74 73 20 64 61 74 61 20 69 6e 20  res its data in 
10f30 73 75 63 68 0a 20 20 20 20 61 20 77 61 79 20 61  such.    a way a
10f40 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 72 65  s to optimize re
10f50 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 73 20  turning results 
10f60 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
10f70 64 65 72 20 62 79 20 64 6f 63 69 64 2e 0a 20 20  der by docid..  
10f80 20 20 5e 49 66 20 69 74 20 69 73 20 73 65 74 20    ^If it is set 
10f90 74 6f 20 22 41 53 43 22 20 28 74 68 65 20 64 65  to "ASC" (the de
10fa0 66 61 75 6c 74 29 2c 20 74 68 65 6e 20 74 68 65  fault), then the
10fb0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
10fc0 20 61 72 65 20 0a 20 20 20 20 6f 70 74 69 6d 69   are .    optimi
10fd0 7a 65 64 20 66 6f 72 20 72 65 74 75 72 6e 69 6e  zed for returnin
10fe0 67 20 72 65 73 75 6c 74 73 20 69 6e 20 61 73 63  g results in asc
10ff0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
11000 64 6f 63 69 64 2e 20 20 5e 49 6e 20 6f 74 68 65  docid.  ^In othe
11010 72 0a 20 20 20 20 77 6f 72 64 73 2c 20 69 66 20  r.    words, if 
11020 6d 61 6e 79 20 6f 66 20 74 68 65 20 71 75 65 72  many of the quer
11030 69 65 73 20 72 75 6e 20 61 67 61 69 6e 73 74 20  ies run against 
11040 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 20 75  the FTS4 table u
11050 73 65 20 22 4f 52 44 45 52 20 42 59 0a 20 20 20  se "ORDER BY.   
11060 20 64 6f 63 69 64 20 44 45 53 43 22 2c 20 74 68   docid DESC", th
11070 65 6e 20 69 74 20 6d 61 79 20 69 6d 70 72 6f 76  en it may improv
11080 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 6f  e performance to
11090 20 61 64 64 20 74 68 65 20 22 6f 72 64 65 72 3d   add the "order=
110a0 64 65 73 63 22 20 0a 20 20 20 20 6f 70 74 69 6f  desc" .    optio
110b0 6e 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  n to the CREATE 
110c0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
110d0 61 74 65 6d 65 6e 74 2e 0a 0a 20 20 3c 74 72 3e  atement...  <tr>
110e0 3c 74 64 3e 70 72 65 66 69 78 3c 74 64 3e 0a 20  <td>prefix<td>. 
110f0 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 6d     This option m
11100 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 20 63  ay be set to a c
11110 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c  omma-separated l
11120 69 73 74 20 6f 66 20 70 6f 73 69 74 69 76 65 20  ist of positive 
11130 6e 6f 6e 2d 7a 65 72 6f 20 0a 20 20 20 20 69 6e  non-zero .    in
11140 74 65 67 65 72 73 2e 20 46 6f 72 20 65 61 63 68  tegers. For each
11150 20 69 6e 74 65 67 65 72 20 4e 20 69 6e 20 74 68   integer N in th
11160 65 20 6c 69 73 74 2c 20 61 20 73 65 70 61 72 61  e list, a separa
11170 74 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  te index is crea
11180 74 65 64 0a 20 20 20 20 69 6e 20 74 68 65 20 64  ted.    in the d
11190 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
111a0 6f 70 74 69 6d 69 7a 65 20 5b 70 72 65 66 69 78  optimize [prefix
111b0 20 71 75 65 72 69 65 73 5d 20 77 68 65 72 65 0a   queries] where.
111c0 20 20 20 20 74 68 65 20 71 75 65 72 79 20 74 65      the query te
111d0 72 6d 20 69 73 20 4e 20 62 79 74 65 73 20 69 6e  rm is N bytes in
111e0 20 6c 65 6e 67 74 68 2c 20 6e 6f 74 20 69 6e 63   length, not inc
111f0 6c 75 64 69 6e 67 20 74 68 65 20 27 2a 27 20 63  luding the '*' c
11200 68 61 72 61 63 74 65 72 2c 0a 20 20 20 20 77 68  haracter,.    wh
11210 65 6e 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67  en encoded using
11220 20 55 54 46 2d 38 2e 20 5b 66 74 73 34 20 70 72   UTF-8. [fts4 pr
11230 65 66 69 78 20 6f 70 74 69 6f 6e 7c 53 65 65 20  efix option|See 
11240 62 65 6c 6f 77 5d 20 66 6f 72 20 64 65 74 61 69  below] for detai
11250 6c 73 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 75  ls...  <tr><td>u
11260 6e 63 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20  ncompress<td>.  
11270 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73    This option is
11280 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
11290 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20   the uncompress 
112a0 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
112b0 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20  an error to.    
112c0 73 70 65 63 69 66 79 20 61 6e 20 75 6e 63 6f 6d  specify an uncom
112d0 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77  press function w
112e0 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63  ithout also spec
112f0 69 66 79 69 6e 67 20 61 20 63 6f 6d 70 72 65 73  ifying a compres
11300 73 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 20  s.    function. 
11310 5b 66 74 73 34 20 63 6f 6d 70 72 65 73 73 20 6f  [fts4 compress o
11320 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d  ption|See below]
11330 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3c 2f   for details..</
11340 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 57 68  table>..<p>.  Wh
11350 65 6e 20 75 73 69 6e 67 20 46 54 53 34 2c 20 73  en using FTS4, s
11360 70 65 63 69 66 79 69 6e 67 20 61 20 63 6f 6c 75  pecifying a colu
11370 6d 6e 20 6e 61 6d 65 20 74 68 61 74 20 63 6f 6e  mn name that con
11380 74 61 69 6e 73 20 61 6e 20 22 3d 22 20 63 68 61  tains an "=" cha
11390 72 61 63 74 65 72 0a 20 20 61 6e 64 20 69 73 20  racter.  and is 
113a0 6e 6f 74 20 65 69 74 68 65 72 20 61 20 22 74 6f  not either a "to
113b0 6b 65 6e 69 7a 65 3d 2a 22 20 73 70 65 63 69 66  kenize=*" specif
113c0 69 63 61 74 69 6f 6e 20 6f 72 20 61 20 72 65 63  ication or a rec
113d0 6f 67 6e 69 7a 65 64 20 46 54 53 34 20 6f 70 74  ognized FTS4 opt
113e0 69 6f 6e 0a 20 20 69 73 20 61 6e 20 65 72 72 6f  ion.  is an erro
113f0 72 2e 20 57 69 74 68 20 46 54 53 33 2c 20 74 68  r. With FTS3, th
11400 65 20 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e  e first token in
11410 20 74 68 65 20 75 6e 72 65 63 6f 67 6e 69 7a 65   the unrecognize
11420 64 20 64 69 72 65 63 74 69 76 65 20 69 73 20 0a  d directive is .
11430 20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73    interpreted as
11440 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20   a column name. 
11450 53 69 6d 69 6c 61 72 6c 79 2c 20 73 70 65 63 69  Similarly, speci
11460 66 79 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 22  fying multiple "
11470 74 6f 6b 65 6e 69 7a 65 3d 2a 22 0a 20 20 64 69  tokenize=*".  di
11480 72 65 63 74 69 76 65 73 20 69 6e 20 61 20 73 69  rectives in a si
11490 6e 67 6c 65 20 74 61 62 6c 65 20 64 65 63 6c 61  ngle table decla
114a0 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 65 72 72  ration is an err
114b0 6f 72 20 77 68 65 6e 20 75 73 69 6e 67 20 46 54  or when using FT
114c0 53 34 2c 20 77 68 65 72 65 61 73 0a 20 20 74 68  S4, whereas.  th
114d0 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  e second and sub
114e0 73 65 71 75 65 6e 74 20 22 74 6f 6b 65 6e 69 7a  sequent "tokeniz
114f0 65 3d 2a 22 20 64 69 72 65 63 74 69 76 65 73 20  e=*" directives 
11500 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
11510 61 73 20 63 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65  as column.  name
11520 73 20 62 79 20 46 54 53 33 2e 20 46 6f 72 20 65  s by FTS3. For e
11530 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
11540 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20  ock>.  <i>-- An 
11550 65 72 72 6f 72 2e 20 46 54 53 34 20 64 6f 65 73  error. FTS4 does
11560 20 6e 6f 74 20 72 65 63 6f 67 6e 69 7a 65 20 74   not recognize t
11570 68 65 20 64 69 72 65 63 74 69 76 65 20 22 78 79  he directive "xy
11580 7a 3d 61 62 63 22 2e 3c 2f 69 3e 0a 20 20 43 52  z=abc".</i>.  CR
11590 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
115a0 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47 20  LE papers USING 
115b0 66 74 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63  fts4(author, doc
115c0 75 6d 65 6e 74 2c 20 78 79 7a 3d 61 62 63 29 3b  ument, xyz=abc);
115d0 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
115e0 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77   an FTS3 table w
115f0 69 74 68 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e  ith three column
11600 73 20 2d 20 22 61 75 74 68 6f 72 22 2c 20 22 64  s - "author", "d
11610 6f 63 75 6d 65 6e 74 22 3c 2f 69 3e 0a 20 20 3c  ocument"</i>.  <
11620 69 3e 2d 2d 20 61 6e 64 20 22 78 79 7a 22 2e 3c  i>-- and "xyz".<
11630 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
11640 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72  TUAL TABLE paper
11650 73 20 55 53 49 4e 47 20 66 74 73 33 28 61 75 74  s USING fts3(aut
11660 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20 78  hor, document, x
11670 79 7a 3d 61 62 63 29 3b 0a 0a 20 20 3c 69 3e 2d  yz=abc);..  <i>-
11680 2d 20 41 6e 20 65 72 72 6f 72 2e 20 46 54 53 34  - An error. FTS4
11690 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
116a0 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 69 7a  multiple tokeniz
116b0 65 3d 2a 20 64 69 72 65 63 74 69 76 65 73 3c 2f  e=* directives</
116c0 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
116d0 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73  UAL TABLE papers
116e0 20 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65   USING fts4(toke
116f0 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b  nize=porter, tok
11700 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 0a  enize=simple);..
11710 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
11720 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77 69 74  n FTS3 table wit
11730 68 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  h a single colum
11740 6e 20 6e 61 6d 65 64 20 22 74 6f 6b 65 6e 69 7a  n named "tokeniz
11750 65 22 2e 20 54 68 65 3c 2f 69 3e 0a 20 20 3c 69  e". The</i>.  <i
11760 3e 2d 2d 20 74 61 62 6c 65 20 75 73 65 73 20 74  >-- table uses t
11770 68 65 20 22 70 6f 72 74 65 72 22 20 74 6f 6b 65  he "porter" toke
11780 6e 69 7a 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45  nizer.</i>.  CRE
11790 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
117a0 45 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66  E papers USING f
117b0 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  ts3(tokenize=por
117c0 74 65 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d 73 69  ter, tokenize=si
117d0 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  mple);..  <i>-- 
117e0 41 6e 20 65 72 72 6f 72 2e 20 43 61 6e 6e 6f 74  An error. Cannot
117f0 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
11800 77 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73  with two columns
11810 20 6e 61 6d 65 64 20 22 74 6f 6b 65 6e 69 7a 65   named "tokenize
11820 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  ".</i>.  CREATE 
11830 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
11840 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33 28  pers USING fts3(
11850 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c  tokenize=porter,
11860 20 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65   tokenize=simple
11870 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 29 3b  , tokenize=icu);
11880 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
11890 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20  tcl>hd_fragment 
118a0 2a 66 74 73 34 63 6f 6d 70 72 65 73 73 69 6f 6e  *fts4compression
118b0 20 7b 63 6f 6d 70 72 65 73 73 65 64 20 46 54 53   {compressed FTS
118c0 34 20 63 6f 6e 74 65 6e 74 7d 3c 2f 74 63 6c 3e  4 content}</tcl>
118d0 0a 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20  .<h2 tags="fts4 
118e0 63 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 22  compress option"
118f0 3e 54 68 65 20 63 6f 6d 70 72 65 73 73 3d 20 61  >The compress= a
11900 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73 3d 20 6f  nd uncompress= o
11910 70 74 69 6f 6e 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  ptions</h2>..<p>
11920 0a 20 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20  .  The compress 
11930 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73 20 6f  and uncompress o
11940 70 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 46 54 53  ptions allow FTS
11950 34 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20  4 content to be 
11960 73 74 6f 72 65 64 20 69 6e 0a 20 20 74 68 65 20  stored in.  the 
11970 64 61 74 61 62 61 73 65 20 69 6e 20 61 20 63 6f  database in a co
11980 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 2e 20 42  mpressed form. B
11990 6f 74 68 20 6f 70 74 69 6f 6e 73 20 73 68 6f 75  oth options shou
119a0 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ld be set to the
119b0 20 6e 61 6d 65 0a 20 20 6f 66 20 61 6e 20 53 51   name.  of an SQ
119c0 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  L scalar functio
119d0 6e 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  n registered usi
119e0 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61  ng [sqlite3_crea
119f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 5d 0a 20  te_function()]. 
11a00 20 74 68 61 74 20 61 63 63 65 70 74 73 20 61 20   that accepts a 
11a10 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e  single argument.
11a20 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6d   ..<p>.  The com
11a30 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 73  press function s
11a40 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 63  hould return a c
11a50 6f 6d 70 72 65 73 73 65 64 20 76 65 72 73 69 6f  ompressed versio
11a60 6e 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 0a  n of the value .
11a70 20 20 70 61 73 73 65 64 20 74 6f 20 69 74 20 61    passed to it a
11a80 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 45  s an argument. E
11a90 61 63 68 20 74 69 6d 65 20 64 61 74 61 20 69 73  ach time data is
11aa0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11ab0 46 54 53 34 20 74 61 62 6c 65 2c 20 0a 20 20 65  FTS4 table, .  e
11ac0 61 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ach column value
11ad0 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
11ae0 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74  e compress funct
11af0 69 6f 6e 20 61 6e 64 20 74 68 65 20 72 65 73 75  ion and the resu
11b00 6c 74 20 76 61 6c 75 65 20 0a 20 20 73 74 6f 72  lt value .  stor
11b10 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
11b20 73 65 2e 20 54 68 65 20 63 6f 6d 70 72 65 73 73  se. The compress
11b30 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
11b40 74 75 72 6e 20 61 6e 79 20 74 79 70 65 20 6f 66  turn any type of
11b50 20 53 51 4c 69 74 65 20 0a 20 20 76 61 6c 75 65   SQLite .  value
11b60 20 28 62 6c 6f 62 2c 20 74 65 78 74 2c 20 72 65   (blob, text, re
11b70 61 6c 2c 20 69 6e 74 65 67 65 72 20 6f 72 20 6e  al, integer or n
11b80 75 6c 6c 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ull)...<p>.  The
11b90 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63   uncompress func
11ba0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 75 6e 63 6f  tion should unco
11bb0 6d 70 72 65 73 73 20 64 61 74 61 20 70 72 65 76  mpress data prev
11bc0 69 6f 75 73 6c 79 20 63 6f 6d 70 72 65 73 73 65  iously compresse
11bd0 64 20 62 79 0a 20 20 74 68 65 20 63 6f 6d 70 72  d by.  the compr
11be0 65 73 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  ess function. In
11bf0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f   other words, fo
11c00 72 20 61 6c 6c 20 53 51 4c 69 74 65 20 76 61 6c  r all SQLite val
11c10 75 65 73 20 58 2c 20 69 74 20 73 68 6f 75 6c 64  ues X, it should
11c20 0a 20 20 62 65 20 74 72 75 65 20 74 68 61 74 20  .  be true that 
11c30 75 6e 63 6f 6d 70 72 65 73 73 28 63 6f 6d 70 72  uncompress(compr
11c40 65 73 73 28 58 29 29 20 65 71 75 61 6c 73 20 58  ess(X)) equals X
11c50 2e 20 57 68 65 6e 20 64 61 74 61 20 74 68 61 74  . When data that
11c60 20 68 61 73 20 62 65 65 6e 0a 20 20 63 6f 6d 70   has been.  comp
11c70 72 65 73 73 65 64 20 62 79 20 74 68 65 20 63 6f  ressed by the co
11c80 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
11c90 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
11ca0 20 64 61 74 61 62 61 73 65 20 62 79 20 46 54 53   database by FTS
11cb0 34 2c 20 69 74 0a 20 20 69 73 20 70 61 73 73 65  4, it.  is passe
11cc0 64 20 74 6f 20 74 68 65 20 75 6e 63 6f 6d 70 72  d to the uncompr
11cd0 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 62 65 66  ess function bef
11ce0 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 2e 0a  ore it is used..
11cf0 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 73 70  .<p>.  If the sp
11d00 65 63 69 66 69 65 64 20 63 6f 6d 70 72 65 73 73  ecified compress
11d10 20 6f 72 20 75 6e 63 6f 6d 70 72 65 73 73 20 66   or uncompress f
11d20 75 6e 63 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  unctions do not 
11d30 65 78 69 73 74 2c 20 74 68 65 20 74 61 62 6c 65  exist, the table
11d40 0a 20 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  .  may still be 
11d50 63 72 65 61 74 65 64 2e 20 41 6e 20 65 72 72 6f  created. An erro
11d60 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65  r is not returne
11d70 64 20 75 6e 74 69 6c 20 74 68 65 20 46 54 53 34  d until the FTS4
11d80 20 74 61 62 6c 65 20 69 73 0a 20 20 72 65 61 64   table is.  read
11d90 20 28 69 66 20 74 68 65 20 75 6e 63 6f 6d 70 72   (if the uncompr
11da0 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ess function doe
11db0 73 20 6e 6f 74 20 65 78 69 73 74 29 20 6f 72 20  s not exist) or 
11dc0 77 72 69 74 74 65 6e 20 28 69 66 20 69 74 20 69  written (if it i
11dd0 73 20 74 68 65 20 0a 20 20 63 6f 6d 70 72 65 73  s the .  compres
11de0 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
11df0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 29 2e  does not exist).
11e00 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
11e10 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
11e20 46 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20  FTS4 table that 
11e30 73 74 6f 72 65 73 20 64 61 74 61 20 69 6e 20 63  stores data in c
11e40 6f 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 2e 20  ompressed form. 
11e50 54 68 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  This</i>.  <i>--
11e60 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
11e70 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  e scalar functio
11e80 6e 73 20 7a 69 70 28 29 20 61 6e 64 20 75 6e 7a  ns zip() and unz
11e90 69 70 28 29 20 68 61 76 65 20 62 65 65 6e 20 28  ip() have been (
11ea0 6f 72 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77  or</i>.  <i>-- w
11eb0 69 6c 6c 20 62 65 29 20 61 64 64 65 64 20 74 6f  ill be) added to
11ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11ed0 6e 64 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  ndle.</i>.  CREA
11ee0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
11ef0 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74   papers USING ft
11f00 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d  s4(author, docum
11f10 65 6e 74 2c 20 63 6f 6d 70 72 65 73 73 3d 7a 69  ent, compress=zi
11f20 70 2c 20 75 6e 63 6f 6d 70 72 65 73 73 3d 75 6e  p, uncompress=un
11f30 7a 69 70 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  zip);.</codebloc
11f40 6b 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 69  k>..<p>.  When i
11f50 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
11f60 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75 6e 63  compress and unc
11f70 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e  ompress function
11f80 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
11f90 74 20 74 6f 0a 20 20 70 61 79 20 61 74 74 65 6e  t to.  pay atten
11fa0 74 69 6f 6e 20 74 6f 20 64 61 74 61 20 74 79 70  tion to data typ
11fb0 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  es. Specifically
11fc0 2c 20 77 68 65 6e 20 61 20 75 73 65 72 20 72 65  , when a user re
11fd0 61 64 73 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  ads a value from
11fe0 0a 20 20 61 20 63 6f 6d 70 72 65 73 73 65 64 20  .  a compressed 
11ff0 46 54 53 20 74 61 62 6c 65 2c 20 74 68 65 20 76  FTS table, the v
12000 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12010 20 46 54 53 20 69 73 20 65 78 61 63 74 6c 79 20   FTS is exactly 
12020 74 68 65 20 73 61 6d 65 0a 20 20 61 73 20 74 68  the same.  as th
12030 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12040 20 62 79 20 74 68 65 20 75 6e 63 6f 6d 70 72 65   by the uncompre
12050 73 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 63  ss function, inc
12060 6c 75 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  luding the data 
12070 74 79 70 65 2e 0a 20 20 49 66 20 74 68 61 74 20  type..  If that 
12080 64 61 74 61 20 74 79 70 65 20 69 73 20 6e 6f 74  data type is not
12090 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
120a0 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 74 68   data type of th
120b0 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  e original value
120c0 20 61 73 0a 20 20 70 61 73 73 65 64 20 74 6f 20   as.  passed to 
120d0 74 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e  the compress fun
120e0 63 74 69 6f 6e 20 28 66 6f 72 20 65 78 61 6d 70  ction (for examp
120f0 6c 65 20 69 66 20 74 68 65 20 75 6e 63 6f 6d 70  le if the uncomp
12100 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  ress function is
12110 0a 20 20 72 65 74 75 72 6e 69 6e 67 20 42 4c 4f  .  returning BLO
12120 42 20 77 68 65 6e 20 63 6f 6d 70 72 65 73 73 20  B when compress 
12130 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70  was originally p
12140 61 73 73 65 64 20 54 45 58 54 29 2c 20 74 68 65  assed TEXT), the
12150 6e 20 74 68 65 20 75 73 65 72 73 0a 20 20 71 75  n the users.  qu
12160 65 72 79 20 6d 61 79 20 6e 6f 74 20 66 75 6e 63  ery may not func
12170 74 69 6f 6e 20 61 73 20 65 78 70 65 63 74 65 64  tion as expected
12180 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
12190 65 6e 74 20 2a 66 74 73 34 63 6f 6e 74 65 6e 74  ent *fts4content
121a0 20 7b 46 54 53 34 20 63 6f 6e 74 65 6e 74 20 6f   {FTS4 content o
121b0 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32  ption}</tcl>.<h2
121c0 20 74 61 67 73 3d 22 66 74 73 34 20 63 6f 6e 74   tags="fts4 cont
121d0 65 6e 74 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20  ent option">The 
121e0 63 6f 6e 74 65 6e 74 3d 20 6f 70 74 69 6f 6e 20  content= option 
121f0 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h2>..<p>.  The
12200 20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 20   content option 
12210 61 6c 6c 6f 77 73 20 46 54 53 34 20 74 6f 20 66  allows FTS4 to f
12220 6f 72 65 67 6f 20 73 74 6f 72 69 6e 67 20 74 68  orego storing th
12230 65 20 74 65 78 74 20 62 65 69 6e 67 20 69 6e 64  e text being ind
12240 65 78 65 64 2e 0a 20 20 54 68 65 20 63 6f 6e 74  exed..  The cont
12250 65 6e 74 20 6f 70 74 69 6f 6e 20 63 61 6e 20 62  ent option can b
12260 65 20 75 73 65 64 20 69 6e 20 74 77 6f 20 77 61  e used in two wa
12270 79 73 3a 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c 70  ys:..<ul>.<li><p
12280 3e 20 54 68 65 20 69 6e 64 65 78 65 64 20 64 6f  > The indexed do
12290 63 75 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  cuments are not 
122a0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
122b0 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
122c0 65 20 0a 20 20 20 20 20 20 20 20 61 74 20 61 6c  e .        at al
122d0 6c 20 28 61 20 22 63 6f 6e 74 65 6e 74 6c 65 73  l (a "contentles
122e0 73 22 20 46 54 53 34 20 74 61 62 6c 65 29 2c 20  s" FTS4 table), 
122f0 6f 72 0a 0a 3c 6c 69 3e 3c 70 3e 20 54 68 65 20  or..<li><p> The 
12300 69 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74  indexed document
12310 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
12320 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
12330 20 63 72 65 61 74 65 64 20 61 6e 64 0a 20 20 20   created and.   
12340 20 20 20 20 20 6d 61 6e 61 67 65 64 20 62 79 20       managed by 
12350 74 68 65 20 75 73 65 72 20 28 61 6e 20 22 65 78  the user (an "ex
12360 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 22 20  ternal content" 
12370 46 54 53 34 20 74 61 62 6c 65 29 2e 0a 3c 2f 75  FTS4 table)..</u
12380 6c 3e 0a 0a 3c 70 3e 0a 20 20 42 65 63 61 75 73  l>..<p>.  Becaus
12390 65 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 6f  e the indexed do
123a0 63 75 6d 65 6e 74 73 20 74 68 65 6d 73 65 6c 76  cuments themselv
123b0 65 73 20 61 72 65 20 75 73 75 61 6c 6c 79 20 6d  es are usually m
123c0 75 63 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20  uch larger than 
123d0 0a 20 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  .  the full-text
123e0 20 69 6e 64 65 78 2c 20 74 68 65 20 63 6f 6e 74   index, the cont
123f0 65 6e 74 20 6f 70 74 69 6f 6e 20 63 61 6e 20 62  ent option can b
12400 65 20 75 73 65 64 20 74 6f 20 61 63 68 69 65 76  e used to achiev
12410 65 20 0a 20 20 73 69 67 6e 69 66 69 63 61 6e 74  e .  significant
12420 20 73 70 61 63 65 20 73 61 76 69 6e 67 73 2e 0a   space savings..
12430 0a 3c 68 33 20 74 61 67 73 3d 22 63 6f 6e 74 65  .<h3 tags="conte
12440 6e 74 6c 65 73 73 20 66 74 73 34 20 74 61 62 6c  ntless fts4 tabl
12450 65 73 22 3e 20 43 6f 6e 74 65 6e 74 6c 65 73 73  es"> Contentless
12460 20 46 54 53 34 20 54 61 62 6c 65 73 20 3c 2f 68   FTS4 Tables </h
12470 33 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 6f 72 64  3>..<p>.  In ord
12480 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  er to create an 
12490 46 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20  FTS4 table that 
124a0 64 6f 65 73 20 6e 6f 74 20 73 74 6f 72 65 20 61  does not store a
124b0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 64   copy of the ind
124c0 65 78 65 64 0a 20 20 64 6f 63 75 6d 65 6e 74 73  exed.  documents
124d0 20 61 74 20 61 6c 6c 2c 20 74 68 65 20 63 6f 6e   at all, the con
124e0 74 65 6e 74 20 6f 70 74 69 6f 6e 20 73 68 6f 75  tent option shou
124f0 6c 64 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ld be set to an 
12500 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  empty string..  
12510 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
12520 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 63   following SQL c
12530 72 65 61 74 65 73 20 73 75 63 68 20 61 6e 20 46  reates such an F
12540 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74  TS4 table with t
12550 68 72 65 65 0a 20 20 63 6f 6c 75 6d 6e 73 20 2d  hree.  columns -
12560 20 22 61 22 2c 20 22 62 22 2c 20 61 6e 64 20 22   "a", "b", and "
12570 63 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  c":..<codeblock>
12580 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
12590 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
125a0 20 66 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22 22   fts4(content=""
125b0 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 3c 2f 63 6f  , a, b, c);.</co
125c0 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
125d0 44 61 74 61 20 63 61 6e 20 62 65 20 69 6e 73 65  Data can be inse
125e0 72 74 65 64 20 69 6e 74 6f 20 73 75 63 68 20 61  rted into such a
125f0 6e 20 46 54 53 34 20 74 61 62 6c 65 20 75 73 69  n FTS4 table usi
12600 6e 67 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61  ng an INSERT sta
12610 74 65 6d 65 6e 74 73 2e 0a 20 20 48 6f 77 65 76  tements..  Howev
12620 65 72 2c 20 75 6e 6c 69 6b 65 20 6f 72 64 69 6e  er, unlike ordin
12630 61 72 79 20 46 54 53 34 20 74 61 62 6c 65 73 2c  ary FTS4 tables,
12640 20 74 68 65 20 75 73 65 72 20 6d 75 73 74 20 73   the user must s
12650 75 70 70 6c 79 20 61 6e 20 65 78 70 6c 69 63 69  upply an explici
12660 74 0a 20 20 69 6e 74 65 67 65 72 20 64 6f 63 69  t.  integer doci
12670 64 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61  d value. For exa
12680 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
12690 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20  k>.  <i>-- This 
126a0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 4f 6b 3a  statement is Ok:
126b0 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
126c0 54 4f 20 74 31 28 64 6f 63 69 64 2c 20 61 2c 20  TO t1(docid, a, 
126d0 62 2c 20 63 29 20 56 41 4c 55 45 53 28 31 2c 20  b, c) VALUES(1, 
126e0 27 61 20 62 20 63 27 2c 20 27 64 20 65 20 66 27  'a b c', 'd e f'
126f0 2c 20 27 67 20 68 20 69 27 29 3b 0a 0a 20 20 3c  , 'g h i');..  <
12700 69 3e 2d 2d 20 54 68 69 73 20 73 74 61 74 65 6d  i>-- This statem
12710 65 6e 74 20 63 61 75 73 65 73 20 61 6e 20 65 72  ent causes an er
12720 72 6f 72 2c 20 61 73 20 6e 6f 20 64 6f 63 69 64  ror, as no docid
12730 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
12740 70 72 6f 76 69 64 65 64 3a 3c 2f 69 3e 0a 20 20  provided:</i>.  
12750 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
12760 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28 27  , b, c) VALUES('
12770 6a 20 6b 20 6c 27 2c 20 27 6d 20 6e 20 6f 27 2c  j k l', 'm n o',
12780 20 27 70 20 71 20 72 27 29 3b 0a 3c 2f 63 6f 64   'p q r');.</cod
12790 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49  eblock>..<p>.  I
127a0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
127b0 65 20 74 6f 20 55 50 44 41 54 45 20 6f 72 20 44  e to UPDATE or D
127c0 45 4c 45 54 45 20 61 20 72 6f 77 20 73 74 6f 72  ELETE a row stor
127d0 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 6e 74 6c  ed in a contentl
127e0 65 73 73 20 46 54 53 34 0a 20 20 74 61 62 6c 65  ess FTS4.  table
127f0 2e 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  . Attempting to 
12800 64 6f 20 73 6f 20 69 73 20 61 6e 20 65 72 72 6f  do so is an erro
12810 72 2e 0a 0a 3c 70 3e 0a 20 20 43 6f 6e 74 65 6e  r...<p>.  Conten
12820 74 6c 65 73 73 20 46 54 53 34 20 74 61 62 6c 65  tless FTS4 table
12830 73 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 53  s also support S
12840 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12850 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 69 73  . However, it is
12860 0a 20 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 61  .  an error to a
12870 74 74 65 6d 70 74 20 74 6f 20 72 65 74 72 69 65  ttempt to retrie
12880 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ve the value of 
12890 61 6e 79 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  any table column
128a0 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 74 68   other than.  th
128b0 65 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20  e docid column. 
128c0 54 68 65 20 61 75 78 69 6c 69 61 72 79 20 66 75  The auxiliary fu
128d0 6e 63 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f  nction matchinfo
128e0 28 29 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20  () may be used, 
128f0 62 75 74 0a 20 20 73 6e 69 70 70 65 74 28 29 20  but.  snippet() 
12900 61 6e 64 20 6f 66 66 73 65 74 73 28 29 20 6d 61  and offsets() ma
12910 79 20 6e 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70  y not. For examp
12920 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
12930 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
12940 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
12950 73 20 61 72 65 20 4f 6b 3a 3c 2f 69 3e 0a 20 20  s are Ok:</i>.  
12960 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
12970 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
12980 54 43 48 20 27 78 78 78 27 3b 0a 20 20 53 45 4c  TCH 'xxx';.  SEL
12990 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74  ECT docid FROM t
129a0 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20  1 WHERE a MATCH 
129b0 27 78 78 78 27 3b 0a 20 20 53 45 4c 45 43 54 20  'xxx';.  SELECT 
129c0 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 20 46 52  matchinfo(t1) FR
129d0 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
129e0 41 54 43 48 20 27 78 78 78 27 3b 0a 0a 20 20 3c  ATCH 'xxx';..  <
129f0 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
12a00 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c  ng statements al
12a10 6c 20 63 61 75 73 65 20 65 72 72 6f 72 73 2c 20  l cause errors, 
12a20 61 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  as the value of 
12a30 63 6f 6c 75 6d 6e 73 3c 2f 69 3e 0a 20 20 3c 69  columns</i>.  <i
12a40 3e 2d 2d 20 6f 74 68 65 72 20 74 68 61 6e 20 64  >-- other than d
12a50 6f 63 69 64 20 61 72 65 20 72 65 71 75 69 72 65  ocid are require
12a60 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  d to evaluate th
12a70 65 6d 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  em.</i>.  SELECT
12a80 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
12a90 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
12aa0 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
12ab0 20 27 78 78 78 27 3b 0a 20 20 53 45 4c 45 43 54   'xxx';.  SELECT
12ac0 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57   docid FROM t1 W
12ad0 48 45 52 45 20 61 20 4c 49 4b 45 20 27 78 78 78  HERE a LIKE 'xxx
12ae0 25 27 3b 0a 20 20 53 45 4c 45 43 54 20 73 6e 69  %';.  SELECT sni
12af0 70 70 65 74 28 74 31 29 20 46 52 4f 4d 20 74 31  ppet(t1) FROM t1
12b00 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
12b10 27 78 78 78 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  'xxx';.</codeblo
12b20 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 45 72 72 6f 72  ck>..<p>.  Error
12b30 73 20 72 65 6c 61 74 65 64 20 74 6f 20 61 74 74  s related to att
12b40 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 74 72 69  empting to retri
12b50 65 76 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  eve column value
12b60 73 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63  s other than doc
12b70 69 64 0a 20 20 61 72 65 20 72 75 6e 74 69 6d 65  id.  are runtime
12b80 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
12b90 75 72 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65  ur within sqlite
12ba0 33 5f 73 74 65 70 28 29 2e 20 49 6e 20 73 6f 6d  3_step(). In som
12bb0 65 20 63 61 73 65 73 2c 20 66 6f 72 0a 20 20 65  e cases, for.  e
12bc0 78 61 6d 70 6c 65 20 69 66 20 74 68 65 20 4d 41  xample if the MA
12bd0 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 69  TCH expression i
12be0 6e 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79  n a SELECT query
12bf0 20 6d 61 74 63 68 65 73 20 7a 65 72 6f 20 72 6f   matches zero ro
12c00 77 73 2c 20 74 68 65 72 65 0a 20 20 6d 61 79 20  ws, there.  may 
12c10 62 65 20 6e 6f 20 65 72 72 6f 72 20 61 74 20 61  be no error at a
12c20 6c 6c 20 65 76 65 6e 20 69 66 20 61 20 73 74 61  ll even if a sta
12c30 74 65 6d 65 6e 74 20 64 6f 65 73 20 72 65 66 65  tement does refe
12c40 72 20 74 6f 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  r to column valu
12c50 65 73 20 0a 20 20 6f 74 68 65 72 20 74 68 61 6e  es .  other than
12c60 20 64 6f 63 69 64 2e 0a 0a 3c 68 33 20 74 61 67   docid...<h3 tag
12c70 73 3d 22 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74  s="external cont
12c80 65 6e 74 20 66 74 73 34 20 74 61 62 6c 65 73 22  ent fts4 tables"
12c90 3e 20 45 78 74 65 72 6e 61 6c 20 43 6f 6e 74 65  > External Conte
12ca0 6e 74 20 46 54 53 34 20 54 61 62 6c 65 73 20 3c  nt FTS4 Tables <
12cb0 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 22  /h3>..<p>.  An "
12cc0 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74  external content
12cd0 22 20 46 54 53 34 20 74 61 62 6c 65 20 69 73 20  " FTS4 table is 
12ce0 73 69 6d 69 6c 61 72 20 74 6f 20 61 20 63 6f 6e  similar to a con
12cf0 74 65 6e 74 6c 65 73 73 20 74 61 62 6c 65 2c 20  tentless table, 
12d00 65 78 63 65 70 74 0a 20 20 74 68 61 74 20 69 66  except.  that if
12d10 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 61   evaluation of a
12d20 20 71 75 65 72 79 20 72 65 71 75 69 72 65 73 20   query requires 
12d30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 63  the value of a c
12d40 6f 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e  olumn other than
12d50 20 0a 20 20 64 6f 63 69 64 2c 20 46 54 53 34 20   .  docid, FTS4 
12d60 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 74 72  attempts to retr
12d70 69 65 76 65 20 74 68 61 74 20 76 61 6c 75 65 20  ieve that value 
12d80 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 28 6f 72  from a table (or
12d90 20 76 69 65 77 2c 20 6f 72 20 0a 20 20 76 69 72   view, or .  vir
12da0 74 75 61 6c 20 74 61 62 6c 65 29 20 6e 6f 6d 69  tual table) nomi
12db0 6e 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  nated by the use
12dc0 72 20 28 68 65 72 65 61 66 74 65 72 20 72 65 66  r (hereafter ref
12dd0 65 72 72 65 64 20 74 6f 20 61 73 20 74 68 65 20  erred to as the 
12de0 22 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62 6c 65  "content.  table
12df0 22 29 2e 20 54 68 65 20 46 54 53 34 20 6d 6f 64  "). The FTS4 mod
12e00 75 6c 65 20 6e 65 76 65 72 20 77 72 69 74 65 73  ule never writes
12e10 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
12e20 74 61 62 6c 65 2c 20 61 6e 64 20 77 72 69 74 69  table, and writi
12e30 6e 67 0a 20 20 74 6f 20 74 68 65 20 63 6f 6e 74  ng.  to the cont
12e40 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  ent table does n
12e50 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 66 75  ot affect the fu
12e60 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 49  ll-text index. I
12e70 74 20 69 73 20 74 68 65 0a 20 20 72 65 73 70 6f  t is the.  respo
12e80 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12e90 20 75 73 65 72 20 74 6f 20 65 6e 73 75 72 65 20   user to ensure 
12ea0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12eb0 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 0a   table and the .
12ec0 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65    full-text inde
12ed0 78 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74  x are consistent
12ee0 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 78 74 65  ...<p>.  An exte
12ef0 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 46 54 53  rnal content FTS
12f00 34 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  4 table is creat
12f10 65 64 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  ed by setting th
12f20 65 20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e  e content option
12f30 0a 20 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f  .  to the name o
12f40 66 20 61 20 74 61 62 6c 65 20 28 6f 72 20 76 69  f a table (or vi
12f50 65 77 2c 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ew, or virtual t
12f60 61 62 6c 65 29 20 74 68 61 74 20 6d 61 79 20 62  able) that may b
12f70 65 20 71 75 65 72 69 65 64 20 62 79 0a 20 20 46  e queried by.  F
12f80 54 53 34 20 74 6f 20 72 65 74 72 69 65 76 65 20  TS4 to retrieve 
12f90 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 77 68  column values wh
12fa0 65 6e 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  en required. If 
12fb0 74 68 65 20 6e 6f 6d 69 6e 61 74 65 64 20 74 61  the nominated ta
12fc0 62 6c 65 20 64 6f 65 73 0a 20 20 6e 6f 74 20 65  ble does.  not e
12fd0 78 69 73 74 2c 20 74 68 65 6e 20 61 6e 20 65 78  xist, then an ex
12fe0 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 74  ternal content t
12ff0 61 62 6c 65 20 62 65 68 61 76 65 73 20 69 6e 20  able behaves in 
13000 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 0a  the same way as.
13010 20 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20    a contentless 
13020 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70  table. For examp
13030 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
13040 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
13050 74 32 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  t2(id INTEGER PR
13060 49 4d 41 52 59 20 4b 45 59 2c 20 61 2c 20 62 2c  IMARY KEY, a, b,
13070 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49   c);.  CREATE VI
13080 52 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20 55  RTUAL TABLE t3 U
13090 53 49 4e 47 20 66 74 73 34 28 63 6f 6e 74 65 6e  SING fts4(conten
130a0 74 3d 22 74 32 22 2c 20 61 2c 20 63 29 3b 0a 3c  t="t2", a, c);.<
130b0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
130c0 0a 20 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  .  Assuming the 
130d0 6e 6f 6d 69 6e 61 74 65 64 20 74 61 62 6c 65 20  nominated table 
130e0 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e  does exist, then
130f0 20 69 74 73 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   its columns mus
13100 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 0a 20  t be the same . 
13110 20 61 73 20 6f 72 20 61 20 73 75 70 65 72 73 65   as or a superse
13120 74 20 6f 66 20 74 68 6f 73 65 20 64 65 66 69 6e  t of those defin
13130 65 64 20 66 6f 72 20 74 68 65 20 46 54 53 20 74  ed for the FTS t
13140 61 62 6c 65 2e 20 20 54 68 65 20 65 78 74 65 72  able.  The exter
13150 6e 61 6c 20 74 61 62 6c 65 0a 20 20 6d 75 73 74  nal table.  must
13160 20 61 6c 73 6f 20 62 65 20 69 6e 20 74 68 65 20   also be in the 
13170 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
13180 6c 65 20 61 73 20 74 68 65 20 46 54 53 20 74 61  le as the FTS ta
13190 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
131a0 6f 72 64 73 2c 0a 20 20 54 68 65 20 65 78 74 65  ords,.  The exte
131b0 72 6e 61 6c 20 74 61 62 6c 65 20 63 61 6e 6e 6f  rnal table canno
131c0 74 20 62 65 20 69 6e 20 61 20 64 69 66 66 65 72  t be in a differ
131d0 65 6e 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  ent database fil
131e0 65 20 63 6f 6e 6e 65 63 74 65 64 20 75 73 69 6e  e connected usin
131f0 67 0a 20 20 5b 41 54 54 41 43 48 5d 20 6e 6f 72  g.  [ATTACH] nor
13200 20 6d 61 79 20 6f 6e 65 20 6f 66 20 74 68 65 20   may one of the 
13210 46 54 53 20 74 61 62 6c 65 20 61 6e 64 20 74 68  FTS table and th
13220 65 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65  e external conte
13230 6e 74 20 62 65 20 69 6e 20 74 68 65 0a 20 20 54  nt be in the.  T
13240 45 4d 50 20 64 61 74 61 62 61 73 65 20 77 68 65  EMP database whe
13250 6e 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 69  n the other is i
13260 6e 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 64  n a persistent d
13270 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 75 63  atabase file suc
13280 68 20 61 73 20 4d 41 49 4e 2e 0a 0a 3c 70 3e 0a  h as MAIN...<p>.
13290 20 20 57 68 65 6e 20 61 20 75 73 65 72 73 20 71    When a users q
132a0 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 20  uery on the FTS 
132b0 74 61 62 6c 65 20 72 65 71 75 69 72 65 73 20 61  table requires a
132c0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 74   column value ot
132d0 68 65 72 20 74 68 61 6e 0a 20 20 64 6f 63 69 64  her than.  docid
132e0 2c 20 46 54 53 20 61 74 74 65 6d 70 74 73 20 74  , FTS attempts t
132f0 6f 20 72 65 61 64 20 74 68 65 20 72 65 71 75 65  o read the reque
13300 73 74 65 64 20 76 61 6c 75 65 20 66 72 6f 6d 20  sted value from 
13310 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
13320 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 20 20 74 68  g column of.  th
13330 65 20 72 6f 77 20 69 6e 20 74 68 65 20 63 6f 6e  e row in the con
13340 74 65 6e 74 20 74 61 62 6c 65 20 77 69 74 68 20  tent table with 
13350 61 20 72 6f 77 69 64 20 76 61 6c 75 65 20 65 71  a rowid value eq
13360 75 61 6c 20 74 6f 20 74 68 65 20 63 75 72 72 65  ual to the curre
13370 6e 74 20 46 54 53 0a 20 20 64 6f 63 69 64 2e 20  nt FTS.  docid. 
13380 4f 72 2c 20 69 66 20 73 75 63 68 20 61 20 72 6f  Or, if such a ro
13390 77 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  w cannot be foun
133a0 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
133b0 20 74 61 62 6c 65 2c 20 61 20 4e 55 4c 4c 0a 20   table, a NULL. 
133c0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 69   value is used i
133d0 6e 73 74 65 61 64 2e 20 46 6f 72 20 65 78 61 6d  nstead. For exam
133e0 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
133f0 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  >.  CREATE TABLE
13400 20 74 32 28 69 64 20 49 4e 54 45 47 45 52 20 50   t2(id INTEGER P
13410 52 49 4d 41 52 59 20 4b 45 59 2c 20 61 2c 20 62  RIMARY KEY, a, b
13420 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 56  , c);.  CREATE V
13430 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20  IRTUAL TABLE t3 
13440 55 53 49 4e 47 20 66 74 73 34 28 63 6f 6e 74 65  USING fts4(conte
13450 6e 74 3d 22 74 32 22 2c 20 62 2c 20 63 29 3b 0a  nt="t2", b, c);.
13460 20 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f    .  INSERT INTO
13470 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 27 61   t2 VALUES(2, 'a
13480 20 62 27 2c 20 27 63 20 64 27 2c 20 27 65 20 66   b', 'c d', 'e f
13490 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
134a0 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 27  O t2 VALUES(3, '
134b0 67 20 68 27 2c 20 27 69 20 6a 27 2c 20 27 6b 20  g h', 'i j', 'k 
134c0 6c 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  l');.  INSERT IN
134d0 54 4f 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20  TO t3(docid, b, 
134e0 63 29 20 53 45 4c 45 43 54 20 69 64 2c 20 62 2c  c) SELECT id, b,
134f0 20 63 20 46 52 4f 4d 20 74 32 3b 0a 20 20 3c 69   c FROM t2;.  <i
13500 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
13510 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  g query returns 
13520 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74  a single row wit
13530 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 63 6f  h two columns co
13540 6e 74 61 69 6e 69 6e 67 0a 20 20 2d 2d 20 74 68  ntaining.  -- th
13550 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 22 69  e text values "i
13560 20 6a 22 20 61 6e 64 20 22 6b 20 6c 22 2e 0a 20   j" and "k l".. 
13570 20 2d 2d 0a 20 20 2d 2d 20 54 68 65 20 71 75 65   --.  -- The que
13580 72 79 20 75 73 65 73 20 74 68 65 20 66 75 6c 6c  ry uses the full
13590 2d 74 65 78 74 20 69 6e 64 65 78 20 74 6f 20 64  -text index to d
135a0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
135b0 20 4d 41 54 43 48 20 0a 20 20 2d 2d 20 74 65 72   MATCH .  -- ter
135c0 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 6f  m matches the ro
135d0 77 20 77 69 74 68 20 64 6f 63 69 64 3d 33 2e 20  w with docid=3. 
135e0 49 74 20 74 68 65 6e 20 72 65 74 72 69 65 76 65  It then retrieve
135f0 73 20 74 68 65 20 76 61 6c 75 65 73 0a 20 20 2d  s the values.  -
13600 2d 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 20 61  - of columns b a
13610 6e 64 20 63 20 66 72 6f 6d 20 74 68 65 20 72 6f  nd c from the ro
13620 77 20 77 69 74 68 20 72 6f 77 69 64 3d 33 20 69  w with rowid=3 i
13630 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  n the content ta
13640 62 6c 65 0a 20 20 2d 2d 20 74 6f 20 72 65 74 75  ble.  -- to retu
13650 72 6e 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 53  rn..  --</i>.  S
13660 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
13670 57 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27  WHERE t3 MATCH '
13680 6b 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 46 6f 6c  k';..  <i>-- Fol
13690 6c 6f 77 69 6e 67 20 74 68 65 20 55 50 44 41 54  lowing the UPDAT
136a0 45 2c 20 74 68 65 20 71 75 65 72 79 20 73 74 69  E, the query sti
136b0 6c 6c 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e  ll returns a sin
136c0 67 6c 65 20 72 6f 77 2c 20 74 68 69 73 0a 20 20  gle row, this.  
136d0 2d 2d 20 74 69 6d 65 20 63 6f 6e 74 61 69 6e 69  -- time containi
136e0 6e 67 20 74 68 65 20 74 65 78 74 20 76 61 6c 75  ng the text valu
136f0 65 73 20 22 78 78 78 22 20 61 6e 64 20 22 79 79  es "xxx" and "yy
13700 79 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  y". This is beca
13710 75 73 65 20 74 68 65 0a 20 20 2d 2d 20 66 75 6c  use the.  -- ful
13720 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 73 74 69  l-text index sti
13730 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ll indicates tha
13740 74 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 64  t the row with d
13750 6f 63 69 64 3d 33 20 6d 61 74 63 68 65 73 0a 20  ocid=3 matches. 
13760 20 2d 2d 20 74 68 65 20 46 54 53 34 20 71 75 65   -- the FTS4 que
13770 72 79 20 27 6b 27 2c 20 65 76 65 6e 20 74 68 6f  ry 'k', even tho
13780 75 67 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  ugh the document
13790 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
137a0 63 6f 6e 74 65 6e 74 0a 20 20 2d 2d 20 74 61 62  content.  -- tab
137b0 6c 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  le have been mod
137c0 69 66 69 65 64 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a  ified..  --</i>.
137d0 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20    UPDATE t2 SET 
137e0 62 20 3d 20 27 78 78 78 27 2c 20 63 20 3d 20 27  b = 'xxx', c = '
137f0 79 79 79 27 20 57 48 45 52 45 20 72 6f 77 69 64  yyy' WHERE rowid
13800 20 3d 20 33 3b 0a 20 20 53 45 4c 45 43 54 20 2a   = 3;.  SELECT *
13810 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 74   FROM t3 WHERE t
13820 33 20 4d 41 54 43 48 20 27 6b 27 3b 0a 0a 20 20  3 MATCH 'k';..  
13830 3c 69 3e 2d 2d 20 46 6f 6c 6c 6f 77 69 6e 67 20  <i>-- Following 
13840 74 68 65 20 44 45 4c 45 54 45 20 62 65 6c 6f 77  the DELETE below
13850 2c 20 74 68 65 20 71 75 65 72 79 20 72 65 74 75  , the query retu
13860 72 6e 73 20 6f 6e 65 20 72 6f 77 20 63 6f 6e 74  rns one row cont
13870 61 69 6e 69 6e 67 20 74 77 6f 0a 20 20 2d 2d 20  aining two.  -- 
13880 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 4e 55 4c  NULL values. NUL
13890 4c 20 76 61 6c 75 65 73 20 61 72 65 20 72 65 74  L values are ret
138a0 75 72 6e 65 64 20 62 65 63 61 75 73 65 20 46 54  urned because FT
138b0 53 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 66  S is unable to f
138c0 69 6e 64 0a 20 20 2d 2d 20 61 20 72 6f 77 20 77  ind.  -- a row w
138d0 69 74 68 20 72 6f 77 69 64 3d 33 20 77 69 74 68  ith rowid=3 with
138e0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  in the content t
138f0 61 62 6c 65 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20  able..  --</i>. 
13900 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b   DELETE FROM t2;
13910 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
13920 20 74 33 20 57 48 45 52 45 20 74 33 20 4d 41 54   t3 WHERE t3 MAT
13930 43 48 20 27 6b 27 3b 0a 3c 2f 63 6f 64 65 62 6c  CH 'k';.</codebl
13940 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e  ock>..<p>.  When
13950 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65   a row is delete
13960 64 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  d from an extern
13970 61 6c 20 63 6f 6e 74 65 6e 74 20 46 54 53 34 20  al content FTS4 
13980 74 61 62 6c 65 2c 20 46 54 53 34 20 6e 65 65 64  table, FTS4 need
13990 73 20 74 6f 0a 20 20 72 65 74 72 69 65 76 65 20  s to.  retrieve 
139a0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
139b0 73 20 6f 66 20 74 68 65 20 72 6f 77 20 62 65 69  s of the row bei
139c0 6e 67 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  ng deleted from 
139d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
139e0 65 2e 0a 20 20 54 68 69 73 20 69 73 20 73 6f 20  e..  This is so 
139f0 74 68 61 74 20 46 54 53 34 20 63 61 6e 20 75 70  that FTS4 can up
13a00 64 61 74 65 20 74 68 65 20 66 75 6c 6c 2d 74 65  date the full-te
13a10 78 74 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  xt index entries
13a20 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 0a   for each token.
13a30 20 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 69    that occurs wi
13a40 74 68 69 6e 20 74 68 65 20 64 65 6c 65 74 65 64  thin the deleted
13a50 20 72 6f 77 20 74 6f 20 69 6e 64 69 63 61 74 65   row to indicate
13a60 20 74 68 61 74 20 72 6f 77 20 68 61 73 20 62 65   that row has be
13a70 65 6e 20 0a 20 20 64 65 6c 65 74 65 64 2e 20 49  en .  deleted. I
13a80 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  f the content ta
13a90 62 6c 65 20 72 6f 77 20 63 61 6e 6e 6f 74 20 62  ble row cannot b
13aa0 65 20 66 6f 75 6e 64 2c 20 6f 72 20 69 66 20 69  e found, or if i
13ab0 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65  t contains value
13ac0 73 0a 20 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  s.  inconsistent
13ad0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
13ae0 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
13af0 64 65 78 2c 20 74 68 65 20 72 65 73 75 6c 74 73  dex, the results
13b00 20 63 61 6e 20 62 65 20 64 69 66 66 69 63 75 6c   can be difficul
13b10 74 0a 20 20 74 6f 20 70 72 65 64 69 63 74 2e 20  t.  to predict. 
13b20 54 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d 61  The FTS index ma
13b30 79 20 62 65 20 6c 65 66 74 20 63 6f 6e 74 61 69  y be left contai
13b40 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 63 6f 72  ning entries cor
13b50 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
13b60 65 0a 20 20 64 65 6c 65 74 65 64 20 72 6f 77 2c  e.  deleted row,
13b70 20 77 68 69 63 68 20 63 61 6e 20 6c 65 61 64 20   which can lead 
13b80 74 6f 20 73 65 65 6d 69 6e 67 6c 79 20 6e 6f 6e  to seemingly non
13b90 73 65 6e 73 69 63 61 6c 20 72 65 73 75 6c 74 73  sensical results
13ba0 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 0a   being returned.
13bb0 20 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20    by subsequent 
13bc0 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 2e 20  SELECT queries. 
13bd0 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
13be0 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 75   when a row is u
13bf0 70 64 61 74 65 64 2c 20 61 73 0a 20 20 69 6e 74  pdated, as.  int
13c00 65 72 6e 61 6c 6c 79 20 61 6e 20 55 50 44 41 54  ernally an UPDAT
13c10 45 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  E is the same as
13c20 20 61 20 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77   a DELETE follow
13c30 65 64 20 62 79 20 61 6e 20 49 4e 53 45 52 54 2e  ed by an INSERT.
13c40 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 6d 65 61  ..<p>.  This mea
13c50 6e 73 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72  ns that in order
13c60 20 74 6f 20 6b 65 65 70 20 61 6e 20 46 54 53 20   to keep an FTS 
13c70 69 6e 20 73 79 6e 63 20 77 69 74 68 20 61 6e 20  in sync with an 
13c80 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74  external content
13c90 0a 20 20 74 61 62 6c 65 2c 20 61 6e 79 20 55 50  .  table, any UP
13ca0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f  DATE or DELETE o
13cb0 70 65 72 61 74 69 6f 6e 73 20 6d 75 73 74 20 62  perations must b
13cc0 65 20 61 70 70 6c 69 65 64 20 66 69 72 73 74 20  e applied first 
13cd0 74 6f 20 74 68 65 20 46 54 53 0a 20 20 74 61 62  to the FTS.  tab
13ce0 6c 65 2c 20 61 6e 64 20 74 68 65 6e 20 74 6f 20  le, and then to 
13cf0 74 68 65 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e  the external con
13d00 74 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20  tent table. For 
13d10 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
13d20 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54  lock>.  CREATE T
13d30 41 42 4c 45 20 74 31 5f 72 65 61 6c 28 69 64 20  ABLE t1_real(id 
13d40 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
13d50 4b 45 59 2c 20 61 2c 20 62 2c 20 63 2c 20 64 29  KEY, a, b, c, d)
13d60 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  ;.  CREATE VIRTU
13d70 41 4c 20 54 41 42 4c 45 20 74 31 5f 66 74 73 20  AL TABLE t1_fts 
13d80 55 53 49 4e 47 20 66 74 73 34 28 63 6f 6e 74 65  USING fts4(conte
13d90 6e 74 3d 22 74 31 5f 72 65 61 6c 22 2c 20 62 2c  nt="t1_real", b,
13da0 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68   c);..  <i>-- Th
13db0 69 73 20 77 6f 72 6b 73 2e 20 57 68 65 6e 20 74  is works. When t
13dc0 68 65 20 72 6f 77 20 69 73 20 72 65 6d 6f 76 65  he row is remove
13dd0 64 20 66 72 6f 6d 20 74 68 65 20 46 54 53 20 74  d from the FTS t
13de0 61 62 6c 65 2c 20 46 54 53 20 72 65 74 72 69 65  able, FTS retrie
13df0 76 65 73 20 0a 20 20 2d 2d 20 74 68 65 20 72 6f  ves .  -- the ro
13e00 77 20 77 69 74 68 20 72 6f 77 69 64 3d 31 32 33  w with rowid=123
13e10 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 65 73 20 69   and tokenizes i
13e20 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 65  t in order to de
13e30 74 65 72 6d 69 6e 65 20 74 68 65 20 65 6e 74 72  termine the entr
13e40 69 65 73 20 0a 20 20 2d 2d 20 74 68 61 74 20 6d  ies .  -- that m
13e50 75 73 74 20 62 65 20 72 65 6d 6f 76 65 64 20 66  ust be removed f
13e60 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
13e70 74 20 69 6e 64 65 78 2e 0a 20 20 2d 2d 3c 2f 69  t index..  --</i
13e80 3e 20 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  > .  DELETE FROM
13e90 20 74 31 5f 66 74 73 20 57 48 45 52 45 20 72 6f   t1_fts WHERE ro
13ea0 77 69 64 20 3d 20 31 32 33 3b 0a 20 20 44 45 4c  wid = 123;.  DEL
13eb0 45 54 45 20 46 52 4f 4d 20 74 31 5f 72 65 61 6c  ETE FROM t1_real
13ec0 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
13ed0 32 33 3b 0a 0a 20 20 2d 2d 3c 69 3e 20 54 68 69  23;..  --<i> Thi
13ee0 73 20 3c 62 3e 64 6f 65 73 20 6e 6f 74 20 77 6f  s <b>does not wo
13ef0 72 6b 3c 2f 62 3e 2e 20 42 79 20 74 68 65 20 74  rk</b>. By the t
13f00 69 6d 65 20 74 68 65 20 46 54 53 20 74 61 62 6c  ime the FTS tabl
13f10 65 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  e is updated, th
13f20 65 20 72 6f 77 0a 20 20 2d 2d 20 68 61 73 20 61  e row.  -- has a
13f30 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 6c 65  lready been dele
13f40 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
13f50 65 72 6c 79 69 6e 67 20 63 6f 6e 74 65 6e 74 20  erlying content 
13f60 74 61 62 6c 65 2e 20 41 73 20 61 20 72 65 73 75  table. As a resu
13f70 6c 74 0a 20 20 2d 2d 20 46 54 53 20 69 73 20 75  lt.  -- FTS is u
13f80 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  nable to determi
13f90 6e 65 20 74 68 65 20 65 6e 74 72 69 65 73 20 74  ne the entries t
13fa0 6f 20 72 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  o remove from th
13fb0 65 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 0a  e FTS index and.
13fc0 20 20 2d 2d 20 73 6f 20 74 68 65 20 69 6e 64 65    -- so the inde
13fd0 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 74 61  x and content ta
13fe0 62 6c 65 20 61 72 65 20 6c 65 66 74 20 6f 75 74  ble are left out
13ff0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2d 2d 3c 2f   of sync..  --</
14000 69 3e 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  i>.  DELETE FROM
14010 20 74 31 5f 72 65 61 6c 20 57 48 45 52 45 20 72   t1_real WHERE r
14020 6f 77 69 64 20 3d 20 31 32 33 3b 0a 20 20 44 45  owid = 123;.  DE
14030 4c 45 54 45 20 46 52 4f 4d 20 74 31 5f 66 74 73  LETE FROM t1_fts
14040 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
14050 32 33 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  23;.</codeblock>
14060 0a 0a 3c 70 3e 20 20 0a 20 20 49 6e 73 74 65 61  ..<p>  .  Instea
14070 64 20 6f 66 20 77 72 69 74 69 6e 67 20 73 65 70  d of writing sep
14080 61 72 61 74 65 6c 79 20 74 6f 20 74 68 65 20 66  arately to the f
14090 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61  ull-text index a
140a0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  nd the content t
140b0 61 62 6c 65 2c 0a 20 20 73 6f 6d 65 20 75 73 65  able,.  some use
140c0 72 73 20 6d 61 79 20 77 69 73 68 20 74 6f 20 75  rs may wish to u
140d0 73 65 20 64 61 74 61 62 61 73 65 20 74 72 69 67  se database trig
140e0 67 65 72 73 20 74 6f 20 6b 65 65 70 20 74 68 65  gers to keep the
140f0 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
14100 0a 20 20 75 70 20 74 6f 20 64 61 74 65 20 77 69  .  up to date wi
14110 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  th respect to th
14120 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
14130 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
14140 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a   content table..
14150 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75    For example, u
14160 73 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  sing the tables 
14170 66 72 6f 6d 20 65 61 72 6c 69 65 72 20 65 78 61  from earlier exa
14180 6d 70 6c 65 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  mples:..<codeblo
14190 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 52 49  ck>.  CREATE TRI
141a0 47 47 45 52 20 74 32 5f 62 75 20 42 45 46 4f 52  GGER t2_bu BEFOR
141b0 45 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42  E UPDATE ON t2 B
141c0 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45 20  EGIN.    DELETE 
141d0 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 64 6f  FROM t3 WHERE do
141e0 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20  cid=old.rowid;. 
141f0 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
14200 52 49 47 47 45 52 20 74 32 5f 62 64 20 42 45 46  RIGGER t2_bd BEF
14210 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 32  ORE DELETE ON t2
14220 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54   BEGIN.    DELET
14230 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  E FROM t3 WHERE 
14240 64 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b  docid=old.rowid;
14250 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54  .  END;..  CREAT
14260 45 20 54 52 49 47 47 45 52 20 74 32 5f 61 75 20  E TRIGGER t2_au 
14270 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
14280 74 32 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  t2 BEGIN.    INS
14290 45 52 54 20 49 4e 54 4f 20 74 33 28 64 6f 63 69  ERT INTO t3(doci
142a0 64 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28  d, b, c) VALUES(
142b0 6e 65 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 62  new.rowid, new.b
142c0 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 45 4e 44 3b  , new.c);.  END;
142d0 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
142e0 52 20 74 32 5f 61 69 20 41 46 54 45 52 20 49 4e  R t2_ai AFTER IN
142f0 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e  SERT ON t2 BEGIN
14300 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
14310 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20 63 29   t3(docid, b, c)
14320 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
14330 64 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29  d, new.b, new.c)
14340 3b 0a 20 20 45 4e 44 3b 0a 3c 2f 63 6f 64 65 62  ;.  END;.</codeb
14350 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
14360 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 20   DELETE trigger 
14370 6d 75 73 74 20 62 65 20 66 69 72 65 64 20 62 65  must be fired be
14380 66 6f 72 65 20 74 68 65 20 61 63 74 75 61 6c 20  fore the actual 
14390 64 65 6c 65 74 65 20 74 61 6b 65 73 20 70 6c 61  delete takes pla
143a0 63 65 0a 20 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ce.  on the cont
143b0 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ent table. This 
143c0 69 73 20 73 6f 20 74 68 61 74 20 46 54 53 34 20  is so that FTS4 
143d0 63 61 6e 20 73 74 69 6c 6c 20 72 65 74 72 69 65  can still retrie
143e0 76 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  ve the original.
143f0 20 20 76 61 6c 75 65 73 20 69 6e 20 6f 72 64 65    values in orde
14400 72 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  r to update the 
14410 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
14420 20 41 6e 64 20 74 68 65 20 49 4e 53 45 52 54 20   And the INSERT 
14430 74 72 69 67 67 65 72 20 6d 75 73 74 0a 20 20 62  trigger must.  b
14440 65 20 66 69 72 65 64 20 61 66 74 65 72 20 74 68  e fired after th
14450 65 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e 73  e new row is ins
14460 65 72 74 65 64 2c 20 73 6f 20 61 73 20 74 6f 20  erted, so as to 
14470 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
14480 77 68 65 72 65 20 74 68 65 0a 20 20 72 6f 77 69  where the.  rowi
14490 64 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 75  d is assigned au
144a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 69 74 68  tomatically with
144b0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 54  in the system. T
144c0 68 65 20 55 50 44 41 54 45 20 74 72 69 67 67 65  he UPDATE trigge
144d0 72 20 6d 75 73 74 0a 20 20 62 65 20 73 70 6c 69  r must.  be spli
144e0 74 20 69 6e 74 6f 20 74 77 6f 20 70 61 72 74 73  t into two parts
144f0 2c 20 6f 6e 65 20 66 69 72 65 64 20 62 65 66 6f  , one fired befo
14500 72 65 20 61 6e 64 20 6f 6e 65 20 61 66 74 65 72  re and one after
14510 20 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 74   the update of t
14520 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20 74 61 62  he.  content tab
14530 6c 65 2c 20 66 6f 72 20 74 68 65 20 73 61 6d 65  le, for the same
14540 20 72 65 61 73 6f 6e 73 2e 0a 0a 3c 70 3e 0a 20   reasons...<p>. 
14550 20 54 68 65 20 5b 46 54 53 34 20 22 72 65 62 75   The [FTS4 "rebu
14560 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 5d 0a 20 20  ild" command].  
14570 64 65 6c 65 74 65 73 20 74 68 65 20 65 6e 74 69  deletes the enti
14580 72 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  re full-text ind
14590 65 78 20 61 6e 64 20 72 65 62 75 69 6c 64 73 20  ex and rebuilds 
145a0 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  it based on the 
145b0 63 75 72 72 65 6e 74 0a 20 20 73 65 74 20 6f 66  current.  set of
145c0 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68   documents in th
145d0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  e content table.
145e0 20 41 73 73 75 6d 69 6e 67 20 61 67 61 69 6e 20   Assuming again 
145f0 74 68 61 74 20 22 74 33 22 20 69 73 20 74 68 65  that "t3" is the
14600 0a 20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 65  .  name of the e
14610 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  xternal content 
14620 46 54 53 34 20 74 61 62 6c 65 2c 20 74 68 65 20  FTS4 table, the 
14630 72 65 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 20  rebuild command 
14640 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
14650 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
14660 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 74  INSERT INTO t3(t
14670 33 29 20 56 41 4c 55 45 53 28 27 72 65 62 75 69  3) VALUES('rebui
14680 6c 64 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  ld');.</codebloc
14690 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 63  k>..<p>.  This c
146a0 6f 6d 6d 61 6e 64 20 6d 61 79 20 61 6c 73 6f 20  ommand may also 
146b0 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 72 64  be used with ord
146c0 69 6e 61 72 79 20 46 54 53 34 20 74 61 62 6c 65  inary FTS4 table
146d0 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  s, for example i
146e0 66 0a 20 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  f.  the implemen
146f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f  tation of the to
14700 6b 65 6e 69 7a 65 72 20 63 68 61 6e 67 65 73 2e  kenizer changes.
14710 20 20 49 74 20 69 73 20 61 6e 0a 20 20 65 72 72    It is an.  err
14720 6f 72 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  or to attempt to
14730 20 72 65 62 75 69 6c 64 20 74 68 65 20 66 75 6c   rebuild the ful
14740 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6d 61 69  l-text index mai
14750 6e 74 61 69 6e 65 64 20 62 79 20 61 20 63 6f 6e  ntained by a con
14760 74 65 6e 74 6c 65 73 73 0a 20 20 46 54 53 34 20  tentless.  FTS4 
14770 74 61 62 6c 65 2c 20 73 69 6e 63 65 20 6e 6f 20  table, since no 
14780 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 62 65 20  content will be 
14790 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 64 6f 20  available to do 
147a0 74 68 65 20 72 65 62 75 69 6c 64 69 6e 67 2e 0a  the rebuilding..
147b0 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65  ..<tcl>hd_fragme
147c0 6e 74 20 2a 66 74 73 34 6c 61 6e 67 75 61 67 65  nt *fts4language
147d0 69 64 20 6c 61 6e 67 75 61 67 65 69 64 20 7b 46  id languageid {F
147e0 54 53 34 20 6c 61 6e 67 75 61 67 65 69 64 20 6f  TS4 languageid o
147f0 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32  ption}</tcl>.<h2
14800 20 74 61 67 73 3d 22 66 74 73 34 20 6c 61 6e 67   tags="fts4 lang
14810 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 22 3e 54  uageid option">T
14820 68 65 20 6c 61 6e 67 75 61 67 65 69 64 3d 20 6f  he languageid= o
14830 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ption</h2>..<p>.
14840 20 20 57 68 65 6e 20 74 68 65 20 6c 61 6e 67 75    When the langu
14850 61 67 65 69 64 20 6f 70 74 69 6f 6e 20 69 73 20  ageid option is 
14860 70 72 65 73 65 6e 74 2c 20 69 74 20 73 70 65 63  present, it spec
14870 69 66 69 65 73 20 74 68 65 20 6e 61 6d 65 20 6f  ifies the name o
14880 66 0a 20 20 61 6e 6f 74 68 65 72 20 5b 68 69 64  f.  another [hid
14890 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 74 68 61 74  den column] that
148a0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
148b0 20 46 54 53 34 0a 20 20 74 61 62 6c 65 20 61 6e   FTS4.  table an
148c0 64 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  d which is used 
148d0 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20 6c  to specify the l
148e0 61 6e 67 75 61 67 65 20 73 74 6f 72 65 64 20 69  anguage stored i
148f0 6e 20 65 61 63 68 20 72 6f 77 0a 20 20 6f 66 20  n each row.  of 
14900 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e 20  the FTS4 table. 
14910 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
14920 20 6c 61 6e 67 75 61 67 65 69 64 20 68 69 64 64   languageid hidd
14930 65 6e 20 63 6f 6c 75 6d 6e 20 6d 75 73 74 0a 20  en column must. 
14940 20 62 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f   be distinct fro
14950 6d 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6c 75  m all other colu
14960 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  mn names in the 
14970 46 54 53 34 20 74 61 62 6c 65 2e 20 20 45 78 61  FTS4 table.  Exa
14980 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
14990 6b 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  k>.  CREATE VIRT
149a0 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
149b0 4e 47 20 66 74 73 34 28 78 2c 20 79 2c 20 6c 61  NG fts4(x, y, la
149c0 6e 67 75 61 67 65 69 64 3d 22 6c 69 64 22 29 0a  nguageid="lid").
149d0 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
149e0 3e 0a 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  >.  The default 
149f0 76 61 6c 75 65 20 6f 66 20 61 20 6c 61 6e 67 75  value of a langu
14a00 61 67 65 69 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ageid column is 
14a10 30 2e 20 41 6e 79 20 76 61 6c 75 65 20 69 6e 73  0. Any value ins
14a20 65 72 74 65 64 0a 20 20 69 6e 74 6f 20 61 20 6c  erted.  into a l
14a30 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e  anguageid column
14a40 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
14a50 20 61 20 33 32 2d 62 69 74 20 28 6e 6f 74 20 36   a 32-bit (not 6
14a60 34 29 20 73 69 67 6e 65 64 0a 20 20 69 6e 74 65  4) signed.  inte
14a70 67 65 72 2e 0a 0a 3c 70 3e 0a 20 20 42 79 20 64  ger...<p>.  By d
14a80 65 66 61 75 6c 74 2c 20 46 54 53 20 71 75 65 72  efault, FTS quer
14a90 69 65 73 20 28 74 68 6f 73 65 20 74 68 61 74 20  ies (those that 
14aa0 75 73 65 20 74 68 65 20 4d 41 54 43 48 20 6f 70  use the MATCH op
14ab0 65 72 61 74 6f 72 29 0a 20 20 63 6f 6e 73 69 64  erator).  consid
14ac0 65 72 20 6f 6e 6c 79 20 74 68 6f 73 65 20 72 6f  er only those ro
14ad0 77 73 20 77 69 74 68 20 74 68 65 20 6c 61 6e 67  ws with the lang
14ae0 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 20 73 65  uageid column se
14af0 74 20 74 6f 20 30 2e 20 54 6f 0a 20 20 71 75 65  t to 0. To.  que
14b00 72 79 20 66 6f 72 20 72 6f 77 73 20 77 69 74 68  ry for rows with
14b10 20 6f 74 68 65 72 20 6c 61 6e 67 75 61 67 65 69   other languagei
14b20 64 20 76 61 6c 75 65 73 2c 20 61 20 63 6f 6e 73  d values, a cons
14b30 74 72 61 69 6e 74 20 6f 66 20 74 68 65 0a 20 20  traint of the.  
14b40 66 6f 72 6d 20 22 3c 6c 61 6e 67 75 61 67 65 2d  form "<language-
14b50 69 64 3e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 22  id> = <integer>"
14b60 20 6d 75 73 74 20 62 65 20 61 64 64 65 64 20 74   must be added t
14b70 6f 20 74 68 65 20 71 75 65 72 69 65 73 0a 20 20  o the queries.  
14b80 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 46 6f  WHERE clause. Fo
14b90 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
14ba0 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54  eblock>.  SELECT
14bb0 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
14bc0 20 74 31 20 4d 41 54 43 48 20 27 61 62 63 27 20   t1 MATCH 'abc' 
14bd0 41 4e 44 20 6c 69 64 3d 35 3b 0a 3c 2f 63 6f 64  AND lid=5;.</cod
14be0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49  eblock>..<p>.  I
14bf0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
14c00 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 46  e for a single F
14c10 54 53 20 71 75 65 72 79 20 74 6f 20 72 65 74 75  TS query to retu
14c20 72 6e 20 72 6f 77 73 20 77 69 74 68 0a 20 20 64  rn rows with.  d
14c30 69 66 66 65 72 65 6e 74 20 6c 61 6e 67 75 61 67  ifferent languag
14c40 65 69 64 20 76 61 6c 75 65 73 2e 20 54 68 65 20  eid values. The 
14c50 72 65 73 75 6c 74 73 20 6f 66 20 61 64 64 69 6e  results of addin
14c60 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 0a  g WHERE clauses.
14c70 20 20 74 68 61 74 20 75 73 65 20 6f 74 68 65 72    that use other
14c80 20 6f 70 65 72 61 74 6f 72 73 20 28 65 2e 67 2e   operators (e.g.
14c90 20 20 6c 69 64 21 3d 35 2c 20 6f 72 20 6c 69 64    lid!=5, or lid
14ca0 26 6c 74 3b 3d 35 29 20 61 72 65 20 75 6e 64 65  &lt;=5) are unde
14cb0 66 69 6e 65 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66  fined...<p>.  If
14cc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70 74   the content opt
14cd0 69 6f 6e 20 69 73 20 75 73 65 64 20 61 6c 6f 6e  ion is used alon
14ce0 67 20 77 69 74 68 20 74 68 65 20 6c 61 6e 67 75  g with the langu
14cf0 61 67 65 69 64 20 6f 70 74 69 6f 6e 2c 0a 20 20  ageid option,.  
14d00 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6c  then the named l
14d10 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e  anguageid column
14d20 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 74   must exist in t
14d30 68 65 20 63 6f 6e 74 65 6e 74 3d 20 74 61 62 6c  he content= tabl
14d40 65 0a 20 20 28 73 75 62 6a 65 63 74 20 74 6f 20  e.  (subject to 
14d50 74 68 65 20 75 73 75 61 6c 20 72 75 6c 65 73 20  the usual rules 
14d60 2d 20 69 66 20 61 20 71 75 65 72 79 20 6e 65 76  - if a query nev
14d70 65 72 20 6e 65 65 64 73 20 74 6f 20 72 65 61 64  er needs to read
14d80 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20 74   the.  content t
14d90 61 62 6c 65 20 74 68 65 6e 20 74 68 69 73 20 72  able then this r
14da0 65 73 74 72 69 63 74 69 6f 6e 20 64 6f 65 73 20  estriction does 
14db0 6e 6f 74 20 61 70 70 6c 79 29 2e 0a 0a 3c 70 3e  not apply)...<p>
14dc0 0a 20 20 57 68 65 6e 20 74 68 65 20 6c 61 6e 67  .  When the lang
14dd0 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20 69 73  uageid option is
14de0 20 75 73 65 64 2c 20 53 51 4c 69 74 65 20 69 6e   used, SQLite in
14df0 76 6f 6b 65 73 20 74 68 65 20 78 4c 61 6e 67 75  vokes the xLangu
14e00 61 67 65 69 64 28 29 0a 20 20 6f 6e 20 74 68 65  ageid().  on the
14e10 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
14e20 65 72 5f 6d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  er_module object
14e30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
14e40 65 72 20 74 68 65 20 6f 62 6a 65 63 74 0a 20 20  er the object.  
14e50 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
14e60 64 65 72 20 74 6f 20 70 61 73 73 20 69 6e 20 74  der to pass in t
14e70 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 20 74  he language id t
14e80 68 61 74 20 74 68 65 0a 20 20 74 6f 6b 65 6e 69  hat the.  tokeni
14e90 7a 65 72 20 73 68 6f 75 6c 64 20 75 73 65 2e 20  zer should use. 
14ea0 20 54 68 65 20 78 4c 61 6e 67 75 61 67 65 69 64   The xLanguageid
14eb0 28 29 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 6e  () method will n
14ec0 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 0a 20  ever be called. 
14ed0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
14ee0 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 74  for any single t
14ef0 6f 6b 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 2e  okenizer object.
14f00 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74 20    The fact that 
14f10 64 69 66 66 65 72 65 6e 74 0a 20 20 6c 61 6e 67  different.  lang
14f20 75 61 67 65 73 20 6d 69 67 68 74 20 62 65 20 74  uages might be t
14f30 6f 6b 65 6e 69 7a 65 64 20 64 69 66 66 65 72 65  okenized differe
14f40 6e 74 6c 79 20 69 73 20 6f 6e 65 20 72 65 61 73  ntly is one reas
14f50 6f 6e 20 77 68 79 20 6e 6f 20 73 69 6e 67 6c 65  on why no single
14f60 0a 20 20 46 54 53 20 71 75 65 72 79 20 63 61 6e  .  FTS query can
14f70 20 72 65 74 75 72 6e 20 72 6f 77 73 20 77 69 74   return rows wit
14f80 68 20 64 69 66 66 65 72 65 6e 74 20 6c 61 6e 67  h different lang
14f90 75 61 67 65 69 64 20 76 61 6c 75 65 73 2e 0a 20  uageid values.. 
14fa0 20 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67   ...<tcl>hd_frag
14fb0 6d 65 6e 74 20 66 74 73 34 6d 61 74 63 68 69 6e  ment fts4matchin
14fc0 66 6f 20 7b 46 54 53 34 20 6d 61 74 63 68 69 6e  fo {FTS4 matchin
14fd0 66 6f 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e  fo option}</tcl>
14fe0 0a 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20  .<h2 tags="fts4 
14ff0 6d 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e  matchinfo option
15000 22 3e 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 3d  ">The matchinfo=
15010 20 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70   option</h2>..<p
15020 3e 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66  >.  The matchinf
15030 6f 20 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  o option may onl
15040 79 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  y be set to the 
15050 76 61 6c 75 65 20 22 66 74 73 33 22 2e 20 0a 20  value "fts3". . 
15060 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73   Attempting to s
15070 65 74 20 6d 61 74 63 68 69 6e 66 6f 20 74 6f 20  et matchinfo to 
15080 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
15090 68 61 6e 20 22 66 74 73 33 22 20 69 73 20 61 6e  han "fts3" is an
150a0 20 65 72 72 6f 72 2e 0a 20 20 49 66 20 74 68 69   error..  If thi
150b0 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63  s option is spec
150c0 69 66 69 65 64 2c 20 74 68 65 6e 20 73 6f 6d 65  ified, then some
150d0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 69 6e   of the extra in
150e0 66 6f 72 6d 61 74 69 6f 6e 20 73 74 6f 72 65 64  formation stored
150f0 20 62 79 0a 20 20 46 54 53 34 20 69 73 20 6f 6d   by.  FTS4 is om
15100 69 74 74 65 64 2e 20 54 68 69 73 20 72 65 64 75  itted. This redu
15110 63 65 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ces the amount o
15120 66 20 64 69 73 6b 20 73 70 61 63 65 20 63 6f 6e  f disk space con
15130 73 75 6d 65 64 20 62 79 0a 20 20 61 6e 20 46 54  sumed by.  an FT
15140 53 34 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 69  S4 table until i
15150 74 20 69 73 20 61 6c 6d 6f 73 74 20 74 68 65 20  t is almost the 
15160 73 61 6d 65 20 61 73 20 74 68 65 20 61 6d 6f 75  same as the amou
15170 6e 74 20 74 68 61 74 20 77 6f 75 6c 64 0a 20 20  nt that would.  
15180 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 65  be used by the e
15190 71 75 69 76 61 6c 65 6e 74 20 46 54 53 33 20 74  quivalent FTS3 t
151a0 61 62 6c 65 2c 20 62 75 74 20 61 6c 73 6f 20 6d  able, but also m
151b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61  eans that the da
151c0 74 61 0a 20 20 61 63 63 65 73 73 65 64 20 62 79  ta.  accessed by
151d0 20 70 61 73 73 69 6e 67 20 74 68 65 20 27 6c 27   passing the 'l'
151e0 20 66 6c 61 67 20 74 6f 20 74 68 65 20 5b 6d 61   flag to the [ma
151f0 74 63 68 69 6e 66 6f 28 29 5d 20 66 75 6e 63 74  tchinfo()] funct
15200 69 6f 6e 20 69 73 0a 20 20 6e 6f 74 20 61 76 61  ion is.  not ava
15210 69 6c 61 62 6c 65 2e 20 0a 0a 3c 74 63 6c 3e 68  ilable. ..<tcl>h
15220 64 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 6e  d_fragment fts4n
15230 6f 74 69 6e 64 65 78 65 64 20 7b 46 54 53 34 20  otindexed {FTS4 
15240 6e 6f 74 69 6e 64 65 78 65 64 20 6f 70 74 69 6f  notindexed optio
15250 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67  n}</tcl>.<h2 tag
15260 73 3d 22 66 74 73 34 20 6e 6f 74 69 6e 64 65 78  s="fts4 notindex
15270 65 64 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 6e  ed option">The n
15280 6f 74 69 6e 64 65 78 65 64 3d 20 6f 70 74 69 6f  otindexed= optio
15290 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f  n</h2>..<p>.  No
152a0 72 6d 61 6c 6c 79 2c 20 74 68 65 20 46 54 53 20  rmally, the FTS 
152b0 6d 6f 64 75 6c 65 20 6d 61 69 6e 74 61 69 6e 73  module maintains
152c0 20 61 6e 20 69 6e 76 65 72 74 65 64 20 69 6e 64   an inverted ind
152d0 65 78 20 6f 66 20 61 6c 6c 20 74 65 72 6d 73 20  ex of all terms 
152e0 69 6e 0a 20 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  in.  all columns
152f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 54   of the table. T
15300 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  his option is us
15310 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74 68  ed to specify th
15320 65 20 6e 61 6d 65 20 6f 66 0a 20 20 61 20 63 6f  e name of.  a co
15330 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 65  lumn for which e
15340 6e 74 72 69 65 73 20 73 68 6f 75 6c 64 20 6e 6f  ntries should no
15350 74 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  t be added to th
15360 65 20 69 6e 64 65 78 2e 20 4d 75 6c 74 69 70 6c  e index. Multipl
15370 65 0a 20 20 22 6e 6f 74 69 6e 64 65 78 65 64 22  e.  "notindexed"
15380 20 6f 70 74 69 6f 6e 73 20 6d 61 79 20 62 65 20   options may be 
15390 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
153a0 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 63 6f  that multiple co
153b0 6c 75 6d 6e 73 20 73 68 6f 75 6c 64 0a 20 20 62  lumns should.  b
153c0 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
153d0 68 65 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  he index. For ex
153e0 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  ample:..<codeblo
153f0 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61  ck>.  <i>-- Crea
15400 74 65 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65  te an FTS4 table
15410 20 66 6f 72 20 77 68 69 63 68 20 6f 6e 6c 79 20   for which only 
15420 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
15430 63 6f 6c 75 6d 6e 73 20 63 32 20 61 6e 64 20 63  columns c2 and c
15440 34 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 72  4</i>.  <i>-- ar
15450 65 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64 20  e tokenized and 
15460 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 76  added to the inv
15470 65 72 74 65 64 20 69 6e 64 65 78 2e 3c 2f 69 3e  erted index.</i>
15480 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
15490 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
154a0 20 66 74 73 34 28 63 31 2c 20 63 32 2c 20 63 33   fts4(c1, c2, c3
154b0 2c 20 63 34 2c 20 6e 6f 74 69 6e 64 65 78 65 64  , c4, notindexed
154c0 3d 63 31 2c 20 6e 6f 74 69 6e 64 65 78 65 64 3d  =c1, notindexed=
154d0 63 33 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  c3);.</codeblock
154e0 3e 0a 0a 3c 70 3e 0a 20 20 56 61 6c 75 65 73 20  >..<p>.  Values 
154f0 73 74 6f 72 65 64 20 69 6e 20 75 6e 69 6e 64 65  stored in uninde
15500 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
15510 6e 6f 74 20 65 6c 69 67 69 62 6c 65 20 74 6f 20  not eligible to 
15520 6d 61 74 63 68 20 4d 41 54 43 48 20 0a 20 20 6f  match MATCH .  o
15530 70 65 72 61 74 6f 72 73 2e 20 54 68 65 79 20 64  perators. They d
15540 6f 20 6e 6f 74 20 69 6e 66 6c 75 65 6e 63 65 20  o not influence 
15550 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
15560 68 65 20 6f 66 66 73 65 74 73 28 29 20 6f 72 20  he offsets() or 
15570 6d 61 74 63 68 69 6e 66 6f 28 29 0a 20 20 61 75  matchinfo().  au
15580 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
15590 73 2e 20 4e 6f 72 20 77 69 6c 6c 20 74 68 65 20  s. Nor will the 
155a0 73 6e 69 70 70 65 74 28 29 20 66 75 6e 63 74 69  snippet() functi
155b0 6f 6e 20 65 76 65 72 20 72 65 74 75 72 6e 20 61  on ever return a
155c0 0a 20 20 73 6e 69 70 70 65 74 20 62 61 73 65 64  .  snippet based
155d0 20 6f 6e 20 61 20 76 61 6c 75 65 20 73 74 6f 72   on a value stor
155e0 65 64 20 69 6e 20 61 6e 20 75 6e 69 6e 64 65 78  ed in an unindex
155f0 65 64 20 63 6f 6c 75 6d 6e 2e 0a 0a 3c 74 63 6c  ed column...<tcl
15600 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 66 74 73  >hd_fragment fts
15610 34 70 72 65 66 69 78 20 7b 46 54 53 34 20 70 72  4prefix {FTS4 pr
15620 65 66 69 78 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63  efix option}</tc
15630 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22 66 74 73  l>.<h2 tags="fts
15640 34 20 70 72 65 66 69 78 20 6f 70 74 69 6f 6e 22  4 prefix option"
15650 3e 54 68 65 20 70 72 65 66 69 78 3d 20 6f 70 74  >The prefix= opt
15660 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ion</h2>..<p>.  
15670 5e 54 68 65 20 46 54 53 34 20 70 72 65 66 69 78  ^The FTS4 prefix
15680 20 6f 70 74 69 6f 6e 20 63 61 75 73 65 73 20 46   option causes F
15690 54 53 20 74 6f 20 69 6e 64 65 78 20 74 65 72 6d  TS to index term
156a0 20 70 72 65 66 69 78 65 73 20 6f 66 20 73 70 65   prefixes of spe
156b0 63 69 66 69 65 64 20 6c 65 6e 67 74 68 73 0a 20  cified lengths. 
156c0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
156d0 20 74 68 61 74 20 69 74 20 61 6c 77 61 79 73 20   that it always 
156e0 69 6e 64 65 78 65 73 20 63 6f 6d 70 6c 65 74 65  indexes complete
156f0 20 74 65 72 6d 73 2e 20 20 5e 54 68 65 20 70 72   terms.  ^The pr
15700 65 66 69 78 20 6f 70 74 69 6f 6e 0a 20 20 6d 75  efix option.  mu
15710 73 74 20 62 65 20 73 65 74 20 74 6f 20 61 20 63  st be set to a c
15720 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c  omma separated l
15730 69 73 74 20 6f 66 20 70 6f 73 69 74 69 76 65 20  ist of positive 
15740 6e 6f 6e 2d 7a 65 72 6f 20 69 6e 74 65 67 65 72  non-zero integer
15750 73 2e 20 0a 20 20 5e 46 6f 72 20 65 61 63 68 20  s. .  ^For each 
15760 76 61 6c 75 65 20 4e 20 69 6e 20 74 68 65 20 6c  value N in the l
15770 69 73 74 2c 20 70 72 65 66 69 78 65 73 20 6f 66  ist, prefixes of
15780 20 6c 65 6e 67 74 68 20 4e 20 62 79 74 65 73 20   length N bytes 
15790 28 77 68 65 6e 20 65 6e 63 6f 64 65 64 20 0a 20  (when encoded . 
157a0 20 75 73 69 6e 67 20 55 54 46 2d 38 29 20 61 72   using UTF-8) ar
157b0 65 20 69 6e 64 65 78 65 64 2e 20 20 5e 46 54 53  e indexed.  ^FTS
157c0 34 20 75 73 65 73 20 74 65 72 6d 20 70 72 65 66  4 uses term pref
157d0 69 78 20 69 6e 64 65 78 65 73 20 74 6f 20 73 70  ix indexes to sp
157e0 65 65 64 20 75 70 0a 20 20 5b 70 72 65 66 69 78  eed up.  [prefix
157f0 20 71 75 65 72 69 65 73 5d 2e 20 54 68 65 20 63   queries]. The c
15800 6f 73 74 2c 20 6f 66 20 63 6f 75 72 73 65 2c 20  ost, of course, 
15810 69 73 20 74 68 61 74 20 69 6e 64 65 78 69 6e 67  is that indexing
15820 20 74 65 72 6d 20 70 72 65 66 69 78 65 73 20 61   term prefixes a
15830 73 0a 20 20 77 65 6c 6c 20 61 73 20 63 6f 6d 70  s.  well as comp
15840 6c 65 74 65 20 74 65 72 6d 73 20 69 6e 63 72 65  lete terms incre
15850 61 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ases the databas
15860 65 20 73 69 7a 65 20 61 6e 64 20 73 6c 6f 77 73  e size and slows
15870 20 64 6f 77 6e 20 77 72 69 74 65 20 0a 20 20 6f   down write .  o
15880 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  perations on the
15890 20 46 54 53 34 20 74 61 62 6c 65 2e 0a 0a 3c 70   FTS4 table...<p
158a0 3e 0a 20 20 50 72 65 66 69 78 20 69 6e 64 65 78  >.  Prefix index
158b0 65 73 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  es may be used t
158c0 6f 20 6f 70 74 69 6d 69 7a 65 20 5b 70 72 65 66  o optimize [pref
158d0 69 78 20 71 75 65 72 69 65 73 5d 20 69 6e 20 74  ix queries] in t
158e0 77 6f 20 63 61 73 65 73 2e 0a 20 20 49 66 20 74  wo cases..  If t
158f0 68 65 20 71 75 65 72 79 20 69 73 20 66 6f 72 20  he query is for 
15900 61 20 70 72 65 66 69 78 20 6f 66 20 4e 20 62 79  a prefix of N by
15910 74 65 73 2c 20 74 68 65 6e 20 61 20 70 72 65 66  tes, then a pref
15920 69 78 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ix index created
15930 0a 20 20 77 69 74 68 20 22 70 72 65 66 69 78 3d  .  with "prefix=
15940 4e 22 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  N" provides the 
15950 62 65 73 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  best optimizatio
15960 6e 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 22 70 72  n. Or, if no "pr
15970 65 66 69 78 3d 4e 22 0a 20 20 69 6e 64 65 78 20  efix=N".  index 
15980 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 20  is available, a 
15990 22 70 72 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64  "prefix=N+1" ind
159a0 65 78 20 6d 61 79 20 62 65 20 75 73 65 64 20 69  ex may be used i
159b0 6e 73 74 65 61 64 2e 20 0a 20 20 55 73 69 6e 67  nstead. .  Using
159c0 20 61 20 22 70 72 65 66 69 78 3d 4e 2b 31 22 20   a "prefix=N+1" 
159d0 69 6e 64 65 78 20 69 73 20 6c 65 73 73 0a 20 20  index is less.  
159e0 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20 61  efficient than a
159f0 20 22 70 72 65 66 69 78 3d 4e 22 20 69 6e 64 65   "prefix=N" inde
15a00 78 2c 20 62 75 74 20 69 73 20 62 65 74 74 65 72  x, but is better
15a10 20 74 68 61 6e 20 6e 6f 20 70 72 65 66 69 78 20   than no prefix 
15a20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 0a 0a 3c  index at all...<
15a30 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
15a40 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
15a50 34 20 74 61 62 6c 65 20 77 69 74 68 20 69 6e 64  4 table with ind
15a60 65 78 65 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65  exes to optimize
15a70 20 32 20 61 6e 64 20 34 20 62 79 74 65 20 70 72   2 and 4 byte pr
15a80 65 66 69 78 20 71 75 65 72 69 65 73 2e 3c 2f 69  efix queries.</i
15a90 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
15aa0 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
15ab0 47 20 66 74 73 34 28 63 31 2c 20 63 32 2c 20 70  G fts4(c1, c2, p
15ac0 72 65 66 69 78 3d 22 32 2c 34 22 29 3b 0a 0a 20  refix="2,4");.. 
15ad0 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
15ae0 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73  wing two queries
15af0 20 61 72 65 20 62 6f 74 68 20 6f 70 74 69 6d 69   are both optimi
15b00 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 70 72  zed using the pr
15b10 65 66 69 78 20 69 6e 64 65 78 65 73 2e 3c 2f 69  efix indexes.</i
15b20 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
15b30 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
15b40 54 43 48 20 27 61 62 2a 27 3b 0a 20 20 53 45 4c  TCH 'ab*';.  SEL
15b50 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
15b60 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 62  ERE t1 MATCH 'ab
15b70 63 64 2a 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  cd*';..  <i>-- T
15b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
15b90 20 71 75 65 72 69 65 73 20 61 72 65 20 62 6f 74   queries are bot
15ba0 68 20 70 61 72 74 69 61 6c 6c 79 20 6f 70 74 69  h partially opti
15bb0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
15bc0 70 72 65 66 69 78 3c 2f 69 3e 0a 20 20 3c 69 3e  prefix</i>.  <i>
15bd0 2d 2d 20 69 6e 64 65 78 65 73 2e 20 54 68 65 20  -- indexes. The 
15be0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
15bf0 6e 6f 74 20 61 73 20 70 72 6f 6e 6f 75 6e 63 65  not as pronounce
15c00 64 20 61 73 20 69 74 20 69 73 20 66 6f 72 20 74  d as it is for t
15c10 68 65 20 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20  he queries</i>. 
15c20 20 3c 69 3e 2d 2d 20 61 62 6f 76 65 2c 20 62 75   <i>-- above, bu
15c30 74 20 73 74 69 6c 6c 20 61 6e 20 69 6d 70 72 6f  t still an impro
15c40 76 65 6d 65 6e 74 20 6f 76 65 72 20 6e 6f 20 70  vement over no p
15c50 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 61 74  refix indexes at
15c60 20 61 6c 6c 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45   all.</i>.  SELE
15c70 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
15c80 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 2a 27  RE t1 MATCH 'a*'
15c90 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
15ca0 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
15cb0 54 43 48 20 27 61 62 63 2a 27 3b 0a 3c 2f 63 6f  TCH 'abc*';.</co
15cc0 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68  deblock>..<tcl>h
15cd0 64 5f 66 72 61 67 6d 65 6e 74 20 2a 63 6d 64 73  d_fragment *cmds
15ce0 20 7b 46 54 53 34 20 63 6f 6d 6d 61 6e 64 73 7d   {FTS4 commands}
15cf0 3c 2f 74 63 6c 3e 0a 3c 68 31 20 69 64 3d 63 6f  </tcl>.<h1 id=co
15d00 6d 6d 61 6e 64 73 20 74 61 67 73 3d 22 63 6f 6d  mmands tags="com
15d10 6d 61 6e 64 73 22 3e 53 70 65 63 69 61 6c 20 43  mands">Special C
15d20 6f 6d 6d 61 6e 64 73 20 46 6f 72 20 46 54 53 33  ommands For FTS3
15d30 20 61 6e 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a   and FTS4</h1>..
15d40 3c 70 3e 0a 20 20 53 70 65 63 69 61 6c 20 49 4e  <p>.  Special IN
15d50 53 45 52 54 20 6f 70 65 72 61 74 65 73 20 63 61  SERT operates ca
15d60 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 73 73  n be used to iss
15d70 75 65 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 46  ue commands to F
15d80 54 53 33 20 61 6e 64 20 46 54 53 34 20 74 61 62  TS3 and FTS4 tab
15d90 6c 65 73 2e 0a 20 20 45 76 65 72 79 20 46 54 53  les..  Every FTS
15da0 33 20 61 6e 64 20 46 54 53 34 20 68 61 73 20 61  3 and FTS4 has a
15db0 20 68 69 64 64 65 6e 2c 20 72 65 61 64 2d 6f 6e   hidden, read-on
15dc0 6c 79 20 63 6f 6c 75 6d 6e 20 77 68 69 63 68 20  ly column which 
15dd0 69 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  is the same name
15de0 20 61 73 0a 20 20 74 68 65 20 74 61 62 6c 65 20   as.  the table 
15df0 69 74 73 65 6c 66 2e 20 20 49 4e 53 45 52 54 73  itself.  INSERTs
15e00 20 69 6e 74 6f 20 74 68 69 73 20 68 69 64 64 65   into this hidde
15e10 6e 20 63 6f 6c 75 6d 6e 20 61 72 65 20 69 6e 74  n column are int
15e20 65 72 70 72 65 74 65 64 20 61 73 20 63 6f 6d 6d  erpreted as comm
15e30 61 6e 64 73 0a 20 20 74 6f 20 74 68 65 20 46 54  ands.  to the FT
15e40 53 33 2f 34 20 74 61 62 6c 65 2e 20 20 46 6f 72  S3/4 table.  For
15e50 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
15e60 65 20 6e 61 6d 65 20 22 78 79 7a 22 20 74 68 65  e name "xyz" the
15e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
15e80 6e 64 73 0a 20 20 61 72 65 20 73 75 70 70 6f 72  nds.  are suppor
15e90 74 65 64 3a 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c  ted:..<ul>.<li><
15ea0 70 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 79  p>INSERT INTO xy
15eb0 7a 28 78 79 7a 29 20 56 41 4c 55 45 53 28 27 6f  z(xyz) VALUES('o
15ec0 70 74 69 6d 69 7a 65 27 29 3b 3c 2f 70 3e 0a 3c  ptimize');</p>.<
15ed0 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54  li><p>INSERT INT
15ee0 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
15ef0 53 28 27 72 65 62 75 69 6c 64 27 29 3b 3c 2f 70  S('rebuild');</p
15f00 3e 0a 3c 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20  >.<li><p>INSERT 
15f10 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41  INTO xyz(xyz) VA
15f20 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d  LUES('integrity-
15f30 63 68 65 63 6b 27 29 3b 3c 2f 70 3e 0a 3c 6c 69  check');</p>.<li
15f40 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20  ><p>INSERT INTO 
15f50 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53 28  xyz(xyz) VALUES(
15f60 27 6d 65 72 67 65 3d 58 2c 59 27 29 3b 3c 2f 70  'merge=X,Y');</p
15f70 3e 0a 3c 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20  >.<li><p>INSERT 
15f80 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41  INTO xyz(xyz) VA
15f90 4c 55 45 53 28 27 61 75 74 6f 6d 65 72 67 65 3d  LUES('automerge=
15fa0 4e 27 29 3b 3c 2f 70 3e 0a 3c 2f 75 6c 3e 0a 0a  N');</p>.</ul>..
15fb0 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
15fc0 20 2a 66 74 73 34 6f 70 74 63 6d 64 20 7b 46 54   *fts4optcmd {FT
15fd0 53 34 20 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f  S4 "optimize" co
15fe0 6d 6d 61 6e 64 7d 20 5c 0a 20 20 20 20 20 20 20  mmand} \.       
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 20 20 20 20 7b 22 6f 70 74 69 6d 69 7a 65        {"optimize
16010 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e  " command}</tcl>
16020 0a 3c 68 32 20 69 64 3d 6f 70 74 69 6d 69 7a 65  .<h2 id=optimize
16030 3e 54 68 65 20 22 6f 70 74 69 6d 69 7a 65 22 20  >The "optimize" 
16040 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70  command</h2>..<p
16050 3e 0a 20 20 54 68 65 20 22 6f 70 74 69 6d 69 7a  >.  The "optimiz
16060 65 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  e" command cause
16070 73 20 46 54 53 33 2f 34 20 74 6f 20 6d 65 72 67  s FTS3/4 to merg
16080 65 20 74 6f 67 65 74 68 65 72 20 61 6c 6c 20 6f  e together all o
16090 66 20 69 74 73 0a 20 20 69 6e 76 65 72 74 65 64  f its.  inverted
160a0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20 69   index b-trees i
160b0 6e 74 6f 20 6f 6e 65 20 6c 61 72 67 65 20 61 6e  nto one large an
160c0 64 20 63 6f 6d 70 6c 65 74 65 20 62 2d 74 72 65  d complete b-tre
160d0 65 2e 20 20 44 6f 69 6e 67 0a 20 20 61 6e 20 6f  e.  Doing.  an o
160e0 70 74 69 6d 69 7a 65 20 77 69 6c 6c 20 6d 61 6b  ptimize will mak
160f0 65 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65  e subsequent que
16100 72 69 65 73 20 72 75 6e 20 66 61 73 74 65 72 20  ries run faster 
16110 73 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 0a  since there are.
16120 20 20 66 65 77 65 72 20 62 2d 74 72 65 65 73 20    fewer b-trees 
16130 74 6f 20 73 65 61 72 63 68 2c 20 61 6e 64 20 69  to search, and i
16140 74 20 6d 61 79 20 72 65 64 75 63 65 20 64 69 73  t may reduce dis
16150 6b 20 75 73 61 67 65 20 62 79 20 63 6f 61 6c 65  k usage by coale
16160 73 63 69 6e 67 0a 20 20 72 65 64 75 6e 64 61 6e  scing.  redundan
16170 74 20 65 6e 74 72 69 65 73 2e 20 20 48 6f 77 65  t entries.  Howe
16180 76 65 72 2c 20 66 6f 72 20 61 20 6c 61 72 67 65  ver, for a large
16190 20 46 54 53 20 74 61 62 6c 65 2c 20 72 75 6e 6e   FTS table, runn
161a0 69 6e 67 20 6f 70 74 69 6d 69 7a 65 0a 20 20 63  ing optimize.  c
161b0 61 6e 20 62 65 20 61 73 20 65 78 70 65 6e 73 69  an be as expensi
161c0 76 65 20 61 73 20 72 75 6e 6e 69 6e 67 20 5b 56  ve as running [V
161d0 41 43 55 55 4d 5d 2e 20 20 54 68 65 20 6f 70 74  ACUUM].  The opt
161e0 69 6d 69 7a 65 20 63 6f 6d 6d 61 6e 64 0a 20 20  imize command.  
161f0 65 73 73 65 6e 74 69 61 6c 6c 79 20 68 61 73 20  essentially has 
16200 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  to read and writ
16210 65 20 74 68 65 20 65 6e 74 69 72 65 20 46 54 53  e the entire FTS
16220 20 74 61 62 6c 65 2c 20 72 65 73 75 6c 74 69 6e   table, resultin
16230 67 0a 20 20 69 6e 20 61 20 6c 61 72 67 65 20 74  g.  in a large t
16240 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 0a 3c 70 3e  ransaction...<p>
16250 0a 20 20 49 6e 20 62 61 74 63 68 2d 6d 6f 64 65  .  In batch-mode
16260 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77 68 65 72   operation, wher
16270 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 69  e an FTS table i
16280 73 20 69 6e 69 74 69 61 6c 6c 79 20 62 75 69 6c  s initially buil
16290 74 20 75 70 0a 20 20 75 73 69 6e 67 20 61 20 6c  t up.  using a l
162a0 61 72 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 49  arge number of I
162b0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
162c0 2c 20 74 68 65 6e 20 71 75 65 72 69 65 64 20 72  , then queried r
162d0 65 70 65 61 74 65 64 6c 79 0a 20 20 77 69 74 68  epeatedly.  with
162e0 6f 75 74 20 66 75 72 74 68 65 72 20 63 68 61 6e  out further chan
162f0 67 65 73 2c 20 69 74 20 69 73 20 6f 66 74 65 6e  ges, it is often
16300 20 61 20 67 6f 6f 64 20 69 64 65 61 0a 20 20 74   a good idea.  t
16310 6f 20 72 75 6e 20 22 6f 70 74 69 6d 69 7a 65 22  o run "optimize"
16320 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
16330 49 4e 53 45 52 54 20 61 6e 64 20 62 65 66 6f 72  INSERT and befor
16340 65 20 74 68 65 20 66 69 72 73 74 20 71 75 65 72  e the first quer
16350 79 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  y...<tcl>hd_frag
16360 6d 65 6e 74 20 2a 66 74 73 34 72 65 62 75 69 64  ment *fts4rebuid
16370 63 6d 64 20 7b 46 54 53 34 20 22 72 65 62 75 69  cmd {FTS4 "rebui
16380 6c 64 22 20 63 6f 6d 6d 61 6e 64 7d 20 5c 0a 20  ld" command} \. 
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
163b0 22 72 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e  "rebuild" comman
163c0 64 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 69 64 3d  d}</tcl>.<h2 id=
163d0 72 65 62 75 69 6c 64 3e 54 68 65 20 22 72 65 62  rebuild>The "reb
163e0 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68  uild" command</h
163f0 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22 72  2>..<p>.  The "r
16400 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 20  ebuild" command 
16410 63 61 75 73 65 73 20 53 51 4c 69 74 65 20 74 6f  causes SQLite to
16420 20 64 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   discard the ent
16430 69 72 65 20 46 54 53 33 2f 34 0a 20 20 74 61 62  ire FTS3/4.  tab
16440 6c 65 20 61 6e 64 20 74 68 65 6e 20 72 65 62 75  le and then rebu
16450 69 6c 64 20 69 74 20 61 67 61 69 6e 20 66 72 6f  ild it again fro
16460 6d 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 2e  m original text.
16470 20 20 54 68 65 20 63 6f 6e 63 65 70 74 0a 20 20    The concept.  
16480 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 5b 52  is similar to [R
16490 45 49 4e 44 45 58 5d 2c 20 6f 6e 6c 79 20 74 68  EINDEX], only th
164a0 61 74 20 69 74 20 61 70 70 6c 69 65 73 20 74 6f  at it applies to
164b0 20 61 6e 0a 20 20 46 54 53 33 2f 34 20 74 61 62   an.  FTS3/4 tab
164c0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
164d0 20 6f 72 64 69 6e 61 72 79 20 69 6e 64 65 78 2e   ordinary index.
164e0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22 72 65 62  ..<p>.  The "reb
164f0 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 20 73 68  uild" command sh
16500 6f 75 6c 64 20 62 65 20 72 75 6e 20 77 68 65 6e  ould be run when
16510 65 76 65 72 20 74 68 65 20 69 6d 70 6c 65 6d 65  ever the impleme
16520 6e 74 61 74 69 6f 6e 0a 20 20 6f 66 20 61 20 63  ntation.  of a c
16530 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 20  ustom tokenizer 
16540 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 61 74  changes, so that
16550 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 63 61 6e   all content can
16560 20 62 65 20 72 65 74 6f 6b 65 6e 69 7a 65 64 2e   be retokenized.
16570 0a 20 20 54 68 65 20 22 72 65 62 75 69 6c 64 22  .  The "rebuild"
16580 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 6c 73 6f   command is also
16590 20 75 73 65 66 75 6c 20 77 68 65 6e 20 75 73 69   useful when usi
165a0 6e 67 20 74 68 65 0a 20 20 5b 46 54 53 34 20 63  ng the.  [FTS4 c
165b0 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 5d 20 61  ontent option] a
165c0 66 74 65 72 20 63 68 61 6e 67 65 73 20 68 61 76  fter changes hav
165d0 65 20 62 65 65 6e 20 6d 61 64 65 20 74 6f 20 74  e been made to t
165e0 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 63 6f  he original.  co
165f0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 0a 3c 74  ntent table...<t
16600 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a  cl>hd_fragment *
16610 66 74 73 34 69 63 6b 63 6d 64 20 7b 46 54 53 34  fts4ickcmd {FTS4
16620 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63   "integrity-chec
16630 6b 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c  k" command}</tcl
16640 3e 0a 3c 68 32 20 69 64 3d 69 6e 74 65 67 63 68  >.<h2 id=integch
16650 65 63 6b 3e 54 68 65 20 22 69 6e 74 65 67 72 69  eck>The "integri
16660 74 79 2d 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e  ty-check" comman
16670 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68  d</h2>..<p>.  Th
16680 65 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65  e "integrity-che
16690 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73  ck" command caus
166a0 65 73 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61  es SQLite to rea
166b0 64 20 61 6e 64 20 76 65 72 69 66 79 0a 20 20 74  d and verify.  t
166c0 68 65 20 61 63 63 75 72 61 63 79 20 6f 66 20 61  he accuracy of a
166d0 6c 6c 20 69 6e 76 65 72 74 65 64 20 69 6e 64 69  ll inverted indi
166e0 63 65 73 20 69 6e 20 61 6e 20 46 54 53 33 2f 34  ces in an FTS3/4
166f0 20 74 61 62 6c 65 20 62 79 20 63 6f 6d 70 61 72   table by compar
16700 69 6e 67 0a 20 20 74 68 6f 73 65 20 69 6e 76 65  ing.  those inve
16710 72 74 65 64 20 69 6e 64 69 63 65 73 20 61 67 61  rted indices aga
16720 69 6e 73 74 20 74 68 65 20 6f 72 69 67 69 6e 61  inst the origina
16730 6c 20 63 6f 6e 74 65 6e 74 2e 20 54 68 65 20 0a  l content. The .
16740 20 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65    "integrity-che
16750 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 73 69 6c 65  ck" command sile
16760 6e 74 6c 79 20 73 75 63 63 65 65 64 73 20 69 66  ntly succeeds if
16770 20 74 68 65 20 69 6e 76 65 72 74 65 64 0a 20 20   the inverted.  
16780 69 6e 64 69 63 65 73 20 61 72 65 20 61 6c 6c 20  indices are all 
16790 6f 6b 2c 20 62 75 74 20 77 69 6c 6c 20 66 61 69  ok, but will fai
167a0 6c 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  l with an SQLITE
167b0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 0a 20  _CORRUPT error. 
167c0 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
167d0 20 61 72 65 20 66 6f 75 6e 64 2e 0a 0a 3c 70 3e   are found...<p>
167e0 0a 20 20 54 68 65 20 22 69 6e 74 65 67 72 69 74  .  The "integrit
167f0 79 2d 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64  y-check" command
16800 20 69 73 20 73 69 6d 69 6c 61 72 20 69 6e 20 63   is similar in c
16810 6f 6e 63 65 70 74 20 74 6f 0a 20 5b 50 52 41 47  oncept to. [PRAG
16820 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
16830 63 6b 5d 2e 20 20 49 6e 20 61 20 77 6f 72 6b 69  ck].  In a worki
16840 6e 67 20 73 79 73 74 65 6d 2c 20 74 68 65 20 22  ng system, the "
16850 69 6e 74 65 67 72 69 74 79 2d 63 6f 6d 6d 61 6e  integrity-comman
16860 64 22 0a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  d". should alway
16870 73 20 62 65 20 73 75 63 63 65 73 73 66 75 6c 2e  s be successful.
16880 20 20 50 6f 73 73 69 62 6c 65 20 63 61 75 73 65    Possible cause
16890 73 20 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63  s of integrity-c
168a0 68 65 63 6b 0a 20 66 61 69 6c 75 72 65 73 20 69  heck. failures i
168b0 6e 63 6c 75 64 65 3a 0a 20 20 3c 75 6c 3e 0a 20  nclude:.  <ul>. 
168c0 20 3c 6c 69 3e 20 54 68 65 20 61 70 70 6c 69 63   <li> The applic
168d0 61 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 63  ation has made c
168e0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 5b 46  hanges to the [F
168f0 54 53 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73  TS shadow tables
16900 5d 0a 20 20 20 20 20 20 20 64 69 72 65 63 74 6c  ].       directl
16910 79 2c 20 77 69 74 68 6f 75 74 20 75 73 69 6e 67  y, without using
16920 20 74 68 65 20 46 54 53 33 2f 34 20 76 69 72 74   the FTS3/4 virt
16930 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 75 73 69  ual table, causi
16940 6e 67 0a 20 20 20 20 20 20 20 74 68 65 20 73 68  ng.       the sh
16950 61 64 6f 77 20 74 61 62 6c 65 73 20 74 6f 20 62  adow tables to b
16960 65 63 6f 6d 65 20 6f 75 74 20 6f 66 20 73 79 6e  ecome out of syn
16970 63 20 77 69 74 68 20 65 61 63 68 20 6f 74 68 65  c with each othe
16980 72 2e 0a 20 20 3c 6c 69 3e 20 55 73 69 6e 67 20  r..  <li> Using 
16990 74 68 65 20 5b 46 54 53 34 20 63 6f 6e 74 65 6e  the [FTS4 conten
169a0 74 20 6f 70 74 69 6f 6e 5d 20 61 6e 64 20 66 61  t option] and fa
169b0 69 6c 69 6e 67 20 74 6f 20 6d 61 6e 75 61 6c 6c  iling to manuall
169c0 79 20 6b 65 65 70 0a 20 20 20 20 20 20 20 74 68  y keep.       th
169d0 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 73 79 6e  e content in syn
169e0 63 20 77 69 74 68 20 74 68 65 20 46 54 53 34 20  c with the FTS4 
169f0 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73  inverted indices
16a00 2e 0a 20 20 3c 6c 69 3e 20 42 75 67 73 20 69 6e  ..  <li> Bugs in
16a10 20 74 68 65 20 46 54 53 33 2f 34 20 76 69 72 74   the FTS3/4 virt
16a20 75 61 6c 20 74 61 62 6c 65 2e 20 20 28 54 68 65  ual table.  (The
16a30 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63   "integrity-chec
16a40 6b 22 0a 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e  k".       comman
16a50 64 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 20 63  d was original c
16a60 6f 6e 63 65 69 76 65 64 20 61 73 20 70 61 72 74  onceived as part
16a70 20 6f 66 20 74 68 65 20 74 65 73 74 20 73 75 69   of the test sui
16a80 74 65 0a 20 20 20 20 20 20 20 66 6f 72 20 46 54  te.       for FT
16a90 53 33 2f 34 2e 29 0a 20 20 3c 6c 69 3e 20 43 6f  S3/4.).  <li> Co
16aa0 72 72 75 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  rruption to the 
16ab0 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74  underlying SQLit
16ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16ad0 20 20 28 53 65 65 0a 20 20 20 20 20 20 20 64 6f    (See.       do
16ae0 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 5b  cumentation on [
16af0 68 6f 77 20 74 6f 20 63 6f 72 72 75 70 74 5d 20  how to corrupt] 
16b00 61 6e 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  and SQLite datab
16b10 61 73 65 20 66 6f 72 0a 20 20 20 20 20 20 20 61  ase for.       a
16b20 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
16b30 61 74 69 6f 6e 2e 29 0a 20 20 3c 2f 75 6c 3e 0a  ation.).  </ul>.
16b40 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
16b50 74 20 2a 66 74 73 34 6d 65 72 67 65 63 6d 64 20  t *fts4mergecmd 
16b60 7b 46 54 53 34 20 22 6d 65 72 67 65 22 20 63 6f  {FTS4 "merge" co
16b70 6d 6d 61 6e 64 7d 20 7b 22 6d 65 72 67 65 22 20  mmand} {"merge" 
16b80 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c  command}</tcl>.<
16b90 68 32 20 69 64 3d 22 6d 65 72 67 65 63 6d 64 22  h2 id="mergecmd"
16ba0 3e 54 68 65 20 22 6d 65 72 67 65 3d 58 2c 59 22  >The "merge=X,Y"
16bb0 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c   command</h2>..<
16bc0 70 3e 0a 20 20 54 68 65 20 22 6d 65 72 67 65 3d  p>.  The "merge=
16bd0 58 2c 59 22 20 63 6f 6d 6d 61 6e 64 20 28 77 68  X,Y" command (wh
16be0 65 72 65 20 58 20 61 6e 64 20 59 20 61 72 65 20  ere X and Y are 
16bf0 69 6e 74 65 67 65 72 73 29 20 63 61 75 73 65 73  integers) causes
16c00 20 53 51 4c 69 74 65 0a 20 20 74 6f 20 64 6f 20   SQLite.  to do 
16c10 61 20 6c 69 6d 69 74 65 64 20 61 6d 6f 75 6e 74  a limited amount
16c20 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 20   of work toward 
16c30 6d 65 72 67 69 6e 67 20 74 68 65 20 76 61 72 69  merging the vari
16c40 6f 75 73 20 69 6e 76 65 72 74 65 64 0a 20 20 69  ous inverted.  i
16c50 6e 64 65 78 20 62 2d 74 72 65 65 73 20 6f 66 20  ndex b-trees of 
16c60 61 6e 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20  an FTS3/4 table 
16c70 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 6f 6e  together into on
16c80 65 20 6c 61 72 67 65 20 62 2d 74 72 65 65 2e 0a  e large b-tree..
16c90 20 20 54 68 65 20 58 20 76 61 6c 75 65 20 69 73    The X value is
16ca0 20 74 68 65 20 74 61 72 67 65 74 20 6e 75 6d 62   the target numb
16cb0 65 72 20 6f 66 20 22 62 6c 6f 63 6b 73 22 20 74  er of "blocks" t
16cc0 6f 20 62 65 20 6d 65 72 67 65 64 2c 20 61 6e 64  o be merged, and
16cd0 20 59 20 69 73 0a 20 20 74 68 65 20 6d 69 6e 69   Y is.  the mini
16ce0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d  mum number of b-
16cf0 74 72 65 65 20 73 65 67 6d 65 6e 74 73 20 6f 6e  tree segments on
16d00 20 61 20 6c 65 76 65 6c 20 72 65 71 75 69 72 65   a level require
16d10 64 20 62 65 66 6f 72 65 0a 20 20 6d 65 72 67 69  d before.  mergi
16d20 6e 67 20 77 69 6c 6c 20 62 65 20 61 70 70 6c 69  ng will be appli
16d30 65 64 20 74 6f 20 74 68 61 74 20 6c 65 76 65 6c  ed to that level
16d40 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  .  The value of 
16d50 59 20 73 68 6f 75 6c 64 0a 20 20 62 65 20 62 65  Y should.  be be
16d60 74 77 65 65 6e 20 32 20 61 6e 64 20 31 36 20 77  tween 2 and 16 w
16d70 69 74 68 20 61 20 72 65 63 6f 6d 6d 65 6e 64 65  ith a recommende
16d80 64 20 76 61 6c 75 65 20 6f 66 20 38 2e 20 20 54  d value of 8.  T
16d90 68 65 20 76 61 6c 75 65 20 6f 66 20 58 0a 20 20  he value of X.  
16da0 63 61 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74  can be any posit
16db0 69 76 65 20 69 6e 74 65 67 65 72 20 62 75 74 20  ive integer but 
16dc0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 6f 72  values on the or
16dd0 64 65 72 20 6f 66 20 31 30 30 20 74 6f 20 33 30  der of 100 to 30
16de0 30 0a 20 20 61 72 65 20 72 65 63 6f 6d 6d 65 6e  0.  are recommen
16df0 64 65 64 2e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e  ded...<p>.  When
16e00 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 61 63   an FTS table ac
16e10 63 75 6d 75 6c 61 74 65 73 20 31 36 20 62 2d 74  cumulates 16 b-t
16e20 72 65 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20  ree segments at 
16e30 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c 0a  the same level,.
16e40 20 20 74 68 65 20 6e 65 78 74 20 49 4e 53 45 52    the next INSER
16e50 54 20 69 6e 74 6f 20 74 68 61 74 20 74 61 62 6c  T into that tabl
16e60 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6c 6c  e will cause all
16e70 20 31 36 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   16 segments to 
16e80 62 65 0a 20 20 6d 65 72 67 65 64 20 69 6e 74 6f  be.  merged into
16e90 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65   a single b-tree
16ea0 20 73 65 67 6d 65 6e 74 20 61 74 20 74 68 65 20   segment at the 
16eb0 6e 65 78 74 20 68 69 67 68 65 72 20 6c 65 76 65  next higher leve
16ec0 6c 2e 20 20 54 68 65 0a 20 20 65 66 66 65 63 74  l.  The.  effect
16ed0 20 6f 66 20 74 68 65 73 65 20 6c 65 76 65 6c 20   of these level 
16ee0 6d 65 72 67 65 73 20 69 73 20 74 68 61 74 20 6d  merges is that m
16ef0 6f 73 74 20 49 4e 53 45 52 54 73 20 69 6e 74 6f  ost INSERTs into
16f00 20 61 6e 20 46 54 53 20 74 61 62 6c 65 0a 20 20   an FTS table.  
16f10 61 72 65 20 76 65 72 79 20 66 61 73 74 20 61 6e  are very fast an
16f20 64 20 74 61 6b 65 20 6d 69 6e 69 6d 61 6c 20 6d  d take minimal m
16f30 65 6d 6f 72 79 2c 20 62 75 74 20 61 6e 20 6f 63  emory, but an oc
16f40 63 61 73 69 6f 6e 61 6c 20 49 4e 53 45 52 54 20  casional INSERT 
16f50 69 73 0a 20 20 73 6c 6f 77 20 61 6e 64 20 67 65  is.  slow and ge
16f60 6e 65 72 61 74 65 73 20 61 20 6c 61 72 67 65 20  nerates a large 
16f70 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 63 61  transaction beca
16f80 75 73 65 20 6f 66 20 74 68 65 20 6e 65 65 64 20  use of the need 
16f90 74 6f 0a 20 20 64 6f 20 6d 65 72 67 69 6e 67 2e  to.  do merging.
16fa0 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
16fb0 20 22 73 70 69 6b 79 22 20 70 65 72 66 6f 72 6d   "spiky" perform
16fc0 61 6e 63 65 20 6f 66 20 49 4e 53 45 52 54 73 2e  ance of INSERTs.
16fd0 0a 0a 3c 70 3e 0a 20 20 54 6f 20 61 76 6f 69 64  ..<p>.  To avoid
16fe0 20 73 70 69 6b 79 20 49 4e 53 45 52 54 20 70 65   spiky INSERT pe
16ff0 72 66 6f 72 6d 61 6e 63 65 2c 20 61 6e 20 61 70  rformance, an ap
17000 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e 20 72 75  plication can ru
17010 6e 20 74 68 65 0a 20 20 22 6d 65 72 67 65 3d 58  n the.  "merge=X
17020 2c 59 22 20 63 6f 6d 6d 61 6e 64 20 70 65 72 69  ,Y" command peri
17030 6f 64 69 63 61 6c 6c 79 2c 20 70 6f 73 73 69 62  odically, possib
17040 6c 79 20 69 6e 20 61 6e 20 69 64 6c 65 20 74 68  ly in an idle th
17050 72 65 61 64 20 6f 72 0a 20 20 69 64 6c 65 20 70  read or.  idle p
17060 72 6f 63 65 73 73 2c 20 74 6f 20 65 6e 73 75 72  rocess, to ensur
17070 65 20 74 68 61 74 20 74 68 65 20 46 54 53 20 74  e that the FTS t
17080 61 62 6c 65 20 6e 65 76 65 72 20 61 63 63 75 6d  able never accum
17090 75 6c 61 74 65 73 0a 20 20 74 6f 6f 20 6d 61 6e  ulates.  too man
170a0 79 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74  y b-tree segment
170b0 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 6c 65  s at the same le
170c0 76 65 6c 2e 20 20 49 4e 53 45 52 54 20 70 65 72  vel.  INSERT per
170d0 66 6f 72 6d 61 6e 63 65 0a 20 20 73 70 69 6b 65  formance.  spike
170e0 73 20 63 61 6e 20 67 65 6e 65 72 61 6c 6c 79 20  s can generally 
170f0 62 65 20 61 76 6f 69 64 65 64 2c 20 61 6e 64 20  be avoided, and 
17100 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 46  performance of F
17110 54 53 33 2f 34 20 63 61 6e 20 62 65 0a 20 20 6d  TS3/4 can be.  m
17120 61 78 69 6d 69 7a 65 64 2c 20 62 79 20 72 75 6e  aximized, by run
17130 6e 69 6e 67 20 22 6d 65 72 67 65 3d 58 2c 59 22  ning "merge=X,Y"
17140 20 61 66 74 65 72 20 65 76 65 72 79 20 66 65 77   after every few
17150 20 74 68 6f 75 73 61 6e 64 0a 20 20 64 6f 63 75   thousand.  docu
17160 6d 65 6e 74 20 69 6e 73 65 72 74 73 2e 20 20 45  ment inserts.  E
17170 61 63 68 20 22 6d 65 72 67 65 3d 58 2c 59 22 20  ach "merge=X,Y" 
17180 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20 72 75 6e  command will run
17190 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 0a 20   in a separate. 
171a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 75 6e   transaction (un
171b0 6c 65 73 73 20 74 68 65 79 20 61 72 65 20 67 72  less they are gr
171c0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 75  ouped together u
171d0 73 69 6e 67 20 5b 42 45 47 49 4e 5d 2e 2e 2e 5b  sing [BEGIN]...[
171e0 43 4f 4d 4d 49 54 5d 2c 0a 20 20 6f 66 20 63 6f  COMMIT],.  of co
171f0 75 72 73 65 29 2e 20 20 54 68 65 20 74 72 61 6e  urse).  The tran
17200 73 61 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  sactions can be 
17210 6b 65 70 74 20 73 6d 61 6c 6c 20 62 79 20 63 68  kept small by ch
17220 6f 6f 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 20  oosing a value. 
17230 20 66 6f 72 20 58 20 69 6e 20 74 68 65 20 72 61   for X in the ra
17240 6e 67 65 20 6f 66 20 31 30 30 20 74 6f 20 33 30  nge of 100 to 30
17250 30 2e 20 20 54 68 65 20 69 64 6c 65 20 74 68 72  0.  The idle thr
17260 65 61 64 20 74 68 61 74 20 69 73 20 72 75 6e 6e  ead that is runn
17270 69 6e 67 0a 20 20 74 68 65 20 6d 65 72 67 65 20  ing.  the merge 
17280 63 6f 6d 6d 61 6e 64 73 20 63 61 6e 20 6b 6e 6f  commands can kno
17290 77 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  w when it is don
172a0 65 20 62 79 20 63 68 65 63 6b 69 6e 67 20 74 68  e by checking th
172b0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 69  e difference.  i
172c0 6e 20 5b 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  n [sqlite3_total
172d0 5f 63 68 61 6e 67 65 73 28 29 5d 20 62 65 66 6f  _changes()] befo
172e0 72 65 20 61 6e 64 20 61 66 74 65 72 20 65 61 63  re and after eac
172f0 68 20 22 6d 65 72 67 65 3d 58 2c 59 22 0a 20 20  h "merge=X,Y".  
17300 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 73 74 6f 70  command and stop
17310 70 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 77 68  ping the loop wh
17320 65 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  en the differenc
17330 65 20 64 72 6f 70 73 20 62 65 6c 6f 77 20 74 77  e drops below tw
17340 6f 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  o...<tcl>hd_frag
17350 6d 65 6e 74 20 2a 66 74 73 34 61 75 74 6f 6d 65  ment *fts4autome
17360 72 67 65 63 6d 64 20 7b 46 54 53 34 20 22 61 75  rgecmd {FTS4 "au
17370 74 6f 6d 65 72 67 65 22 20 63 6f 6d 6d 61 6e 64  tomerge" command
17380 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  } \.            
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 7b 22 61 75 74 6f 6d 65 72         {"automer
173b0 67 65 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63  ge" command}</tc
173c0 6c 3e 0a 3c 68 32 20 69 64 3d 61 75 74 6f 6d 65  l>.<h2 id=autome
173d0 72 67 65 22 3e 54 68 65 20 22 61 75 74 6f 6d 65  rge">The "autome
173e0 72 67 65 3d 4e 22 20 63 6f 6d 6d 61 6e 64 3c 2f  rge=N" command</
173f0 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22  h2>..<p>.  The "
17400 61 75 74 6f 6d 65 72 67 65 3d 4e 22 20 63 6f 6d  automerge=N" com
17410 6d 61 6e 64 20 28 77 68 65 72 65 20 4e 20 69 73  mand (where N is
17420 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
17430 65 65 6e 20 30 20 61 6e 64 20 31 35 2c 0a 20 20  een 0 and 15,.  
17440 69 6e 63 6c 75 73 69 76 65 29 20 69 73 20 75 73  inclusive) is us
17450 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20  ed to configure 
17460 61 6e 20 46 54 53 33 2f 34 20 74 61 62 6c 65 73  an FTS3/4 tables
17470 20 22 61 75 74 6f 6d 65 72 67 65 22 20 70 61 72   "automerge" par
17480 61 6d 65 74 65 72 2c 0a 20 20 77 68 69 63 68 20  ameter,.  which 
17490 63 6f 6e 74 72 6f 6c 73 20 61 75 74 6f 6d 61 74  controls automat
174a0 69 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 69  ic incremental i
174b0 6e 76 65 72 74 65 64 20 69 6e 64 65 78 20 6d 65  nverted index me
174c0 72 67 69 6e 67 2e 20 54 68 65 20 64 65 66 61 75  rging. The defau
174d0 6c 74 20 0a 20 20 61 75 74 6f 6d 65 72 67 65 20  lt .  automerge 
174e0 76 61 6c 75 65 20 66 6f 72 20 6e 65 77 20 74 61  value for new ta
174f0 62 6c 65 73 20 69 73 20 30 2c 20 6d 65 61 6e 69  bles is 0, meani
17500 6e 67 20 74 68 61 74 20 61 75 74 6f 6d 61 74 69  ng that automati
17510 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 20  c incremental . 
17520 20 6d 65 72 67 69 6e 67 20 69 73 20 63 6f 6d 70   merging is comp
17530 6c 65 74 65 6c 79 20 64 69 73 61 62 6c 65 64 2e  letely disabled.
17540 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
17550 20 74 68 65 20 61 75 74 6f 6d 65 72 67 65 20 70   the automerge p
17560 61 72 61 6d 65 74 65 72 0a 20 20 69 73 20 6d 6f  arameter.  is mo
17570 64 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  dified using the
17580 20 22 61 75 74 6f 6d 65 72 67 65 3d 4e 22 20 63   "automerge=N" c
17590 6f 6d 6d 61 6e 64 2c 20 74 68 65 20 6e 65 77 20  ommand, the new 
175a0 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 20  parameter value 
175b0 69 73 0a 20 20 73 74 6f 72 65 64 20 70 65 72 73  is.  stored pers
175c0 69 73 74 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  istently in the 
175d0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 73 20  database and is 
175e0 75 73 65 64 20 62 79 20 61 6c 6c 20 73 75 62 73  used by all subs
175f0 65 71 75 65 6e 74 6c 79 0a 20 20 65 73 74 61 62  equently.  estab
17600 6c 69 73 68 65 64 20 64 61 74 61 62 61 73 65 20  lished database 
17610 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 0a 3c 70  connections...<p
17620 3e 0a 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  >.  Setting the 
17630 61 75 74 6f 6d 65 72 67 65 20 70 61 72 61 6d 65  automerge parame
17640 74 65 72 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  ter to a non-zer
17650 6f 20 76 61 6c 75 65 20 65 6e 61 62 6c 65 73 20  o value enables 
17660 61 75 74 6f 6d 61 74 69 63 0a 20 20 69 6e 63 72  automatic.  incr
17670 65 6d 65 6e 74 61 6c 20 6d 65 72 67 69 6e 67 2e  emental merging.
17680 20 54 68 69 73 20 63 61 75 73 65 73 20 53 51 4c   This causes SQL
17690 69 74 65 20 74 6f 20 64 6f 20 61 20 73 6d 61 6c  ite to do a smal
176a0 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 69 6e 76 65  l amount of inve
176b0 72 74 65 64 20 0a 20 20 69 6e 64 65 78 20 6d 65  rted .  index me
176c0 72 67 69 6e 67 20 61 66 74 65 72 20 65 76 65 72  rging after ever
176d0 79 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  y INSERT operati
176e0 6f 6e 2e 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f  on. The amount o
176f0 66 20 6d 65 72 67 69 6e 67 20 0a 20 20 70 65 72  f merging .  per
17700 66 6f 72 6d 65 64 20 69 73 20 64 65 73 69 67 6e  formed is design
17710 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 46  ed so that the F
17720 54 53 33 2f 34 20 74 61 62 6c 65 20 6e 65 76 65  TS3/4 table neve
17730 72 20 72 65 61 63 68 65 73 20 61 20 70 6f 69 6e  r reaches a poin
17740 74 20 0a 20 20 77 68 65 72 65 20 69 74 20 68 61  t .  where it ha
17750 73 20 31 36 20 73 65 67 6d 65 6e 74 73 20 61 74  s 16 segments at
17760 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 20   the same level 
17770 61 6e 64 20 68 65 6e 63 65 20 68 61 73 20 74 6f  and hence has to
17780 20 64 6f 20 61 20 6c 61 72 67 65 20 0a 20 20 6d   do a large .  m
17790 65 72 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  erge in order to
177a0 20 63 6f 6d 70 6c 65 74 65 20 61 6e 20 69 6e 73   complete an ins
177b0 65 72 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ert.  In other w
177c0 6f 72 64 73 2c 20 61 75 74 6f 6d 61 74 69 63 20  ords, automatic 
177d0 0a 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  .  incremental m
177e0 65 72 67 69 6e 67 20 69 73 20 64 65 73 69 67 6e  erging is design
177f0 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 73 70  ed to prevent sp
17800 69 6b 79 20 49 4e 53 45 52 54 20 70 65 72 66 6f  iky INSERT perfo
17810 72 6d 61 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54  rmance...<p>.  T
17820 68 65 20 64 6f 77 6e 73 69 64 65 20 6f 66 20 61  he downside of a
17830 75 74 6f 6d 61 74 69 63 20 69 6e 63 72 65 6d 65  utomatic increme
17840 6e 74 61 6c 20 6d 65 72 67 69 6e 67 20 69 73 20  ntal merging is 
17850 74 68 61 74 20 69 74 20 6d 61 6b 65 73 0a 20 20  that it makes.  
17860 65 76 65 72 79 20 49 4e 53 45 52 54 2c 20 55 50  every INSERT, UP
17870 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
17880 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 61 6e   operation on an
17890 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20 72 75   FTS3/4 table ru
178a0 6e 0a 20 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  n.  a little slo
178b0 77 65 72 2c 20 73 69 6e 63 65 20 65 78 74 72 61  wer, since extra
178c0 20 74 69 6d 65 20 6d 75 73 74 20 62 65 20 75 73   time must be us
178d0 65 64 20 74 6f 20 64 6f 20 74 68 65 20 69 6e 63  ed to do the inc
178e0 72 65 6d 65 6e 74 61 6c 0a 20 20 6d 65 72 67 65  remental.  merge
178f0 2e 20 20 46 6f 72 20 6d 61 78 69 6d 75 6d 20 70  .  For maximum p
17900 65 72 66 6f 72 6d 61 6e 63 65 2c 20 69 74 20 69  erformance, it i
17910 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 68  s recommended th
17920 61 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  at applications.
17930 20 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61    disable automa
17940 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  tic incremental 
17950 6d 65 72 67 65 20 61 6e 64 20 69 6e 73 74 65 61  merge and instea
17960 64 20 75 73 65 20 74 68 65 20 0a 20 20 5b 22 6d  d use the .  ["m
17970 65 72 67 65 22 20 63 6f 6d 6d 61 6e 64 5d 20 69  erge" command] i
17980 6e 20 61 6e 20 69 64 6c 65 20 70 72 6f 63 65 73  n an idle proces
17990 73 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e  s to keep the in
179a0 76 65 72 74 65 64 20 69 6e 64 69 63 65 73 0a 20  verted indices. 
179b0 20 77 65 6c 6c 20 6d 65 72 67 65 64 2e 20 20 42   well merged.  B
179c0 75 74 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ut if the struct
179d0 75 72 65 20 6f 66 20 61 6e 20 61 70 70 6c 69 63  ure of an applic
179e0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ation does not e
179f0 61 73 69 6c 79 0a 20 20 61 6c 6c 6f 77 20 66 6f  asily.  allow fo
17a00 72 20 69 64 6c 65 20 70 72 6f 63 65 73 73 65 73  r idle processes
17a10 2c 20 74 68 65 20 75 73 65 20 6f 66 20 61 75 74  , the use of aut
17a20 6f 6d 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74  omatic increment
17a30 61 6c 20 6d 65 72 67 65 20 69 73 0a 20 20 61 20  al merge is.  a 
17a40 76 65 72 79 20 72 65 61 73 6f 6e 61 62 6c 65 20  very reasonable 
17a50 66 61 6c 6c 62 61 63 6b 20 73 6f 6c 75 74 69 6f  fallback solutio
17a60 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 61 63  n...<p>.  The ac
17a70 74 75 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  tual value of th
17a80 65 20 61 75 74 6f 6d 65 72 67 65 20 70 61 72 61  e automerge para
17a90 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
17aa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
17ab0 20 69 6e 64 65 78 20 73 65 67 6d 65 6e 74 73 20   index segments 
17ac0 6d 65 72 67 65 64 20 73 69 6d 75 6c 74 61 6e 65  merged simultane
17ad0 6f 75 73 6c 79 20 62 79 20 61 6e 20 61 75 74 6f  ously by an auto
17ae0 6d 61 74 69 63 20 69 6e 76 65 72 74 65 64 20 69  matic inverted i
17af0 6e 64 65 78 0a 20 20 6d 65 72 67 65 2e 20 49 66  ndex.  merge. If
17b00 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
17b10 74 20 74 6f 20 4e 2c 20 74 68 65 20 73 79 73 74  t to N, the syst
17b20 65 6d 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  em waits until t
17b30 68 65 72 65 20 61 72 65 20 61 74 0a 20 20 6c 65  here are at.  le
17b40 61 73 74 20 4e 20 73 65 67 6d 65 6e 74 73 20 6f  ast N segments o
17b50 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  n a single level
17b60 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
17b70 67 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g to incremental
17b80 6c 79 0a 20 20 6d 65 72 67 65 20 74 68 65 6d 2e  ly.  merge them.
17b90 20 53 65 74 74 69 6e 67 20 61 20 6c 6f 77 65 72   Setting a lower
17ba0 20 76 61 6c 75 65 20 6f 66 20 4e 20 63 61 75 73   value of N caus
17bb0 65 73 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 62  es segments to b
17bc0 65 20 6d 65 72 67 65 64 20 6d 6f 72 65 0a 20 20  e merged more.  
17bd0 71 75 69 63 6b 6c 79 2c 20 77 68 69 63 68 20 6d  quickly, which m
17be0 61 79 20 73 70 65 65 64 20 75 70 20 66 75 6c 6c  ay speed up full
17bf0 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 61 6e  -text queries an
17c00 64 2c 20 69 66 20 74 68 65 20 77 6f 72 6b 6c 6f  d, if the worklo
17c10 61 64 20 0a 20 20 63 6f 6e 74 61 69 6e 73 20 55  ad .  contains U
17c20 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
17c30 6f 70 65 72 61 74 69 6f 6e 73 20 61 73 20 77 65  operations as we
17c40 6c 6c 20 61 73 20 49 4e 53 45 52 54 73 2c 20 72  ll as INSERTs, r
17c50 65 64 75 63 65 20 74 68 65 20 73 70 61 63 65 0a  educe the space.
17c60 20 20 6f 6e 20 64 69 73 6b 20 63 6f 6e 73 75 6d    on disk consum
17c70 65 64 20 62 79 20 74 68 65 20 66 75 6c 6c 2d 74  ed by the full-t
17c80 65 78 74 20 69 6e 64 65 78 2e 20 48 6f 77 65 76  ext index. Howev
17c90 65 72 2c 20 69 74 20 61 6c 73 6f 20 69 6e 63 72  er, it also incr
17ca0 65 61 73 65 73 20 74 68 65 0a 20 20 61 6d 6f 75  eases the.  amou
17cb0 6e 74 20 6f 66 20 64 61 74 61 20 77 72 69 74 74  nt of data writt
17cc0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 0a 3c 70 3e  en to disk...<p>
17cd0 0a 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 75  .  For general u
17ce0 73 65 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  se in cases wher
17cf0 65 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 20 63  e the workload c
17d00 6f 6e 74 61 69 6e 73 20 66 65 77 20 55 50 44 41  ontains few UPDA
17d10 54 45 20 6f 72 20 44 45 4c 45 54 45 0a 20 20 6f  TE or DELETE.  o
17d20 70 65 72 61 74 69 6f 6e 73 2c 20 61 20 67 6f 6f  perations, a goo
17d30 64 20 63 68 6f 69 63 65 20 66 6f 72 20 61 75 74  d choice for aut
17d40 6f 6d 65 72 67 65 20 69 73 20 38 2e 20 49 66 20  omerge is 8. If 
17d50 74 68 65 20 77 6f 72 6b 6c 6f 61 64 20 63 6f 6e  the workload con
17d60 74 61 69 6e 73 0a 20 20 6d 61 6e 79 20 55 50 44  tains.  many UPD
17d70 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 63 6f  ATE or DELETE co
17d80 6d 6d 61 6e 64 73 2c 20 0a 20 20 6f 72 20 69 66  mmands, .  or if
17d90 20 71 75 65 72 79 20 73 70 65 65 64 20 69 73 20   query speed is 
17da0 61 20 63 6f 6e 63 65 72 6e 2c 20 69 74 20 6d 61  a concern, it ma
17db0 79 20 62 65 20 61 64 76 61 6e 74 61 67 65 6f 75  y be advantageou
17dc0 73 20 74 6f 20 72 65 64 75 63 65 20 61 75 74 6f  s to reduce auto
17dd0 6d 65 72 67 65 0a 20 20 74 6f 20 32 2e 0a 0a 3c  merge.  to 2...<
17de0 70 3e 0a 20 20 46 6f 72 20 72 65 61 73 6f 6e 73  p>.  For reasons
17df0 20 6f 66 20 62 61 63 6b 77 61 72 64 73 20 63 6f   of backwards co
17e00 6d 70 61 74 69 62 69 6c 69 74 79 2c 20 74 68 65  mpatibility, the
17e10 20 22 61 75 74 6f 6d 65 72 67 65 3d 31 22 20 63   "automerge=1" c
17e20 6f 6d 6d 61 6e 64 20 73 65 74 73 0a 20 20 74 68  ommand sets.  th
17e30 65 20 61 75 74 6f 6d 65 72 67 65 20 70 61 72 61  e automerge para
17e40 6d 65 74 65 72 20 74 6f 20 38 2c 20 6e 6f 74 20  meter to 8, not 
17e50 31 20 28 61 20 76 61 6c 75 65 20 6f 66 20 31 20  1 (a value of 1 
17e60 77 6f 75 6c 64 20 6d 61 6b 65 20 6e 6f 20 73 65  would make no se
17e70 6e 73 65 20 0a 20 20 61 6e 79 77 61 79 2c 20 61  nse .  anyway, a
17e80 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66  s merging data f
17e90 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 73 65 67  rom a single seg
17ea0 6d 65 6e 74 20 69 73 20 61 20 6e 6f 2d 6f 70 29  ment is a no-op)
17eb0 2e 0a 0a 0a 3c 68 31 20 69 64 3d 74 6f 6b 65 6e  ....<h1 id=token
17ec0 69 7a 65 72 20 74 61 67 73 3d 22 74 6f 6b 65 6e  izer tags="token
17ed0 69 7a 65 72 22 3e 54 6f 6b 65 6e 69 7a 65 72 73  izer">Tokenizers
17ee0 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6e 20  </h1>..<p>.  An 
17ef0 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  FTS tokenizer is
17f00 20 61 20 73 65 74 20 6f 66 20 72 75 6c 65 73 20   a set of rules 
17f10 66 6f 72 20 65 78 74 72 61 63 74 69 6e 67 20 74  for extracting t
17f20 65 72 6d 73 20 66 72 6f 6d 20 61 20 64 6f 63 75  erms from a docu
17f30 6d 65 6e 74 20 0a 20 20 6f 72 20 62 61 73 69 63  ment .  or basic
17f40 20 46 54 53 20 66 75 6c 6c 2d 74 65 78 74 20 71   FTS full-text q
17f50 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e  uery. ..<p>.  Un
17f60 6c 65 73 73 20 61 20 73 70 65 63 69 66 69 63 20  less a specific 
17f70 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 70 65  tokenizer is spe
17f80 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
17f90 66 20 74 68 65 20 43 52 45 41 54 45 20 0a 20 20  f the CREATE .  
17fa0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
17fb0 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
17fc0 63 72 65 61 74 65 20 74 68 65 20 46 54 53 20 74  create the FTS t
17fd0 61 62 6c 65 2c 20 74 68 65 20 64 65 66 61 75 6c  able, the defaul
17fe0 74 20 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  t .  tokenizer, 
17ff0 22 73 69 6d 70 6c 65 22 2c 20 69 73 20 75 73 65  "simple", is use
18000 64 2e 20 54 68 65 20 73 69 6d 70 6c 65 20 74 6f  d. The simple to
18010 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73  kenizer extracts
18020 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20 20 61   tokens from.  a
18030 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20 62 61 73   document or bas
18040 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78 74  ic FTS full-text
18050 20 71 75 65 72 79 20 61 63 63 6f 72 64 69 6e 67   query according
18060 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
18070 67 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c 75 6c  g .  rules:..<ul
18080 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74 65  >.  <li><p> A te
18090 72 6d 20 69 73 20 61 20 63 6f 6e 74 69 67 75 6f  rm is a contiguo
180a0 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  us sequence of e
180b0 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65  ligible characte
180c0 72 73 2c 20 77 68 65 72 65 20 0a 20 20 20 20 65  rs, where .    e
180d0 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65  ligible characte
180e0 72 73 20 61 72 65 20 61 6c 6c 20 61 6c 70 68 61  rs are all alpha
180f0 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65  numeric characte
18100 72 73 20 61 6e 64 20 61 6c 6c 20 63 68 61 72 61  rs and all chara
18110 63 74 65 72 73 20 77 69 74 68 0a 20 20 20 20 55  cters with.    U
18120 6e 69 63 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74  nicode codepoint
18130 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
18140 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
18150 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c 20 6f 74   128..    All ot
18160 68 65 72 20 63 68 61 72 61 63 74 65 72 73 20 61  her characters a
18170 72 65 0a 20 20 20 20 64 69 73 63 61 72 64 65 64  re.    discarded
18180 20 77 68 65 6e 20 73 70 6c 69 74 74 69 6e 67 20   when splitting 
18190 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20  a document into 
181a0 74 65 72 6d 73 2e 20 54 68 65 69 72 20 6f 6e 6c  terms. Their onl
181b0 79 20 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 69  y contribution i
181c0 73 0a 20 20 20 20 74 6f 20 73 65 70 61 72 61 74  s.    to separat
181d0 65 20 61 64 6a 61 63 65 6e 74 20 74 65 72 6d 73  e adjacent terms
181e0 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c  ...  <li><p> All
181f0 20 75 70 70 65 72 63 61 73 65 20 63 68 61 72 61   uppercase chara
18200 63 74 65 72 73 20 77 69 74 68 69 6e 20 74 68 65  cters within the
18210 20 41 53 43 49 49 20 72 61 6e 67 65 20 28 55 6e   ASCII range (Un
18220 69 63 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74 73  icode codepoints
18230 0a 20 20 20 20 6c 65 73 73 20 74 68 61 6e 20 31  .    less than 1
18240 32 38 29 2c 20 61 72 65 20 74 72 61 6e 73 66 6f  28), are transfo
18250 72 6d 65 64 20 74 6f 20 74 68 65 69 72 20 6c 6f  rmed to their lo
18260 77 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65  wercase equivale
18270 6e 74 73 20 61 73 20 70 61 72 74 0a 20 20 20 20  nts as part.    
18280 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74  of the tokenizat
18290 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 54 68 75  ion process. Thu
182a0 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  s, full-text que
182b0 72 69 65 73 20 61 72 65 0a 20 20 20 20 63 61 73  ries are.    cas
182c0 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 77 68  e-insensitive wh
182d0 65 6e 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d  en using the sim
182e0 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 3c  ple tokenizer..<
182f0 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  /ul>..<p>.  For 
18300 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
18310 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  document contain
18320 69 6e 67 20 74 68 65 20 74 65 78 74 20 22 52 69  ing the text "Ri
18330 67 68 74 20 6e 6f 77 2c 20 74 68 65 79 27 72 65  ght now, they're
18340 20 76 65 72 79 0a 20 20 66 72 75 73 74 72 61 74   very.  frustrat
18350 65 64 2e 22 2c 20 74 68 65 20 74 65 72 6d 73 20  ed.", the terms 
18360 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
18370 68 65 20 64 6f 63 75 6d 65 6e 74 20 61 6e 64 20  he document and 
18380 61 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20  added to the .  
18390 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
183a0 61 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 22  are, in order, "
183b0 72 69 67 68 74 20 6e 6f 77 20 74 68 65 79 20 72  right now they r
183c0 65 20 76 65 72 79 20 66 72 75 73 74 72 61 74 65  e very frustrate
183d0 64 22 2e 20 53 75 63 68 0a 20 20 61 20 64 6f 63  d". Such.  a doc
183e0 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d 61 74 63  ument would matc
183f0 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  h a full-text qu
18400 65 72 79 20 73 75 63 68 20 61 73 20 22 4d 41 54  ery such as "MAT
18410 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27 22  CH 'Frustrated'"
18420 2c 20 0a 20 20 61 73 20 74 68 65 20 73 69 6d 70  , .  as the simp
18430 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 74 72 61  le tokenizer tra
18440 6e 73 66 6f 72 6d 73 20 74 68 65 20 74 65 72 6d  nsforms the term
18450 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 74 6f   in the query to
18460 20 6c 6f 77 65 72 63 61 73 65 0a 20 20 62 65 66   lowercase.  bef
18470 6f 72 65 20 73 65 61 72 63 68 69 6e 67 20 74 68  ore searching th
18480 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
18490 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c  x...<p>.  As wel
184a0 6c 20 61 73 20 74 68 65 20 22 73 69 6d 70 6c 65  l as the "simple
184b0 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65  " tokenizer, the
184c0 20 46 54 53 20 73 6f 75 72 63 65 20 63 6f 64 65   FTS source code
184d0 20 66 65 61 74 75 72 65 73 20 61 20 74 6f 6b 65   features a toke
184e0 6e 69 7a 65 72 20 0a 20 20 74 68 61 74 20 75 73  nizer .  that us
184f0 65 73 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22  es the <a href="
18500 68 74 74 70 3a 2f 2f 74 61 72 74 61 72 75 73 2e  http://tartarus.
18510 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f 72 74  org/~martin/Port
18520 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f 72 74  erStemmer/">Port
18530 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67 20 61  er .  Stemming a
18540 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20 54 68  lgorithm</a>. Th
18550 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65  is tokenizer use
18560 73 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65 73  s the same rules
18570 20 74 6f 20 73 65 70 61 72 61 74 65 0a 20 20 74   to separate.  t
18580 68 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e  he input documen
18590 74 20 69 6e 74 6f 20 74 65 72 6d 73 20 69 6e 63  t into terms inc
185a0 6c 75 64 69 6e 67 20 66 6f 6c 64 69 6e 67 20 61  luding folding a
185b0 6c 6c 20 74 65 72 6d 73 20 69 6e 74 6f 20 6c 6f  ll terms into lo
185c0 77 65 72 20 63 61 73 65 2c 0a 20 20 62 75 74 20  wer case,.  but 
185d0 61 6c 73 6f 20 75 73 65 73 20 74 68 65 20 50 6f  also uses the Po
185e0 72 74 65 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c  rter Stemming al
185f0 67 6f 72 69 74 68 6d 20 74 6f 20 72 65 64 75 63  gorithm to reduc
18600 65 20 72 65 6c 61 74 65 64 20 45 6e 67 6c 69 73  e related Englis
18610 68 20 6c 61 6e 67 75 61 67 65 0a 20 20 77 6f 72  h language.  wor
18620 64 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72  ds to a common r
18630 6f 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  oot. For example
18640 2c 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  , using the same
18650 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74 20   input document 
18660 61 73 20 69 6e 20 74 68 65 0a 20 20 70 61 72 61  as in the.  para
18670 67 72 61 70 68 20 61 62 6f 76 65 2c 20 74 68 65  graph above, the
18680 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65   porter tokenize
18690 72 20 65 78 74 72 61 63 74 73 20 74 68 65 20 66  r extracts the f
186a0 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a  ollowing tokens:
186b0 0a 20 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68  .  "right now th
186c0 65 69 20 76 65 72 69 20 66 72 75 73 74 72 61 74  ei veri frustrat
186d0 22 2e 20 45 76 65 6e 20 74 68 6f 75 67 68 20 73  ". Even though s
186e0 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 74 65 72  ome of these ter
186f0 6d 73 20 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a  ms are not even.
18700 20 20 45 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c    English words,
18710 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 75   in some cases u
18720 73 69 6e 67 20 74 68 65 6d 20 74 6f 20 62 75 69  sing them to bui
18730 6c 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ld the full-text
18740 20 69 6e 64 65 78 20 69 73 20 6d 6f 72 65 0a 20   index is more. 
18750 20 75 73 65 66 75 6c 20 74 68 61 6e 20 74 68 65   useful than the
18760 20 6d 6f 72 65 20 69 6e 74 65 6c 6c 69 67 69 62   more intelligib
18770 6c 65 20 6f 75 74 70 75 74 20 70 72 6f 64 75 63  le output produc
18780 65 64 20 62 79 20 74 68 65 20 73 69 6d 70 6c 65  ed by the simple
18790 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73   tokenizer..  Us
187a0 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74  ing the porter t
187b0 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f  okenizer, the do
187c0 63 75 6d 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20  cument not only 
187d0 6d 61 74 63 68 65 73 20 66 75 6c 6c 2d 74 65 78  matches full-tex
187e0 74 20 71 75 65 72 69 65 73 0a 20 20 73 75 63 68  t queries.  such
187f0 20 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73   as "MATCH 'Frus
18800 74 72 61 74 65 64 27 22 2c 20 62 75 74 20 61 6c  trated'", but al
18810 73 6f 20 71 75 65 72 69 65 73 20 73 75 63 68 20  so queries such 
18820 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74  as "MATCH 'Frust
18830 72 61 74 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74  ration'",.  as t
18840 68 65 20 74 65 72 6d 20 22 46 72 75 73 74 72 61  he term "Frustra
18850 74 69 6f 6e 22 20 69 73 20 72 65 64 75 63 65 64  tion" is reduced
18860 20 62 79 20 74 68 65 20 50 6f 72 74 65 72 20 73   by the Porter s
18870 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d  temmer algorithm
18880 20 74 6f 20 0a 20 20 22 66 72 75 73 74 72 61 74   to .  "frustrat
18890 22 20 2d 20 6a 75 73 74 20 61 73 20 22 46 72 75  " - just as "Fru
188a0 73 74 72 61 74 65 64 22 20 69 73 2e 20 53 6f 2c  strated" is. So,
188b0 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
188c0 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72  porter tokenizer
188d0 2c 0a 20 20 46 54 53 20 69 73 20 61 62 6c 65 20  ,.  FTS is able 
188e0 74 6f 20 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74  to find not just
188f0 20 65 78 61 63 74 20 6d 61 74 63 68 65 73 20 66   exact matches f
18900 6f 72 20 71 75 65 72 69 65 64 20 74 65 72 6d 73  or queried terms
18910 2c 20 62 75 74 20 6d 61 74 63 68 65 73 0a 20 20  , but matches.  
18920 61 67 61 69 6e 73 74 20 73 69 6d 69 6c 61 72 20  against similar 
18930 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
18940 20 74 65 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65   terms. For more
18950 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
18960 74 68 65 20 0a 20 20 50 6f 72 74 65 72 20 53 74  the .  Porter St
18970 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c  emmer algorithm,
18980 20 70 6c 65 61 73 65 20 72 65 66 65 72 20 74 6f   please refer to
18990 20 74 68 65 20 70 61 67 65 20 6c 69 6e 6b 65 64   the page linked
189a0 20 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45   above...<p>.  E
189b0 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74  xample illustrat
189c0 69 6e 67 20 74 68 65 20 64 69 66 66 65 72 65 6e  ing the differen
189d0 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 22  ce between the "
189e0 73 69 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72  simple" and "por
189f0 74 65 72 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  ter".  tokenizer
18a00 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  s:..<codeblock>.
18a10 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
18a20 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
18a30 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65   simple tokenize
18a40 72 2e 20 49 6e 73 65 72 74 20 61 20 64 6f 63 75  r. Insert a docu
18a50 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e 3c 2f 69  ment into it.</i
18a60 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
18a70 41 4c 20 54 41 42 4c 45 20 73 69 6d 70 6c 65 20  AL TABLE simple 
18a80 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e  USING fts3(token
18a90 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 20 20 49  ize=simple);.  I
18aa0 4e 53 45 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c  NSERT INTO simpl
18ab0 65 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20  e VALUES('Right 
18ac0 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72  now they''re ver
18ad0 79 20 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a  y frustrated');.
18ae0 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72  .  <i>-- The fir
18af0 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  st of the follow
18b00 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73 20  ing two queries 
18b10 6d 61 74 63 68 65 73 20 74 68 65 20 64 6f 63 75  matches the docu
18b20 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 3c 2f  ment stored in</
18b30 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65  i>.  <i>-- table
18b40 20 22 73 69 6d 70 6c 65 22 2e 20 54 68 65 20 73   "simple". The s
18b50 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 3c  econd does not.<
18b60 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
18b70 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45 52 45  ROM simple WHERE
18b80 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20 27 46   simple MATCH 'F
18b90 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45  rustrated';.  SE
18ba0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70  LECT * FROM simp
18bb0 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20  le WHERE simple 
18bc0 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69  MATCH 'Frustrati
18bd0 6f 6e 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  on';..  <i>-- Cr
18be0 65 61 74 65 20 61 20 74 61 62 6c 65 20 75 73 69  eate a table usi
18bf0 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f  ng the porter to
18c00 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72 74 20  kenizer. Insert 
18c10 74 68 65 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e  the same documen
18c20 74 20 69 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20  t into it</i>.  
18c30 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
18c40 41 42 4c 45 20 70 6f 72 74 65 72 20 55 53 49 4e  ABLE porter USIN
18c50 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d  G fts3(tokenize=
18c60 70 6f 72 74 65 72 29 3b 0a 20 20 49 4e 53 45 52  porter);.  INSER
18c70 54 20 49 4e 54 4f 20 70 6f 72 74 65 72 20 56 41  T INTO porter VA
18c80 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77 20  LUES('Right now 
18c90 74 68 65 79 27 27 72 65 20 76 65 72 79 20 66 72  they''re very fr
18ca0 75 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c  ustrated');..  <
18cb0 69 3e 2d 2d 20 42 6f 74 68 20 6f 66 20 74 68 65  i>-- Both of the
18cc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
18cd0 65 73 20 6d 61 74 63 68 20 74 68 65 20 64 6f 63  es match the doc
18ce0 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 20  ument stored in 
18cf0 74 61 62 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c  table "porter".<
18d00 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
18d10 52 4f 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45  ROM porter WHERE
18d20 20 70 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46   porter MATCH 'F
18d30 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45  rustrated';.  SE
18d40 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74  LECT * FROM port
18d50 65 72 20 57 48 45 52 45 20 70 6f 72 74 65 72 20  er WHERE porter 
18d60 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69  MATCH 'Frustrati
18d70 6f 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  on';.</codeblock
18d80 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 69 73  >..<p>.  If this
18d90 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f   extension is co
18da0 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
18db0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
18dc0 55 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a  U pre-processor.
18dd0 20 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64    symbol defined
18de0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 65 78 69  , then there exi
18df0 73 74 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 74  sts a built-in t
18e00 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22  okenizer named "
18e10 69 63 75 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74  icu".  implement
18e20 65 64 20 75 73 69 6e 67 20 74 68 65 20 49 43 55  ed using the ICU
18e30 20 6c 69 62 72 61 72 79 2e 20 54 68 65 20 66 69   library. The fi
18e40 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
18e50 73 65 64 20 74 6f 20 74 68 65 0a 20 20 78 43 72  sed to the.  xCr
18e60 65 61 74 65 28 29 20 6d 65 74 68 6f 64 20 28 73  eate() method (s
18e70 65 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  ee fts3_tokenize
18e80 72 2e 68 29 20 6f 66 20 74 68 69 73 20 74 6f 6b  r.h) of this tok
18e90 65 6e 69 7a 65 72 20 6d 61 79 20 62 65 0a 20 20  enizer may be.  
18ea0 61 6e 20 49 43 55 20 6c 6f 63 61 6c 65 20 69 64  an ICU locale id
18eb0 65 6e 74 69 66 69 65 72 2e 20 46 6f 72 20 65 78  entifier. For ex
18ec0 61 6d 70 6c 65 20 22 74 72 5f 54 52 22 20 66 6f  ample "tr_TR" fo
18ed0 72 20 54 75 72 6b 69 73 68 20 61 73 20 75 73 65  r Turkish as use
18ee0 64 0a 20 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f  d.  in Turkey, o
18ef0 72 20 22 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e  r "en_AU" for En
18f00 67 6c 69 73 68 20 61 73 20 75 73 65 64 20 69 6e  glish as used in
18f10 20 41 75 73 74 72 61 6c 69 61 2e 20 46 6f 72 20   Australia. For 
18f20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
18f30 6c 6f 63 6b 3e 0a 20 20 20 20 43 52 45 41 54 45  lock>.    CREATE
18f40 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
18f50 68 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20 66  hai_text USING f
18f60 74 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69  ts3(text, tokeni
18f70 7a 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 3c 2f  ze=icu th_TH).</
18f80 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
18f90 20 20 54 68 65 20 49 43 55 20 74 6f 6b 65 6e 69    The ICU tokeni
18fa0 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  zer implementati
18fb0 6f 6e 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c  on is very simpl
18fc0 65 2e 20 49 74 20 73 70 6c 69 74 73 20 74 68 65  e. It splits the
18fd0 20 69 6e 70 75 74 0a 20 20 74 65 78 74 20 61 63   input.  text ac
18fe0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 49  cording to the I
18ff0 43 55 20 72 75 6c 65 73 20 66 6f 72 20 66 69 6e  CU rules for fin
19000 64 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61  ding word bounda
19010 72 69 65 73 20 61 6e 64 20 64 69 73 63 61 72 64  ries and discard
19020 73 0a 20 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74  s.  any tokens t
19030 68 61 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69  hat consist enti
19040 72 65 6c 79 20 6f 66 20 77 68 69 74 65 2d 73 70  rely of white-sp
19050 61 63 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ace. This may be
19060 20 73 75 69 74 61 62 6c 65 0a 20 20 66 6f 72 20   suitable.  for 
19070 73 6f 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e  some application
19080 73 20 69 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65  s in some locale
19090 73 2c 20 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20  s, but not all. 
190a0 49 66 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a  If more complex.
190b0 20 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20    processing is 
190c0 72 65 71 75 69 72 65 64 2c 20 66 6f 72 20 65 78  required, for ex
190d0 61 6d 70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65  ample to impleme
190e0 6e 74 20 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20  nt stemming or. 
190f0 20 64 69 73 63 61 72 64 20 70 75 6e 63 74 75 61   discard punctua
19100 74 69 6f 6e 2c 20 74 68 69 73 20 63 61 6e 20 62  tion, this can b
19110 65 20 64 6f 6e 65 20 62 79 20 63 72 65 61 74 69  e done by creati
19120 6e 67 20 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20  ng a tokenizer. 
19130 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19140 74 68 61 74 20 75 73 65 73 20 74 68 65 20 49 43  that uses the IC
19150 55 20 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70  U tokenizer as p
19160 61 72 74 20 6f 66 20 69 74 73 20 69 6d 70 6c 65  art of its imple
19170 6d 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c 74 63 6c  mentation...<tcl
19180 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 75 6e 69  >hd_fragment uni
19190 63 6f 64 65 36 31 20 75 6e 69 63 6f 64 65 36 31  code61 unicode61
191a0 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20 54 68 65  </tcl>.<p>.  The
191b0 20 22 75 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b   "unicode61" tok
191c0 65 6e 69 7a 65 72 20 69 73 20 61 76 61 69 6c 61  enizer is availa
191d0 62 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ble beginning wi
191e0 74 68 20 53 51 4c 69 74 65 20 5b 76 65 72 73 69  th SQLite [versi
191f0 6f 6e 20 33 2e 37 2e 31 33 5d 0a 20 20 28 5b 64  on 3.7.13].  ([d
19200 61 74 65 6f 66 3a 33 2e 37 2e 31 33 5d 29 2e 0a  ateof:3.7.13])..
19210 20 20 55 6e 69 63 6f 64 65 36 31 20 77 6f 72 6b    Unicode61 work
19220 73 20 76 65 72 79 20 6d 75 63 68 20 6c 69 6b 65  s very much like
19230 20 22 73 69 6d 70 6c 65 22 20 65 78 63 65 70 74   "simple" except
19240 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 73 69   that it does si
19250 6d 70 6c 65 20 75 6e 69 63 6f 64 65 0a 20 20 63  mple unicode.  c
19260 61 73 65 20 66 6f 6c 64 69 6e 67 20 61 63 63 6f  ase folding acco
19270 72 64 69 6e 67 20 74 6f 20 72 75 6c 65 73 20 69  rding to rules i
19280 6e 20 55 6e 69 63 6f 64 65 20 56 65 72 73 69 6f  n Unicode Versio
19290 6e 20 36 2e 31 20 61 6e 64 20 69 74 20 72 65 63  n 6.1 and it rec
192a0 6f 67 6e 69 7a 65 73 0a 20 20 75 6e 69 63 6f 64  ognizes.  unicod
192b0 65 20 73 70 61 63 65 20 61 6e 64 20 70 75 6e 63  e space and punc
192c0 74 75 61 74 69 6f 6e 20 63 68 61 72 61 63 74 65  tuation characte
192d0 72 73 20 61 6e 64 20 75 73 65 73 20 74 68 6f 73  rs and uses thos
192e0 65 20 74 6f 20 73 65 70 61 72 61 74 65 20 74 6f  e to separate to
192f0 6b 65 6e 73 2e 0a 20 20 54 68 65 20 73 69 6d 70  kens..  The simp
19300 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 6f 6e 6c  le tokenizer onl
19310 79 20 64 6f 65 73 20 63 61 73 65 20 66 6f 6c 64  y does case fold
19320 69 6e 67 20 6f 66 20 41 53 43 49 49 20 63 68 61  ing of ASCII cha
19330 72 61 63 74 65 72 73 20 61 6e 64 20 6f 6e 6c 79  racters and only
19340 0a 20 20 72 65 63 6f 67 6e 69 7a 65 73 20 41 53  .  recognizes AS
19350 43 49 49 20 73 70 61 63 65 20 61 6e 64 20 70 75  CII space and pu
19360 6e 63 74 75 61 74 69 6f 6e 20 63 68 61 72 61 63  nctuation charac
19370 74 65 72 73 20 61 73 20 74 6f 6b 65 6e 20 73 65  ters as token se
19380 70 61 72 61 74 6f 72 73 2e 0a 0a 3c 70 3e 0a 20  parators...<p>. 
19390 20 42 79 20 64 65 66 61 75 6c 74 2c 20 22 75 6e   By default, "un
193a0 69 63 6f 64 65 36 31 22 20 61 6c 73 6f 20 72 65  icode61" also re
193b0 6d 6f 76 65 73 20 61 6c 6c 20 64 69 61 63 72 69  moves all diacri
193c0 74 69 63 73 20 66 72 6f 6d 20 4c 61 74 69 6e 20  tics from Latin 
193d0 73 63 72 69 70 74 0a 20 20 63 68 61 72 61 63 74  script.  charact
193e0 65 72 73 2e 20 54 68 69 73 20 62 65 68 61 76 69  ers. This behavi
193f0 6f 75 72 20 63 61 6e 20 62 65 20 6f 76 65 72 72  our can be overr
19400 69 64 64 65 6e 20 62 79 20 61 64 64 69 6e 67 20  idden by adding 
19410 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61 72  the tokenizer ar
19420 67 75 6d 65 6e 74 0a 20 20 22 72 65 6d 6f 76 65  gument.  "remove
19430 5f 64 69 61 63 72 69 74 69 63 73 3d 30 22 2e 20  _diacritics=0". 
19440 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63  For example:..<c
19450 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 3c 69  odeblock>.    <i
19460 3e 2d 2d 20 43 72 65 61 74 65 20 74 61 62 6c 65  >-- Create table
19470 73 20 74 68 61 74 20 72 65 6d 6f 76 65 20 64 69  s that remove di
19480 61 63 72 69 74 69 63 73 20 66 72 6f 6d 20 4c 61  acritics from La
19490 74 69 6e 20 73 63 72 69 70 74 20 63 68 61 72 61  tin script chara
194a0 63 74 65 72 73 3c 2f 69 3e 0a 20 20 20 20 3c 69  cters</i>.    <i
194b0 3e 2d 2d 20 61 73 20 70 61 72 74 20 6f 66 20 74  >-- as part of t
194c0 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2e 3c 2f 69 3e  okenization.</i>
194d0 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
194e0 55 41 4c 20 54 41 42 4c 45 20 74 78 74 31 20 55  UAL TABLE txt1 U
194f0 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69  SING fts4(tokeni
19500 7a 65 3d 75 6e 69 63 6f 64 65 36 31 29 3b 0a 20  ze=unicode61);. 
19510 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
19520 4c 20 54 41 42 4c 45 20 74 78 74 32 20 55 53 49  L TABLE txt2 USI
19530 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
19540 3d 75 6e 69 63 6f 64 65 36 31 20 22 72 65 6d 6f  =unicode61 "remo
19550 76 65 5f 64 69 61 63 72 69 74 69 63 73 3d 31 22  ve_diacritics=1"
19560 29 3b 0a 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72  );..    <i>-- Cr
19570 65 61 74 65 20 61 20 74 61 62 6c 65 20 74 68 61  eate a table tha
19580 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 6f 76  t does not remov
19590 65 20 64 69 61 63 72 69 74 69 63 73 20 66 72 6f  e diacritics fro
195a0 6d 20 4c 61 74 69 6e 20 73 63 72 69 70 74 3c 2f  m Latin script</
195b0 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 63 68 61  i>.    <i>-- cha
195c0 72 61 63 74 65 72 73 20 61 73 20 70 61 72 74 20  racters as part 
195d0 6f 66 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2e  of tokenization.
195e0 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45 20  </i>.    CREATE 
195f0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 78  VIRTUAL TABLE tx
19600 74 33 20 55 53 49 4e 47 20 66 74 73 34 28 74 6f  t3 USING fts4(to
19610 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31  kenize=unicode61
19620 20 22 72 65 6d 6f 76 65 5f 64 69 61 63 72 69 74   "remove_diacrit
19630 69 63 73 3d 30 22 29 3b 0a 3c 2f 63 6f 64 65 62  ics=0");.</codeb
19640 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 74 20  lock>..<p>.  It 
19650 69 73 20 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65  is also possible
19660 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
19670 65 20 73 65 74 20 6f 66 20 63 6f 64 65 70 6f 69  e set of codepoi
19680 6e 74 73 20 74 68 61 74 20 75 6e 69 63 6f 64 65  nts that unicode
19690 36 31 20 74 72 65 61 74 73 0a 20 20 61 73 20 73  61 treats.  as s
196a0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
196b0 65 72 73 2e 20 54 68 65 20 22 73 65 70 61 72 61  ers. The "separa
196c0 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 20 6d 61  tors=" option ma
196d0 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  y be used to spe
196e0 63 69 66 79 20 6f 6e 65 0a 20 20 6f 72 20 6d 6f  cify one.  or mo
196f0 72 65 20 65 78 74 72 61 20 63 68 61 72 61 63 74  re extra charact
19700 65 72 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ers that should 
19710 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 65  be treated as se
19720 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
19730 72 73 2c 20 61 6e 64 0a 20 20 74 68 65 20 22 74  rs, and.  the "t
19740 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f 70 74 69  okenchars=" opti
19750 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  on may be used t
19760 6f 20 73 70 65 63 69 66 79 20 6f 6e 65 20 6f 72  o specify one or
19770 20 6d 6f 72 65 20 65 78 74 72 61 20 63 68 61 72   more extra char
19780 61 63 74 65 72 73 0a 20 20 74 68 61 74 20 73 68  acters.  that sh
19790 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20  ould be treated 
197a0 61 73 20 70 61 72 74 20 6f 66 20 74 6f 6b 65 6e  as part of token
197b0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20  s instead of as 
197c0 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
197d0 74 65 72 73 2e 0a 20 20 46 6f 72 20 65 78 61 6d  ters..  For exam
197e0 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
197f0 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61  >.    <i>-- Crea
19800 74 65 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  te a table that 
19810 75 73 65 73 20 74 68 65 20 75 6e 69 63 6f 64 65  uses the unicode
19820 36 31 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 62 75  61 tokenizer, bu
19830 74 20 63 6f 6e 73 69 64 65 72 73 20 22 2e 22 3c  t considers "."<
19840 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 61 6e  /i>.    <i>-- an
19850 64 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 73  d "=" characters
19860 20 74 6f 20 62 65 20 70 61 72 74 20 6f 66 20 74   to be part of t
19870 6f 6b 65 6e 73 2c 20 61 6e 64 20 63 61 70 69 74  okens, and capit
19880 61 6c 20 22 58 22 20 63 68 61 72 61 63 74 65 72  al "X" character
19890 73 20 74 6f 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e  s to</i>.    <i>
198a0 2d 2d 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 73  -- function as s
198b0 65 70 61 72 61 74 6f 72 73 2e 3c 2f 69 3e 0a 20  eparators.</i>. 
198c0 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
198d0 4c 20 54 41 42 4c 45 20 74 78 74 33 20 55 53 49  L TABLE txt3 USI
198e0 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
198f0 3d 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65  =unicode61 "toke
19900 6e 63 68 61 72 73 3d 2e 3d 22 20 22 73 65 70 61  nchars=.=" "sepa
19910 72 61 74 6f 72 73 3d 58 22 29 3b 0a 0a 20 20 20  rators=X");..   
19920 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20   <i>-- Create a 
19930 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 73 69  table that consi
19940 64 65 72 73 20 73 70 61 63 65 20 63 68 61 72 61  ders space chara
19950 63 74 65 72 73 20 28 63 6f 64 65 70 6f 69 6e 74  cters (codepoint
19960 20 33 32 29 20 74 6f 20 62 65 3c 2f 69 3e 0a 20   32) to be</i>. 
19970 20 20 20 3c 69 3e 2d 2d 20 61 20 74 6f 6b 65 6e     <i>-- a token
19980 20 63 68 61 72 61 63 74 65 72 3c 2f 69 3e 0a 20   character</i>. 
19990 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
199a0 4c 20 54 41 42 4c 45 20 74 78 74 34 20 55 53 49  L TABLE txt4 USI
199b0 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
199c0 3d 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65  =unicode61 "toke
199d0 6e 63 68 61 72 73 3d 20 22 29 3b 0a 3c 2f 63 6f  nchars= ");.</co
199e0 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
199f0 49 66 20 61 20 63 68 61 72 61 63 74 65 72 20 73  If a character s
19a00 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
19a10 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
19a20 20 74 6f 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d   to "tokenchars=
19a30 22 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  " is considered.
19a40 20 20 74 6f 20 62 65 20 61 20 74 6f 6b 65 6e 20    to be a token 
19a50 63 68 61 72 61 63 74 65 72 20 62 79 20 64 65 66  character by def
19a60 61 75 6c 74 2c 20 69 74 20 69 73 20 69 67 6e 6f  ault, it is igno
19a70 72 65 64 2e 20 54 68 69 73 20 69 73 20 74 72 75  red. This is tru
19a80 65 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73  e even if it has
19a90 0a 20 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 61  .  been marked a
19aa0 73 20 61 20 73 65 70 61 72 61 74 6f 72 20 62 79  s a separator by
19ab0 20 61 6e 20 65 61 72 6c 69 65 72 20 22 73 65 70   an earlier "sep
19ac0 61 72 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e  arators=" option
19ad0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 0a  . Similarly, if.
19ae0 20 20 61 20 63 68 61 72 61 63 74 65 72 20 73 70    a character sp
19af0 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
19b00 6f 66 20 61 20 22 73 65 70 61 72 61 74 6f 72 73  of a "separators
19b10 3d 22 20 6f 70 74 69 6f 6e 20 69 73 20 74 72 65  =" option is tre
19b20 61 74 65 64 20 61 73 20 61 20 73 65 70 61 72 61  ated as a separa
19b30 74 6f 72 0a 20 20 63 68 61 72 61 63 74 65 72 20  tor.  character 
19b40 62 79 20 64 65 66 61 75 6c 74 2c 20 69 74 20 69  by default, it i
19b50 73 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 6d 75  s ignored. If mu
19b60 6c 74 69 70 6c 65 20 22 74 6f 6b 65 6e 63 68 61  ltiple "tokencha
19b70 72 73 3d 22 20 6f 72 20 22 73 65 70 61 72 61 74  rs=" or "separat
19b80 6f 72 73 3d 22 0a 20 20 6f 70 74 69 6f 6e 73 20  ors=".  options 
19b90 61 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 61  are specified, a
19ba0 6c 6c 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ll are processed
19bb0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
19bc0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20  <codeblock>.    
19bd0 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74  <i>-- Create a t
19be0 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 74  able that uses t
19bf0 68 65 20 75 6e 69 63 6f 64 65 36 31 20 74 6f 6b  he unicode61 tok
19c00 65 6e 69 7a 65 72 2c 20 62 75 74 20 63 6f 6e 73  enizer, but cons
19c10 69 64 65 72 73 20 22 2e 22 3c 2f 69 3e 0a 20 20  iders "."</i>.  
19c20 20 20 3c 69 3e 2d 2d 20 61 6e 64 20 22 3d 22 20    <i>-- and "=" 
19c30 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 62 65  characters to be
19c40 20 70 61 72 74 20 6f 66 20 74 6f 6b 65 6e 73 2c   part of tokens,
19c50 20 61 6e 64 20 63 61 70 69 74 61 6c 20 22 58 22   and capital "X"
19c60 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 3c 2f   characters to</
19c70 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 66 75 6e  i>.    <i>-- fun
19c80 63 74 69 6f 6e 20 61 73 20 73 65 70 61 72 61 74  ction as separat
19c90 6f 72 73 2e 20 42 6f 74 68 20 6f 66 20 74 68 65  ors. Both of the
19ca0 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f   "tokenchars=" o
19cb0 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 63 65  ptions are proce
19cc0 73 73 65 64 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e  ssed</i>.    <i>
19cd0 2d 2d 20 54 68 65 20 22 73 65 70 61 72 61 74 6f  -- The "separato
19ce0 72 73 3d 22 20 6f 70 74 69 6f 6e 20 69 67 6e 6f  rs=" option igno
19cf0 72 65 73 20 74 68 65 20 22 2e 22 20 70 61 73 73  res the "." pass
19d00 65 64 20 74 6f 20 69 74 2c 20 61 73 20 22 2e 22  ed to it, as "."
19d10 20 69 73 20 62 79 3c 2f 69 3e 0a 20 20 20 20 3c   is by</i>.    <
19d20 69 3e 2d 2d 20 64 65 66 61 75 6c 74 20 61 20 73  i>-- default a s
19d30 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
19d40 65 72 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  er, even though 
19d50 69 74 20 68 61 73 20 62 65 65 6e 20 6d 61 72 6b  it has been mark
19d60 65 64 20 61 73 20 61 20 74 6f 6b 65 6e 3c 2f 69  ed as a token</i
19d70 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 63 68 61 72  >.    <i>-- char
19d80 61 63 74 65 72 20 62 79 20 61 6e 20 65 61 72 6c  acter by an earl
19d90 69 65 72 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d  ier "tokenchars=
19da0 22 20 6f 70 74 69 6f 6e 2e 3c 2f 69 3e 0a 20 20  " option.</i>.  
19db0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
19dc0 20 54 41 42 4c 45 20 74 78 74 35 20 55 53 49 4e   TABLE txt5 USIN
19dd0 47 20 66 74 73 34 28 0a 20 20 20 20 20 20 20 20  G fts4(.        
19de0 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65  tokenize=unicode
19df0 36 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 2e  61 "tokenchars=.
19e00 22 20 22 73 65 70 61 72 61 74 6f 72 73 3d 58 2e  " "separators=X.
19e10 22 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 3d 22  " "tokenchars=="
19e20 0a 20 20 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c  .    );.</codebl
19e30 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ock>..<p>.  The 
19e40 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
19e50 20 74 6f 20 74 68 65 20 22 74 6f 6b 65 6e 63 68   to the "tokench
19e60 61 72 73 3d 22 20 6f 72 20 22 73 65 70 61 72 61  ars=" or "separa
19e70 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 73 20 61  tors=" options a
19e80 72 65 20 0a 20 20 63 61 73 65 2d 73 65 6e 73 69  re .  case-sensi
19e90 74 69 76 65 2e 20 49 6e 20 74 68 65 20 65 78 61  tive. In the exa
19ea0 6d 70 6c 65 20 61 62 6f 76 65 2c 20 73 70 65 63  mple above, spec
19eb0 69 66 79 69 6e 67 20 74 68 61 74 20 22 58 22 20  ifying that "X" 
19ec0 69 73 20 61 20 73 65 70 61 72 61 74 6f 72 0a 20  is a separator. 
19ed0 20 63 68 61 72 61 63 74 65 72 20 64 6f 65 73 20   character does 
19ee0 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 77  not affect the w
19ef0 61 79 20 22 78 22 20 69 73 20 68 61 6e 64 6c 65  ay "x" is handle
19f00 64 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  d...<tcl>hd_frag
19f10 6d 65 6e 74 20 66 33 74 6b 6e 7a 72 20 7b 66 74  ment f3tknzr {ft
19f20 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 7d 3c 2f 74  s3_tokenizer}</t
19f30 63 6c 3e 0a 3c 68 32 3e 43 75 73 74 6f 6d 20 28  cl>.<h2>Custom (
19f40 41 70 70 6c 69 63 61 74 69 6f 6e 20 44 65 66 69  Application Defi
19f50 6e 65 64 29 20 54 6f 6b 65 6e 69 7a 65 72 73 3c  ned) Tokenizers<
19f60 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61  /h2>..<p>.  In a
19f70 64 64 69 74 69 6f 6e 20 74 6f 20 70 72 6f 76 69  ddition to provi
19f80 64 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 22 73  ding built-in "s
19f90 69 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22  imple", "porter"
19fa0 20 61 6e 64 20 28 70 6f 73 73 69 62 6c 79 29 20   and (possibly) 
19fb0 22 69 63 75 22 20 61 6e 64 0a 20 20 22 75 6e 69  "icu" and.  "uni
19fc0 63 6f 64 65 36 31 22 20 74 6f 6b 65 6e 69 7a 65  code61" tokenize
19fd0 72 73 2c 0a 20 20 46 54 53 20 70 72 6f 76 69 64  rs,.  FTS provid
19fe0 65 73 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20  es an interface 
19ff0 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  for applications
1a000 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
1a010 64 20 72 65 67 69 73 74 65 72 20 63 75 73 74 6f  d register custo
1a020 6d 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 20 77  m.  tokenizers w
1a030 72 69 74 74 65 6e 20 69 6e 20 43 2e 20 20 54 68  ritten in C.  Th
1a040 65 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64  e interface used
1a050 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
1a060 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 64 65   tokenizer is de
1a070 66 69 6e 65 64 0a 20 20 61 6e 64 20 64 65 73 63  fined.  and desc
1a080 72 69 62 65 64 20 69 6e 20 74 68 65 20 66 74 73  ribed in the fts
1a090 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 20 73 6f  3_tokenizer.h so
1a0a0 75 72 63 65 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a  urce file...<p>.
1a0b0 20 20 52 65 67 69 73 74 65 72 69 6e 67 20 61 20    Registering a 
1a0c0 6e 65 77 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65  new FTS tokenize
1a0d0 72 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  r is similar to 
1a0e0 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65  registering a ne
1a0f0 77 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c  w.  virtual tabl
1a100 65 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 53 51  e module with SQ
1a110 4c 69 74 65 2e 20 54 68 65 20 75 73 65 72 20 70  Lite. The user p
1a120 61 73 73 65 73 20 61 20 70 6f 69 6e 74 65 72 20  asses a pointer 
1a130 74 6f 20 61 0a 20 20 73 74 72 75 63 74 75 72 65  to a.  structure
1a140 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e   containing poin
1a150 74 65 72 73 20 74 6f 20 76 61 72 69 6f 75 73 20  ters to various 
1a160 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
1a170 6e 73 20 74 68 61 74 0a 20 20 6d 61 6b 65 20 75  ns that.  make u
1a180 70 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  p the implementa
1a190 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
1a1a0 74 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 2e 20  tokenizer type. 
1a1b0 46 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a  For tokenizers,.
1a1c0 20 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20    the structure 
1a1d0 28 64 65 66 69 6e 65 64 20 69 6e 20 66 74 73 33  (defined in fts3
1a1e0 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73  _tokenizer.h) is
1a1f0 20 63 61 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74   called.  "sqlit
1a200 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
1a210 75 6c 65 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53  ule"...<p>.  FTS
1a220 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6f 73 65   does not expose
1a230 20 61 20 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68   a C-function th
1a240 61 74 20 75 73 65 72 73 20 63 61 6c 6c 20 74 6f  at users call to
1a250 20 72 65 67 69 73 74 65 72 20 6e 65 77 0a 20 20   register new.  
1a260 74 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 73 20  tokenizer types 
1a270 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
1a280 68 61 6e 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c  handle. Instead,
1a290 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 75 73   the pointer mus
1a2a0 74 0a 20 20 62 65 20 65 6e 63 6f 64 65 64 20 61  t.  be encoded a
1a2b0 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61  s an SQL blob va
1a2c0 6c 75 65 20 61 6e 64 20 70 61 73 73 65 64 20 74  lue and passed t
1a2d0 6f 20 46 54 53 20 74 68 72 6f 75 67 68 20 74 68  o FTS through th
1a2e0 65 20 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62  e SQL.  engine b
1a2f0 79 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73  y evaluating a s
1a300 70 65 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75  pecial scalar fu
1a310 6e 63 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f  nction, "fts3_to
1a320 6b 65 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68  kenizer()"..  Th
1a330 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
1a340 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  () function may 
1a350 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f  be called with o
1a360 6e 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65  ne or two argume
1a370 6e 74 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77  nts,.  as follow
1a380 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  s:..<codeblock>.
1a390 20 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f      SELECT fts3_
1a3a0 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f  tokenizer(&lt;to
1a3b0 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b  kenizer-name&gt;
1a3c0 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 66 74  );.    SELECT ft
1a3d0 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74  s3_tokenizer(&lt
1a3e0 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26  ;tokenizer-name&
1a3f0 67 74 3b 2c 20 26 6c 74 3b 73 71 6c 69 74 65 33  gt;, &lt;sqlite3
1a400 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
1a410 65 20 70 74 72 26 67 74 3b 29 3b 0a 3c 2f 63 6f  e ptr&gt;);.</co
1a420 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
1a430 57 68 65 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69  Where &lt;tokeni
1a440 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 20 69 73 20  zer-name&gt; is 
1a450 61 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66  a string identif
1a460 79 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a  ying the tokeniz
1a470 65 72 20 61 6e 64 0a 20 20 26 6c 74 3b 73 71 6c  er and.  &lt;sql
1a480 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
1a490 6f 64 75 6c 65 20 70 74 72 26 67 74 3b 20 69 73  odule ptr&gt; is
1a4a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1a4b0 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
1a4c0 65 72 5f 6d 6f 64 75 6c 65 0a 20 20 73 74 72 75  er_module.  stru
1a4d0 63 74 75 72 65 20 65 6e 63 6f 64 65 64 20 61 73  cture encoded as
1a4e0 20 61 6e 20 53 51 4c 20 62 6c 6f 62 2e 20 49 66   an SQL blob. If
1a4f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1a500 6d 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 2c  ment is present,
1a510 0a 20 20 69 74 20 69 73 20 72 65 67 69 73 74 65  .  it is registe
1a520 72 65 64 20 61 73 20 74 6f 6b 65 6e 69 7a 65 72  red as tokenizer
1a530 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e   &lt;tokenizer-n
1a540 61 6d 65 26 67 74 3b 20 61 6e 64 20 61 20 63 6f  ame&gt; and a co
1a550 70 79 20 6f 66 20 69 74 0a 20 20 72 65 74 75 72  py of it.  retur
1a560 6e 65 64 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65  ned. If only one
1a570 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73   argument is pas
1a580 73 65 64 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  sed, a pointer t
1a590 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a  o the tokenizer.
1a5a0 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e    implementation
1a5b0 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73   currently regis
1a5c0 74 65 72 65 64 20 61 73 20 26 6c 74 3b 74 6f 6b  tered as &lt;tok
1a5d0 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 20  enizer-name&gt; 
1a5e0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 65  is returned,.  e
1a5f0 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62  ncoded as a blob
1a600 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63 68  . Or, if no such
1a610 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 69 73 74   tokenizer exist
1a620 73 2c 20 61 6e 20 53 51 4c 20 65 78 63 65 70 74  s, an SQL except
1a630 69 6f 6e 0a 20 20 28 65 72 72 6f 72 29 20 69 73  ion.  (error) is
1a640 20 72 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a 20 20   raised...<p>.  
1a650 42 65 63 61 75 73 65 20 6f 66 20 73 65 63 75 72  Because of secur
1a660 69 74 79 20 63 6f 6e 63 65 72 6e 73 2c 20 53 51  ity concerns, SQ
1a670 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e  Lite [version 3.
1a680 31 31 2e 30 5d 20 28 5b 64 61 74 65 6f 66 3a 33  11.0] ([dateof:3
1a690 2e 31 31 2e 30 5d 29 0a 20 20 61 6e 64 20 6c 61  .11.0]).  and la
1a6a0 74 65 72 20 6f 6e 6c 79 20 65 6e 61 62 6c 65 64  ter only enabled
1a6b0 20 74 68 65 0a 20 20 73 65 63 6f 6e 64 20 66 6f   the.  second fo
1a6c0 72 6d 20 6f 66 20 74 68 65 20 66 74 73 33 5f 74  rm of the fts3_t
1a6d0 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74  okenizer() funct
1a6e0 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 69 62  ion when the lib
1a6f0 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
1a700 0a 20 20 77 69 74 68 20 74 68 65 20 5b 53 51 4c  .  with the [SQL
1a710 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
1a720 54 4f 4b 45 4e 49 5a 45 52 20 7c 20 2d 44 53 51  TOKENIZER | -DSQ
1a730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
1a740 5f 54 4f 4b 45 4e 49 5a 45 52 5d 0a 20 20 6f 70  _TOKENIZER].  op
1a750 74 69 6f 6e 2e 20 49 6e 20 65 61 72 6c 69 65 72  tion. In earlier
1a760 20 76 65 72 73 69 6f 6e 73 20 69 74 20 77 61 73   versions it was
1a770 0a 20 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61  .  always availa
1a780 62 6c 65 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20  ble.  Beginning 
1a790 77 69 74 68 20 53 51 4c 69 74 65 20 5b 76 65 72  with SQLite [ver
1a7a0 73 69 6f 6e 20 33 2e 31 32 2e 30 5d 0a 20 20 28  sion 3.12.0].  (
1a7b0 5b 64 61 74 65 6f 66 3a 33 2e 31 32 2e 30 5d 29  [dateof:3.12.0])
1a7c0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  , the second for
1a7d0 6d 20 6f 66 0a 20 20 66 74 73 33 5f 74 6f 6b 65  m of.  fts3_toke
1a7e0 6e 69 7a 65 72 28 29 20 63 61 6e 20 61 6c 73 6f  nizer() can also
1a7f0 20 62 65 20 61 63 74 69 76 61 74 65 64 20 61 74   be activated at
1a800 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 63 61 6c   run-time by cal
1a810 6c 69 6e 67 0a 20 20 5b 73 71 6c 69 74 65 33 5f  ling.  [sqlite3_
1a820 64 62 5f 63 6f 6e 66 69 67 5d 28 64 62 2c 5b 53  db_config](db,[S
1a830 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
1a840 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
1a850 49 5a 45 52 5d 2c 31 2c 30 29 2e 0a 0a 3c 70 3e  IZER],1,0)...<p>
1a860 0a 20 20 3c 62 3e 53 45 43 55 52 49 54 59 20 57  .  <b>SECURITY W
1a870 41 52 4e 49 4e 47 3c 2f 62 3e 3a 20 0a 20 20 49  ARNING</b>: .  I
1a880 66 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  f a version of t
1a890 68 65 20 66 74 73 33 2f 34 20 65 78 74 65 6e 73  he fts3/4 extens
1a8a0 69 6f 6e 20 74 68 61 74 20 73 75 70 70 6f 72 74  ion that support
1a8b0 73 20 74 68 65 20 74 77 6f 2d 61 72 67 75 6d 65  s the two-argume
1a8c0 6e 74 20 66 6f 72 6d 20 6f 66 0a 20 20 66 74 73  nt form of.  fts
1a8d0 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20 69 73  3_tokenizer() is
1a8e0 20 64 65 70 6c 6f 79 65 64 20 69 6e 20 61 6e 20   deployed in an 
1a8f0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 77 68 65 72  environment wher
1a900 65 20 6d 61 6c 69 63 69 6f 75 73 20 75 73 65 72  e malicious user
1a910 73 20 63 61 6e 0a 20 20 72 75 6e 20 61 72 62 69  s can.  run arbi
1a920 74 72 61 72 79 20 53 51 4c 2c 20 74 68 65 6e 20  trary SQL, then 
1a930 74 68 6f 73 65 20 75 73 65 72 73 20 73 68 6f 75  those users shou
1a940 6c 64 20 62 65 20 70 72 65 76 65 6e 74 65 64 20  ld be prevented 
1a950 66 72 6f 6d 20 69 6e 76 6f 6b 69 6e 67 20 74 68  from invoking th
1a960 65 20 0a 20 20 74 77 6f 2d 61 72 67 75 6d 65 6e  e .  two-argumen
1a970 74 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  t fts3_tokenizer
1a980 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 54  () function..  T
1a990 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
1a9a0 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c 69 74  using the [sqlit
1a9b0 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
1a9c0 72 28 29 7c 61 75 74 68 6f 72 69 7a 61 74 69 6f  r()|authorizatio
1a9d0 6e 20 63 61 6c 6c 62 61 63 6b 5d 2c 20 0a 20 20  n callback], .  
1a9e0 6f 72 20 62 79 20 64 69 73 61 62 6c 69 6e 67 20  or by disabling 
1a9f0 74 68 65 20 74 77 6f 2d 61 72 67 75 6d 65 6e 74  the two-argument
1aa00 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
1aa10 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
1aa20 67 20 61 0a 20 20 63 61 6c 6c 20 74 6f 0a 20 20  g a.  call to.  
1aa30 5b 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  [sqlite3_db_conf
1aa40 69 67 5d 28 64 62 2c 5b 53 51 4c 49 54 45 5f 44  ig](db,[SQLITE_D
1aa50 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
1aa60 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 5d 2c 30  TS3_TOKENIZER],0
1aa70 2c 30 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ,0)...<p>.  The 
1aa80 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
1aa90 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d  contains an exam
1aaa0 70 6c 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74  ple of calling t
1aab0 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  he fts3_tokenize
1aac0 72 28 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20 66  r().  function f
1aad0 72 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a 3c 63 6f  rom C code:..<co
1aae0 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2f 2a  deblock>.  <i>/*
1aaf0 0a 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 61  .  ** Register a
1ab00 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
1ab10 6d 65 6e 74 61 74 69 6f 6e 20 77 69 74 68 20 46  mentation with F
1ab20 54 53 33 20 6f 72 20 46 54 53 34 2e 0a 20 20 2a  TS3 or FTS4..  *
1ab30 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 72 65 67 69  /</i>.  int regi
1ab40 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72 28 0a 20  sterTokenizer(. 
1ab50 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a     sqlite3 *db,.
1ab60 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
1ab70 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
1ab80 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
1ab90 75 6c 65 20 2a 70 0a 20 20 29 7b 0a 20 20 20 20  ule *p.  ){.    
1aba0 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  int rc;.    sqli
1abb0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1abc0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1abd0 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20  *zSql = "SELECT 
1abe0 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f  fts3_tokenizer(?
1abf0 2c 20 3f 29 22 3b 0a 0a 20 20 20 20 72 63 20 3d  , ?)";..    rc =
1ac00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1ac10 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
1ac20 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1ac30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ac40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ac50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1ac60 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1ac70 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
1ac80 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
1ac90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
1aca0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
1acb0 70 53 74 6d 74 2c 20 32 2c 20 26 70 2c 20 73 69  pStmt, 2, &p, si
1acc0 7a 65 6f 66 28 70 29 2c 20 53 51 4c 49 54 45 5f  zeof(p), SQLITE_
1acd0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
1ace0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1acf0 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ;..    return sq
1ad00 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1ad10 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69  Stmt);.  }..  <i
1ad20 3e 2f 2a 0a 20 20 2a 2a 20 51 75 65 72 79 20 46  >/*.  ** Query F
1ad30 54 53 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e  TS for the token
1ad40 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  izer implementat
1ad50 69 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  ion named zName.
1ad60 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  .  */</i>.  int 
1ad70 71 75 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 0a  queryTokenizer(.
1ad80 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c      sqlite3 *db,
1ad90 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
1ada0 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ,.    const sqli
1adb0 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
1adc0 64 75 6c 65 20 2a 2a 70 70 0a 20 20 29 7b 0a 20  dule **pp.  ){. 
1add0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
1ade0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1adf0 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  mt;.    const ch
1ae00 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
1ae10 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  CT fts3_tokenize
1ae20 72 28 3f 29 22 3b 0a 0a 20 20 20 20 2a 70 70 20  r(?)";..    *pp 
1ae30 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
1ae40 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1ae50 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
1ae60 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1ae70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ae80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ae90 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1aea0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1aeb0 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d  t(pStmt, 1, zNam
1aec0 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  e, -1, SQLITE_ST
1aed0 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20 53  ATIC);.    if( S
1aee0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1aef0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1af00 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1af10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
1af20 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54  pStmt, 0)==SQLIT
1af30 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
1af40 20 20 6d 65 6d 63 70 79 28 70 70 2c 20 73 71 6c    memcpy(pp, sql
1af50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1af60 28 70 53 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65  (pStmt, 0), size
1af70 6f 66 28 2a 70 70 29 29 3b 0a 20 20 20 20 20 20  of(*pp));.      
1af80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  }.    }..    ret
1af90 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
1afa0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
1afb0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a  .</codeblock>...
1afc0 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
1afd0 20 66 74 73 33 74 6f 6b 20 7b 66 74 73 33 74 6f   fts3tok {fts3to
1afe0 6b 65 6e 69 7a 65 7d 20 7b 66 74 73 33 74 6f 6b  kenize} {fts3tok
1aff0 65 6e 69 7a 65 20 76 69 72 74 75 61 6c 20 74 61  enize virtual ta
1b000 62 6c 65 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 51  ble}</tcl>.<h2>Q
1b010 75 65 72 79 69 6e 67 20 54 6f 6b 65 6e 69 7a 65  uerying Tokenize
1b020 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65 20  rs</h2>..<p>The 
1b030 22 66 74 73 33 74 6f 6b 65 6e 69 7a 65 22 20 76  "fts3tokenize" v
1b040 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e  irtual table can
1b050 20 62 65 20 75 73 65 64 20 74 6f 20 64 69 72 65   be used to dire
1b060 63 74 6c 79 20 61 63 63 65 73 73 20 61 6e 79 0a  ctly access any.
1b070 20 20 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 20 54     tokenizer.  T
1b080 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
1b090 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 68 6f   demonstrates ho
1b0a0 77 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  w to create an i
1b0b0 6e 73 74 61 6e 63 65 20 0a 20 20 20 6f 66 20 74  nstance .   of t
1b0c0 68 65 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 20  he fts3tokenize 
1b0d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 3a 0a 0a  virtual table:..
1b0e0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 43 52 45 41  <codeblock>.CREA
1b0f0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1b100 20 74 6f 6b 31 20 55 53 49 4e 47 20 66 74 73 33   tok1 USING fts3
1b110 74 6f 6b 65 6e 69 7a 65 28 27 70 6f 72 74 65 72  tokenize('porter
1b120 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ');.</codeblock>
1b130 0a 0a 3c 70 3e 54 68 65 20 6e 61 6d 65 20 6f 66  ..<p>The name of
1b140 20 74 68 65 20 64 65 73 69 72 65 64 20 74 6f 6b   the desired tok
1b150 65 6e 69 7a 65 72 20 73 68 6f 75 6c 64 20 62 65  enizer should be
1b160 20 73 75 62 73 74 69 74 75 74 65 64 20 69 6e 20   substituted in 
1b170 70 6c 61 63 65 20 6f 66 0a 20 20 20 27 70 6f 72  place of.   'por
1b180 74 65 72 27 20 69 6e 20 74 68 65 20 65 78 61 6d  ter' in the exam
1b190 70 6c 65 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20  ple, of course. 
1b1a0 20 49 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65   If the tokenize
1b1b0 72 20 72 65 71 75 69 72 65 73 20 6f 6e 65 20 6f  r requires one o
1b1c0 72 0a 20 20 20 6d 6f 72 65 20 61 72 67 75 6d 65  r.   more argume
1b1d0 6e 74 73 2c 20 74 68 65 79 20 73 68 6f 75 6c 64  nts, they should
1b1e0 20 62 65 20 73 65 70 61 72 61 74 65 64 20 62 79   be separated by
1b1f0 20 63 6f 6d 6d 61 73 20 69 6e 20 74 68 65 20 66   commas in the f
1b200 74 73 33 74 6f 6b 65 6e 69 7a 65 0a 20 20 20 64  ts3tokenize.   d
1b210 65 63 6c 61 72 61 74 69 6f 6e 20 28 65 76 65 6e  eclaration (even
1b220 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
1b230 20 73 65 70 61 72 61 74 65 64 20 62 79 20 73 70   separated by sp
1b240 61 63 65 73 20 69 6e 20 64 65 63 6c 61 72 61 74  aces in declarat
1b250 69 6f 6e 73 0a 20 20 20 6f 66 20 72 65 67 75 6c  ions.   of regul
1b260 61 72 20 66 74 73 34 20 74 61 62 6c 65 73 29 2e  ar fts4 tables).
1b270 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1b280 72 65 61 74 65 73 20 66 74 73 34 20 61 6e 64 20  reates fts4 and 
1b290 66 74 73 33 74 6f 6b 65 6e 69 7a 65 0a 20 20 20  fts3tokenize.   
1b2a0 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1b2b0 74 68 65 20 73 61 6d 65 20 74 6f 6b 65 6e 69 7a  the same tokeniz
1b2c0 65 72 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  er:.<codeblock>.
1b2d0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1b2e0 20 54 41 42 4c 45 20 74 65 78 74 31 20 55 53 49   TABLE text1 USI
1b2f0 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
1b300 3d 69 63 75 20 65 6e 5f 41 55 29 3b 0a 20 20 43  =icu en_AU);.  C
1b310 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1b320 42 4c 45 20 74 6f 6b 65 6e 73 31 20 55 53 49 4e  BLE tokens1 USIN
1b330 47 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 28 69  G fts3tokenize(i
1b340 63 75 2c 20 65 6e 5f 41 55 29 3b 0a 0a 20 20 43  cu, en_AU);..  C
1b350 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1b360 42 4c 45 20 74 65 78 74 32 20 55 53 49 4e 47 20  BLE text2 USING 
1b370 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e  fts4(tokenize=un
1b380 69 63 6f 64 65 36 31 20 22 74 6f 6b 65 6e 63 68  icode61 "tokench
1b390 61 72 73 3d 40 2e 22 20 22 73 65 70 61 72 61 74  ars=@." "separat
1b3a0 6f 72 73 3d 31 32 33 22 29 3b 0a 20 20 43 52 45  ors=123");.  CRE
1b3b0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1b3c0 45 20 74 6f 6b 65 6e 73 32 20 55 53 49 4e 47 20  E tokens2 USING 
1b3d0 66 74 73 33 74 6f 6b 65 6e 69 7a 65 28 75 6e 69  fts3tokenize(uni
1b3e0 63 6f 64 65 36 31 2c 20 22 74 6f 6b 65 6e 63 68  code61, "tokench
1b3f0 61 72 73 3d 40 2e 22 2c 20 22 73 65 70 61 72 61  ars=@.", "separa
1b400 74 6f 72 73 3d 31 32 33 22 29 3b 0a 3c 2f 63 6f  tors=123");.</co
1b410 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 0a 3c 70 3e  deblock>.   .<p>
1b420 0a 20 20 20 4f 6e 63 65 20 74 68 65 20 76 69 72  .   Once the vir
1b430 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 63 72  tual table is cr
1b440 65 61 74 65 64 2c 20 69 74 20 63 61 6e 20 62 65  eated, it can be
1b450 20 71 75 65 72 69 65 64 20 61 73 20 66 6f 6c 6c   queried as foll
1b460 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ows:..<codeblock
1b470 3e 0a 53 45 4c 45 43 54 20 74 6f 6b 65 6e 2c 20  >.SELECT token, 
1b480 73 74 61 72 74 2c 20 65 6e 64 2c 20 70 6f 73 69  start, end, posi
1b490 74 69 6f 6e 20 0a 20 20 46 52 4f 4d 20 74 6f 6b  tion .  FROM tok
1b4a0 31 0a 20 57 48 45 52 45 20 69 6e 70 75 74 3d 27  1. WHERE input='
1b4b0 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73  This is a test s
1b4c0 65 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f 63 6f 64  entence.';.</cod
1b4d0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20  eblock>..<p>The 
1b4e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
1b4f0 6c 6c 20 72 65 74 75 72 6e 20 6f 6e 65 20 72 6f  ll return one ro
1b500 77 20 6f 66 20 6f 75 74 70 75 74 20 66 6f 72 20  w of output for 
1b510 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
1b520 65 0a 20 20 20 69 6e 70 75 74 20 73 74 72 69 6e  e.   input strin
1b530 67 2e 20 20 54 68 65 20 22 74 6f 6b 65 6e 22 20  g.  The "token" 
1b540 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 74 65  column is the te
1b550 78 74 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 2e  xt of the token.
1b560 20 20 54 68 65 20 22 73 74 61 72 74 22 0a 20 20    The "start".  
1b570 20 61 6e 64 20 22 65 6e 64 22 20 63 6f 6c 75 6d   and "end" colum
1b580 6e 73 20 61 72 65 20 74 68 65 20 62 79 74 65 20  ns are the byte 
1b590 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 62 65  offset to the be
1b5a0 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
1b5b0 6f 66 20 74 68 65 0a 20 20 20 74 6f 6b 65 6e 20  of the.   token 
1b5c0 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
1b5d0 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20 0a  input string.  .
1b5e0 20 20 20 54 68 65 20 22 70 6f 73 69 74 69 6f 6e     The "position
1b5f0 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  " column is the 
1b600 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 0a  sequence number.
1b610 20 20 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20     of the token 
1b620 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
1b630 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20 54  input string.  T
1b640 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
1b650 22 69 6e 70 75 74 22 0a 20 20 20 63 6f 6c 75 6d  "input".   colum
1b660 6e 20 77 68 69 63 68 20 69 73 20 73 69 6d 70 6c  n which is simpl
1b670 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  y a copy of the 
1b680 69 6e 70 75 74 20 73 74 72 69 6e 67 20 74 68 61  input string tha
1b690 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20 69  t is specified i
1b6a0 6e 0a 20 20 20 74 68 65 20 57 48 45 52 45 20 63  n.   the WHERE c
1b6b0 6c 61 75 73 65 2e 20 20 4e 6f 74 65 20 74 68 61  lause.  Note tha
1b6c0 74 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  t a constraint o
1b6d0 66 20 74 68 65 20 66 6f 72 6d 20 22 69 6e 70 75  f the form "inpu
1b6e0 74 3d 3f 22 20 6d 75 73 74 0a 20 20 20 61 70 70  t=?" must.   app
1b6f0 65 61 72 20 69 6e 20 74 68 65 20 57 48 45 52 45  ear in the WHERE
1b700 20 63 6c 61 75 73 65 20 6f 72 20 65 6c 73 65 20   clause or else 
1b710 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1b720 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 69  e will have no i
1b730 6e 70 75 74 0a 20 20 20 74 6f 20 74 6f 6b 65 6e  nput.   to token
1b740 69 7a 65 20 61 6e 64 20 77 69 6c 6c 20 72 65 74  ize and will ret
1b750 75 72 6e 20 6e 6f 20 72 6f 77 73 2e 20 20 54 68  urn no rows.  Th
1b760 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
1b770 67 65 6e 65 72 61 74 65 73 0a 20 20 20 74 68 65  generates.   the
1b780 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 75 74 70 75   following outpu
1b790 74 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  t:..<codeblock>.
1b7a0 74 68 69 7c 30 7c 34 7c 30 0a 69 73 7c 35 7c 37  thi|0|4|0.is|5|7
1b7b0 7c 31 0a 61 7c 38 7c 39 7c 32 0a 74 65 73 74 7c  |1.a|8|9|2.test|
1b7c0 31 30 7c 31 34 7c 33 0a 73 65 6e 74 65 6e 63 7c  10|14|3.sentenc|
1b7d0 31 35 7c 32 33 7c 34 0a 3c 2f 63 6f 64 65 62 6c  15|23|4.</codebl
1b7e0 6f 63 6b 3e 0a 0a 3c 70 3e 4e 6f 74 69 63 65 20  ock>..<p>Notice 
1b7f0 74 68 61 74 20 74 68 65 20 74 6f 6b 65 6e 73 20  that the tokens 
1b800 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1b810 74 20 66 72 6f 6d 20 74 68 65 20 66 74 73 33 74  t from the fts3t
1b820 6f 6b 65 6e 69 7a 65 20 76 69 72 74 75 61 6c 0a  okenize virtual.
1b830 20 20 20 74 61 62 6c 65 20 68 61 76 65 20 62 65     table have be
1b840 65 6e 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 61  en transformed a
1b850 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1b860 72 75 6c 65 73 20 6f 66 20 74 68 65 20 74 6f 6b  rules of the tok
1b870 65 6e 69 7a 65 72 2e 0a 20 20 20 53 69 6e 63 65  enizer..   Since
1b880 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 75 73   this example us
1b890 65 64 20 74 68 65 20 22 70 6f 72 74 65 72 22 20  ed the "porter" 
1b8a0 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 22  tokenizer, the "
1b8b0 54 68 69 73 22 20 74 6f 6b 65 6e 20 77 61 73 0a  This" token was.
1b8c0 20 20 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74     converted int
1b8d0 6f 20 22 74 68 69 22 2e 20 20 49 66 20 74 68 65  o "thi".  If the
1b8e0 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
1b8f0 66 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 64  f the token is d
1b900 65 73 69 72 65 64 2c 0a 20 20 20 69 74 20 63 61  esired,.   it ca
1b910 6e 20 62 65 20 72 65 74 72 69 65 76 65 64 20 75  n be retrieved u
1b920 73 69 6e 67 20 74 68 65 20 22 73 74 61 72 74 22  sing the "start"
1b930 20 61 6e 64 20 22 65 6e 64 22 20 63 6f 6c 75 6d   and "end" colum
1b940 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 5b  ns with the.   [
1b950 73 75 62 73 74 72 28 29 5d 20 66 75 6e 63 74 69  substr()] functi
1b960 6f 6e 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  on.  For example
1b970 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 53  :..<codeblock>.S
1b980 45 4c 45 43 54 20 73 75 62 73 74 72 28 69 6e 70  ELECT substr(inp
1b990 75 74 2c 20 73 74 61 72 74 2b 31 2c 20 65 6e 64  ut, start+1, end
1b9a0 2d 73 74 61 72 74 29 2c 20 74 6f 6b 65 6e 2c 20  -start), token, 
1b9b0 70 6f 73 69 74 69 6f 6e 0a 20 20 46 52 4f 4d 20  position.  FROM 
1b9c0 74 6f 6b 31 0a 20 57 48 45 52 45 20 69 6e 70 75  tok1. WHERE inpu
1b9d0 74 3d 27 54 68 69 73 20 69 73 20 61 20 74 65 73  t='This is a tes
1b9e0 74 20 73 65 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f  t sentence.';.</
1b9f0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54  codeblock>..<p>T
1ba00 68 65 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 20  he fts3tokenize 
1ba10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61  virtual table ca
1ba20 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e 79  n be used on any
1ba30 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 72 65 67 61   tokenizer, rega
1ba40 72 64 6c 65 73 73 0a 20 20 20 6f 66 20 77 68 65  rdless.   of whe
1ba50 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
1ba60 65 20 65 78 69 73 74 73 20 61 6e 20 46 54 53 33  e exists an FTS3
1ba70 20 6f 72 20 46 54 53 34 20 74 61 62 6c 65 20 74   or FTS4 table t
1ba80 68 61 74 20 61 63 74 75 61 6c 6c 79 20 75 73 65  hat actually use
1ba90 73 0a 20 20 20 74 68 61 74 20 74 6f 6b 65 6e 69  s.   that tokeni
1baa0 7a 65 72 2e 0a 0a 20 0a 3c 68 31 20 74 61 67 73  zer... .<h1 tags
1bab0 3d 22 73 65 67 6d 65 6e 74 20 62 74 72 65 65 22  ="segment btree"
1bac0 3e 44 61 74 61 20 53 74 72 75 63 74 75 72 65 73  >Data Structures
1bad0 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69  </h1>..<p>.  Thi
1bae0 73 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69  s section descri
1baf0 62 65 73 20 61 74 20 61 20 68 69 67 68 2d 6c 65  bes at a high-le
1bb00 76 65 6c 20 74 68 65 20 77 61 79 20 74 68 65 20  vel the way the 
1bb10 46 54 53 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65  FTS module store
1bb20 73 20 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e  s its.  index an
1bb30 64 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  d content in the
1bb40 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73   database. It is
1bb50 20 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72   <b>not necessar
1bb60 79 20 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20  y to read or .  
1bb70 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d  understand the m
1bb80 61 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20  aterial in this 
1bb90 73 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72  section in order
1bba0 20 74 6f 20 75 73 65 20 46 54 53 3c 2f 62 3e 20   to use FTS</b> 
1bbb0 69 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61  in an .  applica
1bbc0 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69  tion. However, i
1bbd0 74 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20  t may be useful 
1bbe0 74 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  to application d
1bbf0 65 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70  evelopers attemp
1bc00 74 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79  ting .  to analy
1bc10 7a 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e  ze and understan
1bc20 64 20 46 54 53 20 70 65 72 66 6f 72 6d 61 6e 63  d FTS performanc
1bc30 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1bc40 73 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70  s, or to develop
1bc50 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61  ers .  contempla
1bc60 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74  ting enhancement
1bc70 73 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e  s to the existin
1bc80 67 20 46 54 53 20 66 65 61 74 75 72 65 20 73 65  g FTS feature se
1bc90 74 2e 0a 3c 2f 70 3e 0a 0a 3c 74 63 6c 3e 68 64  t..</p>..<tcl>hd
1bca0 5f 66 72 61 67 6d 65 6e 74 20 2a 73 68 61 64 6f  _fragment *shado
1bcb0 77 74 61 62 20 7b 46 54 53 20 73 68 61 64 6f 77  wtab {FTS shadow
1bcc0 20 74 61 62 6c 65 73 7d 20 7b 73 68 61 64 6f 77   tables} {shadow
1bcd0 20 74 61 62 6c 65 73 7d 3c 2f 74 63 6c 3e 0a 3c   tables}</tcl>.<
1bce0 68 32 20 74 61 67 73 3d 22 73 68 61 64 6f 77 74  h2 tags="shadowt
1bcf0 61 62 73 22 3e 53 68 61 64 6f 77 20 54 61 62 6c  abs">Shadow Tabl
1bd00 65 73 3c 2f 68 32 3e 0a 3c 70 3e 0a 20 20 46 6f  es</h2>.<p>.  Fo
1bd10 72 20 65 61 63 68 20 46 54 53 20 76 69 72 74 75  r each FTS virtu
1bd20 61 6c 20 74 61 62 6c 65 20 69 6e 20 61 20 64 61  al table in a da
1bd30 74 61 62 61 73 65 2c 20 74 68 72 65 65 20 74 6f  tabase, three to
1bd40 20 66 69 76 65 20 72 65 61 6c 20 28 6e 6f 6e 2d   five real (non-
1bd50 76 69 72 74 75 61 6c 29 20 74 61 62 6c 65 73 0a  virtual) tables.
1bd60 20 20 61 72 65 20 63 72 65 61 74 65 64 20 74 6f    are created to
1bd70 20 73 74 6f 72 65 20 74 68 65 20 75 6e 64 65 72   store the under
1bd80 6c 79 69 6e 67 20 64 61 74 61 2e 20 20 54 68 65  lying data.  The
1bd90 73 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20 61  se real tables a
1bda0 72 65 20 63 61 6c 6c 65 64 20 22 73 68 61 64 6f  re called "shado
1bdb0 77 20 74 61 62 6c 65 73 22 2e 0a 20 20 54 68 65  w tables"..  The
1bdc0 20 72 65 61 6c 20 74 61 62 6c 65 73 20 61 72 65   real tables are
1bdd0 20 6e 61 6d 65 64 20 22 25 5f 63 6f 6e 74 65 6e   named "%_conten
1bde0 74 22 2c 0a 20 20 22 25 5f 73 65 67 64 69 72 22  t",.  "%_segdir"
1bdf0 2c 20 22 25 5f 73 65 67 6d 65 6e 74 73 22 2c 20  , "%_segments", 
1be00 22 25 5f 73 74 61 74 22 2c 20 61 6e 64 20 22 25  "%_stat", and "%
1be10 5f 64 6f 63 73 69 7a 65 22 2c 20 77 68 65 72 65  _docsize", where
1be20 20 22 25 22 20 69 73 20 72 65 70 6c 61 63 65 64   "%" is replaced
1be30 20 62 79 20 74 68 65 20 6e 61 6d 65 0a 20 20 6f   by the name.  o
1be40 66 20 74 68 65 20 46 54 53 20 76 69 72 74 75 61  f the FTS virtua
1be50 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20  l table...<p>.  
1be60 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c  The leftmost col
1be70 75 6d 6e 20 6f 66 20 74 68 65 20 22 25 5f 63 6f  umn of the "%_co
1be80 6e 74 65 6e 74 22 20 74 61 62 6c 65 20 69 73 20  ntent" table is 
1be90 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
1bea0 52 59 20 4b 45 59 20 66 69 65 6c 64 0a 20 20 6e  RY KEY field.  n
1beb0 61 6d 65 64 20 22 64 6f 63 69 64 22 2e 20 46 6f  amed "docid". Fo
1bec0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 69 73 20  llowing this is 
1bed0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 65  one column for e
1bee0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
1bef0 65 20 46 54 53 0a 20 20 76 69 72 74 75 61 6c 20  e FTS.  virtual 
1bf00 74 61 62 6c 65 20 61 73 20 64 65 63 6c 61 72 65  table as declare
1bf10 64 20 62 79 20 74 68 65 20 75 73 65 72 2c 20 6e  d by the user, n
1bf20 61 6d 65 64 20 62 79 20 70 72 65 70 65 6e 64 69  amed by prependi
1bf30 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ng the column na
1bf40 6d 65 0a 20 20 73 75 70 70 6c 69 65 64 20 62 79  me.  supplied by
1bf50 20 74 68 65 20 75 73 65 72 20 77 69 74 68 20 22   the user with "
1bf60 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65 72  c<i>N</i>", wher
1bf70 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68  e <i>N</i> is th
1bf80 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 0a  e index of the .
1bf90 20 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20    column within 
1bfa0 74 68 65 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65  the table, numbe
1bfb0 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  red from left to
1bfc0 20 72 69 67 68 74 20 73 74 61 72 74 69 6e 67 20   right starting 
1bfd0 77 69 74 68 20 30 2e 20 44 61 74 61 0a 20 20 74  with 0. Data.  t
1bfe0 79 70 65 73 20 73 75 70 70 6c 69 65 64 20 61 73  ypes supplied as
1bff0 20 70 61 72 74 20 6f 66 20 74 68 65 20 76 69 72   part of the vir
1c000 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61  tual table decla
1c010 72 61 74 69 6f 6e 20 61 72 65 20 6e 6f 74 20 75  ration are not u
1c020 73 65 64 20 61 73 0a 20 20 70 61 72 74 20 6f 66  sed as.  part of
1c030 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
1c040 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
1c050 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
1c060 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
1c070 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
1c080 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69  e declaration</i
1c090 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
1c0a0 41 4c 20 54 41 42 4c 45 20 61 62 63 20 55 53 49  AL TABLE abc USI
1c0b0 4e 47 20 66 74 73 34 28 61 20 4e 55 4d 42 45 52  NG fts4(a NUMBER
1c0c0 2c 20 62 20 54 45 58 54 2c 20 63 29 3b 0a 0a 20  , b TEXT, c);.. 
1c0d0 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73 70 6f 6e   <i>-- Correspon
1c0e0 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e 74 20 74  ding %_content t
1c0f0 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
1c100 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54 41  </i>.  CREATE TA
1c110 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65 6e 74 28  BLE abc_content(
1c120 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52  docid INTEGER PR
1c130 49 4d 41 52 59 20 4b 45 59 2c 20 63 30 61 2c 20  IMARY KEY, c0a, 
1c140 63 31 62 2c 20 63 32 63 29 3b 0a 3c 2f 63 6f 64  c1b, c2c);.</cod
1c150 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
1c160 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
1c170 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
1c180 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64 61  unadulterated da
1c190 74 61 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  ta inserted by t
1c1a0 68 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f 20  he user .  into 
1c1b0 74 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20  the FTS virtual 
1c1c0 74 61 62 6c 65 20 62 79 20 74 68 65 20 75 73 65  table by the use
1c1d0 72 2e 20 49 66 20 74 68 65 20 75 73 65 72 20 64  r. If the user d
1c1e0 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
1c1f0 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20 22 64  ly.  supply a "d
1c200 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68 65 6e  ocid" value when
1c210 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72   inserting recor
1c220 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c 65 63  ds, one is selec
1c230 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
1c240 79 0a 20 20 62 79 20 74 68 65 20 73 79 73 74 65  y.  by the syste
1c250 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f  m...<p>.  The %_
1c260 73 74 61 74 20 61 6e 64 20 25 5f 64 6f 63 73 69  stat and %_docsi
1c270 7a 65 20 74 61 62 6c 65 73 20 61 72 65 20 6f 6e  ze tables are on
1c280 6c 79 20 63 72 65 61 74 65 64 20 69 66 20 74 68  ly created if th
1c290 65 20 46 54 53 20 74 61 62 6c 65 20 75 73 65 73  e FTS table uses
1c2a0 20 74 68 65 0a 20 20 46 54 53 34 20 6d 6f 64 75   the.  FTS4 modu
1c2b0 6c 65 2c 20 6e 6f 74 20 46 54 53 33 2e 20 46 75  le, not FTS3. Fu
1c2c0 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 25  rthermore, the %
1c2d0 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 69  _docsize table i
1c2e0 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
1c2f0 0a 20 20 46 54 53 34 20 74 61 62 6c 65 20 69 73  .  FTS4 table is
1c300 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
1c310 65 20 5b 46 54 53 34 20 6d 61 74 63 68 69 6e 66  e [FTS4 matchinf
1c320 6f 20 6f 70 74 69 6f 6e 7c 22 6d 61 74 63 68 69  o option|"matchi
1c330 6e 66 6f 3d 66 74 73 33 22 5d 20 64 69 72 65 63  nfo=fts3"] direc
1c340 74 69 76 65 0a 20 20 73 70 65 63 69 66 69 65 64  tive.  specified
1c350 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1c360 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1c370 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1c380 49 66 20 74 68 65 79 20 61 72 65 20 63 72 65 61  If they are crea
1c390 74 65 64 2c 0a 20 20 74 68 65 20 73 63 68 65 6d  ted,.  the schem
1c3a0 61 20 6f 66 20 74 68 65 20 74 77 6f 20 74 61 62  a of the two tab
1c3b0 6c 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  les is as follow
1c3c0 73 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  s:.<codeblock>. 
1c3d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f   CREATE TABLE %_
1c3e0 73 74 61 74 28 0a 20 20 20 20 69 64 20 49 4e 54  stat(.    id INT
1c3f0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1c400 2c 20 0a 20 20 20 20 76 61 6c 75 65 20 42 4c 4f  , .    value BLO
1c410 42 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54 45  B.  );..  CREATE
1c420 20 54 41 42 4c 45 20 25 5f 64 6f 63 73 69 7a 65   TABLE %_docsize
1c430 28 0a 20 20 20 20 64 6f 63 69 64 20 49 4e 54 45  (.    docid INTE
1c440 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1c450 0a 20 20 20 20 73 69 7a 65 20 42 4c 4f 42 0a 20  .    size BLOB. 
1c460 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e   );.</codeblock>
1c470 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68  ..<p>.  For each
1c480 20 72 6f 77 20 69 6e 20 74 68 65 20 46 54 53 20   row in the FTS 
1c490 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 64 6f 63  table, the %_doc
1c4a0 73 69 7a 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  size table conta
1c4b0 69 6e 73 20 61 20 63 6f 72 72 65 73 70 6f 6e 64  ins a correspond
1c4c0 69 6e 67 0a 20 20 72 6f 77 20 77 69 74 68 20 74  ing.  row with t
1c4d0 68 65 20 73 61 6d 65 20 22 64 6f 63 69 64 22 20  he same "docid" 
1c4e0 76 61 6c 75 65 2e 20 54 68 65 20 22 73 69 7a 65  value. The "size
1c4f0 22 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  " field contains
1c500 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69   a blob consisti
1c510 6e 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e  ng.  of <i>N</i>
1c520 20 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68   FTS varints, wh
1c530 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20  ere <i>N</i> is 
1c540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
1c550 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
1c560 6e 73 0a 20 20 69 6e 20 74 68 65 20 74 61 62 6c  ns.  in the tabl
1c570 65 2e 20 45 61 63 68 20 76 61 72 69 6e 74 20 69  e. Each varint i
1c580 6e 20 74 68 65 20 22 73 69 7a 65 22 20 62 6c 6f  n the "size" blo
1c590 62 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  b is the number 
1c5a0 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  of tokens in the
1c5b0 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  .  corresponding
1c5c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 61   column of the a
1c5d0 73 73 6f 63 69 61 74 65 64 20 72 6f 77 20 69 6e  ssociated row in
1c5e0 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20   the FTS table. 
1c5f0 54 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  The %_stat table
1c600 0a 20 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69  .  always contai
1c610 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ns a single row 
1c620 77 69 74 68 20 74 68 65 20 22 69 64 22 20 63 6f  with the "id" co
1c630 6c 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e 20 54  lumn set to 0. T
1c640 68 65 20 22 76 61 6c 75 65 22 20 0a 20 20 63 6f  he "value" .  co
1c650 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
1c660 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 20  blob consisting 
1c670 6f 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e 20 46 54  of <i>N+1</i> FT
1c680 53 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65  S varints, where
1c690 20 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69 73 20 61   <i>N</i>.  is a
1c6a0 67 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  gain the number 
1c6b0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
1c6c0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
1c6d0 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 66 69  TS table. The fi
1c6e0 72 73 74 0a 20 20 76 61 72 69 6e 74 20 69 6e 20  rst.  varint in 
1c6f0 74 68 65 20 62 6c 6f 62 20 69 73 20 73 65 74 20  the blob is set 
1c700 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
1c710 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1c720 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68  he FTS table. Th
1c730 65 0a 20 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  e.  second and s
1c740 75 62 73 65 71 75 65 6e 74 20 76 61 72 69 6e 74  ubsequent varint
1c750 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f  s contain the to
1c760 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
1c770 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 20  kens stored in. 
1c780 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1c790 6e 67 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c  ng column for al
1c7a0 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 46 54  l rows of the FT
1c7b0 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20  S table...<p>.  
1c7c0 54 68 65 20 74 77 6f 20 72 65 6d 61 69 6e 69 6e  The two remainin
1c7d0 67 20 74 61 62 6c 65 73 2c 20 25 5f 73 65 67 6d  g tables, %_segm
1c7e0 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69  ents and %_segdi
1c7f0 72 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  r, are used to s
1c800 74 6f 72 65 20 74 68 65 20 0a 20 20 66 75 6c 6c  tore the .  full
1c810 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 43 6f 6e  -text index. Con
1c820 63 65 70 74 75 61 6c 6c 79 2c 20 74 68 69 73 20  ceptually, this 
1c830 69 6e 64 65 78 20 69 73 20 61 20 6c 6f 6f 6b 75  index is a looku
1c840 70 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 70  p table that map
1c850 73 20 65 61 63 68 20 0a 20 20 74 65 72 6d 20 28  s each .  term (
1c860 77 6f 72 64 29 20 74 6f 20 74 68 65 20 73 65 74  word) to the set
1c870 20 6f 66 20 64 6f 63 69 64 20 76 61 6c 75 65 73   of docid values
1c880 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1c890 6f 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  o records in the
1c8a0 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61   .  %_content ta
1c8b0 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
1c8c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 63 63   one or more occ
1c8d0 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68 65 20  urrences of the 
1c8e0 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65 74 72 69  term. To.  retri
1c8f0 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  eve all document
1c900 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  s that contain a
1c910 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c   specified term,
1c920 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 0a   the FTS module.
1c930 20 20 71 75 65 72 69 65 73 20 74 68 69 73 20 69    queries this i
1c940 6e 64 65 78 20 74 6f 20 64 65 74 65 72 6d 69 6e  ndex to determin
1c950 65 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  e the set of doc
1c960 69 64 20 76 61 6c 75 65 73 20 66 6f 72 20 72 65  id values for re
1c970 63 6f 72 64 73 20 74 68 61 74 0a 20 20 63 6f 6e  cords that.  con
1c980 74 61 69 6e 20 74 68 65 20 74 65 72 6d 2c 20 74  tain the term, t
1c990 68 65 6e 20 72 65 74 72 69 65 76 65 73 20 74 68  hen retrieves th
1c9a0 65 20 72 65 71 75 69 72 65 64 20 64 6f 63 75 6d  e required docum
1c9b0 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
1c9c0 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62 6c 65 2e  content.  table.
1c9d0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
1c9e0 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
1c9f0 20 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62   FTS virtual tab
1ca00 6c 65 2c 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  le, the %_segmen
1ca10 74 73 0a 20 20 61 6e 64 20 25 5f 73 65 67 64 69  ts.  and %_segdi
1ca20 72 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77  r tables are alw
1ca30 61 79 73 20 63 72 65 61 74 65 64 20 61 73 20 66  ays created as f
1ca40 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c  ollows:..<codebl
1ca50 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 41  ock>.  CREATE TA
1ca60 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 0a  BLE %_segments(.
1ca70 20 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e 54 45      blockid INTE
1ca80 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1ca90 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74         <i>-- B-t
1caa0 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69 3e 0a  ree node id</i>.
1cab0 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62 20 20      block blob  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74         <i>-- B-t
1cae0 72 65 65 20 6e 6f 64 65 20 64 61 74 61 3c 2f 69  ree node data</i
1caf0 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54 45  >.  );..  CREATE
1cb00 20 54 41 42 4c 45 20 25 5f 73 65 67 64 69 72 28   TABLE %_segdir(
1cb10 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e 54 45 47  .    level INTEG
1cb20 45 52 2c 0a 20 20 20 20 69 64 78 20 49 4e 54 45  ER,.    idx INTE
1cb30 47 45 52 2c 0a 20 20 20 20 73 74 61 72 74 5f 62  GER,.    start_b
1cb40 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20  lock INTEGER,   
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d              <i>-
1cb60 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66 69 72  - Blockid of fir
1cb70 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67  st node in %_seg
1cb80 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 6c 65  ments</i>.    le
1cb90 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49  aves_end_block I
1cba0 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
1cbb0 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f   <i>-- Blockid o
1cbc0 66 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f 64 65  f last leaf node
1cbd0 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f   in %_segments</
1cbe0 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b  i>.    end_block
1cbf0 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20   INTEGER,       
1cc00 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
1cc10 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74 20  Blockid of last 
1cc20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e  node in %_segmen
1cc30 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f 74 20  ts</i>.    root 
1cc40 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20 20  BLOB,           
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
1cc60 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f 74 20  >-- B-tree root 
1cc70 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50 52 49  node</i>.    PRI
1cc80 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c 20  MARY KEY(level, 
1cc90 69 64 78 29 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65  idx).  );.</code
1cca0 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
1ccb0 65 20 73 63 68 65 6d 61 20 64 65 70 69 63 74 65  e schema depicte
1ccc0 64 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 64  d above is not d
1ccd0 65 73 69 67 6e 65 64 20 74 6f 20 73 74 6f 72 65  esigned to store
1cce0 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
1ccf0 6e 64 65 78 20 0a 20 20 64 69 72 65 63 74 6c 79  ndex .  directly
1cd00 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73  . Instead, it is
1cd10 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 6f   used to store o
1cd20 6e 65 20 6f 72 20 6d 6f 72 65 20 62 2d 74 72 65  ne or more b-tre
1cd30 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  e structures. Th
1cd40 65 72 65 0a 20 20 69 73 20 6f 6e 65 20 62 2d 74  ere.  is one b-t
1cd50 72 65 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ree for each row
1cd60 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
1cd70 20 74 61 62 6c 65 2e 20 54 68 65 20 25 5f 73 65   table. The %_se
1cd80 67 64 69 72 20 74 61 62 6c 65 0a 20 20 72 6f 77  gdir table.  row
1cd90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
1cda0 6f 74 20 6e 6f 64 65 20 61 6e 64 20 76 61 72 69  ot node and vari
1cdb0 6f 75 73 20 6d 65 74 61 2d 64 61 74 61 20 61 73  ous meta-data as
1cdc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1cdd0 65 0a 20 20 62 2d 74 72 65 65 20 73 74 72 75 63  e.  b-tree struc
1cde0 74 75 72 65 2c 20 61 6e 64 20 74 68 65 20 25 5f  ture, and the %_
1cdf0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 63  segments table c
1ce00 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 6f 74 68 65  ontains all othe
1ce10 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29 0a 20 20 62  r (non-root).  b
1ce20 2d 74 72 65 65 20 6e 6f 64 65 73 2e 20 45 61 63  -tree nodes. Eac
1ce30 68 20 62 2d 74 72 65 65 20 69 73 20 72 65 66 65  h b-tree is refe
1ce40 72 72 65 64 20 74 6f 20 61 73 20 61 20 22 73 65  rred to as a "se
1ce50 67 6d 65 6e 74 22 2e 20 4f 6e 63 65 20 69 74 20  gment". Once it 
1ce60 68 61 73 0a 20 20 62 65 65 6e 20 63 72 65 61 74  has.  been creat
1ce70 65 64 2c 20 61 20 73 65 67 6d 65 6e 74 20 62 2d  ed, a segment b-
1ce80 74 72 65 65 20 69 73 20 6e 65 76 65 72 20 75 70  tree is never up
1ce90 64 61 74 65 64 20 28 61 6c 74 68 6f 75 67 68 20  dated (although 
1cea0 69 74 20 6d 61 79 20 62 65 0a 20 20 64 65 6c 65  it may be.  dele
1ceb0 74 65 64 20 61 6c 74 6f 67 65 74 68 65 72 29 2e  ted altogether).
1cec0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6b 65 79 73  ..<p>.  The keys
1ced0 20 75 73 65 64 20 62 79 20 65 61 63 68 20 73 65   used by each se
1cee0 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 61 72 65  gment b-tree are
1cef0 20 74 65 72 6d 73 20 28 77 6f 72 64 73 29 2e 20   terms (words). 
1cf00 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20  As well as the. 
1cf10 20 6b 65 79 2c 20 65 61 63 68 20 73 65 67 6d 65   key, each segme
1cf20 6e 74 20 62 2d 74 72 65 65 20 65 6e 74 72 79 20  nt b-tree entry 
1cf30 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
1cf40 64 20 22 64 6f 63 6c 69 73 74 22 20 28 64 6f 63  d "doclist" (doc
1cf50 75 6d 65 6e 74 20 6c 69 73 74 29 2e 0a 20 20 41  ument list)..  A
1cf60 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74   doclist consist
1cf70 73 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s of zero or mor
1cf80 65 20 65 6e 74 72 69 65 73 2c 20 77 68 65 72 65  e entries, where
1cf90 20 65 61 63 68 20 65 6e 74 72 79 20 63 6f 6e 73   each entry cons
1cfa0 69 73 74 73 20 6f 66 3a 0a 0a 3c 75 6c 3e 0a 20  ists of:..<ul>. 
1cfb0 20 3c 6c 69 3e 20 41 20 64 6f 63 69 64 20 28 64   <li> A docid (d
1cfc0 6f 63 75 6d 65 6e 74 20 69 64 29 2c 20 61 6e 64  ocument id), and
1cfd0 0a 20 20 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f  .  <li> A list o
1cfe0 66 20 74 65 72 6d 20 6f 66 66 73 65 74 73 2c 20  f term offsets, 
1cff0 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 63 63  one for each occ
1d000 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20 74  urrence of the t
1d010 65 72 6d 20 77 69 74 68 69 6e 0a 20 20 20 20 20  erm within.     
1d020 20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20    the document. 
1d030 41 20 74 65 72 6d 20 6f 66 66 73 65 74 20 69 6e  A term offset in
1d040 64 69 63 61 74 65 73 20 74 68 65 20 6e 75 6d 62  dicates the numb
1d050 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 28 77 6f  er of tokens (wo
1d060 72 64 73 29 0a 20 20 20 20 20 20 20 74 68 61 74  rds).       that
1d070 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1d080 65 20 74 65 72 6d 20 69 6e 20 71 75 65 73 74 69  e term in questi
1d090 6f 6e 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  on, not the numb
1d0a0 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
1d0b0 0a 20 20 20 20 20 20 20 6f 72 20 62 79 74 65 73  .       or bytes
1d0c0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
1d0d0 68 65 20 74 65 72 6d 20 6f 66 66 73 65 74 20 6f  he term offset o
1d0e0 66 20 74 68 65 20 74 65 72 6d 20 22 77 61 72 22  f the term "war"
1d0f0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 70   in the.       p
1d100 68 72 61 73 65 20 22 41 6e 63 65 73 74 72 61 6c  hrase "Ancestral
1d110 20 76 6f 69 63 65 73 20 70 72 6f 70 68 65 73 79   voices prophesy
1d120 69 6e 67 20 77 61 72 21 22 20 69 73 20 33 2e 0a  ing war!" is 3..
1d130 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 45 6e 74  </ul>..<p>.  Ent
1d140 72 69 65 73 20 77 69 74 68 69 6e 20 61 20 64 6f  ries within a do
1d150 63 6c 69 73 74 20 61 72 65 20 73 6f 72 74 65 64  clist are sorted
1d160 20 62 79 20 64 6f 63 69 64 2e 20 50 6f 73 69 74   by docid. Posit
1d170 69 6f 6e 73 20 77 69 74 68 69 6e 20 61 20 64 6f  ions within a do
1d180 63 6c 69 73 74 0a 20 20 65 6e 74 72 79 20 61 72  clist.  entry ar
1d190 65 20 73 74 6f 72 65 64 20 69 6e 20 61 73 63 65  e stored in asce
1d1a0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 0a 3c 70  nding order...<p
1d1b0 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  >.  The contents
1d1c0 20 6f 66 20 74 68 65 20 6c 6f 67 69 63 61 6c 20   of the logical 
1d1d0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
1d1e0 69 73 20 66 6f 75 6e 64 20 62 79 20 6d 65 72 67  is found by merg
1d1f0 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e  ing the.  conten
1d200 74 73 20 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e  ts of all segmen
1d210 74 20 62 2d 74 72 65 65 73 2e 20 49 66 20 61 20  t b-trees. If a 
1d220 74 65 72 6d 20 69 73 20 70 72 65 73 65 6e 74 20  term is present 
1d230 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  in more than one
1d240 0a 20 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  .  segment b-tre
1d250 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 70 73 20  e, then it maps 
1d260 74 6f 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  to the union of 
1d270 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
1d280 64 6f 63 6c 69 73 74 2e 20 49 66 2c 0a 20 20 66  doclist. If,.  f
1d290 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
1d2a0 2c 20 74 68 65 20 73 61 6d 65 20 64 6f 63 69 64  , the same docid
1d2b0 20 6f 63 63 75 72 73 20 69 6e 20 6d 6f 72 65 20   occurs in more 
1d2c0 74 68 61 6e 20 6f 6e 65 20 64 6f 63 6c 69 73 74  than one doclist
1d2d0 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 20 20 74 68  , then only.  th
1d2e0 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69  e doclist that i
1d2f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6d 6f  s part of the mo
1d300 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
1d310 74 65 64 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  ted segment b-tr
1d320 65 65 20 69 73 20 0a 20 20 63 6f 6e 73 69 64 65  ee is .  conside
1d330 72 65 64 20 76 61 6c 69 64 2e 20 0a 0a 3c 70 3e  red valid. ..<p>
1d340 0a 20 20 4d 75 6c 74 69 70 6c 65 20 62 2d 74 72  .  Multiple b-tr
1d350 65 65 20 73 74 72 75 63 74 75 72 65 73 20 61 72  ee structures ar
1d360 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
1d370 66 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65  f a single b-tre
1d380 65 20 74 6f 20 72 65 64 75 63 65 0a 20 20 74 68  e to reduce.  th
1d390 65 20 63 6f 73 74 20 6f 66 20 69 6e 73 65 72 74  e cost of insert
1d3a0 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f  ing records into
1d3b0 20 46 54 53 20 74 61 62 6c 65 73 2e 20 57 68 65   FTS tables. Whe
1d3c0 6e 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  n a new record i
1d3d0 73 20 0a 20 20 69 6e 73 65 72 74 65 64 20 69 6e  s .  inserted in
1d3e0 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20  to an FTS table 
1d3f0 74 68 61 74 20 61 6c 72 65 61 64 79 20 63 6f 6e  that already con
1d400 74 61 69 6e 73 20 61 20 6c 6f 74 20 6f 66 20 64  tains a lot of d
1d410 61 74 61 2c 20 69 74 20 69 73 0a 20 20 6c 69 6b  ata, it is.  lik
1d420 65 6c 79 20 74 68 61 74 20 6d 61 6e 79 20 6f 66  ely that many of
1d430 20 74 68 65 20 74 65 72 6d 73 20 69 6e 20 74 68   the terms in th
1d440 65 20 6e 65 77 20 72 65 63 6f 72 64 20 61 72 65  e new record are
1d450 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
1d460 20 69 6e 0a 20 20 61 20 6c 61 72 67 65 20 6e 75   in.  a large nu
1d470 6d 62 65 72 20 6f 66 20 65 78 69 73 74 69 6e 67  mber of existing
1d480 20 72 65 63 6f 72 64 73 2e 20 49 66 20 61 20 73   records. If a s
1d490 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 77 65 72  ingle b-tree wer
1d4a0 65 20 75 73 65 64 2c 20 74 68 65 6e 0a 20 20 6c  e used, then.  l
1d4b0 61 72 67 65 20 64 6f 63 6c 69 73 74 20 73 74 72  arge doclist str
1d4c0 75 63 74 75 72 65 73 20 77 6f 75 6c 64 20 68 61  uctures would ha
1d4d0 76 65 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ve to be loaded 
1d4e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d4f0 65 2c 0a 20 20 61 6d 65 6e 64 65 64 20 74 6f 20  e,.  amended to 
1d500 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 65 77 20  include the new 
1d510 64 6f 63 69 64 20 61 6e 64 20 74 65 72 6d 2d 6f  docid and term-o
1d520 66 66 73 65 74 20 6c 69 73 74 2c 20 74 68 65 6e  ffset list, then
1d530 20 77 72 69 74 74 65 6e 20 62 61 63 6b 0a 20 20   written back.  
1d540 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1d550 20 55 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   Using multiple 
1d560 62 2d 74 72 65 65 20 74 61 62 6c 65 73 20 61 6c  b-tree tables al
1d570 6c 6f 77 73 20 74 68 69 73 20 74 6f 20 62 65 20  lows this to be 
1d580 61 76 6f 69 64 65 64 0a 20 20 62 79 20 63 72 65  avoided.  by cre
1d590 61 74 69 6e 67 20 61 20 6e 65 77 20 62 2d 74 72  ating a new b-tr
1d5a0 65 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ee which can be 
1d5b0 6d 65 72 67 65 64 20 77 69 74 68 20 74 68 65 20  merged with the 
1d5c0 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 0a  existing b-tree.
1d5d0 20 20 28 6f 72 20 62 2d 74 72 65 65 73 29 20 6c    (or b-trees) l
1d5e0 61 74 65 72 20 6f 6e 2e 20 4d 65 72 67 69 6e 67  ater on. Merging
1d5f0 20 6f 66 20 62 2d 74 72 65 65 20 73 74 72 75 63   of b-tree struc
1d600 74 75 72 65 73 20 63 61 6e 20 62 65 20 70 65 72  tures can be per
1d610 66 6f 72 6d 65 64 20 61 73 0a 20 20 61 20 62 61  formed as.  a ba
1d620 63 6b 67 72 6f 75 6e 64 20 74 61 73 6b 2c 20 6f  ckground task, o
1d630 72 20 6f 6e 63 65 20 61 20 63 65 72 74 61 69 6e  r once a certain
1d640 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 70 61 72   number of separ
1d650 61 74 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  ate b-tree struc
1d660 74 75 72 65 73 0a 20 20 68 61 76 65 20 62 65 65  tures.  have bee
1d670 6e 20 61 63 63 75 6d 75 6c 61 74 65 64 2e 20 4f  n accumulated. O
1d680 66 20 63 6f 75 72 73 65 2c 20 74 68 69 73 20 73  f course, this s
1d690 63 68 65 6d 65 20 6d 61 6b 65 73 20 71 75 65 72  cheme makes quer
1d6a0 69 65 73 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  ies more expensi
1d6b0 76 65 0a 20 20 28 61 73 20 74 68 65 20 46 54 53  ve.  (as the FTS
1d6c0 20 63 6f 64 65 20 6d 61 79 20 68 61 76 65 20 74   code may have t
1d6d0 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e 64 69 76 69  o look up indivi
1d6e0 64 75 61 6c 20 74 65 72 6d 73 20 69 6e 20 6d 6f  dual terms in mo
1d6f0 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 62 2d  re than one.  b-
1d700 74 72 65 65 20 61 6e 64 20 6d 65 72 67 65 20 74  tree and merge t
1d710 68 65 20 72 65 73 75 6c 74 73 29 2c 20 62 75 74  he results), but
1d720 20 69 74 20 68 61 73 20 62 65 65 6e 20 66 6f 75   it has been fou
1d730 6e 64 20 74 68 61 74 20 69 6e 20 70 72 61 63 74  nd that in pract
1d740 69 63 65 20 74 68 69 73 0a 20 20 6f 76 65 72 68  ice this.  overh
1d750 65 61 64 20 69 73 20 6f 66 74 65 6e 20 6e 65 67  ead is often neg
1d760 6c 69 67 69 62 6c 65 2e 0a 20 20 0a 3c 68 32 3e  ligible..  .<h2>
1d770 56 61 72 69 61 62 6c 65 20 4c 65 6e 67 74 68 20  Variable Length 
1d780 49 6e 74 65 67 65 72 20 28 76 61 72 69 6e 74 29  Integer (varint)
1d790 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70   Format</h2>..<p
1d7a0 3e 0a 20 20 49 6e 74 65 67 65 72 20 76 61 6c 75  >.  Integer valu
1d7b0 65 73 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  es stored as par
1d7c0 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74  t of segment b-t
1d7d0 72 65 65 20 6e 6f 64 65 73 20 61 72 65 20 65 6e  ree nodes are en
1d7e0 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68 65 0a  coded using the.
1d7f0 20 20 46 54 53 20 76 61 72 69 6e 74 20 66 6f 72    FTS varint for
1d800 6d 61 74 2e 20 54 68 69 73 20 65 6e 63 6f 64 69  mat. This encodi
1d810 6e 67 20 69 73 20 73 69 6d 69 6c 61 72 2c 20 62  ng is similar, b
1d820 75 74 20 3c 62 3e 6e 6f 74 20 69 64 65 6e 74 69  ut <b>not identi
1d830 63 61 6c 3c 2f 62 3e 2c 20 74 6f 0a 20 20 74 68  cal</b>, to.  th
1d840 65 20 3c 61 20 68 72 65 66 3d 22 66 69 6c 65 66  e <a href="filef
1d850 6f 72 6d 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e  ormat.html#varin
1d860 74 5f 66 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65  t_format">SQLite
1d870 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f   varint format</
1d880 61 3e 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e  a>...<p>.  An en
1d890 63 6f 64 65 64 20 46 54 53 20 76 61 72 69 6e 74  coded FTS varint
1d8a0 20 63 6f 6e 73 75 6d 65 73 20 62 65 74 77 65 65   consumes betwee
1d8b0 6e 20 6f 6e 65 20 61 6e 64 20 74 65 6e 20 62 79  n one and ten by
1d8c0 74 65 73 20 6f 66 20 73 70 61 63 65 2e 20 54 68  tes of space. Th
1d8d0 65 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  e.  number of by
1d8e0 74 65 73 20 72 65 71 75 69 72 65 64 20 69 73 20  tes required is 
1d8f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d900 65 20 73 69 67 6e 20 61 6e 64 20 6d 61 67 6e 69  e sign and magni
1d910 74 75 64 65 20 6f 66 20 74 68 65 0a 20 20 69 6e  tude of the.  in
1d920 74 65 67 65 72 20 76 61 6c 75 65 20 65 6e 63 6f  teger value enco
1d930 64 65 64 2e 20 4d 6f 72 65 20 61 63 63 75 72 61  ded. More accura
1d940 74 65 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  tely, the number
1d950 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 74   of bytes used t
1d960 6f 20 73 74 6f 72 65 0a 20 20 74 68 65 20 65 6e  o store.  the en
1d970 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 64 65  coded integer de
1d980 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 6f 73  pends on the pos
1d990 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ition of the mos
1d9a0 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73 65  t significant se
1d9b0 74 20 62 69 74 0a 20 20 69 6e 20 74 68 65 20 36  t bit.  in the 6
1d9c0 34 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  4-bit twos-compl
1d9d0 65 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  ement representa
1d9e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65  tion of the inte
1d9f0 67 65 72 20 76 61 6c 75 65 2e 20 4e 65 67 61 74  ger value. Negat
1da00 69 76 65 0a 20 20 76 61 6c 75 65 73 20 61 6c 77  ive.  values alw
1da10 61 79 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73  ays have the mos
1da20 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69  t significant bi
1da30 74 20 73 65 74 20 28 74 68 65 20 73 69 67 6e 20  t set (the sign 
1da40 62 69 74 29 2c 20 61 6e 64 20 73 6f 20 61 72 65  bit), and so are
1da50 0a 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  .  always stored
1da60 20 75 73 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   using the full 
1da70 74 65 6e 20 62 79 74 65 73 2e 20 50 6f 73 69 74  ten bytes. Posit
1da80 69 76 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ive integer valu
1da90 65 73 20 6d 61 79 20 62 65 0a 20 20 73 74 6f 72  es may be.  stor
1daa0 65 64 20 75 73 69 6e 67 20 6c 65 73 73 20 73 70  ed using less sp
1dab0 61 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ace...<p>.  The 
1dac0 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 61 6e  final byte of an
1dad0 20 65 6e 63 6f 64 65 64 20 46 54 53 20 76 61 72   encoded FTS var
1dae0 69 6e 74 20 68 61 73 20 69 74 73 20 6d 6f 73 74  int has its most
1daf0 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
1db00 20 0a 20 20 63 6c 65 61 72 65 64 2e 20 41 6c 6c   .  cleared. All
1db10 20 70 72 65 63 65 64 69 6e 67 20 62 79 74 65 73   preceding bytes
1db20 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73   have the most s
1db30 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73  ignificant bit s
1db40 65 74 2e 20 44 61 74 61 0a 20 20 69 73 20 73 74  et. Data.  is st
1db50 6f 72 65 64 20 69 6e 20 74 68 65 20 72 65 6d 61  ored in the rema
1db60 69 6e 69 6e 67 20 73 65 76 65 6e 20 6c 65 61 73  ining seven leas
1db70 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69  t significant bi
1db80 74 73 20 6f 66 20 65 61 63 68 20 62 79 74 65 2e  ts of each byte.
1db90 0a 20 20 54 68 65 20 66 69 72 73 74 20 62 79 74  .  The first byt
1dba0 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64  e of the encoded
1dbb0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1dbc0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 65 61  contains the lea
1dbd0 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20  st significant. 
1dbe0 20 73 65 76 65 6e 20 62 69 74 73 20 6f 66 20 74   seven bits of t
1dbf0 68 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67  he encoded integ
1dc00 65 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 65  er value. The se
1dc10 63 6f 6e 64 20 62 79 74 65 20 6f 66 20 74 68 65  cond byte of the
1dc20 20 65 6e 63 6f 64 65 64 0a 20 20 72 65 70 72 65   encoded.  repre
1dc30 73 65 6e 74 61 74 69 6f 6e 2c 20 69 66 20 69 74  sentation, if it
1dc40 20 69 73 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e   is present, con
1dc50 74 61 69 6e 73 20 74 68 65 20 73 65 76 65 6e 20  tains the seven 
1dc60 6e 65 78 74 20 6c 65 61 73 74 20 73 69 67 6e 69  next least signi
1dc70 66 69 63 61 6e 74 0a 20 20 62 69 74 73 20 6f 66  ficant.  bits of
1dc80 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
1dc90 75 65 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 54  ue, and so on. T
1dca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
1dcb0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d  le contains exam
1dcc0 70 6c 65 73 0a 20 20 6f 66 20 65 6e 63 6f 64 65  ples.  of encode
1dcd0 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  d integer values
1dce0 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65  :..<table stripe
1dcf0 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 44  d=1>.  <tr><th>D
1dd00 65 63 69 6d 61 6c 3c 74 68 3e 48 65 78 61 64 65  ecimal<th>Hexade
1dd10 63 69 6d 61 6c 3c 74 68 20 77 69 64 74 68 3d 31  cimal<th width=1
1dd20 30 30 25 3e 45 6e 63 6f 64 65 64 20 52 65 70 72  00%>Encoded Repr
1dd30 65 73 65 6e 74 61 74 69 6f 6e 0a 20 20 3c 74 72  esentation.  <tr
1dd40 3e 3c 74 64 3e 34 33 3c 74 64 3e 30 78 30 30 30  ><td>43<td>0x000
1dd50 30 30 30 30 30 30 30 30 30 30 30 32 42 3c 74 64  000000000002B<td
1dd60 3e 30 78 32 42 20 0a 20 20 3c 74 72 3e 3c 74 64  >0x2B .  <tr><td
1dd70 3e 32 30 30 38 31 35 3c 74 64 3e 30 78 30 30 30  >200815<td>0x000
1dd80 30 30 30 30 30 30 30 30 33 31 30 36 46 3c 74 64  000000003106F<td
1dd90 3e 30 78 39 43 20 30 78 41 30 20 30 78 30 43 0a  >0x9C 0xA0 0x0C.
1dda0 20 20 3c 74 72 3e 3c 74 64 3e 2d 31 3c 74 64 3e    <tr><td>-1<td>
1ddb0 30 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46  0xFFFFFFFFFFFFFF
1ddc0 46 46 3c 74 64 3e 30 78 46 46 20 30 78 46 46 20  FF<td>0xFF 0xFF 
1ddd0 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
1dde0 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
1ddf0 46 46 20 30 78 30 31 0a 3c 2f 74 61 62 6c 65 3e  FF 0x01.</table>
1de00 0a 20 20 0a 0a 3c 68 32 3e 53 65 67 6d 65 6e 74  .  ..<h2>Segment
1de10 20 42 2d 54 72 65 65 20 46 6f 72 6d 61 74 3c 2f   B-Tree Format</
1de20 68 32 3e 0a 0a 3c 70 3e 0a 20 20 53 65 67 6d 65  h2>..<p>.  Segme
1de30 6e 74 20 62 2d 74 72 65 65 73 20 61 72 65 20 70  nt b-trees are p
1de40 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64  refix-compressed
1de50 20 62 2b 2d 74 72 65 65 73 2e 20 54 68 65 72 65   b+-trees. There
1de60 20 69 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20   is one segment 
1de70 62 2d 74 72 65 65 0a 20 20 66 6f 72 20 65 61 63  b-tree.  for eac
1de80 68 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 73  h row in the %_s
1de90 65 67 64 69 72 20 74 61 62 6c 65 20 28 73 65 65  egdir table (see
1dea0 20 61 62 6f 76 65 29 2e 20 54 68 65 20 72 6f 6f   above). The roo
1deb0 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 65  t node of the se
1dec0 67 6d 65 6e 74 0a 20 20 62 2d 74 72 65 65 20 69  gment.  b-tree i
1ded0 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 62 6c  s stored as a bl
1dee0 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74 22  ob in the "root"
1def0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 6f   field of the co
1df00 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 0a  rresponding row.
1df10 20 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69    of the %_segdi
1df20 72 20 74 61 62 6c 65 2e 20 41 6c 6c 20 6f 74 68  r table. All oth
1df30 65 72 20 6e 6f 64 65 73 20 28 69 66 20 61 6e 79  er nodes (if any
1df40 20 65 78 69 73 74 29 20 61 72 65 20 73 74 6f 72   exist) are stor
1df50 65 64 20 69 6e 20 74 68 65 20 0a 20 20 22 62 6c  ed in the .  "bl
1df60 6f 62 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ob" column of th
1df70 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
1df80 6c 65 2e 20 4e 6f 64 65 73 20 77 69 74 68 69 6e  le. Nodes within
1df90 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
1dfa0 74 61 62 6c 65 20 61 72 65 0a 20 20 69 64 65 6e  table are.  iden
1dfb0 74 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e  tified by the in
1dfc0 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 74  teger value in t
1dfd0 68 65 20 62 6c 6f 63 6b 69 64 20 66 69 65 6c 64  he blockid field
1dfe0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
1dff0 6e 64 69 6e 67 0a 20 20 72 6f 77 2e 20 54 68 65  nding.  row. The
1e000 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
1e010 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 66   describes the f
1e020 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73  ields of the %_s
1e030 65 67 64 69 72 20 74 61 62 6c 65 3a 0a 0a 3c 74  egdir table:..<t
1e040 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
1e050 20 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e    <tr><th>Column
1e060 20 20 20 20 20 20 20 20 20 20 20 3c 74 68 20 77             <th w
1e070 69 64 74 68 3d 31 30 30 25 3e 49 6e 74 65 72 70  idth=100%>Interp
1e080 72 65 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c  retation.  <tr><
1e090 74 64 3e 6c 65 76 65 6c 20 20 20 20 20 20 20 20  td>level        
1e0a0 20 20 20 20 3c 74 64 3e 20 0a 20 20 20 20 42 65      <td> .    Be
1e0b0 74 77 65 65 6e 20 74 68 65 6d 2c 20 74 68 65 20  tween them, the 
1e0c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e0d0 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78  "level" and "idx
1e0e0 22 20 66 69 65 6c 64 73 20 64 65 66 69 6e 65 20  " fields define 
1e0f0 74 68 65 0a 20 20 20 20 72 65 6c 61 74 69 76 65  the.    relative
1e100 20 61 67 65 20 6f 66 20 74 68 65 20 73 65 67 6d   age of the segm
1e110 65 6e 74 20 62 2d 74 72 65 65 2e 20 54 68 65 20  ent b-tree. The 
1e120 73 6d 61 6c 6c 65 72 20 74 68 65 20 76 61 6c 75  smaller the valu
1e130 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  e stored in the.
1e140 20 20 20 20 22 6c 65 76 65 6c 22 20 66 69 65 6c      "level" fiel
1e150 64 2c 20 74 68 65 20 6d 6f 72 65 20 72 65 63 65  d, the more rece
1e160 6e 74 6c 79 20 74 68 65 20 73 65 67 6d 65 6e 74  ntly the segment
1e170 20 62 2d 74 72 65 65 20 77 61 73 20 63 72 65 61   b-tree was crea
1e180 74 65 64 2e 20 49 66 20 74 77 6f 0a 20 20 20 20  ted. If two.    
1e190 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20  segment b-trees 
1e1a0 61 72 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  are of the same 
1e1b0 22 6c 65 76 65 6c 22 2c 20 74 68 65 20 73 65 67  "level", the seg
1e1c0 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 6c 61  ment with the la
1e1d0 72 67 65 72 0a 20 20 20 20 76 61 6c 75 65 20 73  rger.    value s
1e1e0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 69 64  tored in the "id
1e1f0 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72  x" column is mor
1e200 65 20 72 65 63 65 6e 74 2e 20 54 68 65 20 50 52  e recent. The PR
1e210 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1e220 61 69 6e 74 0a 20 20 20 20 6f 6e 20 74 68 65 20  aint.    on the 
1e230 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 70  %_segdir table p
1e240 72 65 76 65 6e 74 73 20 61 6e 79 20 74 77 6f 20  revents any two 
1e250 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 68 61  segments from ha
1e260 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ving the same va
1e270 6c 75 65 0a 20 20 20 20 66 6f 72 20 62 6f 74 68  lue.    for both
1e280 20 74 68 65 20 22 6c 65 76 65 6c 22 20 61 6e 64   the "level" and
1e290 20 22 69 64 78 22 20 66 69 65 6c 64 73 2e 0a 20   "idx" fields.. 
1e2a0 20 3c 74 72 3e 3c 74 64 3e 69 64 78 20 20 20 20   <tr><td>idx    
1e2b0 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e 20 53            <td> S
1e2c0 65 65 20 61 62 6f 76 65 2e 0a 20 20 3c 74 72 3e  ee above..  <tr>
1e2d0 3c 74 64 3e 73 74 61 72 74 5f 62 6c 6f 63 6b 20  <td>start_block 
1e2e0 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 54 68       <td>.    Th
1e2f0 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63  e blockid that c
1e300 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1e310 65 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20  e node with the 
1e320 73 6d 61 6c 6c 65 73 74 20 62 6c 6f 63 6b 69 64  smallest blockid
1e330 20 74 68 61 74 20 0a 20 20 20 20 62 65 6c 6f 6e   that .    belon
1e340 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65  gs to this segme
1e350 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65  nt b-tree. Or ze
1e360 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
1e370 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
1e380 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20      fits on the 
1e390 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74  root node. If it
1e3a0 20 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f   exists, this no
1e3b0 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 6c  de is always a l
1e3c0 65 61 66 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e  eaf node..  <tr>
1e3d0 3c 74 64 3e 6c 65 61 76 65 73 5f 65 6e 64 5f 62  <td>leaves_end_b
1e3e0 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68  lock <td>.    Th
1e3f0 65 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63  e blockid that c
1e400 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1e410 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 74 68  e leaf node with
1e420 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f   the largest blo
1e430 63 6b 69 64 20 0a 20 20 20 20 74 68 61 74 20 62  ckid .    that b
1e440 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73  elongs to this s
1e450 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f  egment b-tree. O
1e460 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e  r zero if the en
1e470 74 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  tire segment b-t
1e480 72 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e 20  ree.    fits on 
1e490 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20  the root node.. 
1e4a0 20 3c 74 72 3e 3c 74 64 3e 65 6e 64 5f 62 6c 6f   <tr><td>end_blo
1e4b0 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 69 73  ck <td>.    This
1e4c0 20 66 69 65 6c 64 20 6d 61 79 20 63 6f 6e 74 61   field may conta
1e4d0 69 6e 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  in either an int
1e4e0 65 67 65 72 20 6f 72 20 61 20 74 65 78 74 20 66  eger or a text f
1e4f0 69 65 6c 64 20 63 6f 6e 73 69 73 74 69 6e 67 20  ield consisting 
1e500 6f 66 0a 20 20 20 20 74 77 6f 20 69 6e 74 65 67  of.    two integ
1e510 65 72 73 20 73 65 70 61 72 61 74 65 64 20 62 79  ers separated by
1e520 20 61 20 73 70 61 63 65 20 63 68 61 72 61 63 74   a space charact
1e530 65 72 20 28 75 6e 69 63 6f 64 65 20 63 6f 64 65  er (unicode code
1e540 70 6f 69 6e 74 20 30 78 32 30 29 2e 0a 3c 70 20  point 0x20)..<p 
1e550 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65  style="margin-le
1e560 66 74 3a 30 3b 6d 61 72 67 69 6e 2d 72 69 67 68  ft:0;margin-righ
1e570 74 3a 30 22 3e 0a 20 20 20 20 54 68 65 20 66 69  t:0">.    The fi
1e580 72 73 74 2c 20 6f 72 20 6f 6e 6c 79 2c 20 69 6e  rst, or only, in
1e590 74 65 67 65 72 20 69 73 20 74 68 65 20 62 6c 6f  teger is the blo
1e5a0 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65 73  ckid that corres
1e5b0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 69 6e 74  ponds to the int
1e5c0 65 72 69 6f 72 0a 20 20 20 20 6e 6f 64 65 20 77  erior.    node w
1e5d0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1e5e0 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 62 65 6c  blockid that bel
1e5f0 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65 67  ongs to this seg
1e600 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20  ment b-tree. Or 
1e610 7a 65 72 6f 0a 20 20 20 20 69 66 20 74 68 65 20  zero.    if the 
1e620 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20 62  entire segment b
1e630 2d 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68  -tree fits on th
1e640 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20  e root node. If 
1e650 69 74 20 65 78 69 73 74 73 2c 20 74 68 69 73 20  it exists, this 
1e660 6e 6f 64 65 0a 20 20 20 20 69 73 20 61 6c 77 61  node.    is alwa
1e670 79 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 6e  ys an interior n
1e680 6f 64 65 2e 0a 3c 70 20 73 74 79 6c 65 3d 22 6d  ode..<p style="m
1e690 61 72 67 69 6e 2d 6c 65 66 74 3a 30 3b 6d 61 72  argin-left:0;mar
1e6a0 67 69 6e 2d 72 69 67 68 74 3a 30 3b 6d 61 72 67  gin-right:0;marg
1e6b0 69 6e 2d 62 6f 74 74 6f 6d 3a 30 22 3e 0a 20 20  in-bottom:0">.  
1e6c0 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74    The second int
1e6d0 65 67 65 72 2c 20 69 66 20 69 74 20 69 73 20 70  eger, if it is p
1e6e0 72 65 73 65 6e 74 2c 20 69 73 20 74 68 65 20 61  resent, is the a
1e6f0 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f 66  ggregate size of
1e700 20 61 6c 6c 20 64 61 74 61 0a 20 20 20 20 73 74   all data.    st
1e710 6f 72 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67  ored on leaf pag
1e720 65 73 20 69 6e 20 62 79 74 65 73 2e 20 49 66 20  es in bytes. If 
1e730 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 65 67  the value is neg
1e740 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
1e750 73 65 67 6d 65 6e 74 0a 20 20 20 20 69 73 20 74  segment.    is t
1e760 68 65 20 6f 75 74 70 75 74 20 6f 66 20 61 6e 20  he output of an 
1e770 75 6e 66 69 6e 69 73 68 65 64 20 69 6e 63 72 65  unfinished incre
1e780 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65  mental-merge ope
1e790 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 0a  ration, and the.
1e7a0 20 20 20 20 61 62 73 6f 6c 75 74 65 20 76 61 6c      absolute val
1e7b0 75 65 20 69 73 20 63 75 72 72 65 6e 74 20 73 69  ue is current si
1e7c0 7a 65 20 69 6e 20 62 79 74 65 73 2e 0a 0a 20 20  ze in bytes...  
1e7d0 3c 74 72 3e 3c 74 64 3e 72 6f 6f 74 20 20 20 20  <tr><td>root    
1e7e0 20 20 20 20 20 20 20 20 20 3c 74 64 3e 0a 20 20           <td>.  
1e7f0 20 20 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e    Blob containin
1e800 67 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  g the root node 
1e810 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  of the segment b
1e820 2d 74 72 65 65 2e 0a 3c 2f 74 61 62 6c 65 3e 0a  -tree..</table>.
1e830 0a 3c 70 3e 0a 20 20 41 70 61 72 74 20 66 72 6f  .<p>.  Apart fro
1e840 6d 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c  m the root node,
1e850 20 74 68 65 20 6e 6f 64 65 73 20 74 68 61 74 20   the nodes that 
1e860 6d 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65  make up a single
1e870 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1e880 61 72 65 0a 20 20 61 6c 77 61 79 73 20 73 74 6f  are.  always sto
1e890 72 65 64 20 75 73 69 6e 67 20 61 20 63 6f 6e 74  red using a cont
1e8a0 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20  iguous sequence 
1e8b0 6f 66 20 62 6c 6f 63 6b 69 64 73 2e 20 46 75 72  of blockids. Fur
1e8c0 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 0a 20 20  thermore, the.  
1e8d0 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 6b 65 20  nodes that make 
1e8e0 75 70 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  up a single leve
1e8f0 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  l of the b-tree 
1e900 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 73  are themselves s
1e910 74 6f 72 65 64 20 61 73 0a 20 20 61 20 63 6f 6e  tored as.  a con
1e920 74 69 67 75 6f 75 73 20 62 6c 6f 63 6b 2c 20 69  tiguous block, i
1e930 6e 20 62 2d 74 72 65 65 20 6f 72 64 65 72 2e 20  n b-tree order. 
1e940 54 68 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 73  The contiguous s
1e950 65 71 75 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b  equence of block
1e960 69 64 73 0a 20 20 75 73 65 64 20 74 6f 20 73 74  ids.  used to st
1e970 6f 72 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c  ore the b-tree l
1e980 65 61 76 65 73 20 61 72 65 20 61 6c 6c 6f 63 61  eaves are alloca
1e990 74 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ted starting wit
1e9a0 68 20 74 68 65 20 62 6c 6f 63 6b 69 64 0a 20 20  h the blockid.  
1e9b0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1e9c0 74 68 65 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b  the "start_block
1e9d0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
1e9e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 25 5f  corresponding %_
1e9f0 73 65 67 64 69 72 20 72 6f 77 2c 0a 20 20 61 6e  segdir row,.  an
1ea00 64 20 66 69 6e 69 73 68 69 6e 67 20 61 74 20 74  d finishing at t
1ea10 68 65 20 62 6c 6f 63 6b 69 64 20 76 61 6c 75 65  he blockid value
1ea20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22   stored in the "
1ea30 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1ea40 22 0a 20 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ".  field of the
1ea50 20 73 61 6d 65 20 72 6f 77 2e 20 49 74 20 69 73   same row. It is
1ea60 20 74 68 65 72 65 66 6f 72 65 20 70 6f 73 73 69   therefore possi
1ea70 62 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  ble to iterate t
1ea80 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 0a 20  hrough all the. 
1ea90 20 6c 65 61 76 65 73 20 6f 66 20 61 20 73 65 67   leaves of a seg
1eaa0 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20 69 6e 20  ment b-tree, in 
1eab0 6b 65 79 20 6f 72 64 65 72 2c 20 62 79 20 74 72  key order, by tr
1eac0 61 76 65 72 73 69 6e 67 20 74 68 65 20 25 5f 73  aversing the %_s
1ead0 65 67 6d 65 6e 74 73 20 0a 20 20 74 61 62 6c 65  egments .  table
1eae0 20 69 6e 20 62 6c 6f 63 6b 69 64 20 6f 72 64 65   in blockid orde
1eaf0 72 20 66 72 6f 6d 20 22 73 74 61 72 74 5f 62 6c  r from "start_bl
1eb00 6f 63 6b 22 20 74 6f 20 22 6c 65 61 76 65 73 5f  ock" to "leaves_
1eb10 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20 20 0a 0a 3c  end_block".  ..<
1eb20 68 33 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65  h3>Segment B-Tre
1eb30 65 20 4c 65 61 66 20 4e 6f 64 65 73 3c 2f 68 33  e Leaf Nodes</h3
1eb40 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c  >..<p>.  The fol
1eb50 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d 20 64  lowing diagram d
1eb60 65 70 69 63 74 73 20 74 68 65 20 66 6f 72 6d 61  epicts the forma
1eb70 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 62  t of a segment b
1eb80 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 2e  -tree leaf node.
1eb90 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c 69 6d  ..<center>.  <im
1eba0 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66 74 73  g src=images/fts
1ebb0 33 5f 6c 65 61 66 5f 6e 6f 64 65 2e 70 6e 67 3e  3_leaf_node.png>
1ebc0 0a 20 20 3c 70 3e 20 53 65 67 6d 65 6e 74 20 42  .  <p> Segment B
1ebd0 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 20  -Tree Leaf Node 
1ebe0 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e  Format.</center>
1ebf0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 72 73  ..<p>.  The firs
1ec00 74 20 74 65 72 6d 20 73 74 6f 72 65 64 20 6f 6e  t term stored on
1ec10 20 65 61 63 68 20 6e 6f 64 65 20 28 22 54 65 72   each node ("Ter
1ec20 6d 20 31 22 20 69 6e 20 74 68 65 20 66 69 67 75  m 1" in the figu
1ec30 72 65 20 61 62 6f 76 65 29 20 69 73 0a 20 20 73  re above) is.  s
1ec40 74 6f 72 65 64 20 76 65 72 62 61 74 69 6d 2e 20  tored verbatim. 
1ec50 45 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  Each subsequent 
1ec60 74 65 72 6d 20 69 73 20 70 72 65 66 69 78 2d 63  term is prefix-c
1ec70 6f 6d 70 72 65 73 73 65 64 20 77 69 74 68 20 72  ompressed with r
1ec80 65 73 70 65 63 74 0a 20 20 74 6f 20 69 74 73 20  espect.  to its 
1ec90 70 72 65 64 65 63 65 73 73 6f 72 2e 20 54 65 72  predecessor. Ter
1eca0 6d 73 20 61 72 65 20 73 74 6f 72 65 64 20 77 69  ms are stored wi
1ecb0 74 68 69 6e 20 61 20 70 61 67 65 20 69 6e 20 73  thin a page in s
1ecc0 6f 72 74 65 64 20 28 6d 65 6d 63 6d 70 29 0a 20  orted (memcmp). 
1ecd0 20 6f 72 64 65 72 2e 0a 0a 3c 68 33 3e 53 65 67   order...<h3>Seg
1ece0 6d 65 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65  ment B-Tree Inte
1ecf0 72 69 6f 72 20 4e 6f 64 65 73 3c 2f 68 33 3e 0a  rior Nodes</h3>.
1ed00 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f  .<p>.  The follo
1ed10 77 69 6e 67 20 64 69 61 67 72 61 6d 20 64 65 70  wing diagram dep
1ed20 69 63 74 73 20 74 68 65 20 66 6f 72 6d 61 74 20  icts the format 
1ed30 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74  of a segment b-t
1ed40 72 65 65 20 69 6e 74 65 72 69 6f 72 20 0a 20 20  ree interior .  
1ed50 28 6e 6f 6e 2d 6c 65 61 66 29 20 6e 6f 64 65 2e  (non-leaf) node.
1ed60 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c 69 6d  ..<center>.  <im
1ed70 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66 74 73  g src=images/fts
1ed80 33 5f 69 6e 74 65 72 69 6f 72 5f 6e 6f 64 65 2e  3_interior_node.
1ed90 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65 67 6d 65  png>.  <p> Segme
1eda0 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72 69  nt B-Tree Interi
1edb0 6f 72 20 4e 6f 64 65 20 46 6f 72 6d 61 74 0a 3c  or Node Format.<
1edc0 2f 63 65 6e 74 65 72 3e 0a 0a 0a 3c 68 32 3e 44  /center>...<h2>D
1edd0 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74 3c 2f 68  oclist Format</h
1ede0 32 3e 0a 0a 3c 70 3e 0a 20 20 41 20 64 6f 63 6c  2>..<p>.  A docl
1edf0 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ist consists of 
1ee00 61 6e 20 61 72 72 61 79 20 6f 66 20 36 34 2d 62  an array of 64-b
1ee10 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1ee20 72 73 2c 20 73 65 72 69 61 6c 69 7a 65 64 20 75  rs, serialized u
1ee30 73 69 6e 67 0a 20 20 74 68 65 20 46 54 53 20 76  sing.  the FTS v
1ee40 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20 45 61  arint format. Ea
1ee50 63 68 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79  ch doclist entry
1ee60 20 69 73 20 6d 61 64 65 20 75 70 20 6f 66 20 61   is made up of a
1ee70 20 73 65 72 69 65 73 20 6f 66 20 74 77 6f 20 0a   series of two .
1ee80 20 20 6f 72 20 6d 6f 72 65 20 69 6e 74 65 67 65    or more intege
1ee90 72 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  rs, as follows:.
1eea0 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65  .<ol>.  <li> The
1eeb0 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 54 68   docid value. Th
1eec0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1eed0 20 61 20 64 6f 63 6c 69 73 74 20 63 6f 6e 74 61   a doclist conta
1eee0 69 6e 73 20 74 68 65 20 6c 69 74 65 72 61 6c 20  ins the literal 
1eef0 64 6f 63 69 64 0a 20 20 20 20 20 20 20 76 61 6c  docid.       val
1ef00 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 66 69  ue. The first fi
1ef10 65 6c 64 20 6f 66 20 65 61 63 68 20 73 75 62 73  eld of each subs
1ef20 65 71 75 65 6e 74 20 64 6f 63 6c 69 73 74 20 65  equent doclist e
1ef30 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1ef40 65 20 0a 20 20 20 20 20 20 20 64 69 66 66 65 72  e .       differ
1ef50 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
1ef60 20 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74   new docid and t
1ef70 68 65 20 70 72 65 76 69 6f 75 73 20 6f 6e 65 20  he previous one 
1ef80 28 61 6c 77 61 79 73 20 61 20 70 6f 73 69 74 69  (always a positi
1ef90 76 65 20 0a 20 20 20 20 20 20 20 6e 75 6d 62 65  ve .       numbe
1efa0 72 29 2e 0a 20 20 3c 6c 69 3e 20 5a 65 72 6f 20  r)..  <li> Zero 
1efb0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6f 66 66  or more term-off
1efc0 73 65 74 20 6c 69 73 74 73 2e 20 41 20 74 65 72  set lists. A ter
1efd0 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 69 73  m-offset list is
1efe0 20 70 72 65 73 65 6e 74 20 66 6f 72 20 65 61 63   present for eac
1eff0 68 0a 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20  h.       column 
1f000 6f 66 20 74 68 65 20 46 54 53 20 76 69 72 74 75  of the FTS virtu
1f010 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  al table that co
1f020 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 2e  ntains the term.
1f030 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 0a 20   A term-offset. 
1f040 20 20 20 20 20 20 6c 69 73 74 20 63 6f 6e 73 69        list consi
1f050 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  sts of the follo
1f060 77 69 6e 67 3a 0a 20 20 20 20 20 3c 6f 6c 3e 0a  wing:.     <ol>.
1f070 20 20 20 20 20 20 20 3c 6c 69 3e 20 43 6f 6e 73         <li> Cons
1f080 74 61 6e 74 20 76 61 6c 75 65 20 31 2e 20 54 68  tant value 1. Th
1f090 69 73 20 66 69 65 6c 64 20 69 73 20 6f 6d 69 74  is field is omit
1f0a0 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72 6d  ted for any term
1f0b0 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 20 20 20  -offset list.   
1f0c0 20 20 20 20 20 20 20 20 20 61 73 73 6f 63 69 61           associa
1f0d0 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ted with column 
1f0e0 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 54  0..       <li> T
1f0f0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
1f100 20 28 31 20 66 6f 72 20 74 68 65 20 73 65 63 6f   (1 for the seco
1f110 6e 64 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75  nd leftmost colu
1f120 6d 6e 2c 20 65 74 63 2e 29 2e 20 54 68 69 73 0a  mn, etc.). This.
1f130 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65 6c              fiel
1f140 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  d is omitted for
1f150 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74   any term-offset
1f160 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64   list associated
1f170 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a   with column 0..
1f180 20 20 20 20 20 20 20 3c 6c 69 3e 20 41 20 6c 69         <li> A li
1f190 73 74 20 6f 66 20 74 65 72 6d 2d 6f 66 66 73 65  st of term-offse
1f1a0 74 73 2c 20 73 6f 72 74 65 64 20 66 72 6f 6d 20  ts, sorted from 
1f1b0 73 6d 61 6c 6c 65 73 74 20 74 6f 20 6c 61 72 67  smallest to larg
1f1c0 65 73 74 2e 20 49 6e 73 74 65 61 64 0a 20 20 20  est. Instead.   
1f1d0 20 20 20 20 20 20 20 20 20 6f 66 20 73 74 6f 72           of stor
1f1e0 69 6e 67 20 74 68 65 20 74 65 72 6d 2d 6f 66 66  ing the term-off
1f1f0 73 65 74 20 76 61 6c 75 65 20 6c 69 74 65 72 61  set value litera
1f200 6c 6c 79 2c 20 65 61 63 68 20 69 6e 74 65 67 65  lly, each intege
1f210 72 20 73 74 6f 72 65 64 20 0a 20 20 20 20 20 20  r stored .      
1f220 20 20 20 20 20 20 69 73 20 74 68 65 20 64 69 66        is the dif
1f230 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1f240 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
1f250 2d 6f 66 66 73 65 74 20 61 6e 64 20 74 68 65 20  -offset and the 
1f260 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 20 20  previous .      
1f270 20 20 20 20 20 20 6f 6e 65 20 28 6f 72 20 7a 65        one (or ze
1f280 72 6f 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ro if the curren
1f290 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 69 73  t term-offset is
1f2a0 20 74 68 65 20 66 69 72 73 74 29 2c 20 70 6c 75   the first), plu
1f2b0 73 20 32 2e 0a 20 20 20 20 20 3c 2f 6f 6c 3e 0a  s 2..     </ol>.
1f2c0 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20    <li> Constant 
1f2d0 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f 6c 3e 0a 0a  value 0..</ol>..
1f2e0 3c 63 65 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20  <center>.  <img 
1f2f0 73 72 63 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f  src=images/fts3_
1f300 64 6f 63 6c 69 73 74 32 2e 70 6e 67 3e 0a 20 20  doclist2.png>.  
1f310 3c 70 3e 20 46 54 53 33 20 44 6f 63 6c 69 73 74  <p> FTS3 Doclist
1f320 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72   Format.</center
1f330 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c 69  >..<center>.  <i
1f340 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66 74  mg src=images/ft
1f350 73 33 5f 64 6f 63 6c 69 73 74 2e 70 6e 67 3e 0a  s3_doclist.png>.
1f360 20 20 3c 70 3e 20 46 54 53 20 44 6f 63 6c 69 73    <p> FTS Doclis
1f370 74 20 45 6e 74 72 79 20 46 6f 72 6d 61 74 0a 3c  t Entry Format.<
1f380 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20  /center>..<p>.  
1f390 46 6f 72 20 64 6f 63 6c 69 73 74 73 20 66 6f 72  For doclists for
1f3a0 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d 20   which the term 
1f3b0 61 70 70 65 61 72 73 20 69 6e 20 6d 6f 72 65 20  appears in more 
1f3c0 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  than one column 
1f3d0 6f 66 20 74 68 65 20 46 54 53 0a 20 20 76 69 72  of the FTS.  vir
1f3e0 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 65 72 6d  tual table, term
1f3f0 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 20 77 69  -offset lists wi
1f400 74 68 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  thin the doclist
1f410 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 63   are stored in c
1f420 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d 62 65 72 20  olumn .  number 
1f430 6f 72 64 65 72 2e 20 54 68 69 73 20 65 6e 73 75  order. This ensu
1f440 72 65 73 20 74 68 61 74 20 74 68 65 20 74 65 72  res that the ter
1f450 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61 73  m-offset list as
1f460 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
1f470 20 63 6f 6c 75 6d 6e 20 30 20 28 69 66 20 61 6e   column 0 (if an
1f480 79 29 20 69 73 20 61 6c 77 61 79 73 20 66 69 72  y) is always fir
1f490 73 74 2c 20 61 6c 6c 6f 77 69 6e 67 20 74 68 65  st, allowing the
1f4a0 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
1f4b0 73 20 6f 66 20 74 68 65 0a 20 20 74 65 72 6d 2d  s of the.  term-
1f4c0 6f 66 66 73 65 74 20 6c 69 73 74 20 74 6f 20 62  offset list to b
1f4d0 65 20 6f 6d 69 74 74 65 64 20 69 6e 20 74 68 69  e omitted in thi
1f4e0 73 20 63 61 73 65 2e 0a 0a 3c 68 31 20 69 64 3d  s case...<h1 id=
1f4f0 61 70 70 65 6e 64 69 78 5f 61 20 6e 6f 6e 75 6d  appendix_a nonum
1f500 62 65 72 20 74 61 67 73 3d 22 73 65 61 72 63 68  ber tags="search
1f510 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 69 70   application tip
1f520 73 22 3e 0a 20 20 41 70 70 65 6e 64 69 78 20 41  s">.  Appendix A
1f530 3a 20 53 65 61 72 63 68 20 41 70 70 6c 69 63 61  : Search Applica
1f540 74 69 6f 6e 20 54 69 70 73 0a 3c 2f 68 31 3e 0a  tion Tips.</h1>.
1f550 0a 3c 70 3e 0a 20 20 46 54 53 20 69 73 20 70 72  .<p>.  FTS is pr
1f560 69 6d 61 72 69 6c 79 20 64 65 73 69 67 6e 65 64  imarily designed
1f570 20 74 6f 20 73 75 70 70 6f 72 74 20 42 6f 6f 6c   to support Bool
1f580 65 61 6e 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  ean full-text qu
1f590 65 72 69 65 73 20 2d 20 71 75 65 72 69 65 73 0a  eries - queries.
1f5a0 20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 65    to find the se
1f5b0 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74  t of documents t
1f5c0 68 61 74 20 6d 61 74 63 68 20 61 20 73 70 65 63  hat match a spec
1f5d0 69 66 69 65 64 20 63 72 69 74 65 72 69 61 2e 20  ified criteria. 
1f5e0 48 6f 77 65 76 65 72 2c 20 6d 61 6e 79 20 0a 20  However, many . 
1f5f0 20 28 6d 6f 73 74 3f 29 20 73 65 61 72 63 68 20   (most?) search 
1f600 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 72 65 71  applications req
1f610 75 69 72 65 20 74 68 61 74 20 72 65 73 75 6c 74  uire that result
1f620 73 20 61 72 65 20 73 6f 6d 65 68 6f 77 20 72 61  s are somehow ra
1f630 6e 6b 65 64 20 69 6e 20 6f 72 64 65 72 0a 20 20  nked in order.  
1f640 6f 66 20 22 72 65 6c 65 76 61 6e 63 65 22 2c 20  of "relevance", 
1f650 77 68 65 72 65 20 22 72 65 6c 65 76 61 6e 63 65  where "relevance
1f660 22 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20  " is defined as 
1f670 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 74  the likelihood t
1f680 68 61 74 20 74 68 65 20 75 73 65 72 0a 20 20 77  hat the user.  w
1f690 68 6f 20 70 65 72 66 6f 72 6d 65 64 20 74 68 65  ho performed the
1f6a0 20 73 65 61 72 63 68 20 69 73 20 69 6e 74 65 72   search is inter
1f6b0 65 73 74 65 64 20 69 6e 20 61 20 73 70 65 63 69  ested in a speci
1f6c0 66 69 63 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  fic element of t
1f6d0 68 65 20 72 65 74 75 72 6e 65 64 0a 20 20 73 65  he returned.  se
1f6e0 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 2e 20  t of documents. 
1f6f0 57 68 65 6e 20 75 73 69 6e 67 20 61 20 73 65 61  When using a sea
1f700 72 63 68 20 65 6e 67 69 6e 65 20 74 6f 20 66 69  rch engine to fi
1f710 6e 64 20 64 6f 63 75 6d 65 6e 74 73 20 6f 6e 20  nd documents on 
1f720 74 68 65 20 77 6f 72 6c 64 0a 20 20 77 69 64 65  the world.  wide
1f730 20 77 65 62 2c 20 74 68 65 20 75 73 65 72 20 65   web, the user e
1f740 78 70 65 63 74 73 20 74 68 61 74 20 74 68 65 20  xpects that the 
1f750 6d 6f 73 74 20 75 73 65 66 75 6c 2c 20 6f 72 20  most useful, or 
1f760 22 72 65 6c 65 76 61 6e 74 22 2c 20 64 6f 63 75  "relevant", docu
1f770 6d 65 6e 74 73 20 0a 20 20 77 69 6c 6c 20 62 65  ments .  will be
1f780 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65   returned as the
1f790 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 72   first page of r
1f7a0 65 73 75 6c 74 73 2c 20 61 6e 64 20 74 68 61 74  esults, and that
1f7b0 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1f7c0 20 70 61 67 65 20 0a 20 20 63 6f 6e 74 61 69 6e   page .  contain
1f7d0 73 20 70 72 6f 67 72 65 73 73 69 76 65 6c 79 20  s progressively 
1f7e0 6c 65 73 73 20 72 65 6c 65 76 61 6e 74 20 72 65  less relevant re
1f7f0 73 75 6c 74 73 2e 20 45 78 61 63 74 6c 79 20 68  sults. Exactly h
1f800 6f 77 20 61 20 6d 61 63 68 69 6e 65 20 63 61 6e  ow a machine can
1f810 20 0a 20 20 64 65 74 65 72 6d 69 6e 65 20 64 6f   .  determine do
1f820 63 75 6d 65 6e 74 20 72 65 6c 65 76 61 6e 63 65  cument relevance
1f830 20 62 61 73 65 64 20 6f 6e 20 61 20 75 73 65 72   based on a user
1f840 73 20 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  s query is a com
1f850 70 6c 69 63 61 74 65 64 20 70 72 6f 62 6c 65 6d  plicated problem
1f860 0a 20 20 61 6e 64 20 74 68 65 20 73 75 62 6a 65  .  and the subje
1f870 63 74 20 6f 66 20 6d 75 63 68 20 6f 6e 67 6f 69  ct of much ongoi
1f880 6e 67 20 72 65 73 65 61 72 63 68 2e 0a 0a 3c 70  ng research...<p
1f890 3e 0a 20 20 4f 6e 65 20 76 65 72 79 20 73 69 6d  >.  One very sim
1f8a0 70 6c 65 20 73 63 68 65 6d 65 20 6d 69 67 68 74  ple scheme might
1f8b0 20 62 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65   be to count the
1f8c0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
1f8d0 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 20 20 75  nces of the .  u
1f8e0 73 65 72 73 20 73 65 61 72 63 68 20 74 65 72 6d  sers search term
1f8f0 73 20 69 6e 20 65 61 63 68 20 72 65 73 75 6c 74  s in each result
1f900 20 64 6f 63 75 6d 65 6e 74 2e 20 54 68 6f 73 65   document. Those
1f910 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
1f920 63 6f 6e 74 61 69 6e 0a 20 20 6d 61 6e 79 20 69  contain.  many i
1f930 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
1f940 74 65 72 6d 73 20 61 72 65 20 63 6f 6e 73 69 64  terms are consid
1f950 65 72 65 64 20 6d 6f 72 65 20 72 65 6c 65 76 61  ered more releva
1f960 6e 74 20 74 68 61 6e 20 74 68 6f 73 65 20 77 69  nt than those wi
1f970 74 68 0a 20 20 61 20 73 6d 61 6c 6c 20 6e 75 6d  th.  a small num
1f980 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ber of instances
1f990 20 6f 66 20 65 61 63 68 20 74 65 72 6d 2e 20 49   of each term. I
1f9a0 6e 20 61 6e 20 46 54 53 20 61 70 70 6c 69 63 61  n an FTS applica
1f9b0 74 69 6f 6e 2c 20 74 68 65 20 0a 20 20 6e 75 6d  tion, the .  num
1f9c0 62 65 72 20 6f 66 20 74 65 72 6d 20 69 6e 73 74  ber of term inst
1f9d0 61 6e 63 65 73 20 69 6e 20 65 61 63 68 20 72 65  ances in each re
1f9e0 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 64 65  sult could be de
1f9f0 74 65 72 6d 69 6e 65 64 20 62 79 20 63 6f 75 6e  termined by coun
1fa00 74 69 6e 67 0a 20 20 74 68 65 20 6e 75 6d 62 65  ting.  the numbe
1fa10 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  r of integers in
1fa20 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1fa30 65 20 6f 66 20 74 68 65 20 5b 6f 66 66 73 65 74  e of the [offset
1fa40 73 5d 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 54  s] function..  T
1fa50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61  he following exa
1fa60 6d 70 6c 65 20 73 68 6f 77 73 20 61 20 71 75 65  mple shows a que
1fa70 72 79 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65  ry that could be
1fa80 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1fa90 74 68 65 0a 20 20 74 65 6e 20 6d 6f 73 74 20 72  the.  ten most r
1faa0 65 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73 20  elevant results 
1fab0 66 6f 72 20 61 20 71 75 65 72 79 20 65 6e 74 65  for a query ente
1fac0 72 65 64 20 62 79 20 74 68 65 20 75 73 65 72 3a  red by the user:
1fad0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
1fae0 3c 69 3e 2d 2d 20 54 68 69 73 20 65 78 61 6d 70  <i>-- This examp
1faf0 6c 65 20 28 61 6e 64 20 61 6c 6c 20 6f 74 68 65  le (and all othe
1fb00 72 73 20 69 6e 20 74 68 69 73 20 73 65 63 74 69  rs in this secti
1fb10 6f 6e 29 20 61 73 73 75 6d 65 73 20 74 68 65 20  on) assumes the 
1fb20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d 61  following schema
1fb30 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
1fb40 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 75  RTUAL TABLE docu
1fb50 6d 65 6e 74 73 20 55 53 49 4e 47 20 66 74 73 33  ments USING fts3
1fb60 28 74 69 74 6c 65 2c 20 63 6f 6e 74 65 6e 74 29  (title, content)
1fb70 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 73 73 75 6d  ;..  <i>-- Assum
1fb80 69 6e 67 20 74 68 65 20 61 70 70 6c 69 63 61 74  ing the applicat
1fb90 69 6f 6e 20 68 61 73 20 73 75 70 70 6c 69 65 64  ion has supplied
1fba0 20 61 6e 20 53 51 4c 69 74 65 20 75 73 65 72 20   an SQLite user 
1fbb0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
1fbc0 63 6f 75 6e 74 69 6e 74 65 67 65 72 73 22 3c 2f  countintegers"</
1fbd0 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20  i>.  <i>-- that 
1fbe0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
1fbf0 65 72 20 6f 66 20 73 70 61 63 65 2d 73 65 70 61  er of space-sepa
1fc00 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 20 63  rated integers c
1fc10 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69 74 73 20  ontained in its 
1fc20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2c 3c 2f  only argument,</
1fc30 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 66  i>.  <i>-- the f
1fc40 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 63  ollowing query c
1fc50 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
1fc60 72 65 74 75 72 6e 20 74 68 65 20 74 69 74 6c 65  return the title
1fc70 73 20 6f 66 20 74 68 65 20 31 30 20 64 6f 63 75  s of the 10 docu
1fc80 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
1fc90 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  in</i>.  <i>-- t
1fca0 68 65 20 67 72 65 61 74 65 73 74 20 6e 75 6d 62  he greatest numb
1fcb0 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  er of instances 
1fcc0 6f 66 20 74 68 65 20 75 73 65 72 73 20 71 75 65  of the users que
1fcd0 72 79 20 74 65 72 6d 73 2e 20 48 6f 70 65 66 75  ry terms. Hopefu
1fce0 6c 6c 79 2c 20 74 68 65 73 65 20 31 30 3c 2f 69  lly, these 10</i
1fcf0 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65  >.  <i>-- docume
1fd00 6e 74 73 20 77 69 6c 6c 20 62 65 20 74 68 6f 73  nts will be thos
1fd10 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72 73  e that the users
1fd20 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f 72 65 20   considers more 
1fd30 6f 72 20 6c 65 73 73 20 74 68 65 20 6d 6f 73 74  or less the most
1fd40 20 22 72 65 6c 65 76 61 6e 74 22 2e 3c 2f 69 3e   "relevant".</i>
1fd50 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65 20  .  SELECT title 
1fd60 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 0a  FROM documents .
1fd70 20 20 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65      WHERE docume
1fd80 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75  nts MATCH &lt;qu
1fd90 65 72 79 26 67 74 3b 0a 20 20 20 20 4f 52 44 45  ery&gt;.    ORDE
1fda0 52 20 42 59 20 63 6f 75 6e 74 69 6e 74 65 67 65  R BY countintege
1fdb0 72 73 28 6f 66 66 73 65 74 73 28 64 6f 63 75 6d  rs(offsets(docum
1fdc0 65 6e 74 73 29 29 20 44 45 53 43 0a 20 20 20 20  ents)) DESC.    
1fdd0 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
1fde0 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  0.</codeblock>..
1fdf0 3c 70 3e 0a 20 20 54 68 65 20 71 75 65 72 79 20  <p>.  The query 
1fe00 61 62 6f 76 65 20 63 6f 75 6c 64 20 62 65 20 6d  above could be m
1fe10 61 64 65 20 74 6f 20 72 75 6e 20 66 61 73 74 65  ade to run faste
1fe20 72 20 62 79 20 75 73 69 6e 67 20 74 68 65 20 46  r by using the F
1fe30 54 53 20 5b 6d 61 74 63 68 69 6e 66 6f 5d 0a 20  TS [matchinfo]. 
1fe40 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 65 74   function to det
1fe50 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65  ermine the numbe
1fe60 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 20  r of query term 
1fe70 69 6e 73 74 61 6e 63 65 73 20 74 68 61 74 20 61  instances that a
1fe80 70 70 65 61 72 20 69 6e 20 65 61 63 68 0a 20 20  ppear in each.  
1fe90 72 65 73 75 6c 74 2e 20 54 68 65 20 6d 61 74 63  result. The matc
1fea0 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 69  hinfo function i
1feb0 73 20 6d 75 63 68 20 6d 6f 72 65 20 65 66 66 69  s much more effi
1fec0 63 69 65 6e 74 20 74 68 61 6e 20 74 68 65 20 6f  cient than the o
1fed0 66 66 73 65 74 73 20 0a 20 20 66 75 6e 63 74 69  ffsets .  functi
1fee0 6f 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  on. Furthermore,
1fef0 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   the matchinfo f
1ff00 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73  unction provides
1ff10 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1ff20 6f 6e 0a 20 20 72 65 67 61 72 64 69 6e 67 20 74  on.  regarding t
1ff30 68 65 20 6f 76 65 72 61 6c 6c 20 6e 75 6d 62 65  he overall numbe
1ff40 72 20 6f 66 20 6f 63 63 75 72 72 65 6e 63 65 73  r of occurrences
1ff50 20 6f 66 20 65 61 63 68 20 71 75 65 72 79 20 74   of each query t
1ff60 65 72 6d 20 69 6e 20 74 68 65 20 65 6e 74 69 72  erm in the entir
1ff70 65 0a 20 20 64 6f 63 75 6d 65 6e 74 20 73 65 74  e.  document set
1ff80 20 28 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63   (not just the c
1ff90 75 72 72 65 6e 74 20 72 6f 77 29 20 61 6e 64 20  urrent row) and 
1ffa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f  the number of do
1ffb0 63 75 6d 65 6e 74 73 20 69 6e 20 77 68 69 63 68  cuments in which
1ffc0 20 0a 20 20 65 61 63 68 20 71 75 65 72 79 20 74   .  each query t
1ffd0 65 72 6d 20 61 70 70 65 61 72 73 2e 20 54 68 69  erm appears. Thi
1ffe0 73 20 6d 61 79 20 62 65 20 75 73 65 64 20 28 66  s may be used (f
1fff0 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 6f 20 61  or example) to a
20000 74 74 61 63 68 20 61 20 68 69 67 68 65 72 0a 20  ttach a higher. 
20010 20 77 65 69 67 68 74 20 74 6f 20 6c 65 73 73 20   weight to less 
20020 63 6f 6d 6d 6f 6e 20 74 65 72 6d 73 20 77 68 69  common terms whi
20030 63 68 20 6d 61 79 20 69 6e 63 72 65 61 73 65 20  ch may increase 
20040 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 6d 70  the overall comp
20050 75 74 65 64 20 72 65 6c 65 76 61 6e 63 79 20 0a  uted relevancy .
20060 20 20 6f 66 20 74 68 6f 73 65 20 72 65 73 75 6c    of those resul
20070 74 73 20 74 68 65 20 75 73 65 72 20 63 6f 6e 73  ts the user cons
20080 69 64 65 72 73 20 6d 6f 72 65 20 69 6e 74 65 72  iders more inter
20090 65 73 74 69 6e 67 2e 0a 0a 3c 63 6f 64 65 62 6c  esting...<codebl
200a0 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 49 66 20  ock>.  <i>-- If 
200b0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
200c0 73 75 70 70 6c 69 65 73 20 61 6e 20 53 51 4c 69  supplies an SQLi
200d0 74 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  te user function
200e0 20 63 61 6c 6c 65 64 20 22 72 61 6e 6b 22 20 74   called "rank" t
200f0 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  hat</i>.  <i>-- 
20100 69 6e 74 65 72 70 72 65 74 73 20 74 68 65 20 62  interprets the b
20110 6c 6f 62 20 6f 66 20 64 61 74 61 20 72 65 74 75  lob of data retu
20120 72 6e 65 64 20 62 79 20 6d 61 74 63 68 69 6e 66  rned by matchinf
20130 6f 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  o and returns a 
20140 6e 75 6d 65 72 69 63 3c 2f 69 3e 0a 20 20 3c 69  numeric</i>.  <i
20150 3e 2d 2d 20 72 65 6c 65 76 61 6e 63 79 20 62 61  >-- relevancy ba
20160 73 65 64 20 6f 6e 20 69 74 2c 20 74 68 65 6e 20  sed on it, then 
20170 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
20180 4c 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  L may be used to
20190 20 72 65 74 75 72 6e 20 74 68 65 3c 2f 69 3e 0a   return the</i>.
201a0 20 20 3c 69 3e 2d 2d 20 74 69 74 6c 65 73 20 6f    <i>-- titles o
201b0 66 20 74 68 65 20 31 30 20 6d 6f 73 74 20 72 65  f the 10 most re
201c0 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e 74 73  levant documents
201d0 20 69 6e 20 74 68 65 20 64 61 74 61 73 65 74 20   in the dataset 
201e0 66 6f 72 20 61 20 75 73 65 72 73 20 71 75 65 72  for a users quer
201f0 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
20200 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d  title FROM docum
20210 65 6e 74 73 20 0a 20 20 20 20 57 48 45 52 45 20  ents .    WHERE 
20220 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20  documents MATCH 
20230 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20  &lt;query&gt;.  
20240 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28    ORDER BY rank(
20250 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65  matchinfo(docume
20260 6e 74 73 29 29 20 44 45 53 43 0a 20 20 20 20 4c  nts)) DESC.    L
20270 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 30  IMIT 10 OFFSET 0
20280 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
20290 70 3e 0a 20 20 54 68 65 20 53 51 4c 20 71 75 65  p>.  The SQL que
202a0 72 79 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  ry in the exampl
202b0 65 20 61 62 6f 76 65 20 75 73 65 73 20 6c 65 73  e above uses les
202c0 73 20 43 50 55 20 74 68 61 6e 20 74 68 65 20 66  s CPU than the f
202d0 69 72 73 74 20 65 78 61 6d 70 6c 65 0a 20 20 69  irst example.  i
202e0 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e 2c 20  n this section, 
202f0 62 75 74 20 73 74 69 6c 6c 20 68 61 73 20 61 20  but still has a 
20300 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 70 65 72 66  non-obvious perf
20310 6f 72 6d 61 6e 63 65 20 70 72 6f 62 6c 65 6d 2e  ormance problem.
20320 20 53 51 4c 69 74 65 0a 20 20 73 61 74 69 73 66   SQLite.  satisf
20330 69 65 73 20 74 68 69 73 20 71 75 65 72 79 20 62  ies this query b
20340 79 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65  y retrieving the
20350 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 74   value of the "t
20360 69 74 6c 65 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  itle" column and
20370 0a 20 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74  .  matchinfo dat
20380 61 20 66 72 6f 6d 20 74 68 65 20 46 54 53 20 6d  a from the FTS m
20390 6f 64 75 6c 65 20 66 6f 72 20 65 76 65 72 79 20  odule for every 
203a0 72 6f 77 20 6d 61 74 63 68 65 64 20 62 79 20 74  row matched by t
203b0 68 65 20 75 73 65 72 73 0a 20 20 71 75 65 72 79  he users.  query
203c0 20 62 65 66 6f 72 65 20 69 74 20 73 6f 72 74 73   before it sorts
203d0 20 61 6e 64 20 6c 69 6d 69 74 73 20 74 68 65 20   and limits the 
203e0 72 65 73 75 6c 74 73 2e 20 42 65 63 61 75 73 65  results. Because
203f0 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
20400 74 65 27 73 0a 20 20 76 69 72 74 75 61 6c 20 74  te's.  virtual t
20410 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65 20 77  able interface w
20420 6f 72 6b 73 2c 20 72 65 74 72 69 65 76 69 6e 67  orks, retrieving
20430 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
20440 65 20 22 74 69 74 6c 65 22 20 63 6f 6c 75 6d 6e  e "title" column
20450 0a 20 20 72 65 71 75 69 72 65 73 20 6c 6f 61 64  .  requires load
20460 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 72  ing the entire r
20470 6f 77 20 66 72 6f 6d 20 64 69 73 6b 20 28 69 6e  ow from disk (in
20480 63 6c 75 64 69 6e 67 20 74 68 65 20 22 63 6f 6e  cluding the "con
20490 74 65 6e 74 22 20 66 69 65 6c 64 2c 0a 20 20 77  tent" field,.  w
204a0 68 69 63 68 20 6d 61 79 20 62 65 20 71 75 69 74  hich may be quit
204b0 65 20 6c 61 72 67 65 29 2e 20 54 68 69 73 20 6d  e large). This m
204c0 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
204d0 20 75 73 65 72 73 20 71 75 65 72 79 20 6d 61 74   users query mat
204e0 63 68 65 73 0a 20 20 73 65 76 65 72 61 6c 20 74  ches.  several t
204f0 68 6f 75 73 61 6e 64 20 64 6f 63 75 6d 65 6e 74  housand document
20500 73 2c 20 6d 61 6e 79 20 6d 65 67 61 62 79 74 65  s, many megabyte
20510 73 20 6f 66 20 22 74 69 74 6c 65 22 20 61 6e 64  s of "title" and
20520 20 22 63 6f 6e 74 65 6e 74 22 20 64 61 74 61 0a   "content" data.
20530 20 20 6d 61 79 20 62 65 20 6c 6f 61 64 65 64 20    may be loaded 
20540 66 72 6f 6d 20 64 69 73 6b 20 69 6e 74 6f 20 6d  from disk into m
20550 65 6d 6f 72 79 20 65 76 65 6e 20 74 68 6f 75 67  emory even thoug
20560 68 20 74 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  h they will neve
20570 72 20 62 65 20 75 73 65 64 0a 20 20 66 6f 72 20  r be used.  for 
20580 61 6e 79 20 70 75 72 70 6f 73 65 2e 20 0a 0a 3c  any purpose. ..<
20590 70 3e 0a 20 20 54 68 65 20 53 51 4c 20 71 75 65  p>.  The SQL que
205a0 72 79 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ry in the follow
205b0 69 6e 67 20 65 78 61 6d 70 6c 65 20 62 6c 6f 63  ing example bloc
205c0 6b 20 69 73 20 6f 6e 65 20 73 6f 6c 75 74 69 6f  k is one solutio
205d0 6e 20 74 6f 20 74 68 69 73 20 0a 20 20 70 72 6f  n to this .  pro
205e0 62 6c 65 6d 2e 20 49 6e 20 53 51 4c 69 74 65 2c  blem. In SQLite,
205f0 20 77 68 65 6e 20 61 20 3c 61 20 68 72 65 66 3d   when a <a href=
20600 22 6f 70 74 6f 76 65 72 76 69 65 77 2e 68 74 6d  "optoverview.htm
20610 6c 23 66 6c 61 74 74 65 6e 69 6e 67 22 3e 73 75  l#flattening">su
20620 62 2d 71 75 65 72 79 20 0a 20 20 75 73 65 64 20  b-query .  used 
20630 69 6e 20 61 20 6a 6f 69 6e 20 63 6f 6e 74 61 69  in a join contai
20640 6e 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ns a LIMIT claus
20650 65 3c 2f 61 3e 2c 20 74 68 65 20 72 65 73 75 6c  e</a>, the resul
20660 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ts of the sub-qu
20670 65 72 79 20 61 72 65 0a 20 20 63 61 6c 63 75 6c  ery are.  calcul
20680 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 20  ated and stored 
20690 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
206a0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61  le before the ma
206b0 69 6e 20 71 75 65 72 79 20 69 73 20 65 78 65 63  in query is exec
206c0 75 74 65 64 2e 0a 20 20 54 68 69 73 20 6d 65 61  uted..  This mea
206d0 6e 73 20 74 68 61 74 20 53 51 4c 69 74 65 20 77  ns that SQLite w
206e0 69 6c 6c 20 6c 6f 61 64 20 6f 6e 6c 79 20 74 68  ill load only th
206f0 65 20 64 6f 63 69 64 20 61 6e 64 20 6d 61 74 63  e docid and matc
20700 68 69 6e 66 6f 20 64 61 74 61 20 66 6f 72 20 65  hinfo data for e
20710 61 63 68 0a 20 20 72 6f 77 20 6d 61 74 63 68 69  ach.  row matchi
20720 6e 67 20 74 68 65 20 75 73 65 72 73 20 71 75 65  ng the users que
20730 72 79 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20  ry into memory, 
20740 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 6f  determine the do
20750 63 69 64 20 76 61 6c 75 65 73 0a 20 20 63 6f 72  cid values.  cor
20760 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
20770 65 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76  e ten most relev
20780 61 6e 74 20 64 6f 63 75 6d 65 6e 74 73 2c 20 74  ant documents, t
20790 68 65 6e 20 6c 6f 61 64 20 6f 6e 6c 79 20 74 68  hen load only th
207a0 65 20 74 69 74 6c 65 0a 20 20 61 6e 64 20 63 6f  e title.  and co
207b0 6e 74 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntent informatio
207c0 6e 20 66 6f 72 20 74 68 6f 73 65 20 31 30 20 64  n for those 10 d
207d0 6f 63 75 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 42  ocuments only. B
207e0 65 63 61 75 73 65 20 62 6f 74 68 20 74 68 65 20  ecause both the 
207f0 6d 61 74 63 68 69 6e 66 6f 0a 20 20 61 6e 64 20  matchinfo.  and 
20800 64 6f 63 69 64 20 76 61 6c 75 65 73 20 61 72 65  docid values are
20810 20 67 6c 65 61 6e 65 64 20 65 6e 74 69 72 65 6c   gleaned entirel
20820 79 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  y from the full-
20830 74 65 78 74 20 69 6e 64 65 78 2c 20 74 68 69 73  text index, this
20840 20 72 65 73 75 6c 74 73 0a 20 20 69 6e 20 64 72   results.  in dr
20850 61 6d 61 74 69 63 61 6c 6c 79 20 6c 65 73 73 20  amatically less 
20860 64 61 74 61 20 62 65 69 6e 67 20 6c 6f 61 64 65  data being loade
20870 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
20880 61 73 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ase into memory.
20890 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
208a0 53 45 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f  SELECT title FRO
208b0 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f 49 4e  M documents JOIN
208c0 20 28 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ( .      SELECT
208d0 20 64 6f 63 69 64 2c 20 72 61 6e 6b 28 6d 61 74   docid, rank(mat
208e0 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73  chinfo(documents
208f0 29 29 20 41 53 20 72 61 6e 6b 20 0a 20 20 20 20  )) AS rank .    
20900 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73    FROM documents
20910 0a 20 20 20 20 20 20 57 48 45 52 45 20 64 6f 63  .      WHERE doc
20920 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74  uments MATCH &lt
20930 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20 20  ;query&gt;.     
20940 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20 44   ORDER BY rank D
20950 45 53 43 20 0a 20 20 20 20 20 20 4c 49 4d 49 54  ESC .      LIMIT
20960 20 31 30 20 4f 46 46 53 45 54 20 30 0a 20 20 29   10 OFFSET 0.  )
20970 20 41 53 20 72 61 6e 6b 74 61 62 6c 65 20 55 53   AS ranktable US
20980 49 4e 47 28 64 6f 63 69 64 29 0a 20 20 4f 52 44  ING(docid).  ORD
20990 45 52 20 42 59 20 72 61 6e 6b 74 61 62 6c 65 2e  ER BY ranktable.
209a0 72 61 6e 6b 20 44 45 53 43 0a 3c 2f 63 6f 64 65  rank DESC.</code
209b0 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
209c0 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
209d0 53 51 4c 20 65 6e 68 61 6e 63 65 73 20 74 68 65  SQL enhances the
209e0 20 71 75 65 72 79 20 77 69 74 68 20 73 6f 6c 75   query with solu
209f0 74 69 6f 6e 73 20 74 6f 20 74 77 6f 20 6f 74 68  tions to two oth
20a00 65 72 20 70 72 6f 62 6c 65 6d 73 0a 20 20 74 68  er problems.  th
20a10 61 74 20 6d 61 79 20 61 72 69 73 65 20 69 6e 20  at may arise in 
20a20 64 65 76 65 6c 6f 70 69 6e 67 20 73 65 61 72 63  developing searc
20a30 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 75  h applications u
20a40 73 69 6e 67 20 46 54 53 3a 0a 0a 3c 6f 6c 3e 0a  sing FTS:..<ol>.
20a50 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20 20 20 20    <li> <p>.     
20a60 20 20 54 68 65 20 5b 73 6e 69 70 70 65 74 5d 20    The [snippet] 
20a70 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
20a80 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  be used with the
20a90 20 61 62 6f 76 65 20 71 75 65 72 79 2e 20 42 65   above query. Be
20aa0 63 61 75 73 65 0a 20 20 20 20 20 20 20 74 68 65  cause.       the
20ab0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
20ac0 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 20  s not include a 
20ad0 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43 48  "WHERE ... MATCH
20ae0 22 20 63 6c 61 75 73 65 2c 20 74 68 65 20 73 6e  " clause, the sn
20af0 69 70 70 65 74 20 0a 20 20 20 20 20 20 20 66 75  ippet .       fu
20b00 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  nction may not b
20b10 65 20 75 73 65 64 20 77 69 74 68 20 69 74 2e 20  e used with it. 
20b20 4f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  One solution is 
20b30 74 6f 20 64 75 70 6c 69 63 61 74 65 20 74 68 65  to duplicate the
20b40 20 57 48 45 52 45 0a 20 20 20 20 20 20 20 63 6c   WHERE.       cl
20b50 61 75 73 65 20 75 73 65 64 20 62 79 20 74 68 65  ause used by the
20b60 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
20b70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 54  e outer query. T
20b80 68 65 20 6f 76 65 72 68 65 61 64 20 61 73 73 6f  he overhead asso
20b90 63 69 61 74 65 64 0a 20 20 20 20 20 20 20 77 69  ciated.       wi
20ba0 74 68 20 74 68 69 73 20 69 73 20 75 73 75 61 6c  th this is usual
20bb0 6c 79 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20  ly negligible.. 
20bc0 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20 20 20 20 20   <li> <p>.      
20bd0 20 54 68 65 20 72 65 6c 65 76 61 6e 63 79 20 6f   The relevancy o
20be0 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 6d 61 79  f a document may
20bf0 20 64 65 70 65 6e 64 20 6f 6e 20 73 6f 6d 65 74   depend on somet
20c00 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
20c10 6a 75 73 74 0a 20 20 20 20 20 20 20 74 68 65 20  just.       the 
20c20 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20 69  data available i
20c30 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
20c40 75 65 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 2e  ue of matchinfo.
20c50 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a 20 20 20   For example.   
20c60 20 20 20 20 65 61 63 68 20 64 6f 63 75 6d 65 6e      each documen
20c70 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
20c80 65 20 6d 61 79 20 62 65 20 61 73 73 69 67 6e 65  e may be assigne
20c90 64 20 61 20 73 74 61 74 69 63 20 77 65 69 67 68  d a static weigh
20ca0 74 20 62 61 73 65 64 0a 20 20 20 20 20 20 20 6f  t based.       o
20cb0 6e 20 66 61 63 74 6f 72 73 20 75 6e 72 65 6c 61  n factors unrela
20cc0 74 65 64 20 74 6f 20 69 74 73 20 63 6f 6e 74 65  ted to its conte
20cd0 6e 74 20 28 6f 72 69 67 69 6e 2c 20 61 75 74 68  nt (origin, auth
20ce0 6f 72 2c 20 61 67 65 2c 20 6e 75 6d 62 65 72 0a  or, age, number.
20cf0 20 20 20 20 20 20 20 6f 66 20 72 65 66 65 72 65         of refere
20d00 6e 63 65 73 20 65 74 63 2e 29 2e 20 54 68 65 73  nces etc.). Thes
20d10 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20  e values can be 
20d20 73 74 6f 72 65 64 20 62 79 20 74 68 65 20 61 70  stored by the ap
20d30 70 6c 69 63 61 74 69 6f 6e 0a 20 20 20 20 20 20  plication.      
20d40 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 74   in a separate t
20d50 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65  able that can be
20d60 20 6a 6f 69 6e 65 64 20 61 67 61 69 6e 73 74 20   joined against 
20d70 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 74 61  the documents ta
20d80 62 6c 65 0a 20 20 20 20 20 20 20 69 6e 20 74 68  ble.       in th
20d90 65 20 73 75 62 2d 71 75 65 72 79 20 73 6f 20 74  e sub-query so t
20da0 68 61 74 20 74 68 65 20 72 61 6e 6b 20 66 75 6e  hat the rank fun
20db0 63 74 69 6f 6e 20 6d 61 79 20 61 63 63 65 73 73  ction may access
20dc0 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 70   them..</ol>..<p
20dd0 3e 0a 20 20 54 68 69 73 20 76 65 72 73 69 6f 6e  >.  This version
20de0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 69 73   of the query is
20df0 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
20e00 20 74 68 61 74 20 75 73 65 64 20 62 79 20 74 68   that used by th
20e10 65 20 0a 20 20 3c 61 20 68 72 65 66 3d 22 68 74  e .  <a href="ht
20e20 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  tps://www.sqlite
20e30 2e 6f 72 67 2f 73 65 61 72 63 68 3f 71 3d 66 74  .org/search?q=ft
20e40 73 33 22 3e 73 71 6c 69 74 65 2e 6f 72 67 20 64  s3">sqlite.org d
20e50 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 65 61  ocumentation sea
20e60 72 63 68 3c 2f 61 3e 20 0a 20 20 61 70 70 6c 69  rch</a> .  appli
20e70 63 61 74 69 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c  cation...<codebl
20e80 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  ock>.  <i>-- Thi
20e90 73 20 74 61 62 6c 65 20 73 74 6f 72 65 73 20 74  s table stores t
20ea0 68 65 20 73 74 61 74 69 63 20 77 65 69 67 68 74  he static weight
20eb0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
20ec0 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 46 54  h document in FT
20ed0 53 20 74 61 62 6c 65 3c 2f 69 3e 0a 20 20 3c 69  S table</i>.  <i
20ee0 3e 2d 2d 20 22 64 6f 63 75 6d 65 6e 74 73 22 2e  >-- "documents".
20ef0 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   For each row in
20f00 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 74   the documents t
20f10 61 62 6c 65 20 74 68 65 72 65 20 69 73 20 61 20  able there is a 
20f20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f  corresponding ro
20f30 77 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 69  w</i>.  <i>-- wi
20f40 74 68 20 74 68 65 20 73 61 6d 65 20 64 6f 63 69  th the same doci
20f50 64 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  d value in this 
20f60 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45  table.</i>.  CRE
20f70 41 54 45 20 54 41 42 4c 45 20 64 6f 63 75 6d 65  ATE TABLE docume
20f80 6e 74 73 5f 64 61 74 61 28 64 6f 63 69 64 20 49  nts_data(docid I
20f90 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
20fa0 45 59 2c 20 77 65 69 67 68 74 29 3b 0a 0a 20 20  EY, weight);..  
20fb0 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65 72 79  <i>-- This query
20fc0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
20fd0 68 65 20 6f 6e 65 20 69 6e 20 74 68 65 20 62 6c  he one in the bl
20fe0 6f 63 6b 20 61 62 6f 76 65 2c 20 65 78 63 65 70  ock above, excep
20ff0 74 20 74 68 61 74 3a 3c 2f 69 3e 0a 20 20 3c 69  t that:</i>.  <i
21000 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  >--</i>.  <i>-- 
21010 20 20 31 2e 20 49 74 20 72 65 74 75 72 6e 73 20    1. It returns 
21020 61 20 22 73 6e 69 70 70 65 74 22 20 6f 66 20 74  a "snippet" of t
21030 65 78 74 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ext along with t
21040 68 65 20 64 6f 63 75 6d 65 6e 74 20 74 69 74 6c  he document titl
21050 65 20 66 6f 72 20 64 69 73 70 6c 61 79 2e 20 53  e for display. S
21060 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  o</i>.  <i>--   
21070 20 20 20 74 68 61 74 20 74 68 65 20 73 6e 69 70     that the snip
21080 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  pet function may
21090 20 62 65 20 75 73 65 64 2c 20 74 68 65 20 22 57   be used, the "W
210a0 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43 48 20 2e  HERE ... MATCH .
210b0 2e 2e 22 20 63 6c 61 75 73 65 20 66 72 6f 6d 3c  .." clause from<
210c0 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
210d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
210e0 73 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 20  s duplicated in 
210f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
21100 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
21110 0a 20 20 3c 69 3e 2d 2d 20 20 20 32 2e 20 54 68  .  <i>--   2. Th
21120 65 20 73 75 62 2d 71 75 65 72 79 20 6a 6f 69 6e  e sub-query join
21130 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20  s the documents 
21140 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 64  table with the d
21150 6f 63 75 6d 65 6e 74 5f 64 61 74 61 20 74 61 62  ocument_data tab
21160 6c 65 2c 20 73 6f 20 74 68 61 74 3c 2f 69 3e 0a  le, so that</i>.
21170 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 69 6d 70    <i>--      imp
21180 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
21190 68 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  he rank function
211a0 20 68 61 73 20 61 63 63 65 73 73 20 74 6f 20 74   has access to t
211b0 68 65 20 73 74 61 74 69 63 20 77 65 69 67 68 74  he static weight
211c0 20 61 73 73 69 67 6e 65 64 3c 2f 69 3e 0a 20 20   assigned</i>.  
211d0 3c 69 3e 2d 2d 20 20 20 20 20 20 74 6f 20 65 61  <i>--      to ea
211e0 63 68 20 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e  ch document.</i>
211f0 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65 2c  .  SELECT title,
21200 20 73 6e 69 70 70 65 74 28 64 6f 63 75 6d 65 6e   snippet(documen
21210 74 73 29 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e  ts) FROM documen
21220 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20  ts JOIN ( .     
21230 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 72   SELECT docid, r
21240 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f  ank(matchinfo(do
21250 63 75 6d 65 6e 74 73 29 2c 20 64 6f 63 75 6d 65  cuments), docume
21260 6e 74 73 5f 64 61 74 61 2e 77 65 69 67 68 74 29  nts_data.weight)
21270 20 41 53 20 72 61 6e 6b 0a 20 20 20 20 20 20 46   AS rank.      F
21280 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f  ROM documents JO
21290 49 4e 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74  IN documents_dat
212a0 61 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20  a USING(docid). 
212b0 20 20 20 20 20 57 48 45 52 45 20 64 6f 63 75 6d       WHERE docum
212c0 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71  ents MATCH &lt;q
212d0 75 65 72 79 26 67 74 3b 0a 20 20 20 20 20 20 4f  uery&gt;.      O
212e0 52 44 45 52 20 42 59 20 72 61 6e 6b 20 44 45 53  RDER BY rank DES
212f0 43 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 31  C .      LIMIT 1
21300 30 20 4f 46 46 53 45 54 20 30 0a 20 20 29 20 41  0 OFFSET 0.  ) A
21310 53 20 72 61 6e 6b 74 61 62 6c 65 20 55 53 49 4e  S ranktable USIN
21320 47 28 64 6f 63 69 64 29 0a 20 20 57 48 45 52 45  G(docid).  WHERE
21330 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
21340 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20   &lt;query&gt;. 
21350 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 74 61   ORDER BY rankta
21360 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a 3c 2f  ble.rank DESC.</
21370 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
21380 20 20 41 6c 6c 20 74 68 65 20 65 78 61 6d 70 6c    All the exampl
21390 65 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 20  e queries above 
213a0 72 65 74 75 72 6e 20 74 68 65 20 74 65 6e 20 6d  return the ten m
213b0 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 71 75 65  ost relevant que
213c0 72 79 20 72 65 73 75 6c 74 73 2e 0a 20 20 42 79  ry results..  By
213d0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 76   modifying the v
213e0 61 6c 75 65 73 20 75 73 65 64 20 77 69 74 68 20  alues used with 
213f0 74 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c  the OFFSET and L
21400 49 4d 49 54 20 63 6c 61 75 73 65 73 2c 20 61 20  IMIT clauses, a 
21410 71 75 65 72 79 20 0a 20 20 74 6f 20 72 65 74 75  query .  to retu
21420 72 6e 20 28 73 61 79 29 20 74 68 65 20 6e 65 78  rn (say) the nex
21430 74 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76  t ten most relev
21440 61 6e 74 20 72 65 73 75 6c 74 73 20 69 73 20 65  ant results is e
21450 61 73 79 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  asy to construct
21460 2e 20 0a 20 20 54 68 69 73 20 6d 61 79 20 62 65  . .  This may be
21470 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
21480 74 68 65 20 64 61 74 61 20 72 65 71 75 69 72 65  the data require
21490 64 20 66 6f 72 20 61 20 73 65 61 72 63 68 20 61  d for a search a
214a0 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 65 63 6f  pplications seco
214b0 6e 64 0a 20 20 61 6e 64 20 73 75 62 73 65 71 75  nd.  and subsequ
214c0 65 6e 74 20 70 61 67 65 73 20 6f 66 20 72 65 73  ent pages of res
214d0 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ults...<p>.  The
214e0 20 6e 65 78 74 20 62 6c 6f 63 6b 20 63 6f 6e 74   next block cont
214f0 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c 65 20  ains an example 
21500 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 74 68  rank function th
21510 61 74 20 75 73 65 73 20 6d 61 74 63 68 69 6e 66  at uses matchinf
21520 6f 20 64 61 74 61 20 0a 20 20 69 6d 70 6c 65 6d  o data .  implem
21530 65 6e 74 65 64 20 69 6e 20 43 2e 20 49 6e 73 74  ented in C. Inst
21540 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ead of a single 
21550 77 65 69 67 68 74 2c 20 69 74 20 61 6c 6c 6f 77  weight, it allow
21560 73 20 61 20 77 65 69 67 68 74 20 74 6f 20 62 65  s a weight to be
21570 20 0a 20 20 65 78 74 65 72 6e 61 6c 6c 79 20 61   .  externally a
21580 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
21590 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63 68 20 64  column of each d
215a0 6f 63 75 6d 65 6e 74 2e 20 49 74 20 6d 61 79 20  ocument. It may 
215b0 62 65 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  be registered.  
215c0 77 69 74 68 20 53 51 4c 69 74 65 20 6c 69 6b 65  with SQLite like
215d0 20 61 6e 79 20 6f 74 68 65 72 20 75 73 65 72 20   any other user 
215e0 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 5b  function using [
215f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
21600 75 6e 63 74 69 6f 6e 5d 2e 0a 0a 3c 70 3e 3c 62  unction]...<p><b
21610 3e 20 53 65 63 75 72 69 74 79 20 57 61 72 6e 69  > Security Warni
21620 6e 67 3a 3c 2f 62 3e 20 42 65 63 61 75 73 65 20  ng:</b> Because 
21630 69 74 20 69 73 20 6a 75 73 74 20 61 6e 20 6f 72  it is just an or
21640 64 69 6e 61 72 79 20 53 51 4c 20 66 75 6e 63 74  dinary SQL funct
21650 69 6f 6e 2c 20 0a 20 20 72 61 6e 6b 28 29 20 6d  ion, .  rank() m
21660 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 73  ay be invoked as
21670 20 70 61 72 74 20 6f 66 20 61 6e 79 20 53 51 4c   part of any SQL
21680 20 71 75 65 72 79 20 69 6e 20 61 6e 79 20 63 6f   query in any co
21690 6e 74 65 78 74 2e 20 54 68 69 73 20 6d 65 61 6e  ntext. This mean
216a0 73 0a 20 20 74 68 61 74 20 74 68 65 20 66 69 72  s.  that the fir
216b0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
216c0 65 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ed may not be a 
216d0 76 61 6c 69 64 20 6d 61 74 63 68 69 6e 66 6f 20  valid matchinfo 
216e0 62 6c 6f 62 2e 0a 20 20 49 6d 70 6c 65 6d 65 6e  blob..  Implemen
216f0 74 6f 72 73 20 73 68 6f 75 6c 64 20 74 61 6b 65  tors should take
21700 20 63 61 72 65 20 74 6f 20 68 61 6e 64 6c 65 20   care to handle 
21710 74 68 69 73 20 63 61 73 65 20 77 69 74 68 6f 75  this case withou
21720 74 20 63 61 75 73 69 6e 67 20 62 75 66 66 65 72  t causing buffer
21730 0a 20 20 6f 76 65 72 72 75 6e 73 20 6f 72 20 6f  .  overruns or o
21740 74 68 65 72 20 70 6f 74 65 6e 74 69 61 6c 20 73  ther potential s
21750 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 73  ecurity problems
21760 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 3c  ...<codeblock>.<
21770 69 3e 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 53  i>/*</i>.<i>** S
21780 51 4c 69 74 65 20 75 73 65 72 20 64 65 66 69 6e  QLite user defin
21790 65 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75  ed function to u
217a0 73 65 20 77 69 74 68 20 6d 61 74 63 68 69 6e 66  se with matchinf
217b0 6f 28 29 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  o() to calculate
217c0 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72   the</i>.<i>** r
217d0 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 6e 20 46  elevancy of an F
217e0 54 53 20 6d 61 74 63 68 2e 20 54 68 65 20 76 61  TS match. The va
217f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
21800 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63  the relevancy sc
21810 6f 72 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 28 61  ore</i>.<i>** (a
21820 20 72 65 61 6c 20 76 61 6c 75 65 20 67 72 65 61   real value grea
21830 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
21840 6c 20 74 6f 20 7a 65 72 6f 29 2e 20 41 20 6c 61  l to zero). A la
21850 72 67 65 72 20 76 61 6c 75 65 20 69 6e 64 69 63  rger value indic
21860 61 74 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  ates </i>.<i>** 
21870 61 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20  a more relevant 
21880 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 3c 69  document.</i>.<i
21890 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68  >**</i>.<i>** Th
218a0 65 20 6f 76 65 72 61 6c 6c 20 72 65 6c 65 76 61  e overall releva
218b0 6e 63 79 20 72 65 74 75 72 6e 65 64 20 69 73 20  ncy returned is 
218c0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 72  the sum of the r
218d0 65 6c 65 76 61 6e 63 69 65 73 20 6f 66 20 65 61  elevancies of ea
218e0 63 68 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f  ch </i>.<i>** co
218f0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
21900 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
21910 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20   relevancy of a 
21920 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
21930 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 73 75  the</i>.<i>** su
21940 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
21950 6e 67 20 66 6f 72 20 65 61 63 68 20 72 65 70 6f  ng for each repo
21960 72 74 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e  rtable phrase in
21970 20 74 68 65 20 46 54 53 20 71 75 65 72 79 3a 3c   the FTS query:<
21980 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69  /i>.<i>**</i>.<i
21990 3e 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63  >**   (&lt;hit c
219a0 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67  ount&gt; / &lt;g
219b0 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26  lobal hit count&
219c0 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e  gt) * &lt;column
219d0 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a   weight&gt;</i>.
219e0 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
219f0 77 68 65 72 65 20 26 6c 74 3b 68 69 74 20 63 6f  where &lt;hit co
21a00 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65 20 6e  unt&gt; is the n
21a10 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
21a20 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  es of the phrase
21a30 20 69 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a   in the</i>.<i>*
21a40 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f  * column value o
21a50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
21a60 77 20 61 6e 64 20 26 6c 74 3b 67 6c 6f 62 61 6c  w and &lt;global
21a70 20 68 69 74 20 63 6f 75 6e 74 26 67 74 3b 20 69   hit count&gt; i
21a80 73 20 74 68 65 20 6e 75 6d 62 65 72 3c 2f 69 3e  s the number</i>
21a90 0a 3c 69 3e 2a 2a 20 6f 66 20 69 6e 73 74 61 6e  .<i>** of instan
21aa0 63 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73  ces of the phras
21ab0 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f  e in the same co
21ac0 6c 75 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 73  lumn of all rows
21ad0 20 69 6e 20 74 68 65 20 46 54 53 3c 2f 69 3e 0a   in the FTS</i>.
21ae0 3c 69 3e 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  <i>** table. The
21af0 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
21b00 68 74 26 67 74 3b 20 69 73 20 61 20 77 65 69 67  ht&gt; is a weig
21b10 68 74 69 6e 67 20 66 61 63 74 6f 72 20 61 73 73  hting factor ass
21b20 69 67 6e 65 64 20 74 6f 20 65 61 63 68 3c 2f 69  igned to each</i
21b30 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62  >.<i>** column b
21b40 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28 73 65  y the caller (se
21b50 65 20 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69  e below).</i>.<i
21b60 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68  >**</i>.<i>** Th
21b70 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21b80 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
21b90 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 72 65  n must be the re
21ba0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
21bb0 65 20 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a  e FTS </i>.<i>**
21bc0 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
21bd0 63 74 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67  ction. Following
21be0 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 6f 6e   this must be on
21bf0 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 65  e argument for e
21c00 61 63 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a  ach column </i>.
21c10 3c 69 3e 2a 2a 20 6f 66 20 74 68 65 20 46 54 53  <i>** of the FTS
21c20 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
21c30 67 20 61 20 6e 75 6d 65 72 69 63 20 77 65 69 67  g a numeric weig
21c40 68 74 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68  ht factor for th
21c50 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
21c60 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d  </i>.<i>** colum
21c70 6e 2e 20 45 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a  n. Example:</i>.
21c80 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
21c90 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
21ca0 41 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e  AL TABLE documen
21cb0 74 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69  ts USING fts3(ti
21cc0 74 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3c 2f 69  tle, content)</i
21cd0 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
21ce0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
21cf0 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68  query returns th
21d00 65 20 64 6f 63 69 64 73 20 6f 66 20 64 6f 63 75  e docids of docu
21d10 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68  ments that match
21d20 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 3c 2f   the full-text</
21d30 69 3e 0a 3c 69 3e 2a 2a 20 71 75 65 72 79 20 26  i>.<i>** query &
21d40 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 73 6f 72  lt;query&gt; sor
21d50 74 65 64 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f  ted from most to
21d60 20 6c 65 61 73 74 20 72 65 6c 65 76 61 6e 74 2e   least relevant.
21d70 20 57 68 65 6e 20 63 61 6c 63 75 6c 61 74 69 6e   When calculatin
21d80 67 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65  g</i>.<i>** rele
21d90 76 61 6e 63 65 2c 20 71 75 65 72 79 20 74 65 72  vance, query ter
21da0 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74  m instances in t
21db0 68 65 20 27 74 69 74 6c 65 27 20 63 6f 6c 75 6d  he 'title' colum
21dc0 6e 20 61 72 65 20 67 69 76 65 6e 20 74 77 69 63  n are given twic
21dd0 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  e the</i>.<i>** 
21de0 77 65 69 67 68 74 69 6e 67 20 6f 66 20 74 68 6f  weighting of tho
21df0 73 65 20 69 6e 20 74 68 65 20 27 63 6f 6e 74 65  se in the 'conte
21e00 6e 74 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a  nt' column.</i>.
21e10 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
21e20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64      SELECT docid
21e30 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
21e40 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 57  </i>.<i>**     W
21e50 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
21e60 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
21e70 74 3b 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  t; </i>.<i>**   
21e80 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28    ORDER BY rank(
21e90 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65  matchinfo(docume
21ea0 6e 74 73 29 2c 20 31 2e 30 2c 20 30 2e 35 29 20  nts), 1.0, 0.5) 
21eb0 44 45 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f  DESC</i>.<i>*/</
21ec0 69 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  i>.static void r
21ed0 61 6e 6b 66 75 6e 63 28 73 71 6c 69 74 65 33 5f  ankfunc(sqlite3_
21ee0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
21ef0 6e 74 20 6e 56 61 6c 2c 20 73 71 6c 69 74 65 33  nt nVal, sqlite3
21f00 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b  _value **apVal){
21f10 0a 20 20 69 6e 74 20 2a 61 4d 61 74 63 68 69 6e  .  int *aMatchin
21f20 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fo;             
21f30 20 20 20 3c 69 3e 2f 2a 20 52 65 74 75 72 6e 20     <i>/* Return 
21f40 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e  value of matchin
21f50 66 6f 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e  fo() */</i>.  in
21f60 74 20 6e 4d 61 74 63 68 69 6e 66 6f 3b 20 20 20  t nMatchinfo;   
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
21f80 3e 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c  >/* Number of el
21f90 65 6d 65 6e 74 73 20 69 6e 20 61 4d 61 74 63 68  ements in aMatch
21fa0 69 6e 66 6f 26 23 78 35 42 3b 26 23 78 35 44 3b  info&#x5B;&#x5D;
21fb0 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 43   */</i>.  int nC
21fc0 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ol = 0;         
21fd0 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
21fe0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
21ff0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
22000 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50 68 72  /</i>.  int nPhr
22010 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
22020 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e 75          <i>/* Nu
22030 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20  mber of phrases 
22040 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a 2f 3c  in the query */<
22050 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68 72 61 73  /i>.  int iPhras
22060 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22070 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72        <i>/* Curr
22080 65 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c 2f 69  ent phrase */</i
22090 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f 72 65  >.  double score
220a0 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20   = 0.0;         
220b0 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75 65 20      <i>/* Value 
220c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f 69 3e  to return */</i>
220d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ..  assert( size
220e0 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a 0a 3c  of(int)==4 );..<
220f0 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  i>  /* Check tha
22100 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
22110 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
22120 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22130 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 3c 2f 69  n is correct.</i
22140 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e 6f 74  >.<i>  ** If not
22150 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e 67 5f  , jump to wrong_
22160 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20 53 65 74  number_args. Set
22170 20 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f 20 70   aMatchinfo to p
22180 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 72 72 61  oint to the arra
22190 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6f 66  y</i>.<i>  ** of
221a0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
221b0 72 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  r values returne
221c0 64 20 62 79 20 46 54 53 20 66 75 6e 63 74 69 6f  d by FTS functio
221d0 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53 65 74  n matchinfo. Set
221e0 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e 50 68  </i>.<i>  ** nPh
221f0 72 61 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  rase to contain 
22200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
22210 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 73  portable phrases
22220 20 69 6e 20 74 68 65 20 75 73 65 72 73 20 66 75   in the users fu
22230 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69 3e 20  ll-text</i>.<i> 
22240 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64 20 6e   ** query, and n
22250 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  Col to the numbe
22260 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
22270 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  the table. Then 
22280 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 3c 2f  check that the</
22290 69 3e 0a 3c 69 3e 20 20 2a 2a 20 73 69 7a 65 20  i>.<i>  ** size 
222a0 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  of the matchinfo
222b0 20 62 6c 6f 62 20 69 73 20 61 73 20 65 78 70 65   blob is as expe
222c0 63 74 65 64 2e 20 52 65 74 75 72 6e 20 61 6e 20  cted. Return an 
222d0 65 72 72 6f 72 20 69 66 20 69 74 20 69 73 20 6e  error if it is n
222e0 6f 74 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2f 3c  ot.</i>.<i>  */<
222f0 2f 69 3e 0a 20 20 69 66 28 20 6e 56 61 6c 26 6c  /i>.  if( nVal&l
22300 74 3b 31 20 29 20 67 6f 74 6f 20 77 72 6f 6e 67  t;1 ) goto wrong
22310 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3b 0a 20 20  _number_args;.  
22320 61 4d 61 74 63 68 69 6e 66 6f 20 3d 20 28 75 6e  aMatchinfo = (un
22330 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 73 71 6c  signed int *)sql
22340 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
22350 61 70 56 61 6c 26 23 78 35 42 3b 30 26 23 78 35  apVal&#x5B;0&#x5
22360 44 3b 29 3b 0a 20 20 6e 4d 61 74 63 68 69 6e 66  D;);.  nMatchinf
22370 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  o = sqlite3_valu
22380 65 5f 62 79 74 65 73 28 61 70 56 61 6c 26 23 78  e_bytes(apVal&#x
22390 35 42 3b 30 26 23 78 35 44 3b 29 20 2f 20 73 69  5B;0&#x5D;) / si
223a0 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 69 66 28  zeof(int);.  if(
223b0 20 6e 4d 61 74 63 68 69 6e 66 6f 26 67 74 3b 3d   nMatchinfo&gt;=
223c0 32 20 29 7b 0a 20 20 20 20 6e 50 68 72 61 73 65  2 ){.    nPhrase
223d0 20 3d 20 61 4d 61 74 63 68 69 6e 66 6f 26 23 78   = aMatchinfo&#x
223e0 35 42 3b 30 26 23 78 35 44 3b 3b 0a 20 20 20 20  5B;0&#x5D;;.    
223f0 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68 69 6e 66  nCol = aMatchinf
22400 6f 26 23 78 35 42 3b 31 26 23 78 35 44 3b 3b 0a  o&#x5B;1&#x5D;;.
22410 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 74 63 68    }.  if( nMatch
22420 69 6e 66 6f 21 3d 28 32 2b 33 2a 6e 43 6f 6c 2a  info!=(2+3*nCol*
22430 6e 50 68 72 61 73 65 29 20 29 7b 0a 20 20 20 20  nPhrase) ){.    
22440 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
22450 72 72 6f 72 28 70 43 74 78 2c 0a 20 20 20 20 20  rror(pCtx,.     
22460 20 22 69 6e 76 61 6c 69 64 20 6d 61 74 63 68 69   "invalid matchi
22470 6e 66 6f 20 62 6c 6f 62 20 70 61 73 73 65 64 20  nfo blob passed 
22480 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e 6b  to function rank
22490 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
224a0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
224b0 6e 56 61 6c 21 3d 28 31 2b 6e 43 6f 6c 29 20 29  nVal!=(1+nCol) )
224c0 20 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62   goto wrong_numb
224d0 65 72 5f 61 72 67 73 3b 0a 0a 3c 69 3e 20 20 2f  er_args;..<i>  /
224e0 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
224f0 68 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  h each phrase in
22500 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79   the users query
22510 2e 20 2a 2f 3c 2f 69 3e 0a 20 20 66 6f 72 28 69  . */</i>.  for(i
22520 50 68 72 61 73 65 3d 30 3b 20 69 50 68 72 61 73  Phrase=0; iPhras
22530 65 26 6c 74 3b 6e 50 68 72 61 73 65 3b 20 69 50  e&lt;nPhrase; iP
22540 68 72 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 6e  hrase++){.    in
22550 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
22560 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
22570 2a 20 43 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  * Current column
22580 20 2a 2f 3c 2f 69 3e 0a 0a 3c 69 3e 20 20 20 20   */</i>..<i>    
22590 2f 2a 20 4e 6f 77 20 69 74 65 72 61 74 65 20 74  /* Now iterate t
225a0 68 72 6f 75 67 68 20 65 61 63 68 20 63 6f 6c 75  hrough each colu
225b0 6d 6e 20 69 6e 20 74 68 65 20 75 73 65 72 73 20  mn in the users 
225c0 71 75 65 72 79 2e 20 46 6f 72 20 65 61 63 68 20  query. For each 
225d0 63 6f 6c 75 6d 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20  column,</i>.<i> 
225e0 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20     ** increment 
225f0 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63  the relevancy sc
22600 6f 72 65 20 62 79 3a 3c 2f 69 3e 0a 3c 69 3e 20  ore by:</i>.<i> 
22610 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20     **</i>.<i>   
22620 20 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63   **   (&lt;hit c
22630 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67  ount&gt; / &lt;g
22640 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26  lobal hit count&
22650 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e  gt) * &lt;column
22660 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a   weight&gt;</i>.
22670 3c 69 3e 20 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69  <i>    **</i>.<i
22680 3e 20 20 20 20 2a 2a 20 61 50 68 72 61 73 65 69  >    ** aPhrasei
22690 6e 66 6f 26 23 78 35 42 3b 26 23 78 35 44 3b 20  nfo&#x5B;&#x5D; 
226a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
226b0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
226c0 66 6f 72 20 70 68 72 61 73 65 20 69 50 68 72 61  for phrase iPhra
226d0 73 65 2e 20 53 6f 3c 2f 69 3e 0a 3c 69 3e 20 20  se. So</i>.<i>  
226e0 20 20 2a 2a 20 74 68 65 20 68 69 74 20 63 6f 75    ** the hit cou
226f0 6e 74 20 61 6e 64 20 67 6c 6f 62 61 6c 20 68 69  nt and global hi
22700 74 20 63 6f 75 6e 74 73 20 66 6f 72 20 65 61 63  t counts for eac
22710 68 20 63 6f 6c 75 6d 6e 20 61 72 65 20 66 6f 75  h column are fou
22720 6e 64 20 69 6e 20 3c 2f 69 3e 0a 3c 69 3e 20 20  nd in </i>.<i>  
22730 20 20 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f    ** aPhraseinfo
22740 26 23 78 35 42 3b 69 43 6f 6c 2a 33 26 23 78 35  &#x5B;iCol*3&#x5
22750 44 3b 20 61 6e 64 20 61 50 68 72 61 73 65 69 6e  D; and aPhrasein
22760 66 6f 26 23 78 35 42 3b 69 43 6f 6c 2a 33 2b 31  fo&#x5B;iCol*3+1
22770 26 23 78 35 44 3b 2c 20 72 65 73 70 65 63 74 69  &#x5D;, respecti
22780 76 65 6c 79 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 20  vely.</i>.<i>   
22790 20 2a 2f 3c 2f 69 3e 0a 20 20 20 20 69 6e 74 20   */</i>.    int 
227a0 2a 61 50 68 72 61 73 65 69 6e 66 6f 20 3d 20 26  *aPhraseinfo = &
227b0 61 4d 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b  aMatchinfo&#x5B;
227c0 32 20 2b 20 69 50 68 72 61 73 65 2a 6e 43 6f 6c  2 + iPhrase*nCol
227d0 2a 33 26 23 78 35 44 3b 3b 0a 20 20 20 20 66 6f  *3&#x5D;;.    fo
227e0 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 26 6c  r(iCol=0; iCol&l
227f0 74 3b 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  t;nCol; iCol++){
22800 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 74 43  .      int nHitC
22810 6f 75 6e 74 20 3d 20 61 50 68 72 61 73 65 69 6e  ount = aPhrasein
22820 66 6f 26 23 78 35 42 3b 33 2a 69 43 6f 6c 26 23  fo&#x5B;3*iCol&#
22830 78 35 44 3b 3b 0a 20 20 20 20 20 20 69 6e 74 20  x5D;;.      int 
22840 6e 47 6c 6f 62 61 6c 48 69 74 43 6f 75 6e 74 20  nGlobalHitCount 
22850 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  = aPhraseinfo&#x
22860 35 42 3b 33 2a 69 43 6f 6c 2b 31 26 23 78 35 44  5B;3*iCol+1&#x5D
22870 3b 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ;;.      double 
22880 77 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  weight = sqlite3
22890 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 70  _value_double(ap
228a0 56 61 6c 26 23 78 35 42 3b 69 43 6f 6c 2b 31 26  Val&#x5B;iCol+1&
228b0 23 78 35 44 3b 29 3b 0a 20 20 20 20 20 20 69 66  #x5D;);.      if
228c0 28 20 6e 48 69 74 43 6f 75 6e 74 3e 30 20 29 7b  ( nHitCount>0 ){
228d0 0a 20 20 20 20 20 20 20 20 73 63 6f 72 65 20 2b  .        score +
228e0 3d 20 28 28 64 6f 75 62 6c 65 29 6e 48 69 74 43  = ((double)nHitC
228f0 6f 75 6e 74 20 2f 20 28 64 6f 75 62 6c 65 29 6e  ount / (double)n
22900 47 6c 6f 62 61 6c 48 69 74 43 6f 75 6e 74 29 20  GlobalHitCount) 
22910 2a 20 77 65 69 67 68 74 3b 0a 20 20 20 20 20 20  * weight;.      
22920 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
22930 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
22940 75 62 6c 65 28 70 43 74 78 2c 20 73 63 6f 72 65  uble(pCtx, score
22950 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 3c 69  );.  return;..<i
22960 3e 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  >  /* Jump here 
22970 69 66 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d  if the wrong num
22980 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22990 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 20 74   are passed to t
229a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 3c  his function */<
229b0 2f 69 3e 0a 77 72 6f 6e 67 5f 6e 75 6d 62 65 72  /i>.wrong_number
229c0 5f 61 72 67 73 3a 0a 20 20 73 71 6c 69 74 65 33  _args:.  sqlite3
229d0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
229e0 74 78 2c 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65  tx, "wrong numbe
229f0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
22a00 6f 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e 6b 28  o function rank(
22a10 29 22 2c 20 2d 31 29 3b 0a 7d 0a 3c 2f 63 6f 64  )", -1);.}.</cod
22a20 65 62 6c 6f 63 6b 3e 0a                          eblock>.