Documentation Source Text

Hex Artifact Content
Login

Artifact bc313ce269b0125a8cc6d072d48cf8c2fca4a862fca95edd5fc208cd05a71498:


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 6e 6c 79 20 74 68 65 20 73 75 62 73 65 74 20  Only the subset 
13390 6f 66 20 63 6f 6e 74 65 6e 74 2d 74 61 62 6c 65  of content-table
133a0 20 63 6f 6c 75 6d 6e 73 20 64 75 70 6c 69 63 61   columns duplica
133b0 74 65 64 20 69 6e 20 74 68 65 20 46 54 53 2f 33  ted in the FTS/3
133c0 34 0a 20 20 74 61 62 6c 65 20 64 65 63 6c 61 72  4.  table declar
133d0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 71 75 65  ation can be que
133e0 72 69 65 64 20 66 6f 72 20 2d 20 74 6f 20 72 65  ried for - to re
133f0 74 72 69 65 76 65 20 76 61 6c 75 65 73 20 66 72  trieve values fr
13400 6f 6d 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 63  om any other.  c
13410 6f 6c 75 6d 6e 73 20 74 68 65 20 63 6f 6e 74 65  olumns the conte
13420 6e 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  nt table must be
13430 20 71 75 65 72 69 65 64 20 64 69 72 65 63 74 6c   queried directl
13440 79 2e 20 4f 72 2c 20 69 66 20 73 75 63 68 20 61  y. Or, if such a
13450 20 72 6f 77 20 63 61 6e 6e 6f 74 0a 20 20 62 65   row cannot.  be
13460 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
13470 6e 74 65 6e 74 20 74 61 62 6c 65 2c 20 61 20 4e  ntent table, a N
13480 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 75 73 65  ULL value is use
13490 64 20 69 6e 73 74 65 61 64 2e 20 46 6f 72 20 65  d instead. For e
134a0 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
134b0 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 41  ock>.  CREATE TA
134c0 42 4c 45 20 74 32 28 69 64 20 49 4e 54 45 47 45  BLE t2(id INTEGE
134d0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 61  R PRIMARY KEY, a
134e0 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
134f0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
13500 74 33 20 55 53 49 4e 47 20 66 74 73 34 28 63 6f  t3 USING fts4(co
13510 6e 74 65 6e 74 3d 22 74 32 22 2c 20 62 2c 20 63  ntent="t2", b, c
13520 29 3b 0a 20 20 0a 20 20 49 4e 53 45 52 54 20 49  );.  .  INSERT I
13530 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c  NTO t2 VALUES(2,
13540 20 27 61 20 62 27 2c 20 27 63 20 64 27 2c 20 27   'a b', 'c d', '
13550 65 20 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  e f');.  INSERT 
13560 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
13570 2c 20 27 67 20 68 27 2c 20 27 69 20 6a 27 2c 20  , 'g h', 'i j', 
13580 27 6b 20 6c 27 29 3b 0a 20 20 49 4e 53 45 52 54  'k l');.  INSERT
13590 20 49 4e 54 4f 20 74 33 28 64 6f 63 69 64 2c 20   INTO t3(docid, 
135a0 62 2c 20 63 29 20 53 45 4c 45 43 54 20 69 64 2c  b, c) SELECT id,
135b0 20 62 2c 20 63 20 46 52 4f 4d 20 74 32 3b 0a 20   b, c FROM t2;. 
135c0 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
135d0 77 69 6e 67 20 71 75 65 72 79 20 72 65 74 75 72  wing query retur
135e0 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ns a single row 
135f0 77 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73  with two columns
13600 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 2d 2d   containing.  --
13610 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 73   the text values
13620 20 22 69 20 6a 22 20 61 6e 64 20 22 6b 20 6c 22   "i j" and "k l"
13630 2e 0a 20 20 2d 2d 0a 20 20 2d 2d 20 54 68 65 20  ..  --.  -- The 
13640 71 75 65 72 79 20 75 73 65 73 20 74 68 65 20 66  query uses the f
13650 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74  ull-text index t
13660 6f 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  o discover that 
13670 74 68 65 20 4d 41 54 43 48 20 0a 20 20 2d 2d 20  the MATCH .  -- 
13680 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65  term matches the
13690 20 72 6f 77 20 77 69 74 68 20 64 6f 63 69 64 3d   row with docid=
136a0 33 2e 20 49 74 20 74 68 65 6e 20 72 65 74 72 69  3. It then retri
136b0 65 76 65 73 20 74 68 65 20 76 61 6c 75 65 73 0a  eves the values.
136c0 20 20 2d 2d 20 6f 66 20 63 6f 6c 75 6d 6e 73 20    -- of columns 
136d0 62 20 61 6e 64 20 63 20 66 72 6f 6d 20 74 68 65  b and c from the
136e0 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d   row with rowid=
136f0 33 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  3 in the content
13700 20 74 61 62 6c 65 0a 20 20 2d 2d 20 74 6f 20 72   table.  -- to r
13710 65 74 75 72 6e 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a  eturn..  --</i>.
13720 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13730 74 33 20 57 48 45 52 45 20 74 33 20 4d 41 54 43  t3 WHERE t3 MATC
13740 48 20 27 6b 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  H 'k';..  <i>-- 
13750 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 55 50  Following the UP
13760 44 41 54 45 2c 20 74 68 65 20 71 75 65 72 79 20  DATE, the query 
13770 73 74 69 6c 6c 20 72 65 74 75 72 6e 73 20 61 20  still returns a 
13780 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 69 73  single row, this
13790 0a 20 20 2d 2d 20 74 69 6d 65 20 63 6f 6e 74 61  .  -- time conta
137a0 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20 76  ining the text v
137b0 61 6c 75 65 73 20 22 78 78 78 22 20 61 6e 64 20  alues "xxx" and 
137c0 22 79 79 79 22 2e 20 54 68 69 73 20 69 73 20 62  "yyy". This is b
137d0 65 63 61 75 73 65 20 74 68 65 0a 20 20 2d 2d 20  ecause the.  -- 
137e0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
137f0 73 74 69 6c 6c 20 69 6e 64 69 63 61 74 65 73 20  still indicates 
13800 74 68 61 74 20 74 68 65 20 72 6f 77 20 77 69 74  that the row wit
13810 68 20 64 6f 63 69 64 3d 33 20 6d 61 74 63 68 65  h docid=3 matche
13820 73 0a 20 20 2d 2d 20 74 68 65 20 46 54 53 34 20  s.  -- the FTS4 
13830 71 75 65 72 79 20 27 6b 27 2c 20 65 76 65 6e 20  query 'k', even 
13840 74 68 6f 75 67 68 20 74 68 65 20 64 6f 63 75 6d  though the docum
13850 65 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ents stored in t
13860 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20 2d 2d 20  he content.  -- 
13870 74 61 62 6c 65 20 68 61 76 65 20 62 65 65 6e 20  table have been 
13880 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2d 2d 3c 2f  modified..  --</
13890 69 3e 0a 20 20 55 50 44 41 54 45 20 74 32 20 53  i>.  UPDATE t2 S
138a0 45 54 20 62 20 3d 20 27 78 78 78 27 2c 20 63 20  ET b = 'xxx', c 
138b0 3d 20 27 79 79 79 27 20 57 48 45 52 45 20 72 6f  = 'yyy' WHERE ro
138c0 77 69 64 20 3d 20 33 3b 0a 20 20 53 45 4c 45 43  wid = 3;.  SELEC
138d0 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T * FROM t3 WHER
138e0 45 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b 0a  E t3 MATCH 'k';.
138f0 0a 20 20 3c 69 3e 2d 2d 20 46 6f 6c 6c 6f 77 69  .  <i>-- Followi
13900 6e 67 20 74 68 65 20 44 45 4c 45 54 45 20 62 65  ng the DELETE be
13910 6c 6f 77 2c 20 74 68 65 20 71 75 65 72 79 20 72  low, the query r
13920 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 63  eturns one row c
13930 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 20 20  ontaining two.  
13940 2d 2d 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  -- NULL values. 
13950 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
13960 72 65 74 75 72 6e 65 64 20 62 65 63 61 75 73 65  returned because
13970 20 46 54 53 20 69 73 20 75 6e 61 62 6c 65 20 74   FTS is unable t
13980 6f 20 66 69 6e 64 0a 20 20 2d 2d 20 61 20 72 6f  o find.  -- a ro
13990 77 20 77 69 74 68 20 72 6f 77 69 64 3d 33 20 77  w with rowid=3 w
139a0 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
139b0 74 20 74 61 62 6c 65 2e 0a 20 20 2d 2d 3c 2f 69  t table..  --</i
139c0 3e 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  >.  DELETE FROM 
139d0 74 32 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t2;.  SELECT * F
139e0 52 4f 4d 20 74 33 20 57 48 45 52 45 20 74 33 20  ROM t3 WHERE t3 
139f0 4d 41 54 43 48 20 27 6b 27 3b 0a 3c 2f 63 6f 64  MATCH 'k';.</cod
13a00 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 57  eblock>..<p>.  W
13a10 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c  hen a row is del
13a20 65 74 65 64 20 66 72 6f 6d 20 61 6e 20 65 78 74  eted from an ext
13a30 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 46 54  ernal content FT
13a40 53 34 20 74 61 62 6c 65 2c 20 46 54 53 34 20 6e  S4 table, FTS4 n
13a50 65 65 64 73 20 74 6f 0a 20 20 72 65 74 72 69 65  eeds to.  retrie
13a60 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  ve the column va
13a70 6c 75 65 73 20 6f 66 20 74 68 65 20 72 6f 77 20  lues of the row 
13a80 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 66 72  being deleted fr
13a90 6f 6d 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  om the content t
13aa0 61 62 6c 65 2e 0a 20 20 54 68 69 73 20 69 73 20  able..  This is 
13ab0 73 6f 20 74 68 61 74 20 46 54 53 34 20 63 61 6e  so that FTS4 can
13ac0 20 75 70 64 61 74 65 20 74 68 65 20 66 75 6c 6c   update the full
13ad0 2d 74 65 78 74 20 69 6e 64 65 78 20 65 6e 74 72  -text index entr
13ae0 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  ies for each tok
13af0 65 6e 0a 20 20 74 68 61 74 20 6f 63 63 75 72 73  en.  that occurs
13b00 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 6c 65   within the dele
13b10 74 65 64 20 72 6f 77 20 74 6f 20 69 6e 64 69 63  ted row to indic
13b20 61 74 65 20 74 68 61 74 20 72 6f 77 20 68 61 73  ate that row has
13b30 20 62 65 65 6e 20 0a 20 20 64 65 6c 65 74 65 64   been .  deleted
13b40 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
13b50 20 74 61 62 6c 65 20 72 6f 77 20 63 61 6e 6e 6f   table row canno
13b60 74 20 62 65 20 66 6f 75 6e 64 2c 20 6f 72 20 69  t be found, or i
13b70 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 76 61  f it contains va
13b80 6c 75 65 73 0a 20 20 69 6e 63 6f 6e 73 69 73 74  lues.  inconsist
13b90 65 6e 74 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ent with the con
13ba0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53  tents of the FTS
13bb0 20 69 6e 64 65 78 2c 20 74 68 65 20 72 65 73 75   index, the resu
13bc0 6c 74 73 20 63 61 6e 20 62 65 20 64 69 66 66 69  lts can be diffi
13bd0 63 75 6c 74 0a 20 20 74 6f 20 70 72 65 64 69 63  cult.  to predic
13be0 74 2e 20 54 68 65 20 46 54 53 20 69 6e 64 65 78  t. The FTS index
13bf0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 63 6f 6e   may be left con
13c00 74 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20  taining entries 
13c10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
13c20 20 74 68 65 0a 20 20 64 65 6c 65 74 65 64 20 72   the.  deleted r
13c30 6f 77 2c 20 77 68 69 63 68 20 63 61 6e 20 6c 65  ow, which can le
13c40 61 64 20 74 6f 20 73 65 65 6d 69 6e 67 6c 79 20  ad to seemingly 
13c50 6e 6f 6e 73 65 6e 73 69 63 61 6c 20 72 65 73 75  nonsensical resu
13c60 6c 74 73 20 62 65 69 6e 67 20 72 65 74 75 72 6e  lts being return
13c70 65 64 0a 20 20 62 79 20 73 75 62 73 65 71 75 65  ed.  by subseque
13c80 6e 74 20 53 45 4c 45 43 54 20 71 75 65 72 69 65  nt SELECT querie
13c90 73 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c  s. The same appl
13ca0 69 65 73 20 77 68 65 6e 20 61 20 72 6f 77 20 69  ies when a row i
13cb0 73 20 75 70 64 61 74 65 64 2c 20 61 73 0a 20 20  s updated, as.  
13cc0 69 6e 74 65 72 6e 61 6c 6c 79 20 61 6e 20 55 50  internally an UP
13cd0 44 41 54 45 20 69 73 20 74 68 65 20 73 61 6d 65  DATE is the same
13ce0 20 61 73 20 61 20 44 45 4c 45 54 45 20 66 6f 6c   as a DELETE fol
13cf0 6c 6f 77 65 64 20 62 79 20 61 6e 20 49 4e 53 45  lowed by an INSE
13d00 52 54 2e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20  RT...<p>.  This 
13d10 6d 65 61 6e 73 20 74 68 61 74 20 69 6e 20 6f 72  means that in or
13d20 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6e 20 46  der to keep an F
13d30 54 53 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  TS in sync with 
13d40 61 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74  an external cont
13d50 65 6e 74 0a 20 20 74 61 62 6c 65 2c 20 61 6e 79  ent.  table, any
13d60 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
13d70 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 75 73  E operations mus
13d80 74 20 62 65 20 61 70 70 6c 69 65 64 20 66 69 72  t be applied fir
13d90 73 74 20 74 6f 20 74 68 65 20 46 54 53 0a 20 20  st to the FTS.  
13da0 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 6e 20  table, and then 
13db0 74 6f 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  to the external 
13dc0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 46  content table. F
13dd0 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  or example:..<co
13de0 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54  deblock>.  CREAT
13df0 45 20 54 41 42 4c 45 20 74 31 5f 72 65 61 6c 28  E TABLE t1_real(
13e00 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
13e10 52 59 20 4b 45 59 2c 20 61 2c 20 62 2c 20 63 2c  RY KEY, a, b, c,
13e20 20 64 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49   d);.  CREATE VI
13e30 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 5f 66  RTUAL TABLE t1_f
13e40 74 73 20 55 53 49 4e 47 20 66 74 73 34 28 63 6f  ts USING fts4(co
13e50 6e 74 65 6e 74 3d 22 74 31 5f 72 65 61 6c 22 2c  ntent="t1_real",
13e60 20 62 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d   b, c);..  <i>--
13e70 20 54 68 69 73 20 77 6f 72 6b 73 2e 20 57 68 65   This works. Whe
13e80 6e 20 74 68 65 20 72 6f 77 20 69 73 20 72 65 6d  n the row is rem
13e90 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 46 54  oved from the FT
13ea0 53 20 74 61 62 6c 65 2c 20 46 54 53 20 72 65 74  S table, FTS ret
13eb0 72 69 65 76 65 73 20 0a 20 20 2d 2d 20 74 68 65  rieves .  -- the
13ec0 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d   row with rowid=
13ed0 31 32 33 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 65  123 and tokenize
13ee0 73 20 69 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  s it in order to
13ef0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
13f00 6e 74 72 69 65 73 20 0a 20 20 2d 2d 20 74 68 61  ntries .  -- tha
13f10 74 20 6d 75 73 74 20 62 65 20 72 65 6d 6f 76 65  t must be remove
13f20 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
13f30 74 65 78 74 20 69 6e 64 65 78 2e 0a 20 20 2d 2d  text index..  --
13f40 3c 2f 69 3e 20 0a 20 20 44 45 4c 45 54 45 20 46  </i> .  DELETE F
13f50 52 4f 4d 20 74 31 5f 66 74 73 20 57 48 45 52 45  ROM t1_fts WHERE
13f60 20 72 6f 77 69 64 20 3d 20 31 32 33 3b 0a 20 20   rowid = 123;.  
13f70 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 5f 72  DELETE FROM t1_r
13f80 65 61 6c 20 57 48 45 52 45 20 72 6f 77 69 64 20  eal WHERE rowid 
13f90 3d 20 31 32 33 3b 0a 0a 20 20 2d 2d 3c 69 3e 20  = 123;..  --<i> 
13fa0 54 68 69 73 20 3c 62 3e 64 6f 65 73 20 6e 6f 74  This <b>does not
13fb0 20 77 6f 72 6b 3c 2f 62 3e 2e 20 42 79 20 74 68   work</b>. By th
13fc0 65 20 74 69 6d 65 20 74 68 65 20 46 54 53 20 74  e time the FTS t
13fd0 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2c  able is updated,
13fe0 20 74 68 65 20 72 6f 77 0a 20 20 2d 2d 20 68 61   the row.  -- ha
13ff0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  s already been d
14000 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
14010 75 6e 64 65 72 6c 79 69 6e 67 20 63 6f 6e 74 65  underlying conte
14020 6e 74 20 74 61 62 6c 65 2e 20 41 73 20 61 20 72  nt table. As a r
14030 65 73 75 6c 74 0a 20 20 2d 2d 20 46 54 53 20 69  esult.  -- FTS i
14040 73 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65  s unable to dete
14050 72 6d 69 6e 65 20 74 68 65 20 65 6e 74 72 69 65  rmine the entrie
14060 73 20 74 6f 20 72 65 6d 6f 76 65 20 66 72 6f 6d  s to remove from
14070 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 61   the FTS index a
14080 6e 64 0a 20 20 2d 2d 20 73 6f 20 74 68 65 20 69  nd.  -- so the i
14090 6e 64 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74  ndex and content
140a0 20 74 61 62 6c 65 20 61 72 65 20 6c 65 66 74 20   table are left 
140b0 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2d  out of sync..  -
140c0 2d 3c 2f 69 3e 0a 20 20 44 45 4c 45 54 45 20 46  -</i>.  DELETE F
140d0 52 4f 4d 20 74 31 5f 72 65 61 6c 20 57 48 45 52  ROM t1_real WHER
140e0 45 20 72 6f 77 69 64 20 3d 20 31 32 33 3b 0a 20  E rowid = 123;. 
140f0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 5f   DELETE FROM t1_
14100 66 74 73 20 57 48 45 52 45 20 72 6f 77 69 64 20  fts WHERE rowid 
14110 3d 20 31 32 33 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  = 123;.</codeblo
14120 63 6b 3e 0a 0a 3c 70 3e 20 20 0a 20 20 49 6e 73  ck>..<p>  .  Ins
14130 74 65 61 64 20 6f 66 20 77 72 69 74 69 6e 67 20  tead of writing 
14140 73 65 70 61 72 61 74 65 6c 79 20 74 6f 20 74 68  separately to th
14150 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
14160 78 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  x and the conten
14170 74 20 74 61 62 6c 65 2c 0a 20 20 73 6f 6d 65 20  t table,.  some 
14180 75 73 65 72 73 20 6d 61 79 20 77 69 73 68 20 74  users may wish t
14190 6f 20 75 73 65 20 64 61 74 61 62 61 73 65 20 74  o use database t
141a0 72 69 67 67 65 72 73 20 74 6f 20 6b 65 65 70 20  riggers to keep 
141b0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
141c0 64 65 78 0a 20 20 75 70 20 74 6f 20 64 61 74 65  dex.  up to date
141d0 20 77 69 74 68 20 72 65 73 70 65 63 74 20 74 6f   with respect to
141e0 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
141f0 6d 65 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20  ments stored in 
14200 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
14210 65 2e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  e..  For example
14220 2c 20 75 73 69 6e 67 20 74 68 65 20 74 61 62 6c  , using the tabl
14230 65 73 20 66 72 6f 6d 20 65 61 72 6c 69 65 72 20  es from earlier 
14240 65 78 61 6d 70 6c 65 73 3a 0a 0a 3c 63 6f 64 65  examples:..<code
14250 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20  block>.  CREATE 
14260 54 52 49 47 47 45 52 20 74 32 5f 62 75 20 42 45  TRIGGER t2_bu BE
14270 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74  FORE UPDATE ON t
14280 32 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45  2 BEGIN.    DELE
14290 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  TE FROM t3 WHERE
142a0 20 64 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64   docid=old.rowid
142b0 3b 0a 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  ;.  END;.  CREAT
142c0 45 20 54 52 49 47 47 45 52 20 74 32 5f 62 64 20  E TRIGGER t2_bd 
142d0 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e  BEFORE DELETE ON
142e0 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 44 45   t2 BEGIN.    DE
142f0 4c 45 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45  LETE FROM t3 WHE
14300 52 45 20 64 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77  RE docid=old.row
14310 69 64 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52  id;.  END;..  CR
14320 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f  EATE TRIGGER t2_
14330 61 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20  au AFTER UPDATE 
14340 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20  ON t2 BEGIN.    
14350 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 64  INSERT INTO t3(d
14360 6f 63 69 64 2c 20 62 2c 20 63 29 20 56 41 4c 55  ocid, b, c) VALU
14370 45 53 28 6e 65 77 2e 72 6f 77 69 64 2c 20 6e 65  ES(new.rowid, ne
14380 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 45  w.b, new.c);.  E
14390 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49  ND;.  CREATE TRI
143a0 47 47 45 52 20 74 32 5f 61 69 20 41 46 54 45 52  GGER t2_ai AFTER
143b0 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45   INSERT ON t2 BE
143c0 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49  GIN.    INSERT I
143d0 4e 54 4f 20 74 33 28 64 6f 63 69 64 2c 20 62 2c  NTO t3(docid, b,
143e0 20 63 29 20 56 41 4c 55 45 53 28 6e 65 77 2e 72   c) VALUES(new.r
143f0 6f 77 69 64 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  owid, new.b, new
14400 2e 63 29 3b 0a 20 20 45 4e 44 3b 0a 3c 2f 63 6f  .c);.  END;.</co
14410 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
14420 54 68 65 20 44 45 4c 45 54 45 20 74 72 69 67 67  The DELETE trigg
14430 65 72 20 6d 75 73 74 20 62 65 20 66 69 72 65 64  er must be fired
14440 20 62 65 66 6f 72 65 20 74 68 65 20 61 63 74 75   before the actu
14450 61 6c 20 64 65 6c 65 74 65 20 74 61 6b 65 73 20  al delete takes 
14460 70 6c 61 63 65 0a 20 20 6f 6e 20 74 68 65 20 63  place.  on the c
14470 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68  ontent table. Th
14480 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 46 54  is is so that FT
14490 53 34 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 74  S4 can still ret
144a0 72 69 65 76 65 20 74 68 65 20 6f 72 69 67 69 6e  rieve the origin
144b0 61 6c 0a 20 20 76 61 6c 75 65 73 20 69 6e 20 6f  al.  values in o
144c0 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 20 74  rder to update t
144d0 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
144e0 65 78 2e 20 41 6e 64 20 74 68 65 20 49 4e 53 45  ex. And the INSE
144f0 52 54 20 74 72 69 67 67 65 72 20 6d 75 73 74 0a  RT trigger must.
14500 20 20 62 65 20 66 69 72 65 64 20 61 66 74 65 72    be fired after
14510 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69 73 20   the new row is 
14520 69 6e 73 65 72 74 65 64 2c 20 73 6f 20 61 73 20  inserted, so as 
14530 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
14540 73 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 72  se where the.  r
14550 6f 77 69 64 20 69 73 20 61 73 73 69 67 6e 65 64  owid is assigned
14560 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
14570 69 74 68 69 6e 20 74 68 65 20 73 79 73 74 65 6d  ithin the system
14580 2e 20 54 68 65 20 55 50 44 41 54 45 20 74 72 69  . The UPDATE tri
14590 67 67 65 72 20 6d 75 73 74 0a 20 20 62 65 20 73  gger must.  be s
145a0 70 6c 69 74 20 69 6e 74 6f 20 74 77 6f 20 70 61  plit into two pa
145b0 72 74 73 2c 20 6f 6e 65 20 66 69 72 65 64 20 62  rts, one fired b
145c0 65 66 6f 72 65 20 61 6e 64 20 6f 6e 65 20 61 66  efore and one af
145d0 74 65 72 20 74 68 65 20 75 70 64 61 74 65 20 6f  ter the update o
145e0 66 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20  f the.  content 
145f0 74 61 62 6c 65 2c 20 66 6f 72 20 74 68 65 20 73  table, for the s
14600 61 6d 65 20 72 65 61 73 6f 6e 73 2e 0a 0a 3c 70  ame reasons...<p
14610 3e 0a 20 20 54 68 65 20 5b 46 54 53 34 20 22 72  >.  The [FTS4 "r
14620 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 5d  ebuild" command]
14630 0a 20 20 64 65 6c 65 74 65 73 20 74 68 65 20 65  .  deletes the e
14640 6e 74 69 72 65 20 66 75 6c 6c 2d 74 65 78 74 20  ntire full-text 
14650 69 6e 64 65 78 20 61 6e 64 20 72 65 62 75 69 6c  index and rebuil
14660 64 73 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74  ds it based on t
14670 68 65 20 63 75 72 72 65 6e 74 0a 20 20 73 65 74  he current.  set
14680 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e   of documents in
14690 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
146a0 6c 65 2e 20 41 73 73 75 6d 69 6e 67 20 61 67 61  le. Assuming aga
146b0 69 6e 20 74 68 61 74 20 22 74 33 22 20 69 73 20  in that "t3" is 
146c0 74 68 65 0a 20 20 6e 61 6d 65 20 6f 66 20 74 68  the.  name of th
146d0 65 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65  e external conte
146e0 6e 74 20 46 54 53 34 20 74 61 62 6c 65 2c 20 74  nt FTS4 table, t
146f0 68 65 20 72 65 62 75 69 6c 64 20 63 6f 6d 6d 61  he rebuild comma
14700 6e 64 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  nd looks like th
14710 69 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  is:..<codeblock>
14720 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
14730 33 28 74 33 29 20 56 41 4c 55 45 53 28 27 72 65  3(t3) VALUES('re
14740 62 75 69 6c 64 27 29 3b 0a 3c 2f 63 6f 64 65 62  build');.</codeb
14750 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69  lock>..<p>.  Thi
14760 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 61 6c  s command may al
14770 73 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  so be used with 
14780 6f 72 64 69 6e 61 72 79 20 46 54 53 34 20 74 61  ordinary FTS4 ta
14790 62 6c 65 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  bles, for exampl
147a0 65 20 69 66 0a 20 20 74 68 65 20 69 6d 70 6c 65  e if.  the imple
147b0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
147c0 20 74 6f 6b 65 6e 69 7a 65 72 20 63 68 61 6e 67   tokenizer chang
147d0 65 73 2e 20 20 49 74 20 69 73 20 61 6e 0a 20 20  es.  It is an.  
147e0 65 72 72 6f 72 20 74 6f 20 61 74 74 65 6d 70 74  error to attempt
147f0 20 74 6f 20 72 65 62 75 69 6c 64 20 74 68 65 20   to rebuild the 
14800 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
14810 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 61 20  maintained by a 
14820 63 6f 6e 74 65 6e 74 6c 65 73 73 0a 20 20 46 54  contentless.  FT
14830 53 34 20 74 61 62 6c 65 2c 20 73 69 6e 63 65 20  S4 table, since 
14840 6e 6f 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  no content will 
14850 62 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  be available to 
14860 64 6f 20 74 68 65 20 72 65 62 75 69 6c 64 69 6e  do the rebuildin
14870 67 2e 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61  g....<tcl>hd_fra
14880 67 6d 65 6e 74 20 2a 66 74 73 34 6c 61 6e 67 75  gment *fts4langu
14890 61 67 65 69 64 20 6c 61 6e 67 75 61 67 65 69 64  ageid languageid
148a0 20 7b 46 54 53 34 20 6c 61 6e 67 75 61 67 65 69   {FTS4 languagei
148b0 64 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  d option}</tcl>.
148c0 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 6c  <h2 tags="fts4 l
148d0 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e  anguageid option
148e0 22 3e 54 68 65 20 6c 61 6e 67 75 61 67 65 69 64  ">The languageid
148f0 3d 20 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c  = option</h2>..<
14900 70 3e 0a 20 20 57 68 65 6e 20 74 68 65 20 6c 61  p>.  When the la
14910 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20  nguageid option 
14920 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 73  is present, it s
14930 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 61 6d  pecifies the nam
14940 65 20 6f 66 0a 20 20 61 6e 6f 74 68 65 72 20 5b  e of.  another [
14950 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 74  hidden column] t
14960 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
14970 74 68 65 20 46 54 53 34 0a 20 20 74 61 62 6c 65  the FTS4.  table
14980 20 61 6e 64 20 77 68 69 63 68 20 69 73 20 75 73   and which is us
14990 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74 68  ed to specify th
149a0 65 20 6c 61 6e 67 75 61 67 65 20 73 74 6f 72 65  e language store
149b0 64 20 69 6e 20 65 61 63 68 20 72 6f 77 0a 20 20  d in each row.  
149c0 6f 66 20 74 68 65 20 46 54 53 34 20 74 61 62 6c  of the FTS4 tabl
149d0 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  e.  The name of 
149e0 74 68 65 20 6c 61 6e 67 75 61 67 65 69 64 20 68  the languageid h
149f0 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 6d 75 73  idden column mus
14a00 74 0a 20 20 62 65 20 64 69 73 74 69 6e 63 74 20  t.  be distinct 
14a10 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 63  from all other c
14a20 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 74  olumn names in t
14a30 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e 20 20  he FTS4 table.  
14a40 45 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  Example:..<codeb
14a50 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56  lock>.  CREATE V
14a60 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20  IRTUAL TABLE t1 
14a70 55 53 49 4e 47 20 66 74 73 34 28 78 2c 20 79 2c  USING fts4(x, y,
14a80 20 6c 61 6e 67 75 61 67 65 69 64 3d 22 6c 69 64   languageid="lid
14a90 22 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ").</codeblock>.
14aa0 0a 3c 70 3e 0a 20 20 54 68 65 20 64 65 66 61 75  .<p>.  The defau
14ab0 6c 74 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 61  lt value of a la
14ac0 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 20  nguageid column 
14ad0 69 73 20 30 2e 20 41 6e 79 20 76 61 6c 75 65 20  is 0. Any value 
14ae0 69 6e 73 65 72 74 65 64 0a 20 20 69 6e 74 6f 20  inserted.  into 
14af0 61 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  a languageid col
14b00 75 6d 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  umn is converted
14b10 20 74 6f 20 61 20 33 32 2d 62 69 74 20 28 6e 6f   to a 32-bit (no
14b20 74 20 36 34 29 20 73 69 67 6e 65 64 0a 20 20 69  t 64) signed.  i
14b30 6e 74 65 67 65 72 2e 0a 0a 3c 70 3e 0a 20 20 42  nteger...<p>.  B
14b40 79 20 64 65 66 61 75 6c 74 2c 20 46 54 53 20 71  y default, FTS q
14b50 75 65 72 69 65 73 20 28 74 68 6f 73 65 20 74 68  ueries (those th
14b60 61 74 20 75 73 65 20 74 68 65 20 4d 41 54 43 48  at use the MATCH
14b70 20 6f 70 65 72 61 74 6f 72 29 0a 20 20 63 6f 6e   operator).  con
14b80 73 69 64 65 72 20 6f 6e 6c 79 20 74 68 6f 73 65  sider only those
14b90 20 72 6f 77 73 20 77 69 74 68 20 74 68 65 20 6c   rows with the l
14ba0 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e  anguageid column
14bb0 20 73 65 74 20 74 6f 20 30 2e 20 54 6f 0a 20 20   set to 0. To.  
14bc0 71 75 65 72 79 20 66 6f 72 20 72 6f 77 73 20 77  query for rows w
14bd0 69 74 68 20 6f 74 68 65 72 20 6c 61 6e 67 75 61  ith other langua
14be0 67 65 69 64 20 76 61 6c 75 65 73 2c 20 61 20 63  geid values, a c
14bf0 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
14c00 0a 20 20 66 6f 72 6d 20 22 3c 6c 61 6e 67 75 61  .  form "<langua
14c10 67 65 2d 69 64 3e 20 3d 20 3c 69 6e 74 65 67 65  ge-id> = <intege
14c20 72 3e 22 20 6d 75 73 74 20 62 65 20 61 64 64 65  r>" must be adde
14c30 64 20 74 6f 20 74 68 65 20 71 75 65 72 69 65 73  d to the queries
14c40 0a 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  .  WHERE clause.
14c50 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
14c60 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c  codeblock>.  SEL
14c70 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
14c80 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 62  ERE t1 MATCH 'ab
14c90 63 27 20 41 4e 44 20 6c 69 64 3d 35 3b 0a 3c 2f  c' AND lid=5;.</
14ca0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
14cb0 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
14cc0 69 62 6c 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  ible for a singl
14cd0 65 20 46 54 53 20 71 75 65 72 79 20 74 6f 20 72  e FTS query to r
14ce0 65 74 75 72 6e 20 72 6f 77 73 20 77 69 74 68 0a  eturn rows with.
14cf0 20 20 64 69 66 66 65 72 65 6e 74 20 6c 61 6e 67    different lang
14d00 75 61 67 65 69 64 20 76 61 6c 75 65 73 2e 20 54  uageid values. T
14d10 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 64  he results of ad
14d20 64 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ding WHERE claus
14d30 65 73 0a 20 20 74 68 61 74 20 75 73 65 20 6f 74  es.  that use ot
14d40 68 65 72 20 6f 70 65 72 61 74 6f 72 73 20 28 65  her operators (e
14d50 2e 67 2e 20 20 6c 69 64 21 3d 35 2c 20 6f 72 20  .g.  lid!=5, or 
14d60 6c 69 64 26 6c 74 3b 3d 35 29 20 61 72 65 20 75  lid&lt;=5) are u
14d70 6e 64 65 66 69 6e 65 64 2e 0a 0a 3c 70 3e 0a 20  ndefined...<p>. 
14d80 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   If the content 
14d90 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  option is used a
14da0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 6c 61  long with the la
14db0 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 2c  nguageid option,
14dc0 0a 20 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  .  then the name
14dd0 64 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  d languageid col
14de0 75 6d 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  umn must exist i
14df0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 20 74  n the content= t
14e00 61 62 6c 65 0a 20 20 28 73 75 62 6a 65 63 74 20  able.  (subject 
14e10 74 6f 20 74 68 65 20 75 73 75 61 6c 20 72 75 6c  to the usual rul
14e20 65 73 20 2d 20 69 66 20 61 20 71 75 65 72 79 20  es - if a query 
14e30 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 72  never needs to r
14e40 65 61 64 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e  ead the.  conten
14e50 74 20 74 61 62 6c 65 20 74 68 65 6e 20 74 68 69  t table then thi
14e60 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 6f  s restriction do
14e70 65 73 20 6e 6f 74 20 61 70 70 6c 79 29 2e 0a 0a  es not apply)...
14e80 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68 65 20 6c  <p>.  When the l
14e90 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e  anguageid option
14ea0 20 69 73 20 75 73 65 64 2c 20 53 51 4c 69 74 65   is used, SQLite
14eb0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 4c 61   invokes the xLa
14ec0 6e 67 75 61 67 65 69 64 28 29 0a 20 20 6f 6e 20  nguageid().  on 
14ed0 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  the sqlite3_toke
14ee0 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 6f 62 6a  nizer_module obj
14ef0 65 63 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ect immediately 
14f00 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
14f10 0a 20 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  .  is created in
14f20 20 6f 72 64 65 72 20 74 6f 20 70 61 73 73 20 69   order to pass i
14f30 6e 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 69  n the language i
14f40 64 20 74 68 61 74 20 74 68 65 0a 20 20 74 6f 6b  d that the.  tok
14f50 65 6e 69 7a 65 72 20 73 68 6f 75 6c 64 20 75 73  enizer should us
14f60 65 2e 20 20 54 68 65 20 78 4c 61 6e 67 75 61 67  e.  The xLanguag
14f70 65 69 64 28 29 20 6d 65 74 68 6f 64 20 77 69 6c  eid() method wil
14f80 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65  l never be calle
14f90 64 0a 20 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  d.  more than on
14fa0 63 65 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ce for any singl
14fb0 65 20 74 6f 6b 65 6e 69 7a 65 72 20 6f 62 6a 65  e tokenizer obje
14fc0 63 74 2e 20 20 54 68 65 20 66 61 63 74 20 74 68  ct.  The fact th
14fd0 61 74 20 64 69 66 66 65 72 65 6e 74 0a 20 20 6c  at different.  l
14fe0 61 6e 67 75 61 67 65 73 20 6d 69 67 68 74 20 62  anguages might b
14ff0 65 20 74 6f 6b 65 6e 69 7a 65 64 20 64 69 66 66  e tokenized diff
15000 65 72 65 6e 74 6c 79 20 69 73 20 6f 6e 65 20 72  erently is one r
15010 65 61 73 6f 6e 20 77 68 79 20 6e 6f 20 73 69 6e  eason why no sin
15020 67 6c 65 0a 20 20 46 54 53 20 71 75 65 72 79 20  gle.  FTS query 
15030 63 61 6e 20 72 65 74 75 72 6e 20 72 6f 77 73 20  can return rows 
15040 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 6c  with different l
15050 61 6e 67 75 61 67 65 69 64 20 76 61 6c 75 65 73  anguageid values
15060 2e 0a 20 20 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66  ..  ...<tcl>hd_f
15070 72 61 67 6d 65 6e 74 20 66 74 73 34 6d 61 74 63  ragment fts4matc
15080 68 69 6e 66 6f 20 7b 46 54 53 34 20 6d 61 74 63  hinfo {FTS4 matc
15090 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 7d 3c 2f 74  hinfo option}</t
150a0 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22 66 74  cl>.<h2 tags="ft
150b0 73 34 20 6d 61 74 63 68 69 6e 66 6f 20 6f 70 74  s4 matchinfo opt
150c0 69 6f 6e 22 3e 54 68 65 20 6d 61 74 63 68 69 6e  ion">The matchin
150d0 66 6f 3d 20 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a  fo= option</h2>.
150e0 0a 3c 70 3e 0a 20 20 54 68 65 20 6d 61 74 63 68  .<p>.  The match
150f0 69 6e 66 6f 20 6f 70 74 69 6f 6e 20 6d 61 79 20  info option may 
15100 6f 6e 6c 79 20 62 65 20 73 65 74 20 74 6f 20 74  only be set to t
15110 68 65 20 76 61 6c 75 65 20 22 66 74 73 33 22 2e  he value "fts3".
15120 20 0a 20 20 41 74 74 65 6d 70 74 69 6e 67 20 74   .  Attempting t
15130 6f 20 73 65 74 20 6d 61 74 63 68 69 6e 66 6f 20  o set matchinfo 
15140 74 6f 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  to anything othe
15150 72 20 74 68 61 6e 20 22 66 74 73 33 22 20 69 73  r than "fts3" is
15160 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 49 66 20   an error..  If 
15170 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73  this option is s
15180 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
15190 6f 6d 65 20 6f 66 20 74 68 65 20 65 78 74 72 61  ome of the extra
151a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 74 6f   information sto
151b0 72 65 64 20 62 79 0a 20 20 46 54 53 34 20 69 73  red by.  FTS4 is
151c0 20 6f 6d 69 74 74 65 64 2e 20 54 68 69 73 20 72   omitted. This r
151d0 65 64 75 63 65 73 20 74 68 65 20 61 6d 6f 75 6e  educes the amoun
151e0 74 20 6f 66 20 64 69 73 6b 20 73 70 61 63 65 20  t of disk space 
151f0 63 6f 6e 73 75 6d 65 64 20 62 79 0a 20 20 61 6e  consumed by.  an
15200 20 46 54 53 34 20 74 61 62 6c 65 20 75 6e 74 69   FTS4 table unti
15210 6c 20 69 74 20 69 73 20 61 6c 6d 6f 73 74 20 74  l it is almost t
15220 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
15230 6d 6f 75 6e 74 20 74 68 61 74 20 77 6f 75 6c 64  mount that would
15240 0a 20 20 62 65 20 75 73 65 64 20 62 79 20 74 68  .  be used by th
15250 65 20 65 71 75 69 76 61 6c 65 6e 74 20 46 54 53  e equivalent FTS
15260 33 20 74 61 62 6c 65 2c 20 62 75 74 20 61 6c 73  3 table, but als
15270 6f 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  o means that the
15280 20 64 61 74 61 0a 20 20 61 63 63 65 73 73 65 64   data.  accessed
15290 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
152a0 27 6c 27 20 66 6c 61 67 20 74 6f 20 74 68 65 20  'l' flag to the 
152b0 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d 20 66 75  [matchinfo()] fu
152c0 6e 63 74 69 6f 6e 20 69 73 0a 20 20 6e 6f 74 20  nction is.  not 
152d0 61 76 61 69 6c 61 62 6c 65 2e 20 0a 0a 3c 74 63  available. ..<tc
152e0 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 66 74  l>hd_fragment ft
152f0 73 34 6e 6f 74 69 6e 64 65 78 65 64 20 7b 46 54  s4notindexed {FT
15300 53 34 20 6e 6f 74 69 6e 64 65 78 65 64 20 6f 70  S4 notindexed op
15310 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20  tion}</tcl>.<h2 
15320 74 61 67 73 3d 22 66 74 73 34 20 6e 6f 74 69 6e  tags="fts4 notin
15330 64 65 78 65 64 20 6f 70 74 69 6f 6e 22 3e 54 68  dexed option">Th
15340 65 20 6e 6f 74 69 6e 64 65 78 65 64 3d 20 6f 70  e notindexed= op
15350 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  tion</h2>..<p>. 
15360 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 65 20 46   Normally, the F
15370 54 53 20 6d 6f 64 75 6c 65 20 6d 61 69 6e 74 61  TS module mainta
15380 69 6e 73 20 61 6e 20 69 6e 76 65 72 74 65 64 20  ins an inverted 
15390 69 6e 64 65 78 20 6f 66 20 61 6c 6c 20 74 65 72  index of all ter
153a0 6d 73 20 69 6e 0a 20 20 61 6c 6c 20 63 6f 6c 75  ms in.  all colu
153b0 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
153c0 2e 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  . This option is
153d0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
153e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 20 20 61   the name of.  a
153f0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
15400 68 20 65 6e 74 72 69 65 73 20 73 68 6f 75 6c 64  h entries should
15410 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 74 6f   not be added to
15420 20 74 68 65 20 69 6e 64 65 78 2e 20 4d 75 6c 74   the index. Mult
15430 69 70 6c 65 0a 20 20 22 6e 6f 74 69 6e 64 65 78  iple.  "notindex
15440 65 64 22 20 6f 70 74 69 6f 6e 73 20 6d 61 79 20  ed" options may 
15450 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  be used to speci
15460 66 79 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  fy that multiple
15470 20 63 6f 6c 75 6d 6e 73 20 73 68 6f 75 6c 64 0a   columns should.
15480 20 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f    be omitted fro
15490 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 46 6f 72  m the index. For
154a0 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65   example:..<code
154b0 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
154c0 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74 61  reate an FTS4 ta
154d0 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20 6f 6e  ble for which on
154e0 6c 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ly the contents 
154f0 6f 66 20 63 6f 6c 75 6d 6e 73 20 63 32 20 61 6e  of columns c2 an
15500 64 20 63 34 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  d c4</i>.  <i>--
15510 20 61 72 65 20 74 6f 6b 65 6e 69 7a 65 64 20 61   are tokenized a
15520 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
15530 69 6e 76 65 72 74 65 64 20 69 6e 64 65 78 2e 3c  inverted index.<
15540 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
15550 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
15560 49 4e 47 20 66 74 73 34 28 63 31 2c 20 63 32 2c  ING fts4(c1, c2,
15570 20 63 33 2c 20 63 34 2c 20 6e 6f 74 69 6e 64 65   c3, c4, notinde
15580 78 65 64 3d 63 31 2c 20 6e 6f 74 69 6e 64 65 78  xed=c1, notindex
15590 65 64 3d 63 33 29 3b 0a 3c 2f 63 6f 64 65 62 6c  ed=c3);.</codebl
155a0 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 56 61 6c 75  ock>..<p>.  Valu
155b0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 75 6e 69  es stored in uni
155c0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
155d0 72 65 20 6e 6f 74 20 65 6c 69 67 69 62 6c 65 20  re not eligible 
155e0 74 6f 20 6d 61 74 63 68 20 4d 41 54 43 48 20 0a  to match MATCH .
155f0 20 20 6f 70 65 72 61 74 6f 72 73 2e 20 54 68 65    operators. The
15600 79 20 64 6f 20 6e 6f 74 20 69 6e 66 6c 75 65 6e  y do not influen
15610 63 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ce the results o
15620 66 20 74 68 65 20 6f 66 66 73 65 74 73 28 29 20  f the offsets() 
15630 6f 72 20 6d 61 74 63 68 69 6e 66 6f 28 29 0a 20  or matchinfo(). 
15640 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
15650 69 6f 6e 73 2e 20 4e 6f 72 20 77 69 6c 6c 20 74  ions. Nor will t
15660 68 65 20 73 6e 69 70 70 65 74 28 29 20 66 75 6e  he snippet() fun
15670 63 74 69 6f 6e 20 65 76 65 72 20 72 65 74 75 72  ction ever retur
15680 6e 20 61 0a 20 20 73 6e 69 70 70 65 74 20 62 61  n a.  snippet ba
15690 73 65 64 20 6f 6e 20 61 20 76 61 6c 75 65 20 73  sed on a value s
156a0 74 6f 72 65 64 20 69 6e 20 61 6e 20 75 6e 69 6e  tored in an unin
156b0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 0a 0a 3c  dexed column...<
156c0 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20  tcl>hd_fragment 
156d0 66 74 73 34 70 72 65 66 69 78 20 7b 46 54 53 34  fts4prefix {FTS4
156e0 20 70 72 65 66 69 78 20 6f 70 74 69 6f 6e 7d 3c   prefix option}<
156f0 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22  /tcl>.<h2 tags="
15700 66 74 73 34 20 70 72 65 66 69 78 20 6f 70 74 69  fts4 prefix opti
15710 6f 6e 22 3e 54 68 65 20 70 72 65 66 69 78 3d 20  on">The prefix= 
15720 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e  option</h2>..<p>
15730 0a 20 20 5e 54 68 65 20 46 54 53 34 20 70 72 65  .  ^The FTS4 pre
15740 66 69 78 20 6f 70 74 69 6f 6e 20 63 61 75 73 65  fix option cause
15750 73 20 46 54 53 20 74 6f 20 69 6e 64 65 78 20 74  s FTS to index t
15760 65 72 6d 20 70 72 65 66 69 78 65 73 20 6f 66 20  erm prefixes of 
15770 73 70 65 63 69 66 69 65 64 20 6c 65 6e 67 74 68  specified length
15780 73 0a 20 20 69 6e 20 74 68 65 20 73 61 6d 65 20  s.  in the same 
15790 77 61 79 20 74 68 61 74 20 69 74 20 61 6c 77 61  way that it alwa
157a0 79 73 20 69 6e 64 65 78 65 73 20 63 6f 6d 70 6c  ys indexes compl
157b0 65 74 65 20 74 65 72 6d 73 2e 20 20 5e 54 68 65  ete terms.  ^The
157c0 20 70 72 65 66 69 78 20 6f 70 74 69 6f 6e 0a 20   prefix option. 
157d0 20 6d 75 73 74 20 62 65 20 73 65 74 20 74 6f 20   must be set to 
157e0 61 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  a comma separate
157f0 64 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69  d list of positi
15800 76 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 6e 74 65  ve non-zero inte
15810 67 65 72 73 2e 20 0a 20 20 5e 46 6f 72 20 65 61  gers. .  ^For ea
15820 63 68 20 76 61 6c 75 65 20 4e 20 69 6e 20 74 68  ch value N in th
15830 65 20 6c 69 73 74 2c 20 70 72 65 66 69 78 65 73  e list, prefixes
15840 20 6f 66 20 6c 65 6e 67 74 68 20 4e 20 62 79 74   of length N byt
15850 65 73 20 28 77 68 65 6e 20 65 6e 63 6f 64 65 64  es (when encoded
15860 20 0a 20 20 75 73 69 6e 67 20 55 54 46 2d 38 29   .  using UTF-8)
15870 20 61 72 65 20 69 6e 64 65 78 65 64 2e 20 20 5e   are indexed.  ^
15880 46 54 53 34 20 75 73 65 73 20 74 65 72 6d 20 70  FTS4 uses term p
15890 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 74 6f  refix indexes to
158a0 20 73 70 65 65 64 20 75 70 0a 20 20 5b 70 72 65   speed up.  [pre
158b0 66 69 78 20 71 75 65 72 69 65 73 5d 2e 20 54 68  fix queries]. Th
158c0 65 20 63 6f 73 74 2c 20 6f 66 20 63 6f 75 72 73  e cost, of cours
158d0 65 2c 20 69 73 20 74 68 61 74 20 69 6e 64 65 78  e, is that index
158e0 69 6e 67 20 74 65 72 6d 20 70 72 65 66 69 78 65  ing term prefixe
158f0 73 20 61 73 0a 20 20 77 65 6c 6c 20 61 73 20 63  s as.  well as c
15900 6f 6d 70 6c 65 74 65 20 74 65 72 6d 73 20 69 6e  omplete terms in
15910 63 72 65 61 73 65 73 20 74 68 65 20 64 61 74 61  creases the data
15920 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 73 6c  base size and sl
15930 6f 77 73 20 64 6f 77 6e 20 77 72 69 74 65 20 0a  ows down write .
15940 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20    operations on 
15950 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e 0a  the FTS4 table..
15960 0a 3c 70 3e 0a 20 20 50 72 65 66 69 78 20 69 6e  .<p>.  Prefix in
15970 64 65 78 65 73 20 6d 61 79 20 62 65 20 75 73 65  dexes may be use
15980 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 5b 70  d to optimize [p
15990 72 65 66 69 78 20 71 75 65 72 69 65 73 5d 20 69  refix queries] i
159a0 6e 20 74 77 6f 20 63 61 73 65 73 2e 0a 20 20 49  n two cases..  I
159b0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 66  f the query is f
159c0 6f 72 20 61 20 70 72 65 66 69 78 20 6f 66 20 4e  or a prefix of N
159d0 20 62 79 74 65 73 2c 20 74 68 65 6e 20 61 20 70   bytes, then a p
159e0 72 65 66 69 78 20 69 6e 64 65 78 20 63 72 65 61  refix index crea
159f0 74 65 64 0a 20 20 77 69 74 68 20 22 70 72 65 66  ted.  with "pref
15a00 69 78 3d 4e 22 20 70 72 6f 76 69 64 65 73 20 74  ix=N" provides t
15a10 68 65 20 62 65 73 74 20 6f 70 74 69 6d 69 7a 61  he best optimiza
15a20 74 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 6e 6f 20  tion. Or, if no 
15a30 22 70 72 65 66 69 78 3d 4e 22 0a 20 20 69 6e 64  "prefix=N".  ind
15a40 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ex is available,
15a50 20 61 20 22 70 72 65 66 69 78 3d 4e 2b 31 22 20   a "prefix=N+1" 
15a60 69 6e 64 65 78 20 6d 61 79 20 62 65 20 75 73 65  index may be use
15a70 64 20 69 6e 73 74 65 61 64 2e 20 0a 20 20 55 73  d instead. .  Us
15a80 69 6e 67 20 61 20 22 70 72 65 66 69 78 3d 4e 2b  ing a "prefix=N+
15a90 31 22 20 69 6e 64 65 78 20 69 73 20 6c 65 73 73  1" index is less
15aa0 0a 20 20 65 66 66 69 63 69 65 6e 74 20 74 68 61  .  efficient tha
15ab0 6e 20 61 20 22 70 72 65 66 69 78 3d 4e 22 20 69  n a "prefix=N" i
15ac0 6e 64 65 78 2c 20 62 75 74 20 69 73 20 62 65 74  ndex, but is bet
15ad0 74 65 72 20 74 68 61 6e 20 6e 6f 20 70 72 65 66  ter than no pref
15ae0 69 78 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  ix index at all.
15af0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
15b00 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
15b10 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20  FTS4 table with 
15b20 69 6e 64 65 78 65 73 20 74 6f 20 6f 70 74 69 6d  indexes to optim
15b30 69 7a 65 20 32 20 61 6e 64 20 34 20 62 79 74 65  ize 2 and 4 byte
15b40 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73 2e   prefix queries.
15b50 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
15b60 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
15b70 53 49 4e 47 20 66 74 73 34 28 63 31 2c 20 63 32  SING fts4(c1, c2
15b80 2c 20 70 72 65 66 69 78 3d 22 32 2c 34 22 29 3b  , prefix="2,4");
15b90 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
15ba0 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72  llowing two quer
15bb0 69 65 73 20 61 72 65 20 62 6f 74 68 20 6f 70 74  ies are both opt
15bc0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
15bd0 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 2e   prefix indexes.
15be0 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
15bf0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
15c00 20 4d 41 54 43 48 20 27 61 62 2a 27 3b 0a 20 20   MATCH 'ab*';.  
15c10 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
15c20 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
15c30 27 61 62 63 64 2a 27 3b 0a 0a 20 20 3c 69 3e 2d  'abcd*';..  <i>-
15c40 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
15c50 74 77 6f 20 71 75 65 72 69 65 73 20 61 72 65 20  two queries are 
15c60 62 6f 74 68 20 70 61 72 74 69 61 6c 6c 79 20 6f  both partially o
15c70 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
15c80 68 65 20 70 72 65 66 69 78 3c 2f 69 3e 0a 20 20  he prefix</i>.  
15c90 3c 69 3e 2d 2d 20 69 6e 64 65 78 65 73 2e 20 54  <i>-- indexes. T
15ca0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
15cb0 69 73 20 6e 6f 74 20 61 73 20 70 72 6f 6e 6f 75  is not as pronou
15cc0 6e 63 65 64 20 61 73 20 69 74 20 69 73 20 66 6f  nced as it is fo
15cd0 72 20 74 68 65 20 71 75 65 72 69 65 73 3c 2f 69  r the queries</i
15ce0 3e 0a 20 20 3c 69 3e 2d 2d 20 61 62 6f 76 65 2c  >.  <i>-- above,
15cf0 20 62 75 74 20 73 74 69 6c 6c 20 61 6e 20 69 6d   but still an im
15d00 70 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 6e  provement over n
15d10 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  o prefix indexes
15d20 20 61 74 20 61 6c 6c 2e 3c 2f 69 3e 0a 20 20 53   at all.</i>.  S
15d30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
15d40 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
15d50 61 2a 27 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  a*';.  SELECT * 
15d60 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
15d70 20 4d 41 54 43 48 20 27 61 62 63 2a 27 3b 0a 3c   MATCH 'abc*';.<
15d80 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63  /codeblock>..<tc
15d90 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 63  l>hd_fragment *c
15da0 6d 64 73 20 7b 46 54 53 34 20 63 6f 6d 6d 61 6e  mds {FTS4 comman
15db0 64 73 7d 3c 2f 74 63 6c 3e 0a 3c 68 31 20 69 64  ds}</tcl>.<h1 id
15dc0 3d 63 6f 6d 6d 61 6e 64 73 20 74 61 67 73 3d 22  =commands tags="
15dd0 63 6f 6d 6d 61 6e 64 73 22 3e 53 70 65 63 69 61  commands">Specia
15de0 6c 20 43 6f 6d 6d 61 6e 64 73 20 46 6f 72 20 46  l Commands For F
15df0 54 53 33 20 61 6e 64 20 46 54 53 34 3c 2f 68 31  TS3 and FTS4</h1
15e00 3e 0a 0a 3c 70 3e 0a 20 20 53 70 65 63 69 61 6c  >..<p>.  Special
15e10 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 65 73   INSERT operates
15e20 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
15e30 69 73 73 75 65 20 63 6f 6d 6d 61 6e 64 73 20 74  issue commands t
15e40 6f 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 20  o FTS3 and FTS4 
15e50 74 61 62 6c 65 73 2e 0a 20 20 45 76 65 72 79 20  tables..  Every 
15e60 46 54 53 33 20 61 6e 64 20 46 54 53 34 20 68 61  FTS3 and FTS4 ha
15e70 73 20 61 20 68 69 64 64 65 6e 2c 20 72 65 61 64  s a hidden, read
15e80 2d 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 77 68 69  -only column whi
15e90 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 6e  ch is the same n
15ea0 61 6d 65 20 61 73 0a 20 20 74 68 65 20 74 61 62  ame as.  the tab
15eb0 6c 65 20 69 74 73 65 6c 66 2e 20 20 49 4e 53 45  le itself.  INSE
15ec0 52 54 73 20 69 6e 74 6f 20 74 68 69 73 20 68 69  RTs into this hi
15ed0 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 61 72 65 20  dden column are 
15ee0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 63  interpreted as c
15ef0 6f 6d 6d 61 6e 64 73 0a 20 20 74 6f 20 74 68 65  ommands.  to the
15f00 20 46 54 53 33 2f 34 20 74 61 62 6c 65 2e 20 20   FTS3/4 table.  
15f10 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
15f20 20 74 68 65 20 6e 61 6d 65 20 22 78 79 7a 22 20   the name "xyz" 
15f30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
15f40 6d 6d 61 6e 64 73 0a 20 20 61 72 65 20 73 75 70  mmands.  are sup
15f50 70 6f 72 74 65 64 3a 0a 0a 3c 75 6c 3e 0a 3c 6c  ported:..<ul>.<l
15f60 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54 4f  i><p>INSERT INTO
15f70 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53   xyz(xyz) VALUES
15f80 28 27 6f 70 74 69 6d 69 7a 65 27 29 3b 3c 2f 70  ('optimize');</p
15f90 3e 0a 3c 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20  >.<li><p>INSERT 
15fa0 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41  INTO xyz(xyz) VA
15fb0 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27 29 3b  LUES('rebuild');
15fc0 3c 2f 70 3e 0a 3c 6c 69 3e 3c 70 3e 49 4e 53 45  </p>.<li><p>INSE
15fd0 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29  RT INTO xyz(xyz)
15fe0 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69   VALUES('integri
15ff0 74 79 2d 63 68 65 63 6b 27 29 3b 3c 2f 70 3e 0a  ty-check');</p>.
16000 3c 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e  <li><p>INSERT IN
16010 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55  TO xyz(xyz) VALU
16020 45 53 28 27 6d 65 72 67 65 3d 58 2c 59 27 29 3b  ES('merge=X,Y');
16030 3c 2f 70 3e 0a 3c 6c 69 3e 3c 70 3e 49 4e 53 45  </p>.<li><p>INSE
16040 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29  RT INTO xyz(xyz)
16050 20 56 41 4c 55 45 53 28 27 61 75 74 6f 6d 65 72   VALUES('automer
16060 67 65 3d 4e 27 29 3b 3c 2f 70 3e 0a 3c 2f 75 6c  ge=N');</p>.</ul
16070 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  >..<tcl>hd_fragm
16080 65 6e 74 20 2a 66 74 73 34 6f 70 74 63 6d 64 20  ent *fts4optcmd 
16090 7b 46 54 53 34 20 22 6f 70 74 69 6d 69 7a 65 22  {FTS4 "optimize"
160a0 20 63 6f 6d 6d 61 6e 64 7d 20 5c 0a 20 20 20 20   command} \.    
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 20 7b 22 6f 70 74 69 6d           {"optim
160d0 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74  ize" command}</t
160e0 63 6c 3e 0a 3c 68 32 20 69 64 3d 6f 70 74 69 6d  cl>.<h2 id=optim
160f0 69 7a 65 3e 54 68 65 20 22 6f 70 74 69 6d 69 7a  ize>The "optimiz
16100 65 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a  e" command</h2>.
16110 0a 3c 70 3e 0a 20 20 54 68 65 20 22 6f 70 74 69  .<p>.  The "opti
16120 6d 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 20 63 61  mize" command ca
16130 75 73 65 73 20 46 54 53 33 2f 34 20 74 6f 20 6d  uses FTS3/4 to m
16140 65 72 67 65 20 74 6f 67 65 74 68 65 72 20 61 6c  erge together al
16150 6c 20 6f 66 20 69 74 73 0a 20 20 69 6e 76 65 72  l of its.  inver
16160 74 65 64 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ted index b-tree
16170 73 20 69 6e 74 6f 20 6f 6e 65 20 6c 61 72 67 65  s into one large
16180 20 61 6e 64 20 63 6f 6d 70 6c 65 74 65 20 62 2d   and complete b-
16190 74 72 65 65 2e 20 20 44 6f 69 6e 67 0a 20 20 61  tree.  Doing.  a
161a0 6e 20 6f 70 74 69 6d 69 7a 65 20 77 69 6c 6c 20  n optimize will 
161b0 6d 61 6b 65 20 73 75 62 73 65 71 75 65 6e 74 20  make subsequent 
161c0 71 75 65 72 69 65 73 20 72 75 6e 20 66 61 73 74  queries run fast
161d0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 61  er since there a
161e0 72 65 0a 20 20 66 65 77 65 72 20 62 2d 74 72 65  re.  fewer b-tre
161f0 65 73 20 74 6f 20 73 65 61 72 63 68 2c 20 61 6e  es to search, an
16200 64 20 69 74 20 6d 61 79 20 72 65 64 75 63 65 20  d it may reduce 
16210 64 69 73 6b 20 75 73 61 67 65 20 62 79 20 63 6f  disk usage by co
16220 61 6c 65 73 63 69 6e 67 0a 20 20 72 65 64 75 6e  alescing.  redun
16230 64 61 6e 74 20 65 6e 74 72 69 65 73 2e 20 20 48  dant entries.  H
16240 6f 77 65 76 65 72 2c 20 66 6f 72 20 61 20 6c 61  owever, for a la
16250 72 67 65 20 46 54 53 20 74 61 62 6c 65 2c 20 72  rge FTS table, r
16260 75 6e 6e 69 6e 67 20 6f 70 74 69 6d 69 7a 65 0a  unning optimize.
16270 20 20 63 61 6e 20 62 65 20 61 73 20 65 78 70 65    can be as expe
16280 6e 73 69 76 65 20 61 73 20 72 75 6e 6e 69 6e 67  nsive as running
16290 20 5b 56 41 43 55 55 4d 5d 2e 20 20 54 68 65 20   [VACUUM].  The 
162a0 6f 70 74 69 6d 69 7a 65 20 63 6f 6d 6d 61 6e 64  optimize command
162b0 0a 20 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 68  .  essentially h
162c0 61 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77  as to read and w
162d0 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
162e0 46 54 53 20 74 61 62 6c 65 2c 20 72 65 73 75 6c  FTS table, resul
162f0 74 69 6e 67 0a 20 20 69 6e 20 61 20 6c 61 72 67  ting.  in a larg
16300 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 0a  e transaction...
16310 3c 70 3e 0a 20 20 49 6e 20 62 61 74 63 68 2d 6d  <p>.  In batch-m
16320 6f 64 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77  ode operation, w
16330 68 65 72 65 20 61 6e 20 46 54 53 20 74 61 62 6c  here an FTS tabl
16340 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 62  e is initially b
16350 75 69 6c 74 20 75 70 0a 20 20 75 73 69 6e 67 20  uilt up.  using 
16360 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f  a large number o
16370 66 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  f INSERT operati
16380 6f 6e 73 2c 20 74 68 65 6e 20 71 75 65 72 69 65  ons, then querie
16390 64 20 72 65 70 65 61 74 65 64 6c 79 0a 20 20 77  d repeatedly.  w
163a0 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 63  ithout further c
163b0 68 61 6e 67 65 73 2c 20 69 74 20 69 73 20 6f 66  hanges, it is of
163c0 74 65 6e 20 61 20 67 6f 6f 64 20 69 64 65 61 0a  ten a good idea.
163d0 20 20 74 6f 20 72 75 6e 20 22 6f 70 74 69 6d 69    to run "optimi
163e0 7a 65 22 20 61 66 74 65 72 20 74 68 65 20 6c 61  ze" after the la
163f0 73 74 20 49 4e 53 45 52 54 20 61 6e 64 20 62 65  st INSERT and be
16400 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 71  fore the first q
16410 75 65 72 79 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66  uery...<tcl>hd_f
16420 72 61 67 6d 65 6e 74 20 2a 66 74 73 34 72 65 62  ragment *fts4reb
16430 75 69 64 63 6d 64 20 7b 46 54 53 34 20 22 72 65  uidcmd {FTS4 "re
16440 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 7d 20  build" command} 
16450 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 7b 22 72 65 62 75 69 6c 64 22 20 63 6f 6d    {"rebuild" com
16480 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20  mand}</tcl>.<h2 
16490 69 64 3d 72 65 62 75 69 6c 64 3e 54 68 65 20 22  id=rebuild>The "
164a0 72 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64  rebuild" command
164b0 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h2>..<p>.  The
164c0 20 22 72 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61   "rebuild" comma
164d0 6e 64 20 63 61 75 73 65 73 20 53 51 4c 69 74 65  nd causes SQLite
164e0 20 74 6f 20 64 69 73 63 61 72 64 20 74 68 65 20   to discard the 
164f0 65 6e 74 69 72 65 20 46 54 53 33 2f 34 0a 20 20  entire FTS3/4.  
16500 74 61 62 6c 65 20 61 6e 64 20 74 68 65 6e 20 72  table and then r
16510 65 62 75 69 6c 64 20 69 74 20 61 67 61 69 6e 20  ebuild it again 
16520 66 72 6f 6d 20 6f 72 69 67 69 6e 61 6c 20 74 65  from original te
16530 78 74 2e 20 20 54 68 65 20 63 6f 6e 63 65 70 74  xt.  The concept
16540 0a 20 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  .  is similar to
16550 20 5b 52 45 49 4e 44 45 58 5d 2c 20 6f 6e 6c 79   [REINDEX], only
16560 20 74 68 61 74 20 69 74 20 61 70 70 6c 69 65 73   that it applies
16570 20 74 6f 20 61 6e 0a 20 20 46 54 53 33 2f 34 20   to an.  FTS3/4 
16580 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
16590 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 69 6e 64   an ordinary ind
165a0 65 78 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22  ex...<p>.  The "
165b0 72 65 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64  rebuild" command
165c0 20 73 68 6f 75 6c 64 20 62 65 20 72 75 6e 20 77   should be run w
165d0 68 65 6e 65 76 65 72 20 74 68 65 20 69 6d 70 6c  henever the impl
165e0 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 6f 66 20  ementation.  of 
165f0 61 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a  a custom tokeniz
16600 65 72 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74  er changes, so t
16610 68 61 74 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  hat all content 
16620 63 61 6e 20 62 65 20 72 65 74 6f 6b 65 6e 69 7a  can be retokeniz
16630 65 64 2e 0a 20 20 54 68 65 20 22 72 65 62 75 69  ed..  The "rebui
16640 6c 64 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  ld" command is a
16650 6c 73 6f 20 75 73 65 66 75 6c 20 77 68 65 6e 20  lso useful when 
16660 75 73 69 6e 67 20 74 68 65 0a 20 20 5b 46 54 53  using the.  [FTS
16670 34 20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e  4 content option
16680 5d 20 61 66 74 65 72 20 63 68 61 6e 67 65 73 20  ] after changes 
16690 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 20 74  have been made t
166a0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  o the original. 
166b0 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a   content table..
166c0 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
166d0 74 20 2a 66 74 73 34 69 63 6b 63 6d 64 20 7b 46  t *fts4ickcmd {F
166e0 54 53 34 20 22 69 6e 74 65 67 72 69 74 79 2d 63  TS4 "integrity-c
166f0 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f  heck" command}</
16700 74 63 6c 3e 0a 3c 68 32 20 69 64 3d 69 6e 74 65  tcl>.<h2 id=inte
16710 67 63 68 65 63 6b 3e 54 68 65 20 22 69 6e 74 65  gcheck>The "inte
16720 67 72 69 74 79 2d 63 68 65 63 6b 22 20 63 6f 6d  grity-check" com
16730 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  mand</h2>..<p>. 
16740 20 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d   The "integrity-
16750 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 63  check" command c
16760 61 75 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20  auses SQLite to 
16770 72 65 61 64 20 61 6e 64 20 76 65 72 69 66 79 0a  read and verify.
16780 20 20 74 68 65 20 61 63 63 75 72 61 63 79 20 6f    the accuracy o
16790 66 20 61 6c 6c 20 69 6e 76 65 72 74 65 64 20 69  f all inverted i
167a0 6e 64 69 63 65 73 20 69 6e 20 61 6e 20 46 54 53  ndices in an FTS
167b0 33 2f 34 20 74 61 62 6c 65 20 62 79 20 63 6f 6d  3/4 table by com
167c0 70 61 72 69 6e 67 0a 20 20 74 68 6f 73 65 20 69  paring.  those i
167d0 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73 20  nverted indices 
167e0 61 67 61 69 6e 73 74 20 74 68 65 20 6f 72 69 67  against the orig
167f0 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 54 68  inal content. Th
16800 65 20 0a 20 20 22 69 6e 74 65 67 72 69 74 79 2d  e .  "integrity-
16810 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 73  check" command s
16820 69 6c 65 6e 74 6c 79 20 73 75 63 63 65 65 64 73  ilently succeeds
16830 20 69 66 20 74 68 65 20 69 6e 76 65 72 74 65 64   if the inverted
16840 0a 20 20 69 6e 64 69 63 65 73 20 61 72 65 20 61  .  indices are a
16850 6c 6c 20 6f 6b 2c 20 62 75 74 20 77 69 6c 6c 20  ll ok, but will 
16860 66 61 69 6c 20 77 69 74 68 20 61 6e 20 53 51 4c  fail with an SQL
16870 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
16880 72 0a 20 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  r.  if any probl
16890 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 0a  ems are found...
168a0 3c 70 3e 0a 20 20 54 68 65 20 22 69 6e 74 65 67  <p>.  The "integ
168b0 72 69 74 79 2d 63 68 65 63 6b 22 20 63 6f 6d 6d  rity-check" comm
168c0 61 6e 64 20 69 73 20 73 69 6d 69 6c 61 72 20 69  and is similar i
168d0 6e 20 63 6f 6e 63 65 70 74 20 74 6f 0a 20 5b 50  n concept to. [P
168e0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
168f0 63 68 65 63 6b 5d 2e 20 20 49 6e 20 61 20 77 6f  check].  In a wo
16900 72 6b 69 6e 67 20 73 79 73 74 65 6d 2c 20 74 68  rking system, th
16910 65 20 22 69 6e 74 65 67 72 69 74 79 2d 63 6f 6d  e "integrity-com
16920 6d 61 6e 64 22 0a 20 73 68 6f 75 6c 64 20 61 6c  mand". should al
16930 77 61 79 73 20 62 65 20 73 75 63 63 65 73 73 66  ways be successf
16940 75 6c 2e 20 20 50 6f 73 73 69 62 6c 65 20 63 61  ul.  Possible ca
16950 75 73 65 73 20 6f 66 20 69 6e 74 65 67 72 69 74  uses of integrit
16960 79 2d 63 68 65 63 6b 0a 20 66 61 69 6c 75 72 65  y-check. failure
16970 73 20 69 6e 63 6c 75 64 65 3a 0a 20 20 3c 75 6c  s include:.  <ul
16980 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20 61 70 70  >.  <li> The app
16990 6c 69 63 61 74 69 6f 6e 20 68 61 73 20 6d 61 64  lication has mad
169a0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
169b0 20 5b 46 54 53 20 73 68 61 64 6f 77 20 74 61 62   [FTS shadow tab
169c0 6c 65 73 5d 0a 20 20 20 20 20 20 20 64 69 72 65  les].       dire
169d0 63 74 6c 79 2c 20 77 69 74 68 6f 75 74 20 75 73  ctly, without us
169e0 69 6e 67 20 74 68 65 20 46 54 53 33 2f 34 20 76  ing the FTS3/4 v
169f0 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
16a00 75 73 69 6e 67 0a 20 20 20 20 20 20 20 74 68 65  using.       the
16a10 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 20 74   shadow tables t
16a20 6f 20 62 65 63 6f 6d 65 20 6f 75 74 20 6f 66 20  o become out of 
16a30 73 79 6e 63 20 77 69 74 68 20 65 61 63 68 20 6f  sync with each o
16a40 74 68 65 72 2e 0a 20 20 3c 6c 69 3e 20 55 73 69  ther..  <li> Usi
16a50 6e 67 20 74 68 65 20 5b 46 54 53 34 20 63 6f 6e  ng the [FTS4 con
16a60 74 65 6e 74 20 6f 70 74 69 6f 6e 5d 20 61 6e 64  tent option] and
16a70 20 66 61 69 6c 69 6e 67 20 74 6f 20 6d 61 6e 75   failing to manu
16a80 61 6c 6c 79 20 6b 65 65 70 0a 20 20 20 20 20 20  ally keep.      
16a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20   the content in 
16aa0 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 46 54  sync with the FT
16ab0 53 34 20 69 6e 76 65 72 74 65 64 20 69 6e 64 69  S4 inverted indi
16ac0 63 65 73 2e 0a 20 20 3c 6c 69 3e 20 42 75 67 73  ces..  <li> Bugs
16ad0 20 69 6e 20 74 68 65 20 46 54 53 33 2f 34 20 76   in the FTS3/4 v
16ae0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 28  irtual table.  (
16af0 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d 63  The "integrity-c
16b00 68 65 63 6b 22 0a 20 20 20 20 20 20 20 63 6f 6d  heck".       com
16b10 6d 61 6e 64 20 77 61 73 20 6f 72 69 67 69 6e 61  mand was origina
16b20 6c 20 63 6f 6e 63 65 69 76 65 64 20 61 73 20 70  l conceived as p
16b30 61 72 74 20 6f 66 20 74 68 65 20 74 65 73 74 20  art of the test 
16b40 73 75 69 74 65 0a 20 20 20 20 20 20 20 66 6f 72  suite.       for
16b50 20 46 54 53 33 2f 34 2e 29 0a 20 20 3c 6c 69 3e   FTS3/4.).  <li>
16b60 20 43 6f 72 72 75 70 74 69 6f 6e 20 74 6f 20 74   Corruption to t
16b70 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51  he underlying SQ
16b80 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
16b90 6c 65 2e 20 20 28 53 65 65 0a 20 20 20 20 20 20  le.  (See.      
16ba0 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f   documentation o
16bb0 6e 20 5b 68 6f 77 20 74 6f 20 63 6f 72 72 75 70  n [how to corrup
16bc0 74 5d 20 61 6e 64 20 53 51 4c 69 74 65 20 64 61  t] and SQLite da
16bd0 74 61 62 61 73 65 20 66 6f 72 0a 20 20 20 20 20  tabase for.     
16be0 20 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66    additional inf
16bf0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 20 20 3c 2f 75  ormation.).  </u
16c00 6c 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  l>..<tcl>hd_frag
16c10 6d 65 6e 74 20 2a 66 74 73 34 6d 65 72 67 65 63  ment *fts4mergec
16c20 6d 64 20 7b 46 54 53 34 20 22 6d 65 72 67 65 22  md {FTS4 "merge"
16c30 20 63 6f 6d 6d 61 6e 64 7d 20 7b 22 6d 65 72 67   command} {"merg
16c40 65 22 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c  e" command}</tcl
16c50 3e 0a 3c 68 32 20 69 64 3d 22 6d 65 72 67 65 63  >.<h2 id="mergec
16c60 6d 64 22 3e 54 68 65 20 22 6d 65 72 67 65 3d 58  md">The "merge=X
16c70 2c 59 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e  ,Y" command</h2>
16c80 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22 6d 65 72  ..<p>.  The "mer
16c90 67 65 3d 58 2c 59 22 20 63 6f 6d 6d 61 6e 64 20  ge=X,Y" command 
16ca0 28 77 68 65 72 65 20 58 20 61 6e 64 20 59 20 61  (where X and Y a
16cb0 72 65 20 69 6e 74 65 67 65 72 73 29 20 63 61 75  re integers) cau
16cc0 73 65 73 20 53 51 4c 69 74 65 0a 20 20 74 6f 20  ses SQLite.  to 
16cd0 64 6f 20 61 20 6c 69 6d 69 74 65 64 20 61 6d 6f  do a limited amo
16ce0 75 6e 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  unt of work towa
16cf0 72 64 20 6d 65 72 67 69 6e 67 20 74 68 65 20 76  rd merging the v
16d00 61 72 69 6f 75 73 20 69 6e 76 65 72 74 65 64 0a  arious inverted.
16d10 20 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20    index b-trees 
16d20 6f 66 20 61 6e 20 46 54 53 33 2f 34 20 74 61 62  of an FTS3/4 tab
16d30 6c 65 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  le together into
16d40 20 6f 6e 65 20 6c 61 72 67 65 20 62 2d 74 72 65   one large b-tre
16d50 65 2e 0a 20 20 54 68 65 20 58 20 76 61 6c 75 65  e..  The X value
16d60 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20 6e   is the target n
16d70 75 6d 62 65 72 20 6f 66 20 22 62 6c 6f 63 6b 73  umber of "blocks
16d80 22 20 74 6f 20 62 65 20 6d 65 72 67 65 64 2c 20  " to be merged, 
16d90 61 6e 64 20 59 20 69 73 0a 20 20 74 68 65 20 6d  and Y is.  the m
16da0 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
16db0 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 73   b-tree segments
16dc0 20 6f 6e 20 61 20 6c 65 76 65 6c 20 72 65 71 75   on a level requ
16dd0 69 72 65 64 20 62 65 66 6f 72 65 0a 20 20 6d 65  ired before.  me
16de0 72 67 69 6e 67 20 77 69 6c 6c 20 62 65 20 61 70  rging will be ap
16df0 70 6c 69 65 64 20 74 6f 20 74 68 61 74 20 6c 65  plied to that le
16e00 76 65 6c 2e 20 20 54 68 65 20 76 61 6c 75 65 20  vel.  The value 
16e10 6f 66 20 59 20 73 68 6f 75 6c 64 0a 20 20 62 65  of Y should.  be
16e20 20 62 65 74 77 65 65 6e 20 32 20 61 6e 64 20 31   between 2 and 1
16e30 36 20 77 69 74 68 20 61 20 72 65 63 6f 6d 6d 65  6 with a recomme
16e40 6e 64 65 64 20 76 61 6c 75 65 20 6f 66 20 38 2e  nded value of 8.
16e50 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 58    The value of X
16e60 0a 20 20 63 61 6e 20 62 65 20 61 6e 79 20 70 6f  .  can be any po
16e70 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 62  sitive integer b
16e80 75 74 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ut values on the
16e90 20 6f 72 64 65 72 20 6f 66 20 31 30 30 20 74 6f   order of 100 to
16ea0 20 33 30 30 0a 20 20 61 72 65 20 72 65 63 6f 6d   300.  are recom
16eb0 6d 65 6e 64 65 64 2e 0a 0a 3c 70 3e 0a 20 20 57  mended...<p>.  W
16ec0 68 65 6e 20 61 6e 20 46 54 53 20 74 61 62 6c 65  hen an FTS table
16ed0 20 61 63 63 75 6d 75 6c 61 74 65 73 20 31 36 20   accumulates 16 
16ee0 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 73 20  b-tree segments 
16ef0 61 74 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65  at the same leve
16f00 6c 2c 0a 20 20 74 68 65 20 6e 65 78 74 20 49 4e  l,.  the next IN
16f10 53 45 52 54 20 69 6e 74 6f 20 74 68 61 74 20 74  SERT into that t
16f20 61 62 6c 65 20 77 69 6c 6c 20 63 61 75 73 65 20  able will cause 
16f30 61 6c 6c 20 31 36 20 73 65 67 6d 65 6e 74 73 20  all 16 segments 
16f40 74 6f 20 62 65 0a 20 20 6d 65 72 67 65 64 20 69  to be.  merged i
16f50 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 2d 74  nto a single b-t
16f60 72 65 65 20 73 65 67 6d 65 6e 74 20 61 74 20 74  ree segment at t
16f70 68 65 20 6e 65 78 74 20 68 69 67 68 65 72 20 6c  he next higher l
16f80 65 76 65 6c 2e 20 20 54 68 65 0a 20 20 65 66 66  evel.  The.  eff
16f90 65 63 74 20 6f 66 20 74 68 65 73 65 20 6c 65 76  ect of these lev
16fa0 65 6c 20 6d 65 72 67 65 73 20 69 73 20 74 68 61  el merges is tha
16fb0 74 20 6d 6f 73 74 20 49 4e 53 45 52 54 73 20 69  t most INSERTs i
16fc0 6e 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65  nto an FTS table
16fd0 0a 20 20 61 72 65 20 76 65 72 79 20 66 61 73 74  .  are very fast
16fe0 20 61 6e 64 20 74 61 6b 65 20 6d 69 6e 69 6d 61   and take minima
16ff0 6c 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 61 6e  l memory, but an
17000 20 6f 63 63 61 73 69 6f 6e 61 6c 20 49 4e 53 45   occasional INSE
17010 52 54 20 69 73 0a 20 20 73 6c 6f 77 20 61 6e 64  RT is.  slow and
17020 20 67 65 6e 65 72 61 74 65 73 20 61 20 6c 61 72   generates a lar
17030 67 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  ge transaction b
17040 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 6e 65  ecause of the ne
17050 65 64 20 74 6f 0a 20 20 64 6f 20 6d 65 72 67 69  ed to.  do mergi
17060 6e 67 2e 20 54 68 69 73 20 72 65 73 75 6c 74 73  ng. This results
17070 20 69 6e 20 22 73 70 69 6b 79 22 20 70 65 72 66   in "spiky" perf
17080 6f 72 6d 61 6e 63 65 20 6f 66 20 49 4e 53 45 52  ormance of INSER
17090 54 73 2e 0a 0a 3c 70 3e 0a 20 20 54 6f 20 61 76  Ts...<p>.  To av
170a0 6f 69 64 20 73 70 69 6b 79 20 49 4e 53 45 52 54  oid spiky INSERT
170b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 61 6e   performance, an
170c0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e   application can
170d0 20 72 75 6e 20 74 68 65 0a 20 20 22 6d 65 72 67   run the.  "merg
170e0 65 3d 58 2c 59 22 20 63 6f 6d 6d 61 6e 64 20 70  e=X,Y" command p
170f0 65 72 69 6f 64 69 63 61 6c 6c 79 2c 20 70 6f 73  eriodically, pos
17100 73 69 62 6c 79 20 69 6e 20 61 6e 20 69 64 6c 65  sibly in an idle
17110 20 74 68 72 65 61 64 20 6f 72 0a 20 20 69 64 6c   thread or.  idl
17120 65 20 70 72 6f 63 65 73 73 2c 20 74 6f 20 65 6e  e process, to en
17130 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
17140 53 20 74 61 62 6c 65 20 6e 65 76 65 72 20 61 63  S table never ac
17150 63 75 6d 75 6c 61 74 65 73 0a 20 20 74 6f 6f 20  cumulates.  too 
17160 6d 61 6e 79 20 62 2d 74 72 65 65 20 73 65 67 6d  many b-tree segm
17170 65 6e 74 73 20 61 74 20 74 68 65 20 73 61 6d 65  ents at the same
17180 20 6c 65 76 65 6c 2e 20 20 49 4e 53 45 52 54 20   level.  INSERT 
17190 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 73 70  performance.  sp
171a0 69 6b 65 73 20 63 61 6e 20 67 65 6e 65 72 61 6c  ikes can general
171b0 6c 79 20 62 65 20 61 76 6f 69 64 65 64 2c 20 61  ly be avoided, a
171c0 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  nd performance o
171d0 66 20 46 54 53 33 2f 34 20 63 61 6e 20 62 65 0a  f FTS3/4 can be.
171e0 20 20 6d 61 78 69 6d 69 7a 65 64 2c 20 62 79 20    maximized, by 
171f0 72 75 6e 6e 69 6e 67 20 22 6d 65 72 67 65 3d 58  running "merge=X
17200 2c 59 22 20 61 66 74 65 72 20 65 76 65 72 79 20  ,Y" after every 
17210 66 65 77 20 74 68 6f 75 73 61 6e 64 0a 20 20 64  few thousand.  d
17220 6f 63 75 6d 65 6e 74 20 69 6e 73 65 72 74 73 2e  ocument inserts.
17230 20 20 45 61 63 68 20 22 6d 65 72 67 65 3d 58 2c    Each "merge=X,
17240 59 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20  Y" command will 
17250 72 75 6e 20 69 6e 20 61 20 73 65 70 61 72 61 74  run in a separat
17260 65 0a 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e.  transaction 
17270 28 75 6e 6c 65 73 73 20 74 68 65 79 20 61 72 65  (unless they are
17280 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
17290 72 20 75 73 69 6e 67 20 5b 42 45 47 49 4e 5d 2e  r using [BEGIN].
172a0 2e 2e 5b 43 4f 4d 4d 49 54 5d 2c 0a 20 20 6f 66  ..[COMMIT],.  of
172b0 20 63 6f 75 72 73 65 29 2e 20 20 54 68 65 20 74   course).  The t
172c0 72 61 6e 73 61 63 74 69 6f 6e 73 20 63 61 6e 20  ransactions can 
172d0 62 65 20 6b 65 70 74 20 73 6d 61 6c 6c 20 62 79  be kept small by
172e0 20 63 68 6f 6f 73 69 6e 67 20 61 20 76 61 6c 75   choosing a valu
172f0 65 0a 20 20 66 6f 72 20 58 20 69 6e 20 74 68 65  e.  for X in the
17300 20 72 61 6e 67 65 20 6f 66 20 31 30 30 20 74 6f   range of 100 to
17310 20 33 30 30 2e 20 20 54 68 65 20 69 64 6c 65 20   300.  The idle 
17320 74 68 72 65 61 64 20 74 68 61 74 20 69 73 20 72  thread that is r
17330 75 6e 6e 69 6e 67 0a 20 20 74 68 65 20 6d 65 72  unning.  the mer
17340 67 65 20 63 6f 6d 6d 61 6e 64 73 20 63 61 6e 20  ge commands can 
17350 6b 6e 6f 77 20 77 68 65 6e 20 69 74 20 69 73 20  know when it is 
17360 64 6f 6e 65 20 62 79 20 63 68 65 63 6b 69 6e 67  done by checking
17370 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
17380 20 20 69 6e 20 5b 73 71 6c 69 74 65 33 5f 74 6f    in [sqlite3_to
17390 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 5d 20 62  tal_changes()] b
173a0 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72 20  efore and after 
173b0 65 61 63 68 20 22 6d 65 72 67 65 3d 58 2c 59 22  each "merge=X,Y"
173c0 0a 20 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 73  .  command and s
173d0 74 6f 70 70 69 6e 67 20 74 68 65 20 6c 6f 6f 70  topping the loop
173e0 20 77 68 65 6e 20 74 68 65 20 64 69 66 66 65 72   when the differ
173f0 65 6e 63 65 20 64 72 6f 70 73 20 62 65 6c 6f 77  ence drops below
17400 20 74 77 6f 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66   two...<tcl>hd_f
17410 72 61 67 6d 65 6e 74 20 2a 66 74 73 34 61 75 74  ragment *fts4aut
17420 6f 6d 65 72 67 65 63 6d 64 20 7b 46 54 53 34 20  omergecmd {FTS4 
17430 22 61 75 74 6f 6d 65 72 67 65 22 20 63 6f 6d 6d  "automerge" comm
17440 61 6e 64 7d 20 5c 0a 20 20 20 20 20 20 20 20 20  and} \.         
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 20 20 20 20 7b 22 61 75 74 6f            {"auto
17470 6d 65 72 67 65 22 20 63 6f 6d 6d 61 6e 64 7d 3c  merge" command}<
17480 2f 74 63 6c 3e 0a 3c 68 32 20 69 64 3d 61 75 74  /tcl>.<h2 id=aut
17490 6f 6d 65 72 67 65 22 3e 54 68 65 20 22 61 75 74  omerge">The "aut
174a0 6f 6d 65 72 67 65 3d 4e 22 20 63 6f 6d 6d 61 6e  omerge=N" comman
174b0 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68  d</h2>..<p>.  Th
174c0 65 20 22 61 75 74 6f 6d 65 72 67 65 3d 4e 22 20  e "automerge=N" 
174d0 63 6f 6d 6d 61 6e 64 20 28 77 68 65 72 65 20 4e  command (where N
174e0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 62   is an integer b
174f0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 35 2c  etween 0 and 15,
17500 0a 20 20 69 6e 63 6c 75 73 69 76 65 29 20 69 73  .  inclusive) is
17510 20 75 73 65 64 20 74 6f 20 63 6f 6e 66 69 67 75   used to configu
17520 72 65 20 61 6e 20 46 54 53 33 2f 34 20 74 61 62  re an FTS3/4 tab
17530 6c 65 73 20 22 61 75 74 6f 6d 65 72 67 65 22 20  les "automerge" 
17540 70 61 72 61 6d 65 74 65 72 2c 0a 20 20 77 68 69  parameter,.  whi
17550 63 68 20 63 6f 6e 74 72 6f 6c 73 20 61 75 74 6f  ch controls auto
17560 6d 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61  matic incrementa
17570 6c 20 69 6e 76 65 72 74 65 64 20 69 6e 64 65 78  l inverted index
17580 20 6d 65 72 67 69 6e 67 2e 20 54 68 65 20 64 65   merging. The de
17590 66 61 75 6c 74 20 0a 20 20 61 75 74 6f 6d 65 72  fault .  automer
175a0 67 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 65 77  ge value for new
175b0 20 74 61 62 6c 65 73 20 69 73 20 30 2c 20 6d 65   tables is 0, me
175c0 61 6e 69 6e 67 20 74 68 61 74 20 61 75 74 6f 6d  aning that autom
175d0 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c  atic incremental
175e0 20 0a 20 20 6d 65 72 67 69 6e 67 20 69 73 20 63   .  merging is c
175f0 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61 62 6c  ompletely disabl
17600 65 64 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  ed. If the value
17610 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 65 72 67   of the automerg
17620 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 69 73  e parameter.  is
17630 20 6d 6f 64 69 66 69 65 64 20 75 73 69 6e 67 20   modified using 
17640 74 68 65 20 22 61 75 74 6f 6d 65 72 67 65 3d 4e  the "automerge=N
17650 22 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 20 6e  " command, the n
17660 65 77 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c  ew parameter val
17670 75 65 20 69 73 0a 20 20 73 74 6f 72 65 64 20 70  ue is.  stored p
17680 65 72 73 69 73 74 65 6e 74 6c 79 20 69 6e 20 74  ersistently in t
17690 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
176a0 69 73 20 75 73 65 64 20 62 79 20 61 6c 6c 20 73  is used by all s
176b0 75 62 73 65 71 75 65 6e 74 6c 79 0a 20 20 65 73  ubsequently.  es
176c0 74 61 62 6c 69 73 68 65 64 20 64 61 74 61 62 61  tablished databa
176d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
176e0 0a 3c 70 3e 0a 20 20 53 65 74 74 69 6e 67 20 74  .<p>.  Setting t
176f0 68 65 20 61 75 74 6f 6d 65 72 67 65 20 70 61 72  he automerge par
17700 61 6d 65 74 65 72 20 74 6f 20 61 20 6e 6f 6e 2d  ameter to a non-
17710 7a 65 72 6f 20 76 61 6c 75 65 20 65 6e 61 62 6c  zero value enabl
17720 65 73 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 69  es automatic.  i
17730 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 69  ncremental mergi
17740 6e 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ng. This causes 
17750 53 51 4c 69 74 65 20 74 6f 20 64 6f 20 61 20 73  SQLite to do a s
17760 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 69  mall amount of i
17770 6e 76 65 72 74 65 64 20 0a 20 20 69 6e 64 65 78  nverted .  index
17780 20 6d 65 72 67 69 6e 67 20 61 66 74 65 72 20 65   merging after e
17790 76 65 72 79 20 49 4e 53 45 52 54 20 6f 70 65 72  very INSERT oper
177a0 61 74 69 6f 6e 2e 20 54 68 65 20 61 6d 6f 75 6e  ation. The amoun
177b0 74 20 6f 66 20 6d 65 72 67 69 6e 67 20 0a 20 20  t of merging .  
177c0 70 65 72 66 6f 72 6d 65 64 20 69 73 20 64 65 73  performed is des
177d0 69 67 6e 65 64 20 73 6f 20 74 68 61 74 20 74 68  igned so that th
177e0 65 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20 6e  e FTS3/4 table n
177f0 65 76 65 72 20 72 65 61 63 68 65 73 20 61 20 70  ever reaches a p
17800 6f 69 6e 74 20 0a 20 20 77 68 65 72 65 20 69 74  oint .  where it
17810 20 68 61 73 20 31 36 20 73 65 67 6d 65 6e 74 73   has 16 segments
17820 20 61 74 20 74 68 65 20 73 61 6d 65 20 6c 65 76   at the same lev
17830 65 6c 20 61 6e 64 20 68 65 6e 63 65 20 68 61 73  el and hence has
17840 20 74 6f 20 64 6f 20 61 20 6c 61 72 67 65 20 0a   to do a large .
17850 20 20 6d 65 72 67 65 20 69 6e 20 6f 72 64 65 72    merge in order
17860 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 61 6e 20   to complete an 
17870 69 6e 73 65 72 74 2e 20 20 49 6e 20 6f 74 68 65  insert.  In othe
17880 72 20 77 6f 72 64 73 2c 20 61 75 74 6f 6d 61 74  r words, automat
17890 69 63 20 0a 20 20 69 6e 63 72 65 6d 65 6e 74 61  ic .  incrementa
178a0 6c 20 6d 65 72 67 69 6e 67 20 69 73 20 64 65 73  l merging is des
178b0 69 67 6e 65 64 20 74 6f 20 70 72 65 76 65 6e 74  igned to prevent
178c0 20 73 70 69 6b 79 20 49 4e 53 45 52 54 20 70 65   spiky INSERT pe
178d0 72 66 6f 72 6d 61 6e 63 65 2e 0a 0a 3c 70 3e 0a  rformance...<p>.
178e0 20 20 54 68 65 20 64 6f 77 6e 73 69 64 65 20 6f    The downside o
178f0 66 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 63 72  f automatic incr
17900 65 6d 65 6e 74 61 6c 20 6d 65 72 67 69 6e 67 20  emental merging 
17910 69 73 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  is that it makes
17920 0a 20 20 65 76 65 72 79 20 49 4e 53 45 52 54 2c  .  every INSERT,
17930 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
17940 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ETE operation on
17950 20 61 6e 20 46 54 53 33 2f 34 20 74 61 62 6c 65   an FTS3/4 table
17960 20 72 75 6e 0a 20 20 61 20 6c 69 74 74 6c 65 20   run.  a little 
17970 73 6c 6f 77 65 72 2c 20 73 69 6e 63 65 20 65 78  slower, since ex
17980 74 72 61 20 74 69 6d 65 20 6d 75 73 74 20 62 65  tra time must be
17990 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
179a0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 6d 65  incremental.  me
179b0 72 67 65 2e 20 20 46 6f 72 20 6d 61 78 69 6d 75  rge.  For maximu
179c0 6d 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 69  m performance, i
179d0 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
179e0 20 74 68 61 74 20 61 70 70 6c 69 63 61 74 69 6f   that applicatio
179f0 6e 73 0a 20 20 64 69 73 61 62 6c 65 20 61 75 74  ns.  disable aut
17a00 6f 6d 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74  omatic increment
17a10 61 6c 20 6d 65 72 67 65 20 61 6e 64 20 69 6e 73  al merge and ins
17a20 74 65 61 64 20 75 73 65 20 74 68 65 20 0a 20 20  tead use the .  
17a30 5b 22 6d 65 72 67 65 22 20 63 6f 6d 6d 61 6e 64  ["merge" command
17a40 5d 20 69 6e 20 61 6e 20 69 64 6c 65 20 70 72 6f  ] in an idle pro
17a50 63 65 73 73 20 74 6f 20 6b 65 65 70 20 74 68 65  cess to keep the
17a60 20 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65   inverted indice
17a70 73 0a 20 20 77 65 6c 6c 20 6d 65 72 67 65 64 2e  s.  well merged.
17a80 20 20 42 75 74 20 69 66 20 74 68 65 20 73 74 72    But if the str
17a90 75 63 74 75 72 65 20 6f 66 20 61 6e 20 61 70 70  ucture of an app
17aa0 6c 69 63 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  lication does no
17ab0 74 20 65 61 73 69 6c 79 0a 20 20 61 6c 6c 6f 77  t easily.  allow
17ac0 20 66 6f 72 20 69 64 6c 65 20 70 72 6f 63 65 73   for idle proces
17ad0 73 65 73 2c 20 74 68 65 20 75 73 65 20 6f 66 20  ses, the use of 
17ae0 61 75 74 6f 6d 61 74 69 63 20 69 6e 63 72 65 6d  automatic increm
17af0 65 6e 74 61 6c 20 6d 65 72 67 65 20 69 73 0a 20  ental merge is. 
17b00 20 61 20 76 65 72 79 20 72 65 61 73 6f 6e 61 62   a very reasonab
17b10 6c 65 20 66 61 6c 6c 62 61 63 6b 20 73 6f 6c 75  le fallback solu
17b20 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  tion...<p>.  The
17b30 20 61 63 74 75 61 6c 20 76 61 6c 75 65 20 6f 66   actual value of
17b40 20 74 68 65 20 61 75 74 6f 6d 65 72 67 65 20 70   the automerge p
17b50 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
17b60 6e 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  nes the number o
17b70 66 0a 20 20 69 6e 64 65 78 20 73 65 67 6d 65 6e  f.  index segmen
17b80 74 73 20 6d 65 72 67 65 64 20 73 69 6d 75 6c 74  ts merged simult
17b90 61 6e 65 6f 75 73 6c 79 20 62 79 20 61 6e 20 61  aneously by an a
17ba0 75 74 6f 6d 61 74 69 63 20 69 6e 76 65 72 74 65  utomatic inverte
17bb0 64 20 69 6e 64 65 78 0a 20 20 6d 65 72 67 65 2e  d index.  merge.
17bc0 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
17bd0 20 73 65 74 20 74 6f 20 4e 2c 20 74 68 65 20 73   set to N, the s
17be0 79 73 74 65 6d 20 77 61 69 74 73 20 75 6e 74 69  ystem waits unti
17bf0 6c 20 74 68 65 72 65 20 61 72 65 20 61 74 0a 20  l there are at. 
17c00 20 6c 65 61 73 74 20 4e 20 73 65 67 6d 65 6e 74   least N segment
17c10 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65  s on a single le
17c20 76 65 6c 20 62 65 66 6f 72 65 20 62 65 67 69 6e  vel before begin
17c30 6e 69 6e 67 20 74 6f 20 69 6e 63 72 65 6d 65 6e  ning to incremen
17c40 74 61 6c 6c 79 0a 20 20 6d 65 72 67 65 20 74 68  tally.  merge th
17c50 65 6d 2e 20 53 65 74 74 69 6e 67 20 61 20 6c 6f  em. Setting a lo
17c60 77 65 72 20 76 61 6c 75 65 20 6f 66 20 4e 20 63  wer value of N c
17c70 61 75 73 65 73 20 73 65 67 6d 65 6e 74 73 20 74  auses segments t
17c80 6f 20 62 65 20 6d 65 72 67 65 64 20 6d 6f 72 65  o be merged more
17c90 0a 20 20 71 75 69 63 6b 6c 79 2c 20 77 68 69 63  .  quickly, whic
17ca0 68 20 6d 61 79 20 73 70 65 65 64 20 75 70 20 66  h may speed up f
17cb0 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
17cc0 20 61 6e 64 2c 20 69 66 20 74 68 65 20 77 6f 72   and, if the wor
17cd0 6b 6c 6f 61 64 20 0a 20 20 63 6f 6e 74 61 69 6e  kload .  contain
17ce0 73 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  s UPDATE or DELE
17cf0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 73  TE operations as
17d00 20 77 65 6c 6c 20 61 73 20 49 4e 53 45 52 54 73   well as INSERTs
17d10 2c 20 72 65 64 75 63 65 20 74 68 65 20 73 70 61  , reduce the spa
17d20 63 65 0a 20 20 6f 6e 20 64 69 73 6b 20 63 6f 6e  ce.  on disk con
17d30 73 75 6d 65 64 20 62 79 20 74 68 65 20 66 75 6c  sumed by the ful
17d40 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 48 6f  l-text index. Ho
17d50 77 65 76 65 72 2c 20 69 74 20 61 6c 73 6f 20 69  wever, it also i
17d60 6e 63 72 65 61 73 65 73 20 74 68 65 0a 20 20 61  ncreases the.  a
17d70 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 77 72  mount of data wr
17d80 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 0a  itten to disk...
17d90 3c 70 3e 0a 20 20 46 6f 72 20 67 65 6e 65 72 61  <p>.  For genera
17da0 6c 20 75 73 65 20 69 6e 20 63 61 73 65 73 20 77  l use in cases w
17db0 68 65 72 65 20 74 68 65 20 77 6f 72 6b 6c 6f 61  here the workloa
17dc0 64 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 20 55  d contains few U
17dd0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 0a  PDATE or DELETE.
17de0 20 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 61 20    operations, a 
17df0 67 6f 6f 64 20 63 68 6f 69 63 65 20 66 6f 72 20  good choice for 
17e00 61 75 74 6f 6d 65 72 67 65 20 69 73 20 38 2e 20  automerge is 8. 
17e10 49 66 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 20  If the workload 
17e20 63 6f 6e 74 61 69 6e 73 0a 20 20 6d 61 6e 79 20  contains.  many 
17e30 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
17e40 20 63 6f 6d 6d 61 6e 64 73 2c 20 0a 20 20 6f 72   commands, .  or
17e50 20 69 66 20 71 75 65 72 79 20 73 70 65 65 64 20   if query speed 
17e60 69 73 20 61 20 63 6f 6e 63 65 72 6e 2c 20 69 74  is a concern, it
17e70 20 6d 61 79 20 62 65 20 61 64 76 61 6e 74 61 67   may be advantag
17e80 65 6f 75 73 20 74 6f 20 72 65 64 75 63 65 20 61  eous to reduce a
17e90 75 74 6f 6d 65 72 67 65 0a 20 20 74 6f 20 32 2e  utomerge.  to 2.
17ea0 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 72 65 61 73  ..<p>.  For reas
17eb0 6f 6e 73 20 6f 66 20 62 61 63 6b 77 61 72 64 73  ons of backwards
17ec0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2c 20   compatibility, 
17ed0 74 68 65 20 22 61 75 74 6f 6d 65 72 67 65 3d 31  the "automerge=1
17ee0 22 20 63 6f 6d 6d 61 6e 64 20 73 65 74 73 0a 20  " command sets. 
17ef0 20 74 68 65 20 61 75 74 6f 6d 65 72 67 65 20 70   the automerge p
17f00 61 72 61 6d 65 74 65 72 20 74 6f 20 38 2c 20 6e  arameter to 8, n
17f10 6f 74 20 31 20 28 61 20 76 61 6c 75 65 20 6f 66  ot 1 (a value of
17f20 20 31 20 77 6f 75 6c 64 20 6d 61 6b 65 20 6e 6f   1 would make no
17f30 20 73 65 6e 73 65 20 0a 20 20 61 6e 79 77 61 79   sense .  anyway
17f40 2c 20 61 73 20 6d 65 72 67 69 6e 67 20 64 61 74  , as merging dat
17f50 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  a from a single 
17f60 73 65 67 6d 65 6e 74 20 69 73 20 61 20 6e 6f 2d  segment is a no-
17f70 6f 70 29 2e 0a 0a 0a 3c 68 31 20 69 64 3d 74 6f  op)....<h1 id=to
17f80 6b 65 6e 69 7a 65 72 20 74 61 67 73 3d 22 74 6f  kenizer tags="to
17f90 6b 65 6e 69 7a 65 72 22 3e 54 6f 6b 65 6e 69 7a  kenizer">Tokeniz
17fa0 65 72 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  ers</h1>..<p>.  
17fb0 41 6e 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72  An FTS tokenizer
17fc0 20 69 73 20 61 20 73 65 74 20 6f 66 20 72 75 6c   is a set of rul
17fd0 65 73 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e  es for extractin
17fe0 67 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 20 64  g terms from a d
17ff0 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62 61  ocument .  or ba
18000 73 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78  sic FTS full-tex
18010 74 20 71 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20  t query. ..<p>. 
18020 20 55 6e 6c 65 73 73 20 61 20 73 70 65 63 69 66   Unless a specif
18030 69 63 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20  ic tokenizer is 
18040 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
18050 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
18060 0a 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  .  VIRTUAL TABLE
18070 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
18080 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 46 54  to create the FT
18090 53 20 74 61 62 6c 65 2c 20 74 68 65 20 64 65 66  S table, the def
180a0 61 75 6c 74 20 0a 20 20 74 6f 6b 65 6e 69 7a 65  ault .  tokenize
180b0 72 2c 20 22 73 69 6d 70 6c 65 22 2c 20 69 73 20  r, "simple", is 
180c0 75 73 65 64 2e 20 54 68 65 20 73 69 6d 70 6c 65  used. The simple
180d0 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72 61   tokenizer extra
180e0 63 74 73 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a  cts tokens from.
180f0 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20    a document or 
18100 62 61 73 69 63 20 46 54 53 20 66 75 6c 6c 2d 74  basic FTS full-t
18110 65 78 74 20 71 75 65 72 79 20 61 63 63 6f 72 64  ext query accord
18120 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ing to the follo
18130 77 69 6e 67 20 0a 20 20 72 75 6c 65 73 3a 0a 0a  wing .  rules:..
18140 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41  <ul>.  <li><p> A
18150 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6e 74 69   term is a conti
18160 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f  guous sequence o
18170 66 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61  f eligible chara
18180 63 74 65 72 73 2c 20 77 68 65 72 65 20 0a 20 20  cters, where .  
18190 20 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61    eligible chara
181a0 63 74 65 72 73 20 61 72 65 20 61 6c 6c 20 61 6c  cters are all al
181b0 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61  phanumeric chara
181c0 63 74 65 72 73 20 61 6e 64 20 61 6c 6c 20 63 68  cters and all ch
181d0 61 72 61 63 74 65 72 73 20 77 69 74 68 0a 20 20  aracters with.  
181e0 20 20 55 6e 69 63 6f 64 65 20 63 6f 64 65 70 6f    Unicode codepo
181f0 69 6e 74 20 76 61 6c 75 65 73 20 67 72 65 61 74  int values great
18200 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
18210 20 74 6f 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c   to 128..    All
18220 20 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72   other character
18230 73 20 61 72 65 0a 20 20 20 20 64 69 73 63 61 72  s are.    discar
18240 64 65 64 20 77 68 65 6e 20 73 70 6c 69 74 74 69  ded when splitti
18250 6e 67 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e  ng a document in
18260 74 6f 20 74 65 72 6d 73 2e 20 54 68 65 69 72 20  to terms. Their 
18270 6f 6e 6c 79 20 63 6f 6e 74 72 69 62 75 74 69 6f  only contributio
18280 6e 20 69 73 0a 20 20 20 20 74 6f 20 73 65 70 61  n is.    to sepa
18290 72 61 74 65 20 61 64 6a 61 63 65 6e 74 20 74 65  rate adjacent te
182a0 72 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20  rms...  <li><p> 
182b0 41 6c 6c 20 75 70 70 65 72 63 61 73 65 20 63 68  All uppercase ch
182c0 61 72 61 63 74 65 72 73 20 77 69 74 68 69 6e 20  aracters within 
182d0 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65 20  the ASCII range 
182e0 28 55 6e 69 63 6f 64 65 20 63 6f 64 65 70 6f 69  (Unicode codepoi
182f0 6e 74 73 0a 20 20 20 20 6c 65 73 73 20 74 68 61  nts.    less tha
18300 6e 20 31 32 38 29 2c 20 61 72 65 20 74 72 61 6e  n 128), are tran
18310 73 66 6f 72 6d 65 64 20 74 6f 20 74 68 65 69 72  sformed to their
18320 20 6c 6f 77 65 72 63 61 73 65 20 65 71 75 69 76   lowercase equiv
18330 61 6c 65 6e 74 73 20 61 73 20 70 61 72 74 0a 20  alents as part. 
18340 20 20 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69     of the tokeni
18350 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  zation process. 
18360 54 68 75 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20  Thus, full-text 
18370 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20  queries are.    
18380 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
18390 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
183a0 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72  simple tokenizer
183b0 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46  ..</ul>..<p>.  F
183c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
183d0 20 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74   a document cont
183e0 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20  aining the text 
183f0 22 52 69 67 68 74 20 6e 6f 77 2c 20 74 68 65 79  "Right now, they
18400 27 72 65 20 76 65 72 79 0a 20 20 66 72 75 73 74  're very.  frust
18410 72 61 74 65 64 2e 22 2c 20 74 68 65 20 74 65 72  rated.", the ter
18420 6d 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ms extracted fro
18430 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 61  m the document a
18440 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
18450 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  .  full-text ind
18460 65 78 20 61 72 65 2c 20 69 6e 20 6f 72 64 65 72  ex are, in order
18470 2c 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65  , "right now the
18480 79 20 72 65 20 76 65 72 79 20 66 72 75 73 74 72  y re very frustr
18490 61 74 65 64 22 2e 20 53 75 63 68 0a 20 20 61 20  ated". Such.  a 
184a0 64 6f 63 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d  document would m
184b0 61 74 63 68 20 61 20 66 75 6c 6c 2d 74 65 78 74  atch a full-text
184c0 20 71 75 65 72 79 20 73 75 63 68 20 61 73 20 22   query such as "
184d0 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65  MATCH 'Frustrate
184e0 64 27 22 2c 20 0a 20 20 61 73 20 74 68 65 20 73  d'", .  as the s
184f0 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20  imple tokenizer 
18500 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 74  transforms the t
18510 65 72 6d 20 69 6e 20 74 68 65 20 71 75 65 72 79  erm in the query
18520 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 0a 20 20   to lowercase.  
18530 62 65 66 6f 72 65 20 73 65 61 72 63 68 69 6e 67  before searching
18540 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
18550 6e 64 65 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20  ndex...<p>.  As 
18560 77 65 6c 6c 20 61 73 20 74 68 65 20 22 73 69 6d  well as the "sim
18570 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  ple" tokenizer, 
18580 74 68 65 20 46 54 53 20 73 6f 75 72 63 65 20 63  the FTS source c
18590 6f 64 65 20 66 65 61 74 75 72 65 73 20 61 20 74  ode features a t
185a0 6f 6b 65 6e 69 7a 65 72 20 0a 20 20 74 68 61 74  okenizer .  that
185b0 20 75 73 65 73 20 74 68 65 20 3c 61 20 68 72 65   uses the <a hre
185c0 66 3d 22 68 74 74 70 3a 2f 2f 74 61 72 74 61 72  f="http://tartar
185d0 75 73 2e 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50  us.org/~martin/P
185e0 6f 72 74 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50  orterStemmer/">P
185f0 6f 72 74 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e  orter .  Stemmin
18600 67 20 61 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e  g algorithm</a>.
18610 20 54 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20   This tokenizer 
18620 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 72 75  uses the same ru
18630 6c 65 73 20 74 6f 20 73 65 70 61 72 61 74 65 0a  les to separate.
18640 20 20 74 68 65 20 69 6e 70 75 74 20 64 6f 63 75    the input docu
18650 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 20  ment into terms 
18660 69 6e 63 6c 75 64 69 6e 67 20 66 6f 6c 64 69 6e  including foldin
18670 67 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 74 6f  g all terms into
18680 20 6c 6f 77 65 72 20 63 61 73 65 2c 0a 20 20 62   lower case,.  b
18690 75 74 20 61 6c 73 6f 20 75 73 65 73 20 74 68 65  ut also uses the
186a0 20 50 6f 72 74 65 72 20 53 74 65 6d 6d 69 6e 67   Porter Stemming
186b0 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 72 65   algorithm to re
186c0 64 75 63 65 20 72 65 6c 61 74 65 64 20 45 6e 67  duce related Eng
186d0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 20 20  lish language.  
186e0 77 6f 72 64 73 20 74 6f 20 61 20 63 6f 6d 6d 6f  words to a commo
186f0 6e 20 72 6f 6f 74 2e 20 46 6f 72 20 65 78 61 6d  n root. For exam
18700 70 6c 65 2c 20 75 73 69 6e 67 20 74 68 65 20 73  ple, using the s
18710 61 6d 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65  ame input docume
18720 6e 74 20 61 73 20 69 6e 20 74 68 65 0a 20 20 70  nt as in the.  p
18730 61 72 61 67 72 61 70 68 20 61 62 6f 76 65 2c 20  aragraph above, 
18740 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
18750 69 7a 65 72 20 65 78 74 72 61 63 74 73 20 74 68  izer extracts th
18760 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65  e following toke
18770 6e 73 3a 0a 20 20 22 72 69 67 68 74 20 6e 6f 77  ns:.  "right now
18780 20 74 68 65 69 20 76 65 72 69 20 66 72 75 73 74   thei veri frust
18790 72 61 74 22 2e 20 45 76 65 6e 20 74 68 6f 75 67  rat". Even thoug
187a0 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  h some of these 
187b0 74 65 72 6d 73 20 61 72 65 20 6e 6f 74 20 65 76  terms are not ev
187c0 65 6e 0a 20 20 45 6e 67 6c 69 73 68 20 77 6f 72  en.  English wor
187d0 64 73 2c 20 69 6e 20 73 6f 6d 65 20 63 61 73 65  ds, in some case
187e0 73 20 75 73 69 6e 67 20 74 68 65 6d 20 74 6f 20  s using them to 
187f0 62 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 2d 74  build the full-t
18800 65 78 74 20 69 6e 64 65 78 20 69 73 20 6d 6f 72  ext index is mor
18810 65 0a 20 20 75 73 65 66 75 6c 20 74 68 61 6e 20  e.  useful than 
18820 74 68 65 20 6d 6f 72 65 20 69 6e 74 65 6c 6c 69  the more intelli
18830 67 69 62 6c 65 20 6f 75 74 70 75 74 20 70 72 6f  gible output pro
18840 64 75 63 65 64 20 62 79 20 74 68 65 20 73 69 6d  duced by the sim
18850 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20  ple tokenizer.. 
18860 20 55 73 69 6e 67 20 74 68 65 20 70 6f 72 74 65   Using the porte
18870 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65  r tokenizer, the
18880 20 64 6f 63 75 6d 65 6e 74 20 6e 6f 74 20 6f 6e   document not on
18890 6c 79 20 6d 61 74 63 68 65 73 20 66 75 6c 6c 2d  ly matches full-
188a0 74 65 78 74 20 71 75 65 72 69 65 73 0a 20 20 73  text queries.  s
188b0 75 63 68 20 61 73 20 22 4d 41 54 43 48 20 27 46  uch as "MATCH 'F
188c0 72 75 73 74 72 61 74 65 64 27 22 2c 20 62 75 74  rustrated'", but
188d0 20 61 6c 73 6f 20 71 75 65 72 69 65 73 20 73 75   also queries su
188e0 63 68 20 61 73 20 22 4d 41 54 43 48 20 27 46 72  ch as "MATCH 'Fr
188f0 75 73 74 72 61 74 69 6f 6e 27 22 2c 0a 20 20 61  ustration'",.  a
18900 73 20 74 68 65 20 74 65 72 6d 20 22 46 72 75 73  s the term "Frus
18910 74 72 61 74 69 6f 6e 22 20 69 73 20 72 65 64 75  tration" is redu
18920 63 65 64 20 62 79 20 74 68 65 20 50 6f 72 74 65  ced by the Porte
18930 72 20 73 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69  r stemmer algori
18940 74 68 6d 20 74 6f 20 0a 20 20 22 66 72 75 73 74  thm to .  "frust
18950 72 61 74 22 20 2d 20 6a 75 73 74 20 61 73 20 22  rat" - just as "
18960 46 72 75 73 74 72 61 74 65 64 22 20 69 73 2e 20  Frustrated" is. 
18970 53 6f 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 74  So, when using t
18980 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69  he porter tokeni
18990 7a 65 72 2c 0a 20 20 46 54 53 20 69 73 20 61 62  zer,.  FTS is ab
189a0 6c 65 20 74 6f 20 66 69 6e 64 20 6e 6f 74 20 6a  le to find not j
189b0 75 73 74 20 65 78 61 63 74 20 6d 61 74 63 68 65  ust exact matche
189c0 73 20 66 6f 72 20 71 75 65 72 69 65 64 20 74 65  s for queried te
189d0 72 6d 73 2c 20 62 75 74 20 6d 61 74 63 68 65 73  rms, but matches
189e0 0a 20 20 61 67 61 69 6e 73 74 20 73 69 6d 69 6c  .  against simil
189f0 61 72 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ar English langu
18a00 61 67 65 20 74 65 72 6d 73 2e 20 46 6f 72 20 6d  age terms. For m
18a10 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
18a20 6f 6e 20 74 68 65 20 0a 20 20 50 6f 72 74 65 72  on the .  Porter
18a30 20 53 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74   Stemmer algorit
18a40 68 6d 2c 20 70 6c 65 61 73 65 20 72 65 66 65 72  hm, please refer
18a50 20 74 6f 20 74 68 65 20 70 61 67 65 20 6c 69 6e   to the page lin
18a60 6b 65 64 20 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a  ked above...<p>.
18a70 20 20 45 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74    Example illust
18a80 72 61 74 69 6e 67 20 74 68 65 20 64 69 66 66 65  rating the diffe
18a90 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
18aa0 65 20 22 73 69 6d 70 6c 65 22 20 61 6e 64 20 22  e "simple" and "
18ab0 70 6f 72 74 65 72 22 0a 20 20 74 6f 6b 65 6e 69  porter".  tokeni
18ac0 7a 65 72 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  zers:..<codebloc
18ad0 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  k>.  <i>-- Creat
18ae0 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  e a table using 
18af0 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e  the simple token
18b00 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 61 20 64  izer. Insert a d
18b10 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e  ocument into it.
18b20 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
18b30 52 54 55 41 4c 20 54 41 42 4c 45 20 73 69 6d 70  RTUAL TABLE simp
18b40 6c 65 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f  le USING fts3(to
18b50 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a  kenize=simple);.
18b60 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 69    INSERT INTO si
18b70 6d 70 6c 65 20 56 41 4c 55 45 53 28 27 52 69 67  mple VALUES('Rig
18b80 68 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20  ht now they''re 
18b90 76 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27  very frustrated'
18ba0 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  );..  <i>-- The 
18bb0 66 69 72 73 74 20 6f 66 20 74 68 65 20 66 6f 6c  first of the fol
18bc0 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69  lowing two queri
18bd0 65 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 64  es matches the d
18be0 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69  ocument stored i
18bf0 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
18c00 62 6c 65 20 22 73 69 6d 70 6c 65 22 2e 20 54 68  ble "simple". Th
18c10 65 20 73 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f  e second does no
18c20 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  t.</i>.  SELECT 
18c30 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48  * FROM simple WH
18c40 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48  ERE simple MATCH
18c50 20 27 46 72 75 73 74 72 61 74 65 64 27 3b 0a 20   'Frustrated';. 
18c60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
18c70 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70  imple WHERE simp
18c80 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73 74 72  le MATCH 'Frustr
18c90 61 74 69 6f 6e 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  ation';..  <i>--
18ca0 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   Create a table 
18cb0 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72  using the porter
18cc0 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65   tokenizer. Inse
18cd0 72 74 20 74 68 65 20 73 61 6d 65 20 64 6f 63 75  rt the same docu
18ce0 6d 65 6e 74 20 69 6e 74 6f 20 69 74 3c 2f 69 3e  ment into it</i>
18cf0 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
18d00 4c 20 54 41 42 4c 45 20 70 6f 72 74 65 72 20 55  L TABLE porter U
18d10 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69  SING fts3(tokeni
18d20 7a 65 3d 70 6f 72 74 65 72 29 3b 0a 20 20 49 4e  ze=porter);.  IN
18d30 53 45 52 54 20 49 4e 54 4f 20 70 6f 72 74 65 72  SERT INTO porter
18d40 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e   VALUES('Right n
18d50 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72 79  ow they''re very
18d60 20 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a 0a   frustrated');..
18d70 20 20 3c 69 3e 2d 2d 20 42 6f 74 68 20 6f 66 20    <i>-- Both of 
18d80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
18d90 65 72 69 65 73 20 6d 61 74 63 68 20 74 68 65 20  eries match the 
18da0 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20  document stored 
18db0 69 6e 20 74 61 62 6c 65 20 22 70 6f 72 74 65 72  in table "porter
18dc0 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
18dd0 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20 57 48  * FROM porter WH
18de0 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54 43 48  ERE porter MATCH
18df0 20 27 46 72 75 73 74 72 61 74 65 64 27 3b 0a 20   'Frustrated';. 
18e00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
18e10 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f 72 74  orter WHERE port
18e20 65 72 20 4d 41 54 43 48 20 27 46 72 75 73 74 72  er MATCH 'Frustr
18e30 61 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c  ation';.</codebl
18e40 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74  ock>..<p>.  If t
18e50 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  his extension is
18e60 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
18e70 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
18e80 5f 49 43 55 20 70 72 65 2d 70 72 6f 63 65 73 73  _ICU pre-process
18e90 6f 72 0a 20 20 73 79 6d 62 6f 6c 20 64 65 66 69  or.  symbol defi
18ea0 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ned, then there 
18eb0 65 78 69 73 74 73 20 61 20 62 75 69 6c 74 2d 69  exists a built-i
18ec0 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65  n tokenizer name
18ed0 64 20 22 69 63 75 22 0a 20 20 69 6d 70 6c 65 6d  d "icu".  implem
18ee0 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  ented using the 
18ef0 49 43 55 20 6c 69 62 72 61 72 79 2e 20 54 68 65  ICU library. The
18f00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
18f10 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20 20  passed to the.  
18f20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f 64  xCreate() method
18f30 20 28 73 65 65 20 66 74 73 33 5f 74 6f 6b 65 6e   (see fts3_token
18f40 69 7a 65 72 2e 68 29 20 6f 66 20 74 68 69 73 20  izer.h) of this 
18f50 74 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20 62 65  tokenizer may be
18f60 0a 20 20 61 6e 20 49 43 55 20 6c 6f 63 61 6c 65  .  an ICU locale
18f70 20 69 64 65 6e 74 69 66 69 65 72 2e 20 46 6f 72   identifier. For
18f80 20 65 78 61 6d 70 6c 65 20 22 74 72 5f 54 52 22   example "tr_TR"
18f90 20 66 6f 72 20 54 75 72 6b 69 73 68 20 61 73 20   for Turkish as 
18fa0 75 73 65 64 0a 20 20 69 6e 20 54 75 72 6b 65 79  used.  in Turkey
18fb0 2c 20 6f 72 20 22 65 6e 5f 41 55 22 20 66 6f 72  , or "en_AU" for
18fc0 20 45 6e 67 6c 69 73 68 20 61 73 20 75 73 65 64   English as used
18fd0 20 69 6e 20 41 75 73 74 72 61 6c 69 61 2e 20 46   in Australia. F
18fe0 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  or example:..<co
18ff0 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 43 52 45  deblock>.    CRE
19000 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
19010 45 20 74 68 61 69 5f 74 65 78 74 20 55 53 49 4e  E thai_text USIN
19020 47 20 66 74 73 33 28 74 65 78 74 2c 20 74 6f 6b  G fts3(text, tok
19030 65 6e 69 7a 65 3d 69 63 75 20 74 68 5f 54 48 29  enize=icu th_TH)
19040 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
19050 70 3e 0a 20 20 54 68 65 20 49 43 55 20 74 6f 6b  p>.  The ICU tok
19060 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74  enizer implement
19070 61 74 69 6f 6e 20 69 73 20 76 65 72 79 20 73 69  ation is very si
19080 6d 70 6c 65 2e 20 49 74 20 73 70 6c 69 74 73 20  mple. It splits 
19090 74 68 65 20 69 6e 70 75 74 0a 20 20 74 65 78 74  the input.  text
190a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
190b0 65 20 49 43 55 20 72 75 6c 65 73 20 66 6f 72 20  e ICU rules for 
190c0 66 69 6e 64 69 6e 67 20 77 6f 72 64 20 62 6f 75  finding word bou
190d0 6e 64 61 72 69 65 73 20 61 6e 64 20 64 69 73 63  ndaries and disc
190e0 61 72 64 73 0a 20 20 61 6e 79 20 74 6f 6b 65 6e  ards.  any token
190f0 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20 65  s that consist e
19100 6e 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65  ntirely of white
19110 2d 73 70 61 63 65 2e 20 54 68 69 73 20 6d 61 79  -space. This may
19120 20 62 65 20 73 75 69 74 61 62 6c 65 0a 20 20 66   be suitable.  f
19130 6f 72 20 73 6f 6d 65 20 61 70 70 6c 69 63 61 74  or some applicat
19140 69 6f 6e 73 20 69 6e 20 73 6f 6d 65 20 6c 6f 63  ions in some loc
19150 61 6c 65 73 2c 20 62 75 74 20 6e 6f 74 20 61 6c  ales, but not al
19160 6c 2e 20 49 66 20 6d 6f 72 65 20 63 6f 6d 70 6c  l. If more compl
19170 65 78 0a 20 20 70 72 6f 63 65 73 73 69 6e 67 20  ex.  processing 
19180 69 73 20 72 65 71 75 69 72 65 64 2c 20 66 6f 72  is required, for
19190 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6d 70 6c   example to impl
191a0 65 6d 65 6e 74 20 73 74 65 6d 6d 69 6e 67 20 6f  ement stemming o
191b0 72 0a 20 20 64 69 73 63 61 72 64 20 70 75 6e 63  r.  discard punc
191c0 74 75 61 74 69 6f 6e 2c 20 74 68 69 73 20 63 61  tuation, this ca
191d0 6e 20 62 65 20 64 6f 6e 65 20 62 79 20 63 72 65  n be done by cre
191e0 61 74 69 6e 67 20 61 20 74 6f 6b 65 6e 69 7a 65  ating a tokenize
191f0 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  r.  implementati
19200 6f 6e 20 74 68 61 74 20 75 73 65 73 20 74 68 65  on that uses the
19210 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65 72 20 61   ICU tokenizer a
19220 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 69 6d  s part of its im
19230 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c  plementation...<
19240 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20  tcl>hd_fragment 
19250 75 6e 69 63 6f 64 65 36 31 20 75 6e 69 63 6f 64  unicode61 unicod
19260 65 36 31 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20  e61</tcl>.<p>.  
19270 54 68 65 20 22 75 6e 69 63 6f 64 65 36 31 22 20  The "unicode61" 
19280 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 61 76 61  tokenizer is ava
19290 69 6c 61 62 6c 65 20 62 65 67 69 6e 6e 69 6e 67  ilable beginning
192a0 20 77 69 74 68 20 53 51 4c 69 74 65 20 5b 76 65   with SQLite [ve
192b0 72 73 69 6f 6e 20 33 2e 37 2e 31 33 5d 0a 20 20  rsion 3.7.13].  
192c0 28 5b 64 61 74 65 6f 66 3a 33 2e 37 2e 31 33 5d  ([dateof:3.7.13]
192d0 29 2e 0a 20 20 55 6e 69 63 6f 64 65 36 31 20 77  )..  Unicode61 w
192e0 6f 72 6b 73 20 76 65 72 79 20 6d 75 63 68 20 6c  orks very much l
192f0 69 6b 65 20 22 73 69 6d 70 6c 65 22 20 65 78 63  ike "simple" exc
19300 65 70 74 20 74 68 61 74 20 69 74 20 64 6f 65 73  ept that it does
19310 20 73 69 6d 70 6c 65 20 75 6e 69 63 6f 64 65 0a   simple unicode.
19320 20 20 63 61 73 65 20 66 6f 6c 64 69 6e 67 20 61    case folding a
19330 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 75 6c 65  ccording to rule
19340 73 20 69 6e 20 55 6e 69 63 6f 64 65 20 56 65 72  s in Unicode Ver
19350 73 69 6f 6e 20 36 2e 31 20 61 6e 64 20 69 74 20  sion 6.1 and it 
19360 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 75 6e 69  recognizes.  uni
19370 63 6f 64 65 20 73 70 61 63 65 20 61 6e 64 20 70  code space and p
19380 75 6e 63 74 75 61 74 69 6f 6e 20 63 68 61 72 61  unctuation chara
19390 63 74 65 72 73 20 61 6e 64 20 75 73 65 73 20 74  cters and uses t
193a0 68 6f 73 65 20 74 6f 20 73 65 70 61 72 61 74 65  hose to separate
193b0 20 74 6f 6b 65 6e 73 2e 0a 20 20 54 68 65 20 73   tokens..  The s
193c0 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20  imple tokenizer 
193d0 6f 6e 6c 79 20 64 6f 65 73 20 63 61 73 65 20 66  only does case f
193e0 6f 6c 64 69 6e 67 20 6f 66 20 41 53 43 49 49 20  olding of ASCII 
193f0 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 20 6f  characters and o
19400 6e 6c 79 0a 20 20 72 65 63 6f 67 6e 69 7a 65 73  nly.  recognizes
19410 20 41 53 43 49 49 20 73 70 61 63 65 20 61 6e 64   ASCII space and
19420 20 70 75 6e 63 74 75 61 74 69 6f 6e 20 63 68 61   punctuation cha
19430 72 61 63 74 65 72 73 20 61 73 20 74 6f 6b 65 6e  racters as token
19440 20 73 65 70 61 72 61 74 6f 72 73 2e 0a 0a 3c 70   separators...<p
19450 3e 0a 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  >.  By default, 
19460 22 75 6e 69 63 6f 64 65 36 31 22 20 61 74 74 65  "unicode61" atte
19470 6d 70 74 73 20 74 6f 20 72 65 6d 6f 76 65 20 64  mpts to remove d
19480 69 61 63 72 69 74 69 63 73 20 66 72 6f 6d 20 4c  iacritics from L
19490 61 74 69 6e 20 73 63 72 69 70 74 0a 20 20 63 68  atin script.  ch
194a0 61 72 61 63 74 65 72 73 2e 20 54 68 69 73 20 62  aracters. This b
194b0 65 68 61 76 69 6f 75 72 20 63 61 6e 20 62 65 20  ehaviour can be 
194c0 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 64  overridden by ad
194d0 64 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a  ding the tokeniz
194e0 65 72 20 61 72 67 75 6d 65 6e 74 0a 20 20 22 72  er argument.  "r
194f0 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73  emove_diacritics
19500 3d 30 22 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  =0". For example
19510 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
19520 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20     <i>-- Create 
19530 74 61 62 6c 65 73 20 74 68 61 74 20 72 65 6d 6f  tables that remo
19540 76 65 20 3c 62 3e 61 6c 6c 3c 2f 62 3e 64 69 61  ve <b>all</b>dia
19550 63 72 69 74 69 63 73 20 66 72 6f 6d 20 4c 61 74  critics from Lat
19560 69 6e 20 73 63 72 69 70 74 20 63 68 61 72 61 63  in script charac
19570 74 65 72 73 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e  ters</i>.    <i>
19580 2d 2d 20 61 73 20 70 61 72 74 20 6f 66 20 74 6f  -- as part of to
19590 6b 65 6e 69 7a 61 74 69 6f 6e 2e 3c 2f 69 3e 0a  kenization.</i>.
195a0 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
195b0 41 4c 20 54 41 42 4c 45 20 74 78 74 31 20 55 53  AL TABLE txt1 US
195c0 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a  ING fts4(tokeniz
195d0 65 3d 75 6e 69 63 6f 64 65 36 31 29 3b 0a 20 20  e=unicode61);.  
195e0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
195f0 20 54 41 42 4c 45 20 74 78 74 32 20 55 53 49 4e   TABLE txt2 USIN
19600 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d  G fts4(tokenize=
19610 75 6e 69 63 6f 64 65 36 31 20 22 72 65 6d 6f 76  unicode61 "remov
19620 65 5f 64 69 61 63 72 69 74 69 63 73 3d 32 22 29  e_diacritics=2")
19630 3b 0a 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65  ;..    <i>-- Cre
19640 61 74 65 20 61 20 74 61 62 6c 65 20 74 68 61 74  ate a table that
19650 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 6f 76 65   does not remove
19660 20 64 69 61 63 72 69 74 69 63 73 20 66 72 6f 6d   diacritics from
19670 20 4c 61 74 69 6e 20 73 63 72 69 70 74 3c 2f 69   Latin script</i
19680 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 63 68 61 72  >.    <i>-- char
19690 61 63 74 65 72 73 20 61 73 20 70 61 72 74 20 6f  acters as part o
196a0 66 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2e 3c  f tokenization.<
196b0 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56  /i>.    CREATE V
196c0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 78 74  IRTUAL TABLE txt
196d0 33 20 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b  3 USING fts4(tok
196e0 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31 20  enize=unicode61 
196f0 22 72 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69  "remove_diacriti
19700 63 73 3d 30 22 29 3b 0a 3c 2f 63 6f 64 65 62 6c  cs=0");.</codebl
19710 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 72 65 6d  ock>..<p>The rem
19720 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73 20 6f  ove_diacritics o
19730 70 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 65 74  ption may be set
19740 20 74 6f 20 22 30 22 2c 20 22 31 22 20 6f 72 20   to "0", "1" or 
19750 22 32 22 2e 20 54 68 65 20 64 65 66 61 75 6c 74  "2". The default
19760 0a 20 20 20 76 61 6c 75 65 20 69 73 20 22 31 22  .   value is "1"
19770 2e 20 20 49 66 20 69 74 20 69 73 20 73 65 74 20  .  If it is set 
19780 74 6f 20 22 31 22 20 6f 72 20 22 32 22 2c 20 74  to "1" or "2", t
19790 68 65 6e 20 64 69 61 63 72 69 74 69 63 73 20 61  hen diacritics a
197a0 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 0a  re removed from.
197b0 20 20 20 4c 61 74 69 6e 20 73 63 72 69 70 74 20     Latin script 
197c0 63 68 61 72 61 63 74 65 72 73 20 61 73 20 64 65  characters as de
197d0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 20 48  scribed above. H
197e0 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20 69 73  owever, if it is
197f0 20 73 65 74 20 74 6f 20 22 31 22 2c 0a 20 20 20   set to "1",.   
19800 74 68 65 6e 20 64 69 61 63 72 69 74 69 63 73 20  then diacritics 
19810 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 20  are not removed 
19820 69 6e 20 74 68 65 20 66 61 69 72 6c 79 20 75 6e  in the fairly un
19830 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
19840 65 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 75 6e  e a single.   un
19850 69 63 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74 20  icode codepoint 
19860 69 73 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  is used to repre
19870 73 65 6e 74 20 61 20 63 68 61 72 61 63 74 65 72  sent a character
19880 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 74 20   with more that 
19890 6f 6e 65 0a 20 20 20 64 69 61 63 72 69 74 69 63  one.   diacritic
198a0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  . For example, d
198b0 69 61 63 72 69 74 69 63 73 20 61 72 65 20 6e 6f  iacritics are no
198c0 74 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 63  t removed from c
198d0 6f 64 65 70 6f 69 6e 74 20 30 78 31 45 44 39 0a  odepoint 0x1ED9.
198e0 20 20 20 28 22 4c 41 54 49 4e 20 53 4d 41 4c 4c     ("LATIN SMALL
198f0 20 4c 45 54 54 45 52 20 4f 20 57 49 54 48 20 43   LETTER O WITH C
19900 49 52 43 55 4d 46 4c 45 58 20 41 4e 44 20 44 4f  IRCUMFLEX AND DO
19910 54 20 42 45 4c 4f 57 22 29 2e 20 54 68 69 73 20  T BELOW"). This 
19920 69 73 20 74 65 63 68 6e 69 63 61 6c 6c 79 0a 20  is technically. 
19930 20 20 61 20 62 75 67 2c 20 62 75 74 20 63 61 6e    a bug, but can
19940 6e 6f 74 20 62 65 20 66 69 78 65 64 20 77 69 74  not be fixed wit
19950 68 6f 75 74 20 63 72 65 61 74 69 6e 67 20 62 61  hout creating ba
19960 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
19970 69 6c 69 74 79 0a 20 20 20 70 72 6f 62 6c 65 6d  ility.   problem
19980 73 2e 20 49 66 20 74 68 69 73 20 6f 70 74 69 6f  s. If this optio
19990 6e 20 69 73 20 73 65 74 20 74 6f 20 22 32 22 2c  n is set to "2",
199a0 20 74 68 65 6e 20 64 69 61 63 72 69 74 69 63 73   then diacritics
199b0 20 61 72 65 20 63 6f 72 72 65 63 74 6c 79 0a 20   are correctly. 
199c0 20 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61    removed from a
199d0 6c 6c 20 4c 61 74 69 6e 20 63 68 61 72 61 63 74  ll Latin charact
199e0 65 72 73 2e 0a 0a 3c 70 3e 0a 20 20 49 74 20 69  ers...<p>.  It i
199f0 73 20 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65 20  s also possible 
19a00 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
19a10 20 73 65 74 20 6f 66 20 63 6f 64 65 70 6f 69 6e   set of codepoin
19a20 74 73 20 74 68 61 74 20 75 6e 69 63 6f 64 65 36  ts that unicode6
19a30 31 20 74 72 65 61 74 73 0a 20 20 61 73 20 73 65  1 treats.  as se
19a40 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
19a50 72 73 2e 20 54 68 65 20 22 73 65 70 61 72 61 74  rs. The "separat
19a60 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 20 6d 61 79  ors=" option may
19a70 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 63   be used to spec
19a80 69 66 79 20 6f 6e 65 0a 20 20 6f 72 20 6d 6f 72  ify one.  or mor
19a90 65 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65  e extra characte
19aa0 72 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  rs that should b
19ab0 65 20 74 72 65 61 74 65 64 20 61 73 20 73 65 70  e treated as sep
19ac0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
19ad0 73 2c 20 61 6e 64 0a 20 20 74 68 65 20 22 74 6f  s, and.  the "to
19ae0 6b 65 6e 63 68 61 72 73 3d 22 20 6f 70 74 69 6f  kenchars=" optio
19af0 6e 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  n may be used to
19b00 20 73 70 65 63 69 66 79 20 6f 6e 65 20 6f 72 20   specify one or 
19b10 6d 6f 72 65 20 65 78 74 72 61 20 63 68 61 72 61  more extra chara
19b20 63 74 65 72 73 0a 20 20 74 68 61 74 20 73 68 6f  cters.  that sho
19b30 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61  uld be treated a
19b40 73 20 70 61 72 74 20 6f 66 20 74 6f 6b 65 6e 73  s part of tokens
19b50 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20 73   instead of as s
19b60 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
19b70 65 72 73 2e 0a 20 20 46 6f 72 20 65 78 61 6d 70  ers..  For examp
19b80 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
19b90 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  .    <i>-- Creat
19ba0 65 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 75  e a table that u
19bb0 73 65 73 20 74 68 65 20 75 6e 69 63 6f 64 65 36  ses the unicode6
19bc0 31 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 62 75 74  1 tokenizer, but
19bd0 20 63 6f 6e 73 69 64 65 72 73 20 22 2e 22 3c 2f   considers "."</
19be0 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 61 6e 64  i>.    <i>-- and
19bf0 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 73 20   "=" characters 
19c00 74 6f 20 62 65 20 70 61 72 74 20 6f 66 20 74 6f  to be part of to
19c10 6b 65 6e 73 2c 20 61 6e 64 20 63 61 70 69 74 61  kens, and capita
19c20 6c 20 22 58 22 20 63 68 61 72 61 63 74 65 72 73  l "X" characters
19c30 20 74 6f 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d   to</i>.    <i>-
19c40 2d 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 73 65  - function as se
19c50 70 61 72 61 74 6f 72 73 2e 3c 2f 69 3e 0a 20 20  parators.</i>.  
19c60 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
19c70 20 54 41 42 4c 45 20 74 78 74 33 20 55 53 49 4e   TABLE txt3 USIN
19c80 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d  G fts4(tokenize=
19c90 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65 6e  unicode61 "token
19ca0 63 68 61 72 73 3d 2e 3d 22 20 22 73 65 70 61 72  chars=.=" "separ
19cb0 61 74 6f 72 73 3d 58 22 29 3b 0a 0a 20 20 20 20  ators=X");..    
19cc0 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74  <i>-- Create a t
19cd0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 73 69 64  able that consid
19ce0 65 72 73 20 73 70 61 63 65 20 63 68 61 72 61 63  ers space charac
19cf0 74 65 72 73 20 28 63 6f 64 65 70 6f 69 6e 74 20  ters (codepoint 
19d00 33 32 29 20 74 6f 20 62 65 3c 2f 69 3e 0a 20 20  32) to be</i>.  
19d10 20 20 3c 69 3e 2d 2d 20 61 20 74 6f 6b 65 6e 20    <i>-- a token 
19d20 63 68 61 72 61 63 74 65 72 3c 2f 69 3e 0a 20 20  character</i>.  
19d30 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
19d40 20 54 41 42 4c 45 20 74 78 74 34 20 55 53 49 4e   TABLE txt4 USIN
19d50 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d  G fts4(tokenize=
19d60 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65 6e  unicode61 "token
19d70 63 68 61 72 73 3d 20 22 29 3b 0a 3c 2f 63 6f 64  chars= ");.</cod
19d80 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49  eblock>..<p>.  I
19d90 66 20 61 20 63 68 61 72 61 63 74 65 72 20 73 70  f a character sp
19da0 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
19db0 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  of the argument 
19dc0 74 6f 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 22  to "tokenchars="
19dd0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 20   is considered. 
19de0 20 74 6f 20 62 65 20 61 20 74 6f 6b 65 6e 20 63   to be a token c
19df0 68 61 72 61 63 74 65 72 20 62 79 20 64 65 66 61  haracter by defa
19e00 75 6c 74 2c 20 69 74 20 69 73 20 69 67 6e 6f 72  ult, it is ignor
19e10 65 64 2e 20 54 68 69 73 20 69 73 20 74 72 75 65  ed. This is true
19e20 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 0a   even if it has.
19e30 20 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 61 73    been marked as
19e40 20 61 20 73 65 70 61 72 61 74 6f 72 20 62 79 20   a separator by 
19e50 61 6e 20 65 61 72 6c 69 65 72 20 22 73 65 70 61  an earlier "sepa
19e60 72 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 2e  rators=" option.
19e70 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 0a 20   Similarly, if. 
19e80 20 61 20 63 68 61 72 61 63 74 65 72 20 73 70 65   a character spe
19e90 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
19ea0 66 20 61 20 22 73 65 70 61 72 61 74 6f 72 73 3d  f a "separators=
19eb0 22 20 6f 70 74 69 6f 6e 20 69 73 20 74 72 65 61  " option is trea
19ec0 74 65 64 20 61 73 20 61 20 73 65 70 61 72 61 74  ted as a separat
19ed0 6f 72 0a 20 20 63 68 61 72 61 63 74 65 72 20 62  or.  character b
19ee0 79 20 64 65 66 61 75 6c 74 2c 20 69 74 20 69 73  y default, it is
19ef0 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 6d 75 6c   ignored. If mul
19f00 74 69 70 6c 65 20 22 74 6f 6b 65 6e 63 68 61 72  tiple "tokenchar
19f10 73 3d 22 20 6f 72 20 22 73 65 70 61 72 61 74 6f  s=" or "separato
19f20 72 73 3d 22 0a 20 20 6f 70 74 69 6f 6e 73 20 61  rs=".  options a
19f30 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 61 6c  re specified, al
19f40 6c 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 2e  l are processed.
19f50 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
19f60 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 3c  codeblock>.    <
19f70 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61  i>-- Create a ta
19f80 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ble that uses th
19f90 65 20 75 6e 69 63 6f 64 65 36 31 20 74 6f 6b 65  e unicode61 toke
19fa0 6e 69 7a 65 72 2c 20 62 75 74 20 63 6f 6e 73 69  nizer, but consi
19fb0 64 65 72 73 20 22 2e 22 3c 2f 69 3e 0a 20 20 20  ders "."</i>.   
19fc0 20 3c 69 3e 2d 2d 20 61 6e 64 20 22 3d 22 20 63   <i>-- and "=" c
19fd0 68 61 72 61 63 74 65 72 73 20 74 6f 20 62 65 20  haracters to be 
19fe0 70 61 72 74 20 6f 66 20 74 6f 6b 65 6e 73 2c 20  part of tokens, 
19ff0 61 6e 64 20 63 61 70 69 74 61 6c 20 22 58 22 20  and capital "X" 
1a000 63 68 61 72 61 63 74 65 72 73 20 74 6f 3c 2f 69  characters to</i
1a010 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 66 75 6e 63  >.    <i>-- func
1a020 74 69 6f 6e 20 61 73 20 73 65 70 61 72 61 74 6f  tion as separato
1a030 72 73 2e 20 42 6f 74 68 20 6f 66 20 74 68 65 20  rs. Both of the 
1a040 22 74 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f 70  "tokenchars=" op
1a050 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 63 65 73  tions are proces
1a060 73 65 64 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d  sed</i>.    <i>-
1a070 2d 20 54 68 65 20 22 73 65 70 61 72 61 74 6f 72  - The "separator
1a080 73 3d 22 20 6f 70 74 69 6f 6e 20 69 67 6e 6f 72  s=" option ignor
1a090 65 73 20 74 68 65 20 22 2e 22 20 70 61 73 73 65  es the "." passe
1a0a0 64 20 74 6f 20 69 74 2c 20 61 73 20 22 2e 22 20  d to it, as "." 
1a0b0 69 73 20 62 79 3c 2f 69 3e 0a 20 20 20 20 3c 69  is by</i>.    <i
1a0c0 3e 2d 2d 20 64 65 66 61 75 6c 74 20 61 20 73 65  >-- default a se
1a0d0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
1a0e0 72 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  r, even though i
1a0f0 74 20 68 61 73 20 62 65 65 6e 20 6d 61 72 6b 65  t has been marke
1a100 64 20 61 73 20 61 20 74 6f 6b 65 6e 3c 2f 69 3e  d as a token</i>
1a110 0a 20 20 20 20 3c 69 3e 2d 2d 20 63 68 61 72 61  .    <i>-- chara
1a120 63 74 65 72 20 62 79 20 61 6e 20 65 61 72 6c 69  cter by an earli
1a130 65 72 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 22  er "tokenchars="
1a140 20 6f 70 74 69 6f 6e 2e 3c 2f 69 3e 0a 20 20 20   option.</i>.   
1a150 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1a160 54 41 42 4c 45 20 74 78 74 35 20 55 53 49 4e 47  TABLE txt5 USING
1a170 20 66 74 73 34 28 0a 20 20 20 20 20 20 20 20 74   fts4(.        t
1a180 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36  okenize=unicode6
1a190 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 2e 22  1 "tokenchars=."
1a1a0 20 22 73 65 70 61 72 61 74 6f 72 73 3d 58 2e 22   "separators=X."
1a1b0 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 3d 22 0a   "tokenchars==".
1a1c0 20 20 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f      );.</codeblo
1a1d0 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 61  ck>..<p>.  The a
1a1e0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
1a1f0 74 6f 20 74 68 65 20 22 74 6f 6b 65 6e 63 68 61  to the "tokencha
1a200 72 73 3d 22 20 6f 72 20 22 73 65 70 61 72 61 74  rs=" or "separat
1a210 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 73 20 61 72  ors=" options ar
1a220 65 20 0a 20 20 63 61 73 65 2d 73 65 6e 73 69 74  e .  case-sensit
1a230 69 76 65 2e 20 49 6e 20 74 68 65 20 65 78 61 6d  ive. In the exam
1a240 70 6c 65 20 61 62 6f 76 65 2c 20 73 70 65 63 69  ple above, speci
1a250 66 79 69 6e 67 20 74 68 61 74 20 22 58 22 20 69  fying that "X" i
1a260 73 20 61 20 73 65 70 61 72 61 74 6f 72 0a 20 20  s a separator.  
1a270 63 68 61 72 61 63 74 65 72 20 64 6f 65 73 20 6e  character does n
1a280 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 77 61  ot affect the wa
1a290 79 20 22 78 22 20 69 73 20 68 61 6e 64 6c 65 64  y "x" is handled
1a2a0 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
1a2b0 65 6e 74 20 66 33 74 6b 6e 7a 72 20 7b 66 74 73  ent f3tknzr {fts
1a2c0 33 5f 74 6f 6b 65 6e 69 7a 65 72 7d 3c 2f 74 63  3_tokenizer}</tc
1a2d0 6c 3e 0a 3c 68 32 3e 43 75 73 74 6f 6d 20 28 41  l>.<h2>Custom (A
1a2e0 70 70 6c 69 63 61 74 69 6f 6e 20 44 65 66 69 6e  pplication Defin
1a2f0 65 64 29 20 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f  ed) Tokenizers</
1a300 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 64  h2>..<p>.  In ad
1a310 64 69 74 69 6f 6e 20 74 6f 20 70 72 6f 76 69 64  dition to provid
1a320 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 22 73 69  ing built-in "si
1a330 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20  mple", "porter" 
1a340 61 6e 64 20 28 70 6f 73 73 69 62 6c 79 29 20 22  and (possibly) "
1a350 69 63 75 22 20 61 6e 64 0a 20 20 22 75 6e 69 63  icu" and.  "unic
1a360 6f 64 65 36 31 22 20 74 6f 6b 65 6e 69 7a 65 72  ode61" tokenizer
1a370 73 2c 0a 20 20 46 54 53 20 70 72 6f 76 69 64 65  s,.  FTS provide
1a380 73 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20 66  s an interface f
1a390 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  or applications 
1a3a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 64  to implement and
1a3b0 20 72 65 67 69 73 74 65 72 20 63 75 73 74 6f 6d   register custom
1a3c0 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 20 77 72  .  tokenizers wr
1a3d0 69 74 74 65 6e 20 69 6e 20 43 2e 20 20 54 68 65  itten in C.  The
1a3e0 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20   interface used 
1a3f0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
1a400 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 64 65 66  tokenizer is def
1a410 69 6e 65 64 0a 20 20 61 6e 64 20 64 65 73 63 72  ined.  and descr
1a420 69 62 65 64 20 69 6e 20 74 68 65 20 66 74 73 33  ibed in the fts3
1a430 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 20 73 6f 75  _tokenizer.h sou
1a440 72 63 65 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20  rce file...<p>. 
1a450 20 52 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e   Registering a n
1a460 65 77 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72  ew FTS tokenizer
1a470 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72   is similar to r
1a480 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77  egistering a new
1a490 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  .  virtual table
1a4a0 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c   module with SQL
1a4b0 69 74 65 2e 20 54 68 65 20 75 73 65 72 20 70 61  ite. The user pa
1a4c0 73 73 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  sses a pointer t
1a4d0 6f 20 61 0a 20 20 73 74 72 75 63 74 75 72 65 20  o a.  structure 
1a4e0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74  containing point
1a4f0 65 72 73 20 74 6f 20 76 61 72 69 6f 75 73 20 63  ers to various c
1a500 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1a510 73 20 74 68 61 74 0a 20 20 6d 61 6b 65 20 75 70  s that.  make up
1a520 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1a530 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
1a540 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 2e 20 46  okenizer type. F
1a550 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20  or tokenizers,. 
1a560 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
1a570 64 65 66 69 6e 65 64 20 69 6e 20 66 74 73 33 5f  defined in fts3_
1a580 74 6f 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73 20  tokenizer.h) is 
1a590 63 61 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74 65  called.  "sqlite
1a5a0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
1a5b0 6c 65 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  le"...<p>.  FTS 
1a5c0 64 6f 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20  does not expose 
1a5d0 61 20 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  a C-function tha
1a5e0 74 20 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20  t users call to 
1a5f0 72 65 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74  register new.  t
1a600 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77  okenizer types w
1a610 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 68  ith a database h
1a620 61 6e 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20  andle. Instead, 
1a630 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74  the pointer must
1a640 0a 20 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  .  be encoded as
1a650 20 61 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c   an SQL blob val
1a660 75 65 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f  ue and passed to
1a670 20 46 54 53 20 74 68 72 6f 75 67 68 20 74 68 65   FTS through the
1a680 20 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62 79   SQL.  engine by
1a690 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73 70   evaluating a sp
1a6a0 65 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75 6e  ecial scalar fun
1a6b0 63 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f 6b  ction, "fts3_tok
1a6c0 65 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68 65  enizer()"..  The
1a6d0 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
1a6e0 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  ) function may b
1a6f0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f 6e  e called with on
1a700 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e  e or two argumen
1a710 74 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73  ts,.  as follows
1a720 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
1a730 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74     SELECT fts3_t
1a740 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b  okenizer(&lt;tok
1a750 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 29  enizer-name&gt;)
1a760 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 66 74 73  ;.    SELECT fts
1a770 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b  3_tokenizer(&lt;
1a780 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67  tokenizer-name&g
1a790 74 3b 2c 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f  t;, &lt;sqlite3_
1a7a0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
1a7b0 20 70 74 72 26 67 74 3b 29 3b 0a 3c 2f 63 6f 64   ptr&gt;);.</cod
1a7c0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 57  eblock>..<p>.  W
1a7d0 68 65 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a  here &lt;tokeniz
1a7e0 65 72 2d 6e 61 6d 65 26 67 74 3b 20 69 73 20 5b  er-name&gt; is [
1a7f0 70 61 72 61 6d 65 74 65 72 5d 20 74 6f 20 77 68  parameter] to wh
1a800 69 63 68 20 61 20 73 74 72 69 6e 67 20 69 73 20  ich a string is 
1a810 62 6f 75 6e 64 20 75 73 69 6e 67 0a 20 20 5b 73  bound using.  [s
1a820 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1a830 28 29 5d 20 77 68 65 72 65 20 74 68 65 20 73 74  ()] where the st
1a840 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73 20  ring identifies 
1a850 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61 6e  the tokenizer an
1a860 64 0a 20 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f  d.  &lt;sqlite3_
1a870 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
1a880 20 70 74 72 26 67 74 3b 20 69 73 20 61 20 5b 70   ptr&gt; is a [p
1a890 61 72 61 6d 65 74 65 72 5d 20 74 6f 20 77 68 69  arameter] to whi
1a8a0 63 68 20 61 20 42 4c 4f 42 20 69 73 0a 20 20 62  ch a BLOB is.  b
1a8b0 6f 75 6e 64 20 75 73 69 6e 67 20 5b 73 71 6c 69  ound using [sqli
1a8c0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 29 5d  te3_bind_blob()]
1a8d0 20 77 68 65 72 65 20 74 68 65 20 76 61 6c 75 65   where the value
1a8e0 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20   of the BLOB is 
1a8f0 61 0a 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  a.  pointer to a
1a900 6e 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  n sqlite3_tokeni
1a910 7a 65 72 5f 6d 6f 64 75 6c 65 20 73 74 72 75 63  zer_module struc
1a920 74 75 72 65 2e 0a 20 20 49 66 20 74 68 65 20 73  ture..  If the s
1a930 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1a940 73 20 70 72 65 73 65 6e 74 2c 0a 20 20 69 74 20  s present,.  it 
1a950 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73  is registered as
1a960 20 74 6f 6b 65 6e 69 7a 65 72 20 26 6c 74 3b 74   tokenizer &lt;t
1a970 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74  okenizer-name&gt
1a980 3b 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  ; and a copy of 
1a990 69 74 0a 20 20 72 65 74 75 72 6e 65 64 2e 20 49  it.  returned. I
1a9a0 66 20 6f 6e 6c 79 20 6f 6e 65 20 61 72 67 75 6d  f only one argum
1a9b0 65 6e 74 20 69 73 20 70 61 73 73 65 64 2c 20 61  ent is passed, a
1a9c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a9d0 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c  tokenizer.  impl
1a9e0 65 6d 65 6e 74 61 74 69 6f 6e 20 63 75 72 72 65  ementation curre
1a9f0 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
1aa00 61 73 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  as &lt;tokenizer
1aa10 2d 6e 61 6d 65 26 67 74 3b 20 69 73 20 72 65 74  -name&gt; is ret
1aa20 75 72 6e 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64  urned,.  encoded
1aa30 20 61 73 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20   as a blob. Or, 
1aa40 69 66 20 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e  if no such token
1aa50 69 7a 65 72 20 65 78 69 73 74 73 2c 20 61 6e 20  izer exists, an 
1aa60 53 51 4c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  SQL exception.  
1aa70 28 65 72 72 6f 72 29 20 69 73 20 72 61 69 73 65  (error) is raise
1aa80 64 2e 0a 0a 3c 70 3e 0a 20 20 50 72 69 6f 72 20  d...<p>.  Prior 
1aa90 74 6f 20 53 51 4c 69 74 65 20 5b 76 65 72 73 69  to SQLite [versi
1aaa0 6f 6e 20 33 2e 31 31 2e 30 5d 20 28 5b 64 61 74  on 3.11.0] ([dat
1aab0 65 6f 66 3a 33 2e 31 31 2e 30 5d 29 2c 20 74 68  eof:3.11.0]), th
1aac0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
1aad0 20 66 74 73 33 5f 74 6f 6b 65 6e 7a 65 72 28 29   fts3_tokenzer()
1aae0 20 63 6f 75 6c 64 20 62 65 20 6c 69 74 65 72 61   could be litera
1aaf0 6c 20 73 74 72 69 6e 67 73 20 6f 72 20 42 4c 4f  l strings or BLO
1ab00 42 73 2e 20 54 68 65 79 20 64 69 64 20 6e 6f 74  Bs. They did not
1ab10 20 68 61 76 65 20 74 6f 0a 20 20 62 65 20 5b 62   have to.  be [b
1ab20 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 5d  ound parameters]
1ab30 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1ab40 64 20 6c 65 61 64 20 74 6f 20 73 65 63 75 72 69  d lead to securi
1ab50 74 79 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 74  ty problems in t
1ab60 68 65 0a 20 20 65 76 65 6e 74 20 6f 66 20 61 6e  he.  event of an
1ab70 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e 2e 20   SQL injection. 
1ab80 20 48 65 6e 63 65 2c 20 74 68 65 20 6c 65 67 61   Hence, the lega
1ab90 63 79 20 62 65 68 61 76 69 6f 72 20 69 73 20 6e  cy behavior is n
1aba0 6f 77 20 64 69 73 61 62 6c 65 64 0a 20 20 62 79  ow disabled.  by
1abb0 20 64 65 66 61 75 6c 74 2e 20 20 42 75 74 20 74   default.  But t
1abc0 68 65 20 6f 6c 64 20 6c 65 67 61 63 79 20 62 65  he old legacy be
1abd0 68 61 76 69 6f 72 20 63 61 6e 20 62 65 20 65 6e  havior can be en
1abe0 61 62 6c 65 64 2c 20 66 6f 72 20 62 61 63 6b 77  abled, for backw
1abf0 61 72 64 73 0a 20 20 63 6f 6d 70 61 74 69 62 69  ards.  compatibi
1ac00 6c 69 74 79 20 69 6e 20 61 70 70 6c 69 63 61 74  lity in applicat
1ac10 69 6f 6e 73 20 74 68 61 74 20 72 65 61 6c 6c 79  ions that really
1ac20 20 6e 65 65 64 20 69 74 2c 20 0a 20 20 62 79 20   need it, .  by 
1ac30 63 61 6c 6c 69 6e 67 0a 20 20 5b 73 71 6c 69 74  calling.  [sqlit
1ac40 65 33 5f 64 62 5f 63 6f 6e 66 69 67 5d 28 64 62  e3_db_config](db
1ac50 2c 5b 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  ,[SQLITE_DBCONFI
1ac60 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
1ac70 4b 45 4e 49 5a 45 52 5d 2c 31 2c 30 29 2e 0a 0a  KENIZER],1,0)...
1ac80 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77  <p>.  The follow
1ac90 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
1aca0 6e 73 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66  ns an example of
1acb0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 74 73   calling the fts
1acc0 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 0a 20 20  3_tokenizer().  
1acd0 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 43 20  function from C 
1ace0 63 6f 64 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  code:..<codebloc
1acf0 6b 3e 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20  k>.  <i>/*.  ** 
1ad00 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b 65 6e  Register a token
1ad10 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  izer implementat
1ad20 69 6f 6e 20 77 69 74 68 20 46 54 53 33 20 6f 72  ion with FTS3 or
1ad30 20 46 54 53 34 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a   FTS4..  */</i>.
1ad40 20 20 69 6e 74 20 72 65 67 69 73 74 65 72 54 6f    int registerTo
1ad50 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20 73 71 6c  kenizer(.    sql
1ad60 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20 63 68  ite3 *db,.    ch
1ad70 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 20 20 63  ar *zName,.    c
1ad80 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b  onst sqlite3_tok
1ad90 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 70  enizer_module *p
1ada0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  .  ){.    int rc
1adb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
1adc0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63  mt *pStmt;.    c
1add0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
1ade0 3d 20 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74  = "SELECT fts3_t
1adf0 6f 6b 65 6e 69 7a 65 72 28 3f 31 2c 20 3f 32 29  okenizer(?1, ?2)
1ae00 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ";..    rc = sql
1ae10 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1ae20 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
1ae30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
1ae40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ae50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ae60 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  rc;.    }..    s
1ae70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1ae80 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65  (pStmt, 1, zName
1ae90 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
1aea0 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
1aeb0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
1aec0 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a 65 6f 66  t, 2, &p, sizeof
1aed0 28 70 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  (p), SQLITE_STAT
1aee0 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
1aef0 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
1af00 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1af10 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1af20 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e 2f 2a 0a  );.  }..  <i>/*.
1af30 20 20 2a 2a 20 51 75 65 72 79 20 46 54 53 20 66    ** Query FTS f
1af40 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  or the tokenizer
1af50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1af60 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 20 20 2a  named zName..  *
1af70 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71 75 65 72  /</i>.  int quer
1af80 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20  yTokenizer(.    
1af90 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20  sqlite3 *db,.   
1afa0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
1afb0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1afc0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
1afd0 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20 20 20 69   **pp.  ){.    i
1afe0 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
1aff0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1b000 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b010 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 66  zSql = "SELECT f
1b020 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 29  ts3_tokenizer(?)
1b030 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ";..    *pp = 0;
1b040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b050 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
1b060 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1b070 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
1b080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b090 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b0a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
1b0b0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
1b0c0 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d  tmt, 1, zName, -
1b0d0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
1b0e0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1b0f0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1b100 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1b110 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1b120 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
1b130 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  t, 0)==SQLITE_BL
1b140 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OB ){.        me
1b150 6d 63 70 79 28 70 70 2c 20 73 71 6c 69 74 65 33  mcpy(pp, sqlite3
1b160 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1b170 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f 66 28 2a  mt, 0), sizeof(*
1b180 70 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pp));.      }.  
1b190 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
1b1a0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1b1b0 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 3c 2f 63  (pStmt);.  }.</c
1b1c0 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 74 63 6c  odeblock>...<tcl
1b1d0 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 66 74 73  >hd_fragment fts
1b1e0 33 74 6f 6b 20 7b 66 74 73 33 74 6f 6b 65 6e 69  3tok {fts3tokeni
1b1f0 7a 65 7d 20 7b 66 74 73 33 74 6f 6b 65 6e 69 7a  ze} {fts3tokeniz
1b200 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 7d  e virtual table}
1b210 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 51 75 65 72 79  </tcl>.<h2>Query
1b220 69 6e 67 20 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f  ing Tokenizers</
1b230 68 32 3e 0a 0a 3c 70 3e 54 68 65 20 22 66 74 73  h2>..<p>The "fts
1b240 33 74 6f 6b 65 6e 69 7a 65 22 20 76 69 72 74 75  3tokenize" virtu
1b250 61 6c 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20  al table can be 
1b260 75 73 65 64 20 74 6f 20 64 69 72 65 63 74 6c 79  used to directly
1b270 20 61 63 63 65 73 73 20 61 6e 79 0a 20 20 20 74   access any.   t
1b280 6f 6b 65 6e 69 7a 65 72 2e 20 20 54 68 65 20 66  okenizer.  The f
1b290 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 64 65 6d  ollowing SQL dem
1b2a0 6f 6e 73 74 72 61 74 65 73 20 68 6f 77 20 74 6f  onstrates how to
1b2b0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 73 74 61   create an insta
1b2c0 6e 63 65 20 0a 20 20 20 6f 66 20 74 68 65 20 66  nce .   of the f
1b2d0 74 73 33 74 6f 6b 65 6e 69 7a 65 20 76 69 72 74  ts3tokenize virt
1b2e0 75 61 6c 20 74 61 62 6c 65 3a 0a 0a 3c 63 6f 64  ual table:..<cod
1b2f0 65 62 6c 6f 63 6b 3e 0a 43 52 45 41 54 45 20 56  eblock>.CREATE V
1b300 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 6f 6b  IRTUAL TABLE tok
1b310 31 20 55 53 49 4e 47 20 66 74 73 33 74 6f 6b 65  1 USING fts3toke
1b320 6e 69 7a 65 28 27 70 6f 72 74 65 72 27 29 3b 0a  nize('porter');.
1b330 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
1b340 3e 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65  >The name of the
1b350 20 64 65 73 69 72 65 64 20 74 6f 6b 65 6e 69 7a   desired tokeniz
1b360 65 72 20 73 68 6f 75 6c 64 20 62 65 20 73 75 62  er should be sub
1b370 73 74 69 74 75 74 65 64 20 69 6e 20 70 6c 61 63  stituted in plac
1b380 65 20 6f 66 0a 20 20 20 27 70 6f 72 74 65 72 27  e of.   'porter'
1b390 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   in the example,
1b3a0 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 49 66 20   of course.  If 
1b3b0 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 72 65  the tokenizer re
1b3c0 71 75 69 72 65 73 20 6f 6e 65 20 6f 72 0a 20 20  quires one or.  
1b3d0 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c   more arguments,
1b3e0 20 74 68 65 79 20 73 68 6f 75 6c 64 20 62 65 20   they should be 
1b3f0 73 65 70 61 72 61 74 65 64 20 62 79 20 63 6f 6d  separated by com
1b400 6d 61 73 20 69 6e 20 74 68 65 20 66 74 73 33 74  mas in the fts3t
1b410 6f 6b 65 6e 69 7a 65 0a 20 20 20 64 65 63 6c 61  okenize.   decla
1b420 72 61 74 69 6f 6e 20 28 65 76 65 6e 20 74 68 6f  ration (even tho
1b430 75 67 68 20 74 68 65 79 20 61 72 65 20 73 65 70  ugh they are sep
1b440 61 72 61 74 65 64 20 62 79 20 73 70 61 63 65 73  arated by spaces
1b450 20 69 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 73   in declarations
1b460 0a 20 20 20 6f 66 20 72 65 67 75 6c 61 72 20 66  .   of regular f
1b470 74 73 34 20 74 61 62 6c 65 73 29 2e 20 54 68 65  ts4 tables). The
1b480 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 65 61 74   following creat
1b490 65 73 20 66 74 73 34 20 61 6e 64 20 66 74 73 33  es fts4 and fts3
1b4a0 74 6f 6b 65 6e 69 7a 65 0a 20 20 20 74 61 62 6c  tokenize.   tabl
1b4b0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
1b4c0 73 61 6d 65 20 74 6f 6b 65 6e 69 7a 65 72 3a 0a  same tokenizer:.
1b4d0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52  <codeblock>.  CR
1b4e0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1b4f0 4c 45 20 74 65 78 74 31 20 55 53 49 4e 47 20 66  LE text1 USING f
1b500 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 69 63 75  ts4(tokenize=icu
1b510 20 65 6e 5f 41 55 29 3b 0a 20 20 43 52 45 41 54   en_AU);.  CREAT
1b520 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1b530 74 6f 6b 65 6e 73 31 20 55 53 49 4e 47 20 66 74  tokens1 USING ft
1b540 73 33 74 6f 6b 65 6e 69 7a 65 28 69 63 75 2c 20  s3tokenize(icu, 
1b550 65 6e 5f 41 55 29 3b 0a 0a 20 20 43 52 45 41 54  en_AU);..  CREAT
1b560 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1b570 74 65 78 74 32 20 55 53 49 4e 47 20 66 74 73 34  text2 USING fts4
1b580 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64  (tokenize=unicod
1b590 65 36 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d  e61 "tokenchars=
1b5a0 40 2e 22 20 22 73 65 70 61 72 61 74 6f 72 73 3d  @." "separators=
1b5b0 31 32 33 22 29 3b 0a 20 20 43 52 45 41 54 45 20  123");.  CREATE 
1b5c0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 6f  VIRTUAL TABLE to
1b5d0 6b 65 6e 73 32 20 55 53 49 4e 47 20 66 74 73 33  kens2 USING fts3
1b5e0 74 6f 6b 65 6e 69 7a 65 28 75 6e 69 63 6f 64 65  tokenize(unicode
1b5f0 36 31 2c 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d  61, "tokenchars=
1b600 40 2e 22 2c 20 22 73 65 70 61 72 61 74 6f 72 73  @.", "separators
1b610 3d 31 32 33 22 29 3b 0a 3c 2f 63 6f 64 65 62 6c  =123");.</codebl
1b620 6f 63 6b 3e 0a 20 20 20 0a 3c 70 3e 0a 20 20 20  ock>.   .<p>.   
1b630 4f 6e 63 65 20 74 68 65 20 76 69 72 74 75 61 6c  Once the virtual
1b640 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65   table is create
1b650 64 2c 20 69 74 20 63 61 6e 20 62 65 20 71 75 65  d, it can be que
1b660 72 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ried as follows:
1b670 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 53 45  ..<codeblock>.SE
1b680 4c 45 43 54 20 74 6f 6b 65 6e 2c 20 73 74 61 72  LECT token, star
1b690 74 2c 20 65 6e 64 2c 20 70 6f 73 69 74 69 6f 6e  t, end, position
1b6a0 20 0a 20 20 46 52 4f 4d 20 74 6f 6b 31 0a 20 57   .  FROM tok1. W
1b6b0 48 45 52 45 20 69 6e 70 75 74 3d 27 54 68 69 73  HERE input='This
1b6c0 20 69 73 20 61 20 74 65 73 74 20 73 65 6e 74 65   is a test sente
1b6d0 6e 63 65 2e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  nce.';.</codeblo
1b6e0 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 76 69 72 74  ck>..<p>The virt
1b6f0 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 72  ual table will r
1b700 65 74 75 72 6e 20 6f 6e 65 20 72 6f 77 20 6f 66  eturn one row of
1b710 20 6f 75 74 70 75 74 20 66 6f 72 20 65 61 63 68   output for each
1b720 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 0a 20 20   token in the.  
1b730 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20   input string.  
1b740 54 68 65 20 22 74 6f 6b 65 6e 22 20 63 6f 6c 75  The "token" colu
1b750 6d 6e 20 69 73 20 74 68 65 20 74 65 78 74 20 6f  mn is the text o
1b760 66 20 74 68 65 20 74 6f 6b 65 6e 2e 20 20 54 68  f the token.  Th
1b770 65 20 22 73 74 61 72 74 22 0a 20 20 20 61 6e 64  e "start".   and
1b780 20 22 65 6e 64 22 20 63 6f 6c 75 6d 6e 73 20 61   "end" columns a
1b790 72 65 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  re the byte offs
1b7a0 65 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  et to the beginn
1b7b0 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 74  ing and end of t
1b7c0 68 65 0a 20 20 20 74 6f 6b 65 6e 20 69 6e 20 74  he.   token in t
1b7d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75  he original inpu
1b7e0 74 20 73 74 72 69 6e 67 2e 20 20 0a 20 20 20 54  t string.  .   T
1b7f0 68 65 20 22 70 6f 73 69 74 69 6f 6e 22 20 63 6f  he "position" co
1b800 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 65 71 75  lumn is the sequ
1b810 65 6e 63 65 20 6e 75 6d 62 65 72 0a 20 20 20 6f  ence number.   o
1b820 66 20 74 68 65 20 74 6f 6b 65 6e 20 69 6e 20 74  f the token in t
1b830 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75  he original inpu
1b840 74 20 73 74 72 69 6e 67 2e 20 20 54 68 65 72 65  t string.  There
1b850 20 69 73 20 61 6c 73 6f 20 61 6e 20 22 69 6e 70   is also an "inp
1b860 75 74 22 0a 20 20 20 63 6f 6c 75 6d 6e 20 77 68  ut".   column wh
1b870 69 63 68 20 69 73 20 73 69 6d 70 6c 79 20 61 20  ich is simply a 
1b880 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70 75  copy of the inpu
1b890 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  t string that is
1b8a0 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 20 20   specified in.  
1b8b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b8c0 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  e.  Note that a 
1b8d0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
1b8e0 65 20 66 6f 72 6d 20 22 69 6e 70 75 74 3d 3f 22  e form "input=?"
1b8f0 20 6d 75 73 74 0a 20 20 20 61 70 70 65 61 72 20   must.   appear 
1b900 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1b910 75 73 65 20 6f 72 20 65 6c 73 65 20 74 68 65 20  use or else the 
1b920 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
1b930 6c 6c 20 68 61 76 65 20 6e 6f 20 69 6e 70 75 74  ll have no input
1b940 0a 20 20 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20  .   to tokenize 
1b950 61 6e 64 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  and will return 
1b960 6e 6f 20 72 6f 77 73 2e 20 20 54 68 65 20 65 78  no rows.  The ex
1b970 61 6d 70 6c 65 20 61 62 6f 76 65 20 67 65 6e 65  ample above gene
1b980 72 61 74 65 73 0a 20 20 20 74 68 65 20 66 6f 6c  rates.   the fol
1b990 6c 6f 77 69 6e 67 20 6f 75 74 70 75 74 3a 0a 0a  lowing output:..
1b9a0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 74 68 69 7c  <codeblock>.thi|
1b9b0 30 7c 34 7c 30 0a 69 73 7c 35 7c 37 7c 31 0a 61  0|4|0.is|5|7|1.a
1b9c0 7c 38 7c 39 7c 32 0a 74 65 73 74 7c 31 30 7c 31  |8|9|2.test|10|1
1b9d0 34 7c 33 0a 73 65 6e 74 65 6e 63 7c 31 35 7c 32  4|3.sentenc|15|2
1b9e0 33 7c 34 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  3|4.</codeblock>
1b9f0 0a 0a 3c 70 3e 4e 6f 74 69 63 65 20 74 68 61 74  ..<p>Notice that
1ba00 20 74 68 65 20 74 6f 6b 65 6e 73 20 69 6e 20 74   the tokens in t
1ba10 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 72  he result set fr
1ba20 6f 6d 20 74 68 65 20 66 74 73 33 74 6f 6b 65 6e  om the fts3token
1ba30 69 7a 65 20 76 69 72 74 75 61 6c 0a 20 20 20 74  ize virtual.   t
1ba40 61 62 6c 65 20 68 61 76 65 20 62 65 65 6e 20 74  able have been t
1ba50 72 61 6e 73 66 6f 72 6d 65 64 20 61 63 63 6f 72  ransformed accor
1ba60 64 69 6e 67 20 74 6f 20 74 68 65 20 72 75 6c 65  ding to the rule
1ba70 73 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a  s of the tokeniz
1ba80 65 72 2e 0a 20 20 20 53 69 6e 63 65 20 74 68 69  er..   Since thi
1ba90 73 20 65 78 61 6d 70 6c 65 20 75 73 65 64 20 74  s example used t
1baa0 68 65 20 22 70 6f 72 74 65 72 22 20 74 6f 6b 65  he "porter" toke
1bab0 6e 69 7a 65 72 2c 20 74 68 65 20 22 54 68 69 73  nizer, the "This
1bac0 22 20 74 6f 6b 65 6e 20 77 61 73 0a 20 20 20 63  " token was.   c
1bad0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 74  onverted into "t
1bae0 68 69 22 2e 20 20 49 66 20 74 68 65 20 6f 72 69  hi".  If the ori
1baf0 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
1bb00 65 20 74 6f 6b 65 6e 20 69 73 20 64 65 73 69 72  e token is desir
1bb10 65 64 2c 0a 20 20 20 69 74 20 63 61 6e 20 62 65  ed,.   it can be
1bb20 20 72 65 74 72 69 65 76 65 64 20 75 73 69 6e 67   retrieved using
1bb30 20 74 68 65 20 22 73 74 61 72 74 22 20 61 6e 64   the "start" and
1bb40 20 22 65 6e 64 22 20 63 6f 6c 75 6d 6e 73 20 77   "end" columns w
1bb50 69 74 68 20 74 68 65 0a 20 20 20 5b 73 75 62 73  ith the.   [subs
1bb60 74 72 28 29 5d 20 66 75 6e 63 74 69 6f 6e 2e 20  tr()] function. 
1bb70 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
1bb80 63 6f 64 65 62 6c 6f 63 6b 3e 0a 53 45 4c 45 43  codeblock>.SELEC
1bb90 54 20 73 75 62 73 74 72 28 69 6e 70 75 74 2c 20  T substr(input, 
1bba0 73 74 61 72 74 2b 31 2c 20 65 6e 64 2d 73 74 61  start+1, end-sta
1bbb0 72 74 29 2c 20 74 6f 6b 65 6e 2c 20 70 6f 73 69  rt), token, posi
1bbc0 74 69 6f 6e 0a 20 20 46 52 4f 4d 20 74 6f 6b 31  tion.  FROM tok1
1bbd0 0a 20 57 48 45 52 45 20 69 6e 70 75 74 3d 27 54  . WHERE input='T
1bbe0 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 65  his is a test se
1bbf0 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f 63 6f 64 65  ntence.';.</code
1bc00 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 66  block>..<p>The f
1bc10 74 73 33 74 6f 6b 65 6e 69 7a 65 20 76 69 72 74  ts3tokenize virt
1bc20 75 61 6c 20 74 61 62 6c 65 20 63 61 6e 20 62 65  ual table can be
1bc30 20 75 73 65 64 20 6f 6e 20 61 6e 79 20 74 6f 6b   used on any tok
1bc40 65 6e 69 7a 65 72 2c 20 72 65 67 61 72 64 6c 65  enizer, regardle
1bc50 73 73 0a 20 20 20 6f 66 20 77 68 65 74 68 65 72  ss.   of whether
1bc60 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 65 78   or not there ex
1bc70 69 73 74 73 20 61 6e 20 46 54 53 33 20 6f 72 20  ists an FTS3 or 
1bc80 46 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20  FTS4 table that 
1bc90 61 63 74 75 61 6c 6c 79 20 75 73 65 73 0a 20 20  actually uses.  
1bca0 20 74 68 61 74 20 74 6f 6b 65 6e 69 7a 65 72 2e   that tokenizer.
1bcb0 0a 0a 20 0a 3c 68 31 20 74 61 67 73 3d 22 73 65  .. .<h1 tags="se
1bcc0 67 6d 65 6e 74 20 62 74 72 65 65 22 3e 44 61 74  gment btree">Dat
1bcd0 61 20 53 74 72 75 63 74 75 72 65 73 3c 2f 68 31  a Structures</h1
1bce0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 73 65  >..<p>.  This se
1bcf0 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73 20  ction describes 
1bd00 61 74 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  at a high-level 
1bd10 74 68 65 20 77 61 79 20 74 68 65 20 46 54 53 20  the way the FTS 
1bd20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73 20 69 74  module stores it
1bd30 73 0a 20 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  s.  index and co
1bd40 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  ntent in the dat
1bd50 61 62 61 73 65 2e 20 49 74 20 69 73 20 3c 62 3e  abase. It is <b>
1bd60 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1bd70 20 72 65 61 64 20 6f 72 20 0a 20 20 75 6e 64 65   read or .  unde
1bd80 72 73 74 61 6e 64 20 74 68 65 20 6d 61 74 65 72  rstand the mater
1bd90 69 61 6c 20 69 6e 20 74 68 69 73 20 73 65 63 74  ial in this sect
1bda0 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ion in order to 
1bdb0 75 73 65 20 46 54 53 3c 2f 62 3e 20 69 6e 20 61  use FTS</b> in a
1bdc0 6e 20 0a 20 20 61 70 70 6c 69 63 61 74 69 6f 6e  n .  application
1bdd0 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 6d 61  . However, it ma
1bde0 79 20 62 65 20 75 73 65 66 75 6c 20 74 6f 20 61  y be useful to a
1bdf0 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 76 65 6c  pplication devel
1be00 6f 70 65 72 73 20 61 74 74 65 6d 70 74 69 6e 67  opers attempting
1be10 20 0a 20 20 74 6f 20 61 6e 61 6c 79 7a 65 20 61   .  to analyze a
1be20 6e 64 20 75 6e 64 65 72 73 74 61 6e 64 20 46 54  nd understand FT
1be30 53 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 68  S performance ch
1be40 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 6f  aracteristics, o
1be50 72 20 74 6f 20 64 65 76 65 6c 6f 70 65 72 73 20  r to developers 
1be60 0a 20 20 63 6f 6e 74 65 6d 70 6c 61 74 69 6e 67  .  contemplating
1be70 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 74 6f   enhancements to
1be80 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 46 54   the existing FT
1be90 53 20 66 65 61 74 75 72 65 20 73 65 74 2e 0a 3c  S feature set..<
1bea0 2f 70 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61  /p>..<tcl>hd_fra
1beb0 67 6d 65 6e 74 20 2a 73 68 61 64 6f 77 74 61 62  gment *shadowtab
1bec0 20 7b 46 54 53 20 73 68 61 64 6f 77 20 74 61 62   {FTS shadow tab
1bed0 6c 65 73 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74  les}</tcl>.<h2 t
1bee0 61 67 73 3d 22 73 68 61 64 6f 77 74 61 62 73 22  ags="shadowtabs"
1bef0 3e 53 68 61 64 6f 77 20 54 61 62 6c 65 73 3c 2f  >Shadow Tables</
1bf00 68 32 3e 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61  h2>.<p>.  For ea
1bf10 63 68 20 46 54 53 20 76 69 72 74 75 61 6c 20 74  ch FTS virtual t
1bf20 61 62 6c 65 20 69 6e 20 61 20 64 61 74 61 62 61  able in a databa
1bf30 73 65 2c 20 74 68 72 65 65 20 74 6f 20 66 69 76  se, three to fiv
1bf40 65 20 72 65 61 6c 20 28 6e 6f 6e 2d 76 69 72 74  e real (non-virt
1bf50 75 61 6c 29 20 74 61 62 6c 65 73 0a 20 20 61 72  ual) tables.  ar
1bf60 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f  e created to sto
1bf70 72 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  re the underlyin
1bf80 67 20 64 61 74 61 2e 20 20 54 68 65 73 65 20 72  g data.  These r
1bf90 65 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 63  eal tables are c
1bfa0 61 6c 6c 65 64 20 22 73 68 61 64 6f 77 20 74 61  alled "shadow ta
1bfb0 62 6c 65 73 22 2e 0a 20 20 54 68 65 20 72 65 61  bles"..  The rea
1bfc0 6c 20 74 61 62 6c 65 73 20 61 72 65 20 6e 61 6d  l tables are nam
1bfd0 65 64 20 22 25 5f 63 6f 6e 74 65 6e 74 22 2c 0a  ed "%_content",.
1bfe0 20 20 22 25 5f 73 65 67 64 69 72 22 2c 20 22 25    "%_segdir", "%
1bff0 5f 73 65 67 6d 65 6e 74 73 22 2c 20 22 25 5f 73  _segments", "%_s
1c000 74 61 74 22 2c 20 61 6e 64 20 22 25 5f 64 6f 63  tat", and "%_doc
1c010 73 69 7a 65 22 2c 20 77 68 65 72 65 20 22 25 22  size", where "%"
1c020 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
1c030 74 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68  the name.  of th
1c040 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74 61  e FTS virtual ta
1c050 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ble...<p>.  The 
1c060 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  leftmost column 
1c070 6f 66 20 74 68 65 20 22 25 5f 63 6f 6e 74 65 6e  of the "%_conten
1c080 74 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 49  t" table is an I
1c090 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1c0a0 45 59 20 66 69 65 6c 64 0a 20 20 6e 61 6d 65 64  EY field.  named
1c0b0 20 22 64 6f 63 69 64 22 2e 20 46 6f 6c 6c 6f 77   "docid". Follow
1c0c0 69 6e 67 20 74 68 69 73 20 69 73 20 6f 6e 65 20  ing this is one 
1c0d0 63 6f 6c 75 6d 6e 20 66 6f 72 20 65 61 63 68 20  column for each 
1c0e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
1c0f0 53 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c  S.  virtual tabl
1c100 65 20 61 73 20 64 65 63 6c 61 72 65 64 20 62 79  e as declared by
1c110 20 74 68 65 20 75 73 65 72 2c 20 6e 61 6d 65 64   the user, named
1c120 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
1c130 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20  he column name. 
1c140 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
1c150 20 75 73 65 72 20 77 69 74 68 20 22 63 3c 69 3e   user with "c<i>
1c160 4e 3c 2f 69 3e 22 2c 20 77 68 65 72 65 20 3c 69  N</i>", where <i
1c170 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20 69 6e  >N</i> is the in
1c180 64 65 78 20 6f 66 20 74 68 65 20 0a 20 20 63 6f  dex of the .  co
1c190 6c 75 6d 6e 20 77 69 74 68 69 6e 20 74 68 65 20  lumn within the 
1c1a0 74 61 62 6c 65 2c 20 6e 75 6d 62 65 72 65 64 20  table, numbered 
1c1b0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1c1c0 68 74 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ht starting with
1c1d0 20 30 2e 20 44 61 74 61 0a 20 20 74 79 70 65 73   0. Data.  types
1c1e0 20 73 75 70 70 6c 69 65 64 20 61 73 20 70 61 72   supplied as par
1c1f0 74 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  t of the virtual
1c200 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
1c210 6f 6e 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  on are not used 
1c220 61 73 0a 20 20 70 61 72 74 20 6f 66 20 74 68 65  as.  part of the
1c230 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1c240 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 46 6f   declaration. Fo
1c250 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
1c260 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
1c270 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65  Virtual table de
1c280 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20  claration</i>.  
1c290 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1c2a0 41 42 4c 45 20 61 62 63 20 55 53 49 4e 47 20 66  ABLE abc USING f
1c2b0 74 73 34 28 61 20 4e 55 4d 42 45 52 2c 20 62 20  ts4(a NUMBER, b 
1c2c0 54 45 58 54 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e  TEXT, c);..  <i>
1c2d0 2d 2d 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67  -- Corresponding
1c2e0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1c2f0 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e   declaration</i>
1c300 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1c310 61 62 63 5f 63 6f 6e 74 65 6e 74 28 64 6f 63 69  abc_content(doci
1c320 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
1c330 59 20 4b 45 59 2c 20 63 30 61 2c 20 63 31 62 2c  Y KEY, c0a, c1b,
1c340 20 63 32 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f   c2c);.</codeblo
1c350 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25  ck>..<p>.  The %
1c360 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 63  _content table c
1c370 6f 6e 74 61 69 6e 73 20 74 68 65 20 75 6e 61 64  ontains the unad
1c380 75 6c 74 65 72 61 74 65 64 20 64 61 74 61 20 69  ulterated data i
1c390 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 75  nserted by the u
1c3a0 73 65 72 20 0a 20 20 69 6e 74 6f 20 74 68 65 20  ser .  into the 
1c3b0 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c  FTS virtual tabl
1c3c0 65 20 62 79 20 74 68 65 20 75 73 65 72 2e 20 49  e by the user. I
1c3d0 66 20 74 68 65 20 75 73 65 72 20 64 6f 65 73 20  f the user does 
1c3e0 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  not explicitly. 
1c3f0 20 73 75 70 70 6c 79 20 61 20 22 64 6f 63 69 64   supply a "docid
1c400 22 20 76 61 6c 75 65 20 77 68 65 6e 20 69 6e 73  " value when ins
1c410 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 2c 20  erting records, 
1c420 6f 6e 65 20 69 73 20 73 65 6c 65 63 74 65 64 20  one is selected 
1c430 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
1c440 62 79 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 0a  by the system...
1c450 3c 70 3e 0a 20 20 54 68 65 20 25 5f 73 74 61 74  <p>.  The %_stat
1c460 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20 74   and %_docsize t
1c470 61 62 6c 65 73 20 61 72 65 20 6f 6e 6c 79 20 63  ables are only c
1c480 72 65 61 74 65 64 20 69 66 20 74 68 65 20 46 54  reated if the FT
1c490 53 20 74 61 62 6c 65 20 75 73 65 73 20 74 68 65  S table uses the
1c4a0 0a 20 20 46 54 53 34 20 6d 6f 64 75 6c 65 2c 20  .  FTS4 module, 
1c4b0 6e 6f 74 20 46 54 53 33 2e 20 46 75 72 74 68 65  not FTS3. Furthe
1c4c0 72 6d 6f 72 65 2c 20 74 68 65 20 25 5f 64 6f 63  rmore, the %_doc
1c4d0 73 69 7a 65 20 74 61 62 6c 65 20 69 73 20 6f 6d  size table is om
1c4e0 69 74 74 65 64 20 69 66 20 74 68 65 0a 20 20 46  itted if the.  F
1c4f0 54 53 34 20 74 61 62 6c 65 20 69 73 20 63 72 65  TS4 table is cre
1c500 61 74 65 64 20 77 69 74 68 20 74 68 65 20 5b 46  ated with the [F
1c510 54 53 34 20 6d 61 74 63 68 69 6e 66 6f 20 6f 70  TS4 matchinfo op
1c520 74 69 6f 6e 7c 22 6d 61 74 63 68 69 6e 66 6f 3d  tion|"matchinfo=
1c530 66 74 73 33 22 5d 20 64 69 72 65 63 74 69 76 65  fts3"] directive
1c540 0a 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20  .  specified as 
1c550 70 61 72 74 20 6f 66 20 74 68 65 20 43 52 45 41  part of the CREA
1c560 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1c570 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
1c580 68 65 79 20 61 72 65 20 63 72 65 61 74 65 64 2c  hey are created,
1c590 0a 20 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  .  the schema of
1c5a0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
1c5b0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 3c  is as follows:.<
1c5c0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45  codeblock>.  CRE
1c5d0 41 54 45 20 54 41 42 4c 45 20 25 5f 73 74 61 74  ATE TABLE %_stat
1c5e0 28 0a 20 20 20 20 69 64 20 49 4e 54 45 47 45 52  (.    id INTEGER
1c5f0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
1c600 20 20 20 76 61 6c 75 65 20 42 4c 4f 42 0a 20 20     value BLOB.  
1c610 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
1c620 4c 45 20 25 5f 64 6f 63 73 69 7a 65 28 0a 20 20  LE %_docsize(.  
1c630 20 20 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20    docid INTEGER 
1c640 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
1c650 20 73 69 7a 65 20 42 4c 4f 42 0a 20 20 29 3b 0a   size BLOB.  );.
1c660 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
1c670 3e 0a 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  >.  For each row
1c680 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
1c690 65 2c 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65  e, the %_docsize
1c6a0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
1c6b0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  a corresponding.
1c6c0 20 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73    row with the s
1c6d0 61 6d 65 20 22 64 6f 63 69 64 22 20 76 61 6c 75  ame "docid" valu
1c6e0 65 2e 20 54 68 65 20 22 73 69 7a 65 22 20 66 69  e. The "size" fi
1c6f0 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 62  eld contains a b
1c700 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 0a 20  lob consisting. 
1c710 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20 46 54 53   of <i>N</i> FTS
1c720 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20   varints, where 
1c730 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20  <i>N</i> is the 
1c740 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64  number of user-d
1c750 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 0a 20  efined columns. 
1c760 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45   in the table. E
1c770 61 63 68 20 76 61 72 69 6e 74 20 69 6e 20 74 68  ach varint in th
1c780 65 20 22 73 69 7a 65 22 20 62 6c 6f 62 20 69 73  e "size" blob is
1c790 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1c7a0 6f 6b 65 6e 73 20 69 6e 20 74 68 65 0a 20 20 63  okens in the.  c
1c7b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
1c7c0 75 6d 6e 20 6f 66 20 74 68 65 20 61 73 73 6f 63  umn of the assoc
1c7d0 69 61 74 65 64 20 72 6f 77 20 69 6e 20 74 68 65  iated row in the
1c7e0 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20   FTS table. The 
1c7f0 25 5f 73 74 61 74 20 74 61 62 6c 65 0a 20 20 61  %_stat table.  a
1c800 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 73 20 61  lways contains a
1c810 20 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68   single row with
1c820 20 74 68 65 20 22 69 64 22 20 63 6f 6c 75 6d 6e   the "id" column
1c830 20 73 65 74 20 74 6f 20 30 2e 20 54 68 65 20 22   set to 0. The "
1c840 76 61 6c 75 65 22 20 0a 20 20 63 6f 6c 75 6d 6e  value" .  column
1c850 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62   contains a blob
1c860 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 3c   consisting of <
1c870 69 3e 4e 2b 31 3c 2f 69 3e 20 46 54 53 20 76 61  i>N+1</i> FTS va
1c880 72 69 6e 74 73 2c 20 77 68 65 72 65 20 3c 69 3e  rints, where <i>
1c890 4e 3c 2f 69 3e 0a 20 20 69 73 20 61 67 61 69 6e  N</i>.  is again
1c8a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
1c8b0 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser-defined colu
1c8c0 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74  mns in the FTS t
1c8d0 61 62 6c 65 2e 20 54 68 65 20 66 69 72 73 74 0a  able. The first.
1c8e0 20 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20    varint in the 
1c8f0 62 6c 6f 62 20 69 73 20 73 65 74 20 74 6f 20 74  blob is set to t
1c900 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1c910 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46  of rows in the F
1c920 54 53 20 74 61 62 6c 65 2e 20 54 68 65 0a 20 20  TS table. The.  
1c930 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
1c940 71 75 65 6e 74 20 76 61 72 69 6e 74 73 20 63 6f  quent varints co
1c950 6e 74 61 69 6e 20 74 68 65 20 74 6f 74 61 6c 20  ntain the total 
1c960 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
1c970 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 74 68 65   stored in.  the
1c980 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
1c990 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f  olumn for all ro
1c9a0 77 73 20 6f 66 20 74 68 65 20 46 54 53 20 74 61  ws of the FTS ta
1c9b0 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ble...<p>.  The 
1c9c0 74 77 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61  two remaining ta
1c9d0 62 6c 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73  bles, %_segments
1c9e0 20 61 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61   and %_segdir, a
1c9f0 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
1ca00 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78   the .  full-tex
1ca10 74 20 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74  t index. Concept
1ca20 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65  ually, this inde
1ca30 78 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61  x is a lookup ta
1ca40 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 65 61  ble that maps ea
1ca50 63 68 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64  ch .  term (word
1ca60 29 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  ) to the set of 
1ca70 64 6f 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72  docid values cor
1ca80 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65  responding to re
1ca90 63 6f 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20  cords in the .  
1caa0 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
1cab0 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65  that contain one
1cac0 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65   or more occurre
1cad0 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d  nces of the term
1cae0 2e 20 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20  . To.  retrieve 
1caf0 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
1cb00 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65  at contain a spe
1cb10 63 69 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65  cified term, the
1cb20 20 46 54 53 20 6d 6f 64 75 6c 65 0a 20 20 71 75   FTS module.  qu
1cb30 65 72 69 65 73 20 74 68 69 73 20 69 6e 64 65 78  eries this index
1cb40 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1cb50 65 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76  e set of docid v
1cb60 61 6c 75 65 73 20 66 6f 72 20 72 65 63 6f 72 64  alues for record
1cb70 73 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e  s that.  contain
1cb80 20 74 68 65 20 74 65 72 6d 2c 20 74 68 65 6e 20   the term, then 
1cb90 72 65 74 72 69 65 76 65 73 20 74 68 65 20 72 65  retrieves the re
1cba0 71 75 69 72 65 64 20 64 6f 63 75 6d 65 6e 74 73  quired documents
1cbb0 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74   from the %_cont
1cbc0 65 6e 74 0a 20 20 74 61 62 6c 65 2e 20 52 65 67  ent.  table. Reg
1cbd0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
1cbe0 63 68 65 6d 61 20 6f 66 20 74 68 65 20 46 54 53  chema of the FTS
1cbf0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
1cc00 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20  the %_segments. 
1cc10 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74 61   and %_segdir ta
1cc20 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  bles are always 
1cc30 63 72 65 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  created as follo
1cc40 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ws:..<codeblock>
1cc50 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1cc60 25 5f 73 65 67 6d 65 6e 74 73 28 0a 20 20 20 20  %_segments(.    
1cc70 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20  blockid INTEGER 
1cc80 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 20  PRIMARY KEY,    
1cc90 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20     <i>-- B-tree 
1cca0 6e 6f 64 65 20 69 64 3c 2f 69 3e 0a 20 20 20 20  node id</i>.    
1ccb0 62 6c 6f 63 6b 20 62 6c 6f 62 20 20 20 20 20 20  block blob      
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20     <i>-- B-tree 
1cce0 6e 6f 64 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20  node data</i>.  
1ccf0 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
1cd00 4c 45 20 25 5f 73 65 67 64 69 72 28 0a 20 20 20  LE %_segdir(.   
1cd10 20 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 0a   level INTEGER,.
1cd20 20 20 20 20 69 64 78 20 49 4e 54 45 47 45 52 2c      idx INTEGER,
1cd30 0a 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b  .    start_block
1cd40 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20   INTEGER,       
1cd50 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c          <i>-- Bl
1cd60 6f 63 6b 69 64 20 6f 66 20 66 69 72 73 74 20 6e  ockid of first n
1cd70 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74  ode in %_segment
1cd80 73 3c 2f 69 3e 0a 20 20 20 20 6c 65 61 76 65 73  s</i>.    leaves
1cd90 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47  _end_block INTEG
1cda0 45 52 2c 20 20 20 20 20 20 20 20 20 20 3c 69 3e  ER,          <i>
1cdb0 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61  -- Blockid of la
1cdc0 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20  st leaf node in 
1cdd0 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20  %_segments</i>. 
1cde0 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54     end_block INT
1cdf0 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 20  EGER,           
1ce00 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63        <i>-- Bloc
1ce10 6b 69 64 20 6f 66 20 6c 61 73 74 20 6e 6f 64 65  kid of last node
1ce20 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f   in %_segments</
1ce30 69 3e 0a 20 20 20 20 72 6f 6f 74 20 42 4c 4f 42  i>.    root BLOB
1ce40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ce50 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
1ce60 42 2d 74 72 65 65 20 72 6f 6f 74 20 6e 6f 64 65  B-tree root node
1ce70 3c 2f 69 3e 0a 20 20 20 20 50 52 49 4d 41 52 59  </i>.    PRIMARY
1ce80 20 4b 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29   KEY(level, idx)
1ce90 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  .  );.</codebloc
1cea0 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 63  k>..<p>.  The sc
1ceb0 68 65 6d 61 20 64 65 70 69 63 74 65 64 20 61 62  hema depicted ab
1cec0 6f 76 65 20 69 73 20 6e 6f 74 20 64 65 73 69 67  ove is not desig
1ced0 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ned to store the
1cee0 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
1cef0 20 0a 20 20 64 69 72 65 63 74 6c 79 2e 20 49 6e   .  directly. In
1cf00 73 74 65 61 64 2c 20 69 74 20 69 73 20 75 73 65  stead, it is use
1cf10 64 20 74 6f 20 73 74 6f 72 65 20 6f 6e 65 20 6f  d to store one o
1cf20 72 20 6d 6f 72 65 20 62 2d 74 72 65 65 20 73 74  r more b-tree st
1cf30 72 75 63 74 75 72 65 73 2e 20 54 68 65 72 65 0a  ructures. There.
1cf40 20 20 69 73 20 6f 6e 65 20 62 2d 74 72 65 65 20    is one b-tree 
1cf50 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
1cf60 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
1cf70 6c 65 2e 20 54 68 65 20 25 5f 73 65 67 64 69 72  le. The %_segdir
1cf80 20 74 61 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e   table.  row con
1cf90 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e  tains the root n
1cfa0 6f 64 65 20 61 6e 64 20 76 61 72 69 6f 75 73 20  ode and various 
1cfb0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1cfc0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1cfd0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
1cfe0 2c 20 61 6e 64 20 74 68 65 20 25 5f 73 65 67 6d  , and the %_segm
1cff0 65 6e 74 73 20 74 61 62 6c 65 20 63 6f 6e 74 61  ents table conta
1d000 69 6e 73 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e  ins all other (n
1d010 6f 6e 2d 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65  on-root).  b-tre
1d020 65 20 6e 6f 64 65 73 2e 20 45 61 63 68 20 62 2d  e nodes. Each b-
1d030 74 72 65 65 20 69 73 20 72 65 66 65 72 72 65 64  tree is referred
1d040 20 74 6f 20 61 73 20 61 20 22 73 65 67 6d 65 6e   to as a "segmen
1d050 74 22 2e 20 4f 6e 63 65 20 69 74 20 68 61 73 0a  t". Once it has.
1d060 20 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20    been created, 
1d070 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
1d080 20 69 73 20 6e 65 76 65 72 20 75 70 64 61 74 65   is never update
1d090 64 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 6d  d (although it m
1d0a0 61 79 20 62 65 0a 20 20 64 65 6c 65 74 65 64 20  ay be.  deleted 
1d0b0 61 6c 74 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70  altogether)...<p
1d0c0 3e 0a 20 20 54 68 65 20 6b 65 79 73 20 75 73 65  >.  The keys use
1d0d0 64 20 62 79 20 65 61 63 68 20 73 65 67 6d 65 6e  d by each segmen
1d0e0 74 20 62 2d 74 72 65 65 20 61 72 65 20 74 65 72  t b-tree are ter
1d0f0 6d 73 20 28 77 6f 72 64 73 29 2e 20 41 73 20 77  ms (words). As w
1d100 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 6b 65 79  ell as the.  key
1d110 2c 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62  , each segment b
1d120 2d 74 72 65 65 20 65 6e 74 72 79 20 68 61 73 20  -tree entry has 
1d130 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 22 64  an associated "d
1d140 6f 63 6c 69 73 74 22 20 28 64 6f 63 75 6d 65 6e  oclist" (documen
1d150 74 20 6c 69 73 74 29 2e 0a 20 20 41 20 64 6f 63  t list)..  A doc
1d160 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  list consists of
1d170 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e   zero or more en
1d180 74 72 69 65 73 2c 20 77 68 65 72 65 20 65 61 63  tries, where eac
1d190 68 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  h entry consists
1d1a0 20 6f 66 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69   of:..<ul>.  <li
1d1b0 3e 20 41 20 64 6f 63 69 64 20 28 64 6f 63 75 6d  > A docid (docum
1d1c0 65 6e 74 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c  ent id), and.  <
1d1d0 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65  li> A list of te
1d1e0 72 6d 20 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20  rm offsets, one 
1d1f0 66 6f 72 20 65 61 63 68 20 6f 63 63 75 72 72 65  for each occurre
1d200 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  nce of the term 
1d210 77 69 74 68 69 6e 0a 20 20 20 20 20 20 20 74 68  within.       th
1d220 65 20 64 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65  e document. A te
1d230 72 6d 20 6f 66 66 73 65 74 20 69 6e 64 69 63 61  rm offset indica
1d240 74 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tes the number o
1d250 66 20 74 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29  f tokens (words)
1d260 0a 20 20 20 20 20 20 20 74 68 61 74 20 6f 63 63  .       that occ
1d270 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 74 65  ur before the te
1d280 72 6d 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20  rm in question, 
1d290 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1d2a0 66 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  f characters.   
1d2b0 20 20 20 20 6f 72 20 62 79 74 65 73 2e 20 46 6f      or bytes. Fo
1d2c0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  r example, the t
1d2d0 65 72 6d 20 6f 66 66 73 65 74 20 6f 66 20 74 68  erm offset of th
1d2e0 65 20 74 65 72 6d 20 22 77 61 72 22 20 69 6e 20  e term "war" in 
1d2f0 74 68 65 0a 20 20 20 20 20 20 20 70 68 72 61 73  the.       phras
1d300 65 20 22 41 6e 63 65 73 74 72 61 6c 20 76 6f 69  e "Ancestral voi
1d310 63 65 73 20 70 72 6f 70 68 65 73 79 69 6e 67 20  ces prophesying 
1d320 77 61 72 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c  war!" is 3..</ul
1d330 3e 0a 0a 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73  >..<p>.  Entries
1d340 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73   within a doclis
1d350 74 20 61 72 65 20 73 6f 72 74 65 64 20 62 79 20  t are sorted by 
1d360 64 6f 63 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73  docid. Positions
1d370 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73   within a doclis
1d380 74 0a 20 20 65 6e 74 72 79 20 61 72 65 20 73 74  t.  entry are st
1d390 6f 72 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  ored in ascendin
1d3a0 67 20 6f 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20  g order...<p>.  
1d3b0 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
1d3c0 74 68 65 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c  the logical full
1d3d0 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73 20 66  -text index is f
1d3e0 6f 75 6e 64 20 62 79 20 6d 65 72 67 69 6e 67 20  ound by merging 
1d3f0 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f  the.  contents o
1d400 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d  f all segment b-
1d410 74 72 65 65 73 2e 20 49 66 20 61 20 74 65 72 6d  trees. If a term
1d420 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 6d   is present in m
1d430 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73  ore than one.  s
1d440 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20 74  egment b-tree, t
1d450 68 65 6e 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hen it maps to t
1d460 68 65 20 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68  he union of each
1d470 20 69 6e 64 69 76 69 64 75 61 6c 20 64 6f 63 6c   individual docl
1d480 69 73 74 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61  ist. If,.  for a
1d490 20 73 69 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68   single term, th
1d4a0 65 20 73 61 6d 65 20 64 6f 63 69 64 20 6f 63 63  e same docid occ
1d4b0 75 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  urs in more than
1d4c0 20 6f 6e 65 20 64 6f 63 6c 69 73 74 2c 20 74 68   one doclist, th
1d4d0 65 6e 20 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f  en only.  the do
1d4e0 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 61  clist that is pa
1d4f0 72 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  rt of the most r
1d500 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
1d510 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
1d520 73 20 0a 20 20 63 6f 6e 73 69 64 65 72 65 64 20  s .  considered 
1d530 76 61 6c 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d  valid. ..<p>.  M
1d540 75 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20 73  ultiple b-tree s
1d550 74 72 75 63 74 75 72 65 73 20 61 72 65 20 75 73  tructures are us
1d560 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ed instead of a 
1d570 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 74 6f  single b-tree to
1d580 20 72 65 64 75 63 65 0a 20 20 74 68 65 20 63 6f   reduce.  the co
1d590 73 74 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20  st of inserting 
1d5a0 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 46 54 53  records into FTS
1d5b0 20 74 61 62 6c 65 73 2e 20 57 68 65 6e 20 61 20   tables. When a 
1d5c0 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 0a 20  new record is . 
1d5d0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
1d5e0 6e 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74  n FTS table that
1d5f0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1d600 73 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c  s a lot of data,
1d610 20 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20   it is.  likely 
1d620 74 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65  that many of the
1d630 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65   terms in the ne
1d640 77 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72  w record are alr
1d650 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a  eady present in.
1d660 20 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72    a large number
1d670 20 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65 63   of existing rec
1d680 6f 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c  ords. If a singl
1d690 65 20 62 2d 74 72 65 65 20 77 65 72 65 20 75 73  e b-tree were us
1d6a0 65 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65  ed, then.  large
1d6b0 20 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75   doclist structu
1d6c0 72 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74  res would have t
1d6d0 6f 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d  o be loaded from
1d6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20   the database,. 
1d6f0 20 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c   amended to incl
1d700 75 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69  ude the new doci
1d710 64 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65  d and term-offse
1d720 74 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69  t list, then wri
1d730 74 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74  tten back.  to t
1d740 68 65 20 64 61 74 61 62 61 73 65 2e 20 55 73 69  he database. Usi
1d750 6e 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72  ng multiple b-tr
1d760 65 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73  ee tables allows
1d770 20 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69   this to be avoi
1d780 64 65 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e  ded.  by creatin
1d790 67 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77  g a new b-tree w
1d7a0 68 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67  hich can be merg
1d7b0 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
1d7c0 74 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f  ting b-tree.  (o
1d7d0 72 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72  r b-trees) later
1d7e0 20 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20   on. Merging of 
1d7f0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
1d800 73 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d  s can be perform
1d810 65 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72  ed as.  a backgr
1d820 6f 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e  ound task, or on
1d830 63 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d  ce a certain num
1d840 62 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 20  ber of separate 
1d850 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
1d860 73 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61 63  s.  have been ac
1d870 63 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f  cumulated. Of co
1d880 75 72 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d  urse, this schem
1d890 65 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20  e makes queries 
1d8a0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20  more expensive. 
1d8b0 20 28 61 73 20 74 68 65 20 46 54 53 20 63 6f 64   (as the FTS cod
1d8c0 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c 6f  e may have to lo
1d8d0 6f 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61 6c  ok up individual
1d8e0 20 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74   terms in more t
1d8f0 68 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65  han one.  b-tree
1d900 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
1d910 65 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74 20  esults), but it 
1d920 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 74  has been found t
1d930 68 61 74 20 69 6e 20 70 72 61 63 74 69 63 65 20  hat in practice 
1d940 74 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64 20  this.  overhead 
1d950 69 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69  is often negligi
1d960 62 6c 65 2e 0a 20 20 0a 3c 68 32 3e 56 61 72 69  ble..  .<h2>Vari
1d970 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74 65  able Length Inte
1d980 67 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f 72  ger (varint) For
1d990 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  mat</h2>..<p>.  
1d9a0 49 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 73  Integer values s
1d9b0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
1d9c0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1d9d0 6e 6f 64 65 73 20 61 72 65 20 65 6e 63 6f 64 65  nodes are encode
1d9e0 64 20 75 73 69 6e 67 20 74 68 65 0a 20 20 46 54  d using the.  FT
1d9f0 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e  S varint format.
1da00 20 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   This encoding i
1da10 73 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c  s similar, but <
1da20 62 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c  b>not identical<
1da30 2f 62 3e 2c 20 74 6f 0a 20 20 74 68 65 20 3c 61  /b>, to.  the <a
1da40 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d 61   href="fileforma
1da50 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74 5f 66 6f  t.html#varint_fo
1da60 72 6d 61 74 22 3e 53 51 4c 69 74 65 20 76 61 72  rmat">SQLite var
1da70 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a  int format</a>..
1da80 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63 6f 64 65  .<p>.  An encode
1da90 64 20 46 54 53 20 76 61 72 69 6e 74 20 63 6f 6e  d FTS varint con
1daa0 73 75 6d 65 73 20 62 65 74 77 65 65 6e 20 6f 6e  sumes between on
1dab0 65 20 61 6e 64 20 74 65 6e 20 62 79 74 65 73 20  e and ten bytes 
1dac0 6f 66 20 73 70 61 63 65 2e 20 54 68 65 0a 20 20  of space. The.  
1dad0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1dae0 72 65 71 75 69 72 65 64 20 69 73 20 64 65 74 65  required is dete
1daf0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 73 69  rmined by the si
1db00 67 6e 20 61 6e 64 20 6d 61 67 6e 69 74 75 64 65  gn and magnitude
1db10 20 6f 66 20 74 68 65 0a 20 20 69 6e 74 65 67 65   of the.  intege
1db20 72 20 76 61 6c 75 65 20 65 6e 63 6f 64 65 64 2e  r value encoded.
1db30 20 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c 79   More accurately
1db40 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
1db50 62 79 74 65 73 20 75 73 65 64 20 74 6f 20 73 74  bytes used to st
1db60 6f 72 65 0a 20 20 74 68 65 20 65 6e 63 6f 64 65  ore.  the encode
1db70 64 20 69 6e 74 65 67 65 72 20 64 65 70 65 6e 64  d integer depend
1db80 73 20 6f 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s on the positio
1db90 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 73 69  n of the most si
1dba0 67 6e 69 66 69 63 61 6e 74 20 73 65 74 20 62 69  gnificant set bi
1dbb0 74 0a 20 20 69 6e 20 74 68 65 20 36 34 2d 62 69  t.  in the 64-bi
1dbc0 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
1dbd0 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
1dbe0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
1dbf0 76 61 6c 75 65 2e 20 4e 65 67 61 74 69 76 65 0a  value. Negative.
1dc00 20 20 76 61 6c 75 65 73 20 61 6c 77 61 79 73 20    values always 
1dc10 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73 69  have the most si
1dc20 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73 65  gnificant bit se
1dc30 74 20 28 74 68 65 20 73 69 67 6e 20 62 69 74 29  t (the sign bit)
1dc40 2c 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 61  , and so are.  a
1dc50 6c 77 61 79 73 20 73 74 6f 72 65 64 20 75 73 69  lways stored usi
1dc60 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 65 6e 20  ng the full ten 
1dc70 62 79 74 65 73 2e 20 50 6f 73 69 74 69 76 65 20  bytes. Positive 
1dc80 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 6d  integer values m
1dc90 61 79 20 62 65 0a 20 20 73 74 6f 72 65 64 20 75  ay be.  stored u
1dca0 73 69 6e 67 20 6c 65 73 73 20 73 70 61 63 65 2e  sing less space.
1dcb0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 6e 61  ..<p>.  The fina
1dcc0 6c 20 62 79 74 65 20 6f 66 20 61 6e 20 65 6e 63  l byte of an enc
1dcd0 6f 64 65 64 20 46 54 53 20 76 61 72 69 6e 74 20  oded FTS varint 
1dce0 68 61 73 20 69 74 73 20 6d 6f 73 74 20 73 69 67  has its most sig
1dcf0 6e 69 66 69 63 61 6e 74 20 62 69 74 20 0a 20 20  nificant bit .  
1dd00 63 6c 65 61 72 65 64 2e 20 41 6c 6c 20 70 72 65  cleared. All pre
1dd10 63 65 64 69 6e 67 20 62 79 74 65 73 20 68 61 76  ceding bytes hav
1dd20 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  e the most signi
1dd30 66 69 63 61 6e 74 20 62 69 74 20 73 65 74 2e 20  ficant bit set. 
1dd40 44 61 74 61 0a 20 20 69 73 20 73 74 6f 72 65 64  Data.  is stored
1dd50 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   in the remainin
1dd60 67 20 73 65 76 65 6e 20 6c 65 61 73 74 20 73 69  g seven least si
1dd70 67 6e 69 66 69 63 61 6e 74 20 62 69 74 73 20 6f  gnificant bits o
1dd80 66 20 65 61 63 68 20 62 79 74 65 2e 0a 20 20 54  f each byte..  T
1dd90 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
1dda0 20 74 68 65 20 65 6e 63 6f 64 65 64 20 72 65 70   the encoded rep
1ddb0 72 65 73 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 74  resentation cont
1ddc0 61 69 6e 73 20 74 68 65 20 6c 65 61 73 74 20 73  ains the least s
1ddd0 69 67 6e 69 66 69 63 61 6e 74 0a 20 20 73 65 76  ignificant.  sev
1dde0 65 6e 20 62 69 74 73 20 6f 66 20 74 68 65 20 65  en bits of the e
1ddf0 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 76  ncoded integer v
1de00 61 6c 75 65 2e 20 54 68 65 20 73 65 63 6f 6e 64  alue. The second
1de10 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e 63   byte of the enc
1de20 6f 64 65 64 0a 20 20 72 65 70 72 65 73 65 6e 74  oded.  represent
1de30 61 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ation, if it is 
1de40 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 61 69 6e  present, contain
1de50 73 20 74 68 65 20 73 65 76 65 6e 20 6e 65 78 74  s the seven next
1de60 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61   least significa
1de70 6e 74 0a 20 20 62 69 74 73 20 6f 66 20 74 68 65  nt.  bits of the
1de80 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20   integer value, 
1de90 61 6e 64 20 73 6f 20 6f 6e 2e 20 54 68 65 20 66  and so on. The f
1dea0 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63  ollowing table c
1deb0 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c 65 73  ontains examples
1dec0 0a 20 20 6f 66 20 65 6e 63 6f 64 65 64 20 69 6e  .  of encoded in
1ded0 74 65 67 65 72 20 76 61 6c 75 65 73 3a 0a 0a 3c  teger values:..<
1dee0 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e  table striped=1>
1def0 0a 20 20 3c 74 72 3e 3c 74 68 3e 44 65 63 69 6d  .  <tr><th>Decim
1df00 61 6c 3c 74 68 3e 48 65 78 61 64 65 63 69 6d 61  al<th>Hexadecima
1df10 6c 3c 74 68 20 77 69 64 74 68 3d 31 30 30 25 3e  l<th width=100%>
1df20 45 6e 63 6f 64 65 64 20 52 65 70 72 65 73 65 6e  Encoded Represen
1df30 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64  tation.  <tr><td
1df40 3e 34 33 3c 74 64 3e 30 78 30 30 30 30 30 30 30  >43<td>0x0000000
1df50 30 30 30 30 30 30 30 32 42 3c 74 64 3e 30 78 32  00000002B<td>0x2
1df60 42 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 30 30  B .  <tr><td>200
1df70 38 31 35 3c 74 64 3e 30 78 30 30 30 30 30 30 30  815<td>0x0000000
1df80 30 30 30 30 33 31 30 36 46 3c 74 64 3e 30 78 39  00003106F<td>0x9
1df90 43 20 30 78 41 30 20 30 78 30 43 0a 20 20 3c 74  C 0xA0 0x0C.  <t
1dfa0 72 3e 3c 74 64 3e 2d 31 3c 74 64 3e 30 78 46 46  r><td>-1<td>0xFF
1dfb0 46 46 46 46 46 46 46 46 46 46 46 46 46 46 3c 74  FFFFFFFFFFFFFF<t
1dfc0 64 3e 30 78 46 46 20 30 78 46 46 20 30 78 46 46  d>0xFF 0xFF 0xFF
1dfd0 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20   0xFF 0xFF 0xFF 
1dfe0 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
1dff0 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a 20 20 0a  x01.</table>.  .
1e000 0a 3c 68 32 3e 53 65 67 6d 65 6e 74 20 42 2d 54  .<h2>Segment B-T
1e010 72 65 65 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a  ree Format</h2>.
1e020 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20 62  .<p>.  Segment b
1e030 2d 74 72 65 65 73 20 61 72 65 20 70 72 65 66 69  -trees are prefi
1e040 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b 2d  x-compressed b+-
1e050 74 72 65 65 73 2e 20 54 68 65 72 65 20 69 73 20  trees. There is 
1e060 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  one segment b-tr
1e070 65 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f  ee.  for each ro
1e080 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  w in the %_segdi
1e090 72 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f  r table (see abo
1e0a0 76 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e 6f  ve). The root no
1e0b0 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
1e0c0 74 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73 74  t.  b-tree is st
1e0d0 6f 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69  ored as a blob i
1e0e0 6e 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69 65  n the "root" fie
1e0f0 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ld of the corres
1e100 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f 66  ponding row.  of
1e110 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
1e120 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e  ble. All other n
1e130 6f 64 65 73 20 28 69 66 20 61 6e 79 20 65 78 69  odes (if any exi
1e140 73 74 29 20 61 72 65 20 73 74 6f 72 65 64 20 69  st) are stored i
1e150 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22 20  n the .  "blob" 
1e160 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f  column of the %_
1e170 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
1e180 4e 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68 65  Nodes within the
1e190 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
1e1a0 65 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66 69  e are.  identifi
1e1b0 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
1e1c0 72 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 62  r value in the b
1e1d0 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66 20  lockid field of 
1e1e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e1f0 67 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f 6c  g.  row. The fol
1e200 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
1e210 63 72 69 62 65 73 20 74 68 65 20 66 69 65 6c 64  cribes the field
1e220 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  s of the %_segdi
1e230 72 20 74 61 62 6c 65 3a 0a 0a 3c 74 61 62 6c 65  r table:..<table
1e240 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74   striped=1>.  <t
1e250 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20  r><th>Column    
1e260 20 20 20 20 20 20 20 3c 74 68 20 77 69 64 74 68         <th width
1e270 3d 31 30 30 25 3e 49 6e 74 65 72 70 72 65 74 61  =100%>Interpreta
1e280 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c  tion.  <tr><td>l
1e290 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20  evel            
1e2a0 3c 74 64 3e 20 0a 20 20 20 20 42 65 74 77 65 65  <td> .    Betwee
1e2b0 6e 20 74 68 65 6d 2c 20 74 68 65 20 63 6f 6e 74  n them, the cont
1e2c0 65 6e 74 73 20 6f 66 20 74 68 65 20 22 6c 65 76  ents of the "lev
1e2d0 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66 69  el" and "idx" fi
1e2e0 65 6c 64 73 20 64 65 66 69 6e 65 20 74 68 65 0a  elds define the.
1e2f0 20 20 20 20 72 65 6c 61 74 69 76 65 20 61 67 65      relative age
1e300 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   of the segment 
1e310 62 2d 74 72 65 65 2e 20 54 68 65 20 73 6d 61 6c  b-tree. The smal
1e320 6c 65 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  ler the value st
1e330 6f 72 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20  ored in the.    
1e340 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 2c 20 74  "level" field, t
1e350 68 65 20 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79  he more recently
1e360 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
1e370 72 65 65 20 77 61 73 20 63 72 65 61 74 65 64 2e  ree was created.
1e380 20 49 66 20 74 77 6f 0a 20 20 20 20 73 65 67 6d   If two.    segm
1e390 65 6e 74 20 62 2d 74 72 65 65 73 20 61 72 65 20  ent b-trees are 
1e3a0 6f 66 20 74 68 65 20 73 61 6d 65 20 22 6c 65 76  of the same "lev
1e3b0 65 6c 22 2c 20 74 68 65 20 73 65 67 6d 65 6e 74  el", the segment
1e3c0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 72   with the larger
1e3d0 0a 20 20 20 20 76 61 6c 75 65 20 73 74 6f 72 65  .    value store
1e3e0 64 20 69 6e 20 74 68 65 20 22 69 64 78 22 20 63  d in the "idx" c
1e3f0 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72 65 20 72 65  olumn is more re
1e400 63 65 6e 74 2e 20 54 68 65 20 50 52 49 4d 41 52  cent. The PRIMAR
1e410 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1e420 0a 20 20 20 20 6f 6e 20 74 68 65 20 25 5f 73 65  .    on the %_se
1e430 67 64 69 72 20 74 61 62 6c 65 20 70 72 65 76 65  gdir table preve
1e440 6e 74 73 20 61 6e 79 20 74 77 6f 20 73 65 67 6d  nts any two segm
1e450 65 6e 74 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  ents from having
1e460 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 0a   the same value.
1e470 20 20 20 20 66 6f 72 20 62 6f 74 68 20 74 68 65      for both the
1e480 20 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64   "level" and "id
1e490 78 22 20 66 69 65 6c 64 73 2e 0a 20 20 3c 74 72  x" fields..  <tr
1e4a0 3e 3c 74 64 3e 69 64 78 20 20 20 20 20 20 20 20  ><td>idx        
1e4b0 20 20 20 20 20 20 3c 74 64 3e 20 53 65 65 20 61        <td> See a
1e4c0 62 6f 76 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  bove..  <tr><td>
1e4d0 73 74 61 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20  start_block     
1e4e0 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c   <td>.    The bl
1e4f0 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65  ockid that corre
1e500 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6e 6f  sponds to the no
1e510 64 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  de with the smal
1e520 6c 65 73 74 20 62 6c 6f 63 6b 69 64 20 74 68 61  lest blockid tha
1e530 74 20 0a 20 20 20 20 62 65 6c 6f 6e 67 73 20 74  t .    belongs t
1e540 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62  o this segment b
1e550 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69  -tree. Or zero i
1e560 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67  f the entire seg
1e570 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20  ment b-tree.    
1e580 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74  fits on the root
1e590 20 6e 6f 64 65 2e 20 49 66 20 69 74 20 65 78 69   node. If it exi
1e5a0 73 74 73 2c 20 74 68 69 73 20 6e 6f 64 65 20 69  sts, this node i
1e5b0 73 20 61 6c 77 61 79 73 20 61 20 6c 65 61 66 20  s always a leaf 
1e5c0 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  node..  <tr><td>
1e5d0 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1e5e0 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c   <td>.    The bl
1e5f0 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65  ockid that corre
1e600 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c 65  sponds to the le
1e610 61 66 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65  af node with the
1e620 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64   largest blockid
1e630 20 0a 20 20 20 20 74 68 61 74 20 62 65 6c 6f 6e   .    that belon
1e640 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65  gs to this segme
1e650 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65  nt b-tree. Or ze
1e660 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
1e670 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
1e680 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20      fits on the 
1e690 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20 20 3c 74 72  root node..  <tr
1e6a0 3e 3c 74 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c  ><td>end_block <
1e6b0 74 64 3e 0a 20 20 20 20 54 68 69 73 20 66 69 65  td>.    This fie
1e6c0 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ld may contain e
1e6d0 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1e6e0 20 6f 72 20 61 20 74 65 78 74 20 66 69 65 6c 64   or a text field
1e6f0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 0a 20   consisting of. 
1e700 20 20 20 74 77 6f 20 69 6e 74 65 67 65 72 73 20     two integers 
1e710 73 65 70 61 72 61 74 65 64 20 62 79 20 61 20 73  separated by a s
1e720 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 28  pace character (
1e730 75 6e 69 63 6f 64 65 20 63 6f 64 65 70 6f 69 6e  unicode codepoin
1e740 74 20 30 78 32 30 29 2e 0a 3c 70 20 73 74 79 6c  t 0x20)..<p styl
1e750 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 30  e="margin-left:0
1e760 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74 3a 30 22  ;margin-right:0"
1e770 3e 0a 20 20 20 20 54 68 65 20 66 69 72 73 74 2c  >.    The first,
1e780 20 6f 72 20 6f 6e 6c 79 2c 20 69 6e 74 65 67 65   or only, intege
1e790 72 20 69 73 20 74 68 65 20 62 6c 6f 63 6b 69 64  r is the blockid
1e7a0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1e7b0 73 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f  s to the interio
1e7c0 72 0a 20 20 20 20 6e 6f 64 65 20 77 69 74 68 20  r.    node with 
1e7d0 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63  the largest bloc
1e7e0 6b 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67 73  kid that belongs
1e7f0 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74   to this segment
1e800 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f   b-tree. Or zero
1e810 0a 20 20 20 20 69 66 20 74 68 65 20 65 6e 74 69  .    if the enti
1e820 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  re segment b-tre
1e830 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f  e fits on the ro
1e840 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20 65  ot node. If it e
1e850 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64 65  xists, this node
1e860 0a 20 20 20 20 69 73 20 61 6c 77 61 79 73 20 61  .    is always a
1e870 6e 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  n interior node.
1e880 0a 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67 69  .<p style="margi
1e890 6e 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e 2d  n-left:0;margin-
1e8a0 72 69 67 68 74 3a 30 3b 6d 61 72 67 69 6e 2d 62  right:0;margin-b
1e8b0 6f 74 74 6f 6d 3a 30 22 3e 0a 20 20 20 20 54 68  ottom:0">.    Th
1e8c0 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
1e8d0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1e8e0 6e 74 2c 20 69 73 20 74 68 65 20 61 67 67 72 65  nt, is the aggre
1e8f0 67 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c  gate size of all
1e900 20 64 61 74 61 0a 20 20 20 20 73 74 6f 72 65 64   data.    stored
1e910 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 20 69   on leaf pages i
1e920 6e 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  n bytes. If the 
1e930 76 61 6c 75 65 20 69 73 20 6e 65 67 61 74 69 76  value is negativ
1e940 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 67 6d  e, then the segm
1e950 65 6e 74 0a 20 20 20 20 69 73 20 74 68 65 20 6f  ent.    is the o
1e960 75 74 70 75 74 20 6f 66 20 61 6e 20 75 6e 66 69  utput of an unfi
1e970 6e 69 73 68 65 64 20 69 6e 63 72 65 6d 65 6e 74  nished increment
1e980 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al-merge operati
1e990 6f 6e 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20  on, and the.    
1e9a0 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69  absolute value i
1e9b0 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 69  s current size i
1e9c0 6e 20 62 79 74 65 73 2e 0a 0a 20 20 3c 74 72 3e  n bytes...  <tr>
1e9d0 3c 74 64 3e 72 6f 6f 74 20 20 20 20 20 20 20 20  <td>root        
1e9e0 20 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 42 6c       <td>.    Bl
1e9f0 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ob containing th
1ea00 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
1ea10 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  he segment b-tre
1ea20 65 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e  e..</table>..<p>
1ea30 0a 20 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  .  Apart from th
1ea40 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65  e root node, the
1ea50 20 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 6b 65   nodes that make
1ea60 20 75 70 20 61 20 73 69 6e 67 6c 65 20 73 65 67   up a single seg
1ea70 6d 65 6e 74 20 62 2d 74 72 65 65 20 61 72 65 0a  ment b-tree are.
1ea80 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20    always stored 
1ea90 75 73 69 6e 67 20 61 20 63 6f 6e 74 69 67 75 6f  using a contiguo
1eaa0 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  us sequence of b
1eab0 6c 6f 63 6b 69 64 73 2e 20 46 75 72 74 68 65 72  lockids. Further
1eac0 6d 6f 72 65 2c 20 74 68 65 0a 20 20 6e 6f 64 65  more, the.  node
1ead0 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61  s that make up a
1eae0 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66   single level of
1eaf0 20 74 68 65 20 62 2d 74 72 65 65 20 61 72 65 20   the b-tree are 
1eb00 74 68 65 6d 73 65 6c 76 65 73 20 73 74 6f 72 65  themselves store
1eb10 64 20 61 73 0a 20 20 61 20 63 6f 6e 74 69 67 75  d as.  a contigu
1eb20 6f 75 73 20 62 6c 6f 63 6b 2c 20 69 6e 20 62 2d  ous block, in b-
1eb30 74 72 65 65 20 6f 72 64 65 72 2e 20 54 68 65 20  tree order. The 
1eb40 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
1eb50 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 0a  nce of blockids.
1eb60 20 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20    used to store 
1eb70 74 68 65 20 62 2d 74 72 65 65 20 6c 65 61 76 65  the b-tree leave
1eb80 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
1eb90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
1eba0 65 20 62 6c 6f 63 6b 69 64 0a 20 20 76 61 6c 75  e blockid.  valu
1ebb0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1ebc0 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 63 6f  "start_block" co
1ebd0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 72 72  lumn of the corr
1ebe0 65 73 70 6f 6e 64 69 6e 67 20 25 5f 73 65 67 64  esponding %_segd
1ebf0 69 72 20 72 6f 77 2c 0a 20 20 61 6e 64 20 66 69  ir row,.  and fi
1ec00 6e 69 73 68 69 6e 67 20 61 74 20 74 68 65 20 62  nishing at the b
1ec10 6c 6f 63 6b 69 64 20 76 61 6c 75 65 20 73 74 6f  lockid value sto
1ec20 72 65 64 20 69 6e 20 74 68 65 20 22 6c 65 61 76  red in the "leav
1ec30 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 0a 20 20  es_end_block".  
1ec40 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 61 6d  field of the sam
1ec50 65 20 72 6f 77 2e 20 49 74 20 69 73 20 74 68 65  e row. It is the
1ec60 72 65 66 6f 72 65 20 70 6f 73 73 69 62 6c 65 20  refore possible 
1ec70 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ec80 67 68 20 61 6c 6c 20 74 68 65 0a 20 20 6c 65 61  gh all the.  lea
1ec90 76 65 73 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  ves of a segment
1eca0 20 62 2d 74 72 65 65 2c 20 69 6e 20 6b 65 79 20   b-tree, in key 
1ecb0 6f 72 64 65 72 2c 20 62 79 20 74 72 61 76 65 72  order, by traver
1ecc0 73 69 6e 67 20 74 68 65 20 25 5f 73 65 67 6d 65  sing the %_segme
1ecd0 6e 74 73 20 0a 20 20 74 61 62 6c 65 20 69 6e 20  nts .  table in 
1ece0 62 6c 6f 63 6b 69 64 20 6f 72 64 65 72 20 66 72  blockid order fr
1ecf0 6f 6d 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22  om "start_block"
1ed00 20 74 6f 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f   to "leaves_end_
1ed10 62 6c 6f 63 6b 22 2e 20 20 0a 0a 3c 68 33 3e 53  block".  ..<h3>S
1ed20 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65  egment B-Tree Le
1ed30 61 66 20 4e 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c  af Nodes</h3>..<
1ed40 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  p>.  The followi
1ed50 6e 67 20 64 69 61 67 72 61 6d 20 64 65 70 69 63  ng diagram depic
1ed60 74 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66  ts the format of
1ed70 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65   a segment b-tre
1ed80 65 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 0a 3c 63  e leaf node...<c
1ed90 65 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72  enter>.  <img sr
1eda0 63 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 6c 65  c=images/fts3_le
1edb0 61 66 5f 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c  af_node.png>.  <
1edc0 70 3e 20 53 65 67 6d 65 6e 74 20 42 2d 54 72 65  p> Segment B-Tre
1edd0 65 20 4c 65 61 66 20 4e 6f 64 65 20 46 6f 72 6d  e Leaf Node Form
1ede0 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70  at.</center>..<p
1edf0 3e 0a 20 20 54 68 65 20 66 69 72 73 74 20 74 65  >.  The first te
1ee00 72 6d 20 73 74 6f 72 65 64 20 6f 6e 20 65 61 63  rm stored on eac
1ee10 68 20 6e 6f 64 65 20 28 22 54 65 72 6d 20 31 22  h node ("Term 1"
1ee20 20 69 6e 20 74 68 65 20 66 69 67 75 72 65 20 61   in the figure a
1ee30 62 6f 76 65 29 20 69 73 0a 20 20 73 74 6f 72 65  bove) is.  store
1ee40 64 20 76 65 72 62 61 74 69 6d 2e 20 45 61 63 68  d verbatim. Each
1ee50 20 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d   subsequent term
1ee60 20 69 73 20 70 72 65 66 69 78 2d 63 6f 6d 70 72   is prefix-compr
1ee70 65 73 73 65 64 20 77 69 74 68 20 72 65 73 70 65  essed with respe
1ee80 63 74 0a 20 20 74 6f 20 69 74 73 20 70 72 65 64  ct.  to its pred
1ee90 65 63 65 73 73 6f 72 2e 20 54 65 72 6d 73 20 61  ecessor. Terms a
1eea0 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  re stored within
1eeb0 20 61 20 70 61 67 65 20 69 6e 20 73 6f 72 74 65   a page in sorte
1eec0 64 20 28 6d 65 6d 63 6d 70 29 0a 20 20 6f 72 64  d (memcmp).  ord
1eed0 65 72 2e 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74  er...<h3>Segment
1eee0 20 42 2d 54 72 65 65 20 49 6e 74 65 72 69 6f 72   B-Tree Interior
1eef0 20 4e 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e   Nodes</h3>..<p>
1ef00 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1ef10 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73   diagram depicts
1ef20 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61   the format of a
1ef30 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1ef40 69 6e 74 65 72 69 6f 72 20 0a 20 20 28 6e 6f 6e  interior .  (non
1ef50 2d 6c 65 61 66 29 20 6e 6f 64 65 2e 0a 0a 3c 63  -leaf) node...<c
1ef60 65 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72  enter>.  <img sr
1ef70 63 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 69 6e  c=images/fts3_in
1ef80 74 65 72 69 6f 72 5f 6e 6f 64 65 2e 70 6e 67 3e  terior_node.png>
1ef90 0a 20 20 3c 70 3e 20 53 65 67 6d 65 6e 74 20 42  .  <p> Segment B
1efa0 2d 54 72 65 65 20 49 6e 74 65 72 69 6f 72 20 4e  -Tree Interior N
1efb0 6f 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e  ode Format.</cen
1efc0 74 65 72 3e 0a 0a 0a 3c 68 32 3e 44 6f 63 6c 69  ter>...<h2>Docli
1efd0 73 74 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a  st Format</h2>..
1efe0 3c 70 3e 0a 20 20 41 20 64 6f 63 6c 69 73 74 20  <p>.  A doclist 
1eff0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 61  consists of an a
1f000 72 72 61 79 20 6f 66 20 36 34 2d 62 69 74 20 73  rray of 64-bit s
1f010 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2c 20  igned integers, 
1f020 73 65 72 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  serialized using
1f030 0a 20 20 74 68 65 20 46 54 53 20 76 61 72 69 6e  .  the FTS varin
1f040 74 20 66 6f 72 6d 61 74 2e 20 45 61 63 68 20 64  t format. Each d
1f050 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 69 73 20  oclist entry is 
1f060 6d 61 64 65 20 75 70 20 6f 66 20 61 20 73 65 72  made up of a ser
1f070 69 65 73 20 6f 66 20 74 77 6f 20 0a 20 20 6f 72  ies of two .  or
1f080 20 6d 6f 72 65 20 69 6e 74 65 67 65 72 73 2c 20   more integers, 
1f090 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c  as follows:..<ol
1f0a0 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20 64 6f 63  >.  <li> The doc
1f0b0 69 64 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69  id value. The fi
1f0c0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 61 20 64  rst entry in a d
1f0d0 6f 63 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  oclist contains 
1f0e0 74 68 65 20 6c 69 74 65 72 61 6c 20 64 6f 63 69  the literal doci
1f0f0 64 0a 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20  d.       value. 
1f100 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  The first field 
1f110 6f 66 20 65 61 63 68 20 73 75 62 73 65 71 75 65  of each subseque
1f120 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79  nt doclist entry
1f130 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 20   contains the . 
1f140 20 20 20 20 20 20 64 69 66 66 65 72 65 6e 63 65        difference
1f150 20 62 65 74 77 65 65 6e 20 74 68 65 20 6e 65 77   between the new
1f160 20 64 6f 63 69 64 20 61 6e 64 20 74 68 65 20 70   docid and the p
1f170 72 65 76 69 6f 75 73 20 6f 6e 65 20 28 61 6c 77  revious one (alw
1f180 61 79 73 20 61 20 70 6f 73 69 74 69 76 65 20 0a  ays a positive .
1f190 20 20 20 20 20 20 20 6e 75 6d 62 65 72 29 2e 0a         number)..
1f1a0 20 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d    <li> Zero or m
1f1b0 6f 72 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  ore term-offset 
1f1c0 6c 69 73 74 73 2e 20 41 20 74 65 72 6d 2d 6f 66  lists. A term-of
1f1d0 66 73 65 74 20 6c 69 73 74 20 69 73 20 70 72 65  fset list is pre
1f1e0 73 65 6e 74 20 66 6f 72 20 65 61 63 68 0a 20 20  sent for each.  
1f1f0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74       column of t
1f200 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74  he FTS virtual t
1f210 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
1f220 6e 73 20 74 68 65 20 74 65 72 6d 2e 20 41 20 74  ns the term. A t
1f230 65 72 6d 2d 6f 66 66 73 65 74 0a 20 20 20 20 20  erm-offset.     
1f240 20 20 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20    list consists 
1f250 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1f260 3a 0a 20 20 20 20 20 3c 6f 6c 3e 0a 20 20 20 20  :.     <ol>.    
1f270 20 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74     <li> Constant
1f280 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 66   value 1. This f
1f290 69 65 6c 64 20 69 73 20 6f 6d 69 74 74 65 64 20  ield is omitted 
1f2a0 66 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66  for any term-off
1f2b0 73 65 74 20 6c 69 73 74 0a 20 20 20 20 20 20 20  set list.       
1f2c0 20 20 20 20 20 61 73 73 6f 63 69 61 74 65 64 20       associated 
1f2d0 77 69 74 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20  with column 0.. 
1f2e0 20 20 20 20 20 20 3c 6c 69 3e 20 54 68 65 20 63        <li> The c
1f2f0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 31 20  olumn number (1 
1f300 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  for the second l
1f310 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20  eftmost column, 
1f320 65 74 63 2e 29 2e 20 54 68 69 73 0a 20 20 20 20  etc.). This.    
1f330 20 20 20 20 20 20 20 20 66 69 65 6c 64 20 69 73          field is
1f340 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79   omitted for any
1f350 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
1f360 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1f370 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20  h column 0..    
1f380 20 20 20 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f     <li> A list o
1f390 66 20 74 65 72 6d 2d 6f 66 66 73 65 74 73 2c 20  f term-offsets, 
1f3a0 73 6f 72 74 65 64 20 66 72 6f 6d 20 73 6d 61 6c  sorted from smal
1f3b0 6c 65 73 74 20 74 6f 20 6c 61 72 67 65 73 74 2e  lest to largest.
1f3c0 20 49 6e 73 74 65 61 64 0a 20 20 20 20 20 20 20   Instead.       
1f3d0 20 20 20 20 20 6f 66 20 73 74 6f 72 69 6e 67 20       of storing 
1f3e0 74 68 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  the term-offset 
1f3f0 76 61 6c 75 65 20 6c 69 74 65 72 61 6c 6c 79 2c  value literally,
1f400 20 65 61 63 68 20 69 6e 74 65 67 65 72 20 73 74   each integer st
1f410 6f 72 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  ored .          
1f420 20 20 69 73 20 74 68 65 20 64 69 66 66 65 72 65    is the differe
1f430 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
1f440 63 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66  current term-off
1f450 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  set and the prev
1f460 69 6f 75 73 20 0a 20 20 20 20 20 20 20 20 20 20  ious .          
1f470 20 20 6f 6e 65 20 28 6f 72 20 7a 65 72 6f 20 69    one (or zero i
1f480 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
1f490 72 6d 2d 6f 66 66 73 65 74 20 69 73 20 74 68 65  rm-offset is the
1f4a0 20 66 69 72 73 74 29 2c 20 70 6c 75 73 20 32 2e   first), plus 2.
1f4b0 0a 20 20 20 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c  .     </ol>.  <l
1f4c0 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75  i> Constant valu
1f4d0 65 20 30 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 65 6e  e 0..</ol>..<cen
1f4e0 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d  ter>.  <img src=
1f4f0 69 6d 61 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c  images/fts3_docl
1f500 69 73 74 32 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20  ist2.png>.  <p> 
1f510 46 54 53 33 20 44 6f 63 6c 69 73 74 20 46 6f 72  FTS3 Doclist For
1f520 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c  mat.</center>..<
1f530 63 65 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73  center>.  <img s
1f540 72 63 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 64  rc=images/fts3_d
1f550 6f 63 6c 69 73 74 2e 70 6e 67 3e 0a 20 20 3c 70  oclist.png>.  <p
1f560 3e 20 46 54 53 20 44 6f 63 6c 69 73 74 20 45 6e  > FTS Doclist En
1f570 74 72 79 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e  try Format.</cen
1f580 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  ter>..<p>.  For 
1f590 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 77 68 69  doclists for whi
1f5a0 63 68 20 74 68 65 20 74 65 72 6d 20 61 70 70 65  ch the term appe
1f5b0 61 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ars in more than
1f5c0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
1f5d0 68 65 20 46 54 53 0a 20 20 76 69 72 74 75 61 6c  he FTS.  virtual
1f5e0 20 74 61 62 6c 65 2c 20 74 65 72 6d 2d 6f 66 66   table, term-off
1f5f0 73 65 74 20 6c 69 73 74 73 20 77 69 74 68 69 6e  set lists within
1f600 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 72 65   the doclist are
1f610 20 73 74 6f 72 65 64 20 69 6e 20 63 6f 6c 75 6d   stored in colum
1f620 6e 20 0a 20 20 6e 75 6d 62 65 72 20 6f 72 64 65  n .  number orde
1f630 72 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  r. This ensures 
1f640 74 68 61 74 20 74 68 65 20 74 65 72 6d 2d 6f 66  that the term-of
1f650 66 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69  fset list associ
1f660 61 74 65 64 20 77 69 74 68 20 0a 20 20 63 6f 6c  ated with .  col
1f670 75 6d 6e 20 30 20 28 69 66 20 61 6e 79 29 20 69  umn 0 (if any) i
1f680 73 20 61 6c 77 61 79 73 20 66 69 72 73 74 2c 20  s always first, 
1f690 61 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72  allowing the fir
1f6a0 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
1f6b0 20 74 68 65 0a 20 20 74 65 72 6d 2d 6f 66 66 73   the.  term-offs
1f6c0 65 74 20 6c 69 73 74 20 74 6f 20 62 65 20 6f 6d  et list to be om
1f6d0 69 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  itted in this ca
1f6e0 73 65 2e 0a 0a 3c 68 31 20 69 64 3d 61 70 70 65  se...<h1 id=appe
1f6f0 6e 64 69 78 5f 61 20 6e 6f 6e 75 6d 62 65 72 20  ndix_a nonumber 
1f700 74 61 67 73 3d 22 73 65 61 72 63 68 20 61 70 70  tags="search app
1f710 6c 69 63 61 74 69 6f 6e 20 74 69 70 73 22 3e 0a  lication tips">.
1f720 20 20 41 70 70 65 6e 64 69 78 20 41 3a 20 53 65    Appendix A: Se
1f730 61 72 63 68 20 41 70 70 6c 69 63 61 74 69 6f 6e  arch Application
1f740 20 54 69 70 73 0a 3c 2f 68 31 3e 0a 0a 3c 70 3e   Tips.</h1>..<p>
1f750 0a 20 20 46 54 53 20 69 73 20 70 72 69 6d 61 72  .  FTS is primar
1f760 69 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f 20  ily designed to 
1f770 73 75 70 70 6f 72 74 20 42 6f 6f 6c 65 61 6e 20  support Boolean 
1f780 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
1f790 73 20 2d 20 71 75 65 72 69 65 73 0a 20 20 74 6f  s - queries.  to
1f7a0 20 66 69 6e 64 20 74 68 65 20 73 65 74 20 6f 66   find the set of
1f7b0 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
1f7c0 6d 61 74 63 68 20 61 20 73 70 65 63 69 66 69 65  match a specifie
1f7d0 64 20 63 72 69 74 65 72 69 61 2e 20 48 6f 77 65  d criteria. Howe
1f7e0 76 65 72 2c 20 6d 61 6e 79 20 0a 20 20 28 6d 6f  ver, many .  (mo
1f7f0 73 74 3f 29 20 73 65 61 72 63 68 20 61 70 70 6c  st?) search appl
1f800 69 63 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  ications require
1f810 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 61 72   that results ar
1f820 65 20 73 6f 6d 65 68 6f 77 20 72 61 6e 6b 65 64  e somehow ranked
1f830 20 69 6e 20 6f 72 64 65 72 0a 20 20 6f 66 20 22   in order.  of "
1f840 72 65 6c 65 76 61 6e 63 65 22 2c 20 77 68 65 72  relevance", wher
1f850 65 20 22 72 65 6c 65 76 61 6e 63 65 22 20 69 73  e "relevance" is
1f860 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20   defined as the 
1f870 6c 69 6b 65 6c 69 68 6f 6f 64 20 74 68 61 74 20  likelihood that 
1f880 74 68 65 20 75 73 65 72 0a 20 20 77 68 6f 20 70  the user.  who p
1f890 65 72 66 6f 72 6d 65 64 20 74 68 65 20 73 65 61  erformed the sea
1f8a0 72 63 68 20 69 73 20 69 6e 74 65 72 65 73 74 65  rch is intereste
1f8b0 64 20 69 6e 20 61 20 73 70 65 63 69 66 69 63 20  d in a specific 
1f8c0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 72  element of the r
1f8d0 65 74 75 72 6e 65 64 0a 20 20 73 65 74 20 6f 66  eturned.  set of
1f8e0 20 64 6f 63 75 6d 65 6e 74 73 2e 20 57 68 65 6e   documents. When
1f8f0 20 75 73 69 6e 67 20 61 20 73 65 61 72 63 68 20   using a search 
1f900 65 6e 67 69 6e 65 20 74 6f 20 66 69 6e 64 20 64  engine to find d
1f910 6f 63 75 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  ocuments on the 
1f920 77 6f 72 6c 64 0a 20 20 77 69 64 65 20 77 65 62  world.  wide web
1f930 2c 20 74 68 65 20 75 73 65 72 20 65 78 70 65 63  , the user expec
1f940 74 73 20 74 68 61 74 20 74 68 65 20 6d 6f 73 74  ts that the most
1f950 20 75 73 65 66 75 6c 2c 20 6f 72 20 22 72 65 6c   useful, or "rel
1f960 65 76 61 6e 74 22 2c 20 64 6f 63 75 6d 65 6e 74  evant", document
1f970 73 20 0a 20 20 77 69 6c 6c 20 62 65 20 72 65 74  s .  will be ret
1f980 75 72 6e 65 64 20 61 73 20 74 68 65 20 66 69 72  urned as the fir
1f990 73 74 20 70 61 67 65 20 6f 66 20 72 65 73 75 6c  st page of resul
1f9a0 74 73 2c 20 61 6e 64 20 74 68 61 74 20 65 61 63  ts, and that eac
1f9b0 68 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67  h subsequent pag
1f9c0 65 20 0a 20 20 63 6f 6e 74 61 69 6e 73 20 70 72  e .  contains pr
1f9d0 6f 67 72 65 73 73 69 76 65 6c 79 20 6c 65 73 73  ogressively less
1f9e0 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75 6c 74   relevant result
1f9f0 73 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  s. Exactly how a
1fa00 20 6d 61 63 68 69 6e 65 20 63 61 6e 20 0a 20 20   machine can .  
1fa10 64 65 74 65 72 6d 69 6e 65 20 64 6f 63 75 6d 65  determine docume
1fa20 6e 74 20 72 65 6c 65 76 61 6e 63 65 20 62 61 73  nt relevance bas
1fa30 65 64 20 6f 6e 20 61 20 75 73 65 72 73 20 71 75  ed on a users qu
1fa40 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6c 69 63  ery is a complic
1fa50 61 74 65 64 20 70 72 6f 62 6c 65 6d 0a 20 20 61  ated problem.  a
1fa60 6e 64 20 74 68 65 20 73 75 62 6a 65 63 74 20 6f  nd the subject o
1fa70 66 20 6d 75 63 68 20 6f 6e 67 6f 69 6e 67 20 72  f much ongoing r
1fa80 65 73 65 61 72 63 68 2e 0a 0a 3c 70 3e 0a 20 20  esearch...<p>.  
1fa90 4f 6e 65 20 76 65 72 79 20 73 69 6d 70 6c 65 20  One very simple 
1faa0 73 63 68 65 6d 65 20 6d 69 67 68 74 20 62 65 20  scheme might be 
1fab0 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  to count the num
1fac0 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ber of instances
1fad0 20 6f 66 20 74 68 65 20 0a 20 20 75 73 65 72 73   of the .  users
1fae0 20 73 65 61 72 63 68 20 74 65 72 6d 73 20 69 6e   search terms in
1faf0 20 65 61 63 68 20 72 65 73 75 6c 74 20 64 6f 63   each result doc
1fb00 75 6d 65 6e 74 2e 20 54 68 6f 73 65 20 64 6f 63  ument. Those doc
1fb10 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
1fb20 61 69 6e 0a 20 20 6d 61 6e 79 20 69 6e 73 74 61  ain.  many insta
1fb30 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d  nces of the term
1fb40 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1fb50 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20 74   more relevant t
1fb60 68 61 6e 20 74 68 6f 73 65 20 77 69 74 68 0a 20  han those with. 
1fb70 20 61 20 73 6d 61 6c 6c 20 6e 75 6d 62 65 72 20   a small number 
1fb80 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  of instances of 
1fb90 65 61 63 68 20 74 65 72 6d 2e 20 49 6e 20 61 6e  each term. In an
1fba0 20 46 54 53 20 61 70 70 6c 69 63 61 74 69 6f 6e   FTS application
1fbb0 2c 20 74 68 65 20 0a 20 20 6e 75 6d 62 65 72 20  , the .  number 
1fbc0 6f 66 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65  of term instance
1fbd0 73 20 69 6e 20 65 61 63 68 20 72 65 73 75 6c 74  s in each result
1fbe0 20 63 6f 75 6c 64 20 62 65 20 64 65 74 65 72 6d   could be determ
1fbf0 69 6e 65 64 20 62 79 20 63 6f 75 6e 74 69 6e 67  ined by counting
1fc00 0a 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  the number of
1fc10 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65   integers in the
1fc20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1fc30 20 74 68 65 20 5b 6f 66 66 73 65 74 73 5d 20 66   the [offsets] f
1fc40 75 6e 63 74 69 6f 6e 2e 0a 20 20 54 68 65 20 66  unction..  The f
1fc50 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65  ollowing example
1fc60 20 73 68 6f 77 73 20 61 20 71 75 65 72 79 20 74   shows a query t
1fc70 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65  hat could be use
1fc80 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 0a  d to obtain the.
1fc90 20 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76    ten most relev
1fca0 61 6e 74 20 72 65 73 75 6c 74 73 20 66 6f 72 20  ant results for 
1fcb0 61 20 71 75 65 72 79 20 65 6e 74 65 72 65 64 20  a query entered 
1fcc0 62 79 20 74 68 65 20 75 73 65 72 3a 0a 0a 3c 63  by the user:..<c
1fcd0 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
1fce0 2d 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 28  - This example (
1fcf0 61 6e 64 20 61 6c 6c 20 6f 74 68 65 72 73 20 69  and all others i
1fd00 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e 29 20  n this section) 
1fd10 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
1fd20 6f 77 69 6e 67 20 73 63 68 65 6d 61 3c 2f 69 3e  owing schema</i>
1fd30 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
1fd40 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74  L TABLE document
1fd50 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74  s USING fts3(tit
1fd60 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20  le, content);.. 
1fd70 20 3c 69 3e 2d 2d 20 41 73 73 75 6d 69 6e 67 20   <i>-- Assuming 
1fd80 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
1fd90 68 61 73 20 73 75 70 70 6c 69 65 64 20 61 6e 20  has supplied an 
1fda0 53 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e 63  SQLite user func
1fdb0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 63 6f 75 6e  tion named "coun
1fdc0 74 69 6e 74 65 67 65 72 73 22 3c 2f 69 3e 0a 20  tintegers"</i>. 
1fdd0 20 3c 69 3e 2d 2d 20 74 68 61 74 20 72 65 74 75   <i>-- that retu
1fde0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1fdf0 66 20 73 70 61 63 65 2d 73 65 70 61 72 61 74 65  f space-separate
1fe00 64 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  d integers conta
1fe10 69 6e 65 64 20 69 6e 20 69 74 73 20 6f 6e 6c 79  ined in its only
1fe20 20 61 72 67 75 6d 65 6e 74 2c 3c 2f 69 3e 0a 20   argument,</i>. 
1fe30 20 3c 69 3e 2d 2d 20 74 68 65 20 66 6f 6c 6c 6f   <i>-- the follo
1fe40 77 69 6e 67 20 71 75 65 72 79 20 63 6f 75 6c 64  wing query could
1fe50 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
1fe60 72 6e 20 74 68 65 20 74 69 74 6c 65 73 20 6f 66  rn the titles of
1fe70 20 74 68 65 20 31 30 20 64 6f 63 75 6d 65 6e 74   the 10 document
1fe80 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 3c 2f  s that contain</
1fe90 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 67  i>.  <i>-- the g
1fea0 72 65 61 74 65 73 74 20 6e 75 6d 62 65 72 20 6f  reatest number o
1feb0 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
1fec0 68 65 20 75 73 65 72 73 20 71 75 65 72 79 20 74  he users query t
1fed0 65 72 6d 73 2e 20 48 6f 70 65 66 75 6c 6c 79 2c  erms. Hopefully,
1fee0 20 74 68 65 73 65 20 31 30 3c 2f 69 3e 0a 20 20   these 10</i>.  
1fef0 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 73 20  <i>-- documents 
1ff00 77 69 6c 6c 20 62 65 20 74 68 6f 73 65 20 74 68  will be those th
1ff10 61 74 20 74 68 65 20 75 73 65 72 73 20 63 6f 6e  at the users con
1ff20 73 69 64 65 72 73 20 6d 6f 72 65 20 6f 72 20 6c  siders more or l
1ff30 65 73 73 20 74 68 65 20 6d 6f 73 74 20 22 72 65  ess the most "re
1ff40 6c 65 76 61 6e 74 22 2e 3c 2f 69 3e 0a 20 20 53  levant".</i>.  S
1ff50 45 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d  ELECT title FROM
1ff60 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20   documents .    
1ff70 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20  WHERE documents 
1ff80 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26  MATCH &lt;query&
1ff90 67 74 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59  gt;.    ORDER BY
1ffa0 20 63 6f 75 6e 74 69 6e 74 65 67 65 72 73 28 6f   countintegers(o
1ffb0 66 66 73 65 74 73 28 64 6f 63 75 6d 65 6e 74 73  ffsets(documents
1ffc0 29 29 20 44 45 53 43 0a 20 20 20 20 4c 49 4d 49  )) DESC.    LIMI
1ffd0 54 20 31 30 20 4f 46 46 53 45 54 20 30 0a 3c 2f  T 10 OFFSET 0.</
1ffe0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
1fff0 20 20 54 68 65 20 71 75 65 72 79 20 61 62 6f 76    The query abov
20000 65 20 63 6f 75 6c 64 20 62 65 20 6d 61 64 65 20  e could be made 
20010 74 6f 20 72 75 6e 20 66 61 73 74 65 72 20 62 79  to run faster by
20020 20 75 73 69 6e 67 20 74 68 65 20 46 54 53 20 5b   using the FTS [
20030 6d 61 74 63 68 69 6e 66 6f 5d 0a 20 20 66 75 6e  matchinfo].  fun
20040 63 74 69 6f 6e 20 74 6f 20 64 65 74 65 72 6d 69  ction to determi
20050 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
20060 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73 74   query term inst
20070 61 6e 63 65 73 20 74 68 61 74 20 61 70 70 65 61  ances that appea
20080 72 20 69 6e 20 65 61 63 68 0a 20 20 72 65 73 75  r in each.  resu
20090 6c 74 2e 20 54 68 65 20 6d 61 74 63 68 69 6e 66  lt. The matchinf
200a0 6f 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75  o function is mu
200b0 63 68 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ch more efficien
200c0 74 20 74 68 61 6e 20 74 68 65 20 6f 66 66 73 65  t than the offse
200d0 74 73 20 0a 20 20 66 75 6e 63 74 69 6f 6e 2e 20  ts .  function. 
200e0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
200f0 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74   matchinfo funct
20100 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 65 78 74  ion provides ext
20110 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ra information. 
20120 20 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 6f   regarding the o
20130 76 65 72 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66  verall number of
20140 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
20150 65 61 63 68 20 71 75 65 72 79 20 74 65 72 6d 20  each query term 
20160 69 6e 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20  in the entire.  
20170 64 6f 63 75 6d 65 6e 74 20 73 65 74 20 28 6e 6f  document set (no
20180 74 20 6a 75 73 74 20 74 68 65 20 63 75 72 72 65  t just the curre
20190 6e 74 20 72 6f 77 29 20 61 6e 64 20 74 68 65 20  nt row) and the 
201a0 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
201b0 6e 74 73 20 69 6e 20 77 68 69 63 68 20 0a 20 20  nts in which .  
201c0 65 61 63 68 20 71 75 65 72 79 20 74 65 72 6d 20  each query term 
201d0 61 70 70 65 61 72 73 2e 20 54 68 69 73 20 6d 61  appears. This ma
201e0 79 20 62 65 20 75 73 65 64 20 28 66 6f 72 20 65  y be used (for e
201f0 78 61 6d 70 6c 65 29 20 74 6f 20 61 74 74 61 63  xample) to attac
20200 68 20 61 20 68 69 67 68 65 72 0a 20 20 77 65 69  h a higher.  wei
20210 67 68 74 20 74 6f 20 6c 65 73 73 20 63 6f 6d 6d  ght to less comm
20220 6f 6e 20 74 65 72 6d 73 20 77 68 69 63 68 20 6d  on terms which m
20230 61 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ay increase the 
20240 6f 76 65 72 61 6c 6c 20 63 6f 6d 70 75 74 65 64  overall computed
20250 20 72 65 6c 65 76 61 6e 63 79 20 0a 20 20 6f 66   relevancy .  of
20260 20 74 68 6f 73 65 20 72 65 73 75 6c 74 73 20 74   those results t
20270 68 65 20 75 73 65 72 20 63 6f 6e 73 69 64 65 72  he user consider
20280 73 20 6d 6f 72 65 20 69 6e 74 65 72 65 73 74 69  s more interesti
20290 6e 67 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ng...<codeblock>
202a0 0a 20 20 3c 69 3e 2d 2d 20 49 66 20 74 68 65 20  .  <i>-- If the 
202b0 61 70 70 6c 69 63 61 74 69 6f 6e 20 73 75 70 70  application supp
202c0 6c 69 65 73 20 61 6e 20 53 51 4c 69 74 65 20 75  lies an SQLite u
202d0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ser function cal
202e0 6c 65 64 20 22 72 61 6e 6b 22 20 74 68 61 74 3c  led "rank" that<
202f0 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 74 65  /i>.  <i>-- inte
20300 72 70 72 65 74 73 20 74 68 65 20 62 6c 6f 62 20  rprets the blob 
20310 6f 66 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  of data returned
20320 20 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 61 6e   by matchinfo an
20330 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6d 65  d returns a nume
20340 72 69 63 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ric</i>.  <i>-- 
20350 72 65 6c 65 76 61 6e 63 79 20 62 61 73 65 64 20  relevancy based 
20360 6f 6e 20 69 74 2c 20 74 68 65 6e 20 74 68 65 20  on it, then the 
20370 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 6d 61  following SQL ma
20380 79 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  y be used to ret
20390 75 72 6e 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69  urn the</i>.  <i
203a0 3e 2d 2d 20 74 69 74 6c 65 73 20 6f 66 20 74 68  >-- titles of th
203b0 65 20 31 30 20 6d 6f 73 74 20 72 65 6c 65 76 61  e 10 most releva
203c0 6e 74 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20  nt documents in 
203d0 74 68 65 20 64 61 74 61 73 65 74 20 66 6f 72 20  the dataset for 
203e0 61 20 75 73 65 72 73 20 71 75 65 72 79 2e 3c 2f  a users query.</
203f0 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c  i>.  SELECT titl
20400 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73  e FROM documents
20410 20 0a 20 20 20 20 57 48 45 52 45 20 64 6f 63 75   .    WHERE docu
20420 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b  ments MATCH &lt;
20430 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20 4f 52  query&gt;.    OR
20440 44 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63  DER BY rank(matc
20450 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29  hinfo(documents)
20460 29 20 44 45 53 43 0a 20 20 20 20 4c 49 4d 49 54  ) DESC.    LIMIT
20470 20 31 30 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63   10 OFFSET 0.</c
20480 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
20490 20 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   The SQL query i
204a0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
204b0 6f 76 65 20 75 73 65 73 20 6c 65 73 73 20 43 50  ove uses less CP
204c0 55 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  U than the first
204d0 20 65 78 61 6d 70 6c 65 0a 20 20 69 6e 20 74 68   example.  in th
204e0 69 73 20 73 65 63 74 69 6f 6e 2c 20 62 75 74 20  is section, but 
204f0 73 74 69 6c 6c 20 68 61 73 20 61 20 6e 6f 6e 2d  still has a non-
20500 6f 62 76 69 6f 75 73 20 70 65 72 66 6f 72 6d 61  obvious performa
20510 6e 63 65 20 70 72 6f 62 6c 65 6d 2e 20 53 51 4c  nce problem. SQL
20520 69 74 65 0a 20 20 73 61 74 69 73 66 69 65 73 20  ite.  satisfies 
20530 74 68 69 73 20 71 75 65 72 79 20 62 79 20 72 65  this query by re
20540 74 72 69 65 76 69 6e 67 20 74 68 65 20 76 61 6c  trieving the val
20550 75 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c 65  ue of the "title
20560 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 20 20 6d  " column and.  m
20570 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66 72  atchinfo data fr
20580 6f 6d 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c  om the FTS modul
20590 65 20 66 6f 72 20 65 76 65 72 79 20 72 6f 77 20  e for every row 
205a0 6d 61 74 63 68 65 64 20 62 79 20 74 68 65 20 75  matched by the u
205b0 73 65 72 73 0a 20 20 71 75 65 72 79 20 62 65 66  sers.  query bef
205c0 6f 72 65 20 69 74 20 73 6f 72 74 73 20 61 6e 64  ore it sorts and
205d0 20 6c 69 6d 69 74 73 20 74 68 65 20 72 65 73 75   limits the resu
205e0 6c 74 73 2e 20 42 65 63 61 75 73 65 20 6f 66 20  lts. Because of 
205f0 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 27 73  the way SQLite's
20600 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  .  virtual table
20610 20 69 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73   interface works
20620 2c 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65  , retrieving the
20630 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 74   value of the "t
20640 69 74 6c 65 22 20 63 6f 6c 75 6d 6e 0a 20 20 72  itle" column.  r
20650 65 71 75 69 72 65 73 20 6c 6f 61 64 69 6e 67 20  equires loading 
20660 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 20 66  the entire row f
20670 72 6f 6d 20 64 69 73 6b 20 28 69 6e 63 6c 75 64  rom disk (includ
20680 69 6e 67 20 74 68 65 20 22 63 6f 6e 74 65 6e 74  ing the "content
20690 22 20 66 69 65 6c 64 2c 0a 20 20 77 68 69 63 68  " field,.  which
206a0 20 6d 61 79 20 62 65 20 71 75 69 74 65 20 6c 61   may be quite la
206b0 72 67 65 29 2e 20 54 68 69 73 20 6d 65 61 6e 73  rge). This means
206c0 20 74 68 61 74 20 69 66 20 74 68 65 20 75 73 65   that if the use
206d0 72 73 20 71 75 65 72 79 20 6d 61 74 63 68 65 73  rs query matches
206e0 0a 20 20 73 65 76 65 72 61 6c 20 74 68 6f 75 73  .  several thous
206f0 61 6e 64 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6d  and documents, m
20700 61 6e 79 20 6d 65 67 61 62 79 74 65 73 20 6f 66  any megabytes of
20710 20 22 74 69 74 6c 65 22 20 61 6e 64 20 22 63 6f   "title" and "co
20720 6e 74 65 6e 74 22 20 64 61 74 61 0a 20 20 6d 61  ntent" data.  ma
20730 79 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d  y be loaded from
20740 20 64 69 73 6b 20 69 6e 74 6f 20 6d 65 6d 6f 72   disk into memor
20750 79 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  y even though th
20760 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
20770 20 75 73 65 64 0a 20 20 66 6f 72 20 61 6e 79 20   used.  for any 
20780 70 75 72 70 6f 73 65 2e 20 0a 0a 3c 70 3e 0a 20  purpose. ..<p>. 
20790 20 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   The SQL query i
207a0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
207b0 65 78 61 6d 70 6c 65 20 62 6c 6f 63 6b 20 69 73  example block is
207c0 20 6f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 74 6f   one solution to
207d0 20 74 68 69 73 20 0a 20 20 70 72 6f 62 6c 65 6d   this .  problem
207e0 2e 20 49 6e 20 53 51 4c 69 74 65 2c 20 77 68 65  . In SQLite, whe
207f0 6e 20 61 20 3c 61 20 68 72 65 66 3d 22 6f 70 74  n a <a href="opt
20800 6f 76 65 72 76 69 65 77 2e 68 74 6d 6c 23 66 6c  overview.html#fl
20810 61 74 74 65 6e 69 6e 67 22 3e 73 75 62 2d 71 75  attening">sub-qu
20820 65 72 79 20 0a 20 20 75 73 65 64 20 69 6e 20 61  ery .  used in a
20830 20 6a 6f 69 6e 20 63 6f 6e 74 61 69 6e 73 20 61   join contains a
20840 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 3c 2f 61   LIMIT clause</a
20850 3e 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  >, the results o
20860 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
20870 61 72 65 0a 20 20 63 61 6c 63 75 6c 61 74 65 64  are.  calculated
20880 20 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 20 74   and stored in t
20890 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 62  emporary table b
208a0 65 66 6f 72 65 20 74 68 65 20 6d 61 69 6e 20 71  efore the main q
208b0 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64  uery is executed
208c0 2e 0a 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  ..  This means t
208d0 68 61 74 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  hat SQLite will 
208e0 6c 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 64 6f  load only the do
208f0 63 69 64 20 61 6e 64 20 6d 61 74 63 68 69 6e 66  cid and matchinf
20900 6f 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 0a  o data for each.
20910 20 20 72 6f 77 20 6d 61 74 63 68 69 6e 67 20 74    row matching t
20920 68 65 20 75 73 65 72 73 20 71 75 65 72 79 20 69  he users query i
20930 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 64 65 74 65  nto memory, dete
20940 72 6d 69 6e 65 20 74 68 65 20 64 6f 63 69 64 20  rmine the docid 
20950 76 61 6c 75 65 73 0a 20 20 63 6f 72 72 65 73 70  values.  corresp
20960 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 74 65  onding to the te
20970 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20  n most relevant 
20980 64 6f 63 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  documents, then 
20990 6c 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 74 69  load only the ti
209a0 74 6c 65 0a 20 20 61 6e 64 20 63 6f 6e 74 65 6e  tle.  and conten
209b0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  t information fo
209c0 72 20 74 68 6f 73 65 20 31 30 20 64 6f 63 75 6d  r those 10 docum
209d0 65 6e 74 73 20 6f 6e 6c 79 2e 20 42 65 63 61 75  ents only. Becau
209e0 73 65 20 62 6f 74 68 20 74 68 65 20 6d 61 74 63  se both the matc
209f0 68 69 6e 66 6f 0a 20 20 61 6e 64 20 64 6f 63 69  hinfo.  and doci
20a00 64 20 76 61 6c 75 65 73 20 61 72 65 20 67 6c 65  d values are gle
20a10 61 6e 65 64 20 65 6e 74 69 72 65 6c 79 20 66 72  aned entirely fr
20a20 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  om the full-text
20a30 20 69 6e 64 65 78 2c 20 74 68 69 73 20 72 65 73   index, this res
20a40 75 6c 74 73 0a 20 20 69 6e 20 64 72 61 6d 61 74  ults.  in dramat
20a50 69 63 61 6c 6c 79 20 6c 65 73 73 20 64 61 74 61  ically less data
20a60 20 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72   being loaded fr
20a70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
20a80 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 0a 3c 63  into memory...<c
20a90 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45  odeblock>.  SELE
20aa0 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f  CT title FROM do
20ab0 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a  cuments JOIN ( .
20ac0 20 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63        SELECT doc
20ad0 69 64 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e  id, rank(matchin
20ae0 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 41  fo(documents)) A
20af0 53 20 72 61 6e 6b 20 0a 20 20 20 20 20 20 46 52  S rank .      FR
20b00 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 0a 20 20 20  OM documents.   
20b10 20 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e     WHERE documen
20b20 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65  ts MATCH &lt;que
20b30 72 79 26 67 74 3b 0a 20 20 20 20 20 20 4f 52 44  ry&gt;.      ORD
20b40 45 52 20 42 59 20 72 61 6e 6b 20 44 45 53 43 20  ER BY rank DESC 
20b50 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 31 30 20  .      LIMIT 10 
20b60 4f 46 46 53 45 54 20 30 0a 20 20 29 20 41 53 20  OFFSET 0.  ) AS 
20b70 72 61 6e 6b 74 61 62 6c 65 20 55 53 49 4e 47 28  ranktable USING(
20b80 64 6f 63 69 64 29 0a 20 20 4f 52 44 45 52 20 42  docid).  ORDER B
20b90 59 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b  Y ranktable.rank
20ba0 20 44 45 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63   DESC.</codebloc
20bb0 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65  k>..<p>.  The ne
20bc0 78 74 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  xt block of SQL 
20bd0 65 6e 68 61 6e 63 65 73 20 74 68 65 20 71 75 65  enhances the que
20be0 72 79 20 77 69 74 68 20 73 6f 6c 75 74 69 6f 6e  ry with solution
20bf0 73 20 74 6f 20 74 77 6f 20 6f 74 68 65 72 20 70  s to two other p
20c00 72 6f 62 6c 65 6d 73 0a 20 20 74 68 61 74 20 6d  roblems.  that m
20c10 61 79 20 61 72 69 73 65 20 69 6e 20 64 65 76 65  ay arise in deve
20c20 6c 6f 70 69 6e 67 20 73 65 61 72 63 68 20 61 70  loping search ap
20c30 70 6c 69 63 61 74 69 6f 6e 73 20 75 73 69 6e 67  plications using
20c40 20 46 54 53 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c   FTS:..<ol>.  <l
20c50 69 3e 20 3c 70 3e 0a 20 20 20 20 20 20 20 54 68  i> <p>.       Th
20c60 65 20 5b 73 6e 69 70 70 65 74 5d 20 66 75 6e 63  e [snippet] func
20c70 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
20c80 73 65 64 20 77 69 74 68 20 74 68 65 20 61 62 6f  sed with the abo
20c90 76 65 20 71 75 65 72 79 2e 20 42 65 63 61 75 73  ve query. Becaus
20ca0 65 0a 20 20 20 20 20 20 20 74 68 65 20 6f 75 74  e.       the out
20cb0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
20cc0 74 20 69 6e 63 6c 75 64 65 20 61 20 22 57 48 45  t include a "WHE
20cd0 52 45 20 2e 2e 2e 20 4d 41 54 43 48 22 20 63 6c  RE ... MATCH" cl
20ce0 61 75 73 65 2c 20 74 68 65 20 73 6e 69 70 70 65  ause, the snippe
20cf0 74 20 0a 20 20 20 20 20 20 20 66 75 6e 63 74 69  t .       functi
20d00 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  on may not be us
20d10 65 64 20 77 69 74 68 20 69 74 2e 20 4f 6e 65 20  ed with it. One 
20d20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 64  solution is to d
20d30 75 70 6c 69 63 61 74 65 20 74 68 65 20 57 48 45  uplicate the WHE
20d40 52 45 0a 20 20 20 20 20 20 20 63 6c 61 75 73 65  RE.       clause
20d50 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
20d60 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 6f 75  -query in the ou
20d70 74 65 72 20 71 75 65 72 79 2e 20 54 68 65 20 6f  ter query. The o
20d80 76 65 72 68 65 61 64 20 61 73 73 6f 63 69 61 74  verhead associat
20d90 65 64 0a 20 20 20 20 20 20 20 77 69 74 68 20 74  ed.       with t
20da0 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 6e  his is usually n
20db0 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20 3c 6c 69  egligible..  <li
20dc0 3e 20 3c 70 3e 0a 20 20 20 20 20 20 20 54 68 65  > <p>.       The
20dd0 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20   relevancy of a 
20de0 64 6f 63 75 6d 65 6e 74 20 6d 61 79 20 64 65 70  document may dep
20df0 65 6e 64 20 6f 6e 20 73 6f 6d 65 74 68 69 6e 67  end on something
20e00 20 6f 74 68 65 72 20 74 68 61 6e 20 6a 75 73 74   other than just
20e10 0a 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61  .       the data
20e20 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
20e30 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
20e40 66 20 6d 61 74 63 68 69 6e 66 6f 2e 20 46 6f 72  f matchinfo. For
20e50 20 65 78 61 6d 70 6c 65 0a 20 20 20 20 20 20 20   example.       
20e60 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e  each document in
20e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
20e80 79 20 62 65 20 61 73 73 69 67 6e 65 64 20 61 20  y be assigned a 
20e90 73 74 61 74 69 63 20 77 65 69 67 68 74 20 62 61  static weight ba
20ea0 73 65 64 0a 20 20 20 20 20 20 20 6f 6e 20 66 61  sed.       on fa
20eb0 63 74 6f 72 73 20 75 6e 72 65 6c 61 74 65 64 20  ctors unrelated 
20ec0 74 6f 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 28  to its content (
20ed0 6f 72 69 67 69 6e 2c 20 61 75 74 68 6f 72 2c 20  origin, author, 
20ee0 61 67 65 2c 20 6e 75 6d 62 65 72 0a 20 20 20 20  age, number.    
20ef0 20 20 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73     of references
20f00 20 65 74 63 2e 29 2e 20 54 68 65 73 65 20 76 61   etc.). These va
20f10 6c 75 65 73 20 63 61 6e 20 62 65 20 73 74 6f 72  lues can be stor
20f20 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  ed by the applic
20f30 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 69 6e 20  ation.       in 
20f40 61 20 73 65 70 61 72 61 74 65 20 74 61 62 6c 65  a separate table
20f50 20 74 68 61 74 20 63 61 6e 20 62 65 20 6a 6f 69   that can be joi
20f60 6e 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  ned against the 
20f70 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 0a  documents table.
20f80 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
20f90 62 2d 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  b-query so that 
20fa0 74 68 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f  the rank functio
20fb0 6e 20 6d 61 79 20 61 63 63 65 73 73 20 74 68 65  n may access the
20fc0 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 70 3e 0a 20 20  m..</ol>..<p>.  
20fd0 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
20fe0 74 68 65 20 71 75 65 72 79 20 69 73 20 76 65 72  the query is ver
20ff0 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 61  y similar to tha
21000 74 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  t used by the . 
21010 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f   <a href="http:/
21020 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
21030 73 65 61 72 63 68 3f 71 3d 66 74 73 33 22 3e 73  search?q=fts3">s
21040 71 6c 69 74 65 2e 6f 72 67 20 64 6f 63 75 6d 65  qlite.org docume
21050 6e 74 61 74 69 6f 6e 20 73 65 61 72 63 68 3c 2f  ntation search</
21060 61 3e 20 0a 20 20 61 70 70 6c 69 63 61 74 69 6f  a> .  applicatio
21070 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  n...<codeblock>.
21080 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 74 61 62    <i>-- This tab
21090 6c 65 20 73 74 6f 72 65 73 20 74 68 65 20 73 74  le stores the st
210a0 61 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69  atic weight assi
210b0 67 6e 65 64 20 74 6f 20 65 61 63 68 20 64 6f 63  gned to each doc
210c0 75 6d 65 6e 74 20 69 6e 20 46 54 53 20 74 61 62  ument in FTS tab
210d0 6c 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  le</i>.  <i>-- "
210e0 64 6f 63 75 6d 65 6e 74 73 22 2e 20 46 6f 72 20  documents". For 
210f0 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
21100 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 20  documents table 
21110 74 68 65 72 65 20 69 73 20 61 20 63 6f 72 72 65  there is a corre
21120 73 70 6f 6e 64 69 6e 67 20 72 6f 77 3c 2f 69 3e  sponding row</i>
21130 0a 20 20 3c 69 3e 2d 2d 20 77 69 74 68 20 74 68  .  <i>-- with th
21140 65 20 73 61 6d 65 20 64 6f 63 69 64 20 76 61 6c  e same docid val
21150 75 65 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ue in this table
21160 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54  .</i>.  CREATE T
21170 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 5f 64  ABLE documents_d
21180 61 74 61 28 64 6f 63 69 64 20 49 4e 54 45 47 45  ata(docid INTEGE
21190 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77  R PRIMARY KEY, w
211a0 65 69 67 68 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  eight);..  <i>--
211b0 20 54 68 69 73 20 71 75 65 72 79 20 69 73 20 73   This query is s
211c0 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e  imilar to the on
211d0 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
211e0 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
211f0 74 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  t:</i>.  <i>--</
21200 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 31 2e 20  i>.  <i>--   1. 
21210 49 74 20 72 65 74 75 72 6e 73 20 61 20 22 73 6e  It returns a "sn
21220 69 70 70 65 74 22 20 6f 66 20 74 65 78 74 20 61  ippet" of text a
21230 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 64 6f  long with the do
21240 63 75 6d 65 6e 74 20 74 69 74 6c 65 20 66 6f 72  cument title for
21250 20 64 69 73 70 6c 61 79 2e 20 53 6f 3c 2f 69 3e   display. So</i>
21260 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68  .  <i>--      th
21270 61 74 20 74 68 65 20 73 6e 69 70 70 65 74 20 66  at the snippet f
21280 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
21290 73 65 64 2c 20 74 68 65 20 22 57 48 45 52 45 20  sed, the "WHERE 
212a0 2e 2e 2e 20 4d 41 54 43 48 20 2e 2e 2e 22 20 63  ... MATCH ..." c
212b0 6c 61 75 73 65 20 66 72 6f 6d 3c 2f 69 3e 0a 20  lause from</i>. 
212c0 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68 65 20   <i>--      the 
212d0 73 75 62 2d 71 75 65 72 79 20 69 73 20 64 75 70  sub-query is dup
212e0 6c 69 63 61 74 65 64 20 69 6e 20 74 68 65 20 6f  licated in the o
212f0 75 74 65 72 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  uter query.</i>.
21300 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
21310 3e 2d 2d 20 20 20 32 2e 20 54 68 65 20 73 75 62  >--   2. The sub
21320 2d 71 75 65 72 79 20 6a 6f 69 6e 73 20 74 68 65  -query joins the
21330 20 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65   documents table
21340 20 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d 65   with the docume
21350 6e 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73  nt_data table, s
21360 6f 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e  o that</i>.  <i>
21370 2d 2d 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e  --      implemen
21380 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 61  tation of the ra
21390 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  nk function has 
213a0 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 73 74  access to the st
213b0 61 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69  atic weight assi
213c0 67 6e 65 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  gned</i>.  <i>--
213d0 20 20 20 20 20 20 74 6f 20 65 61 63 68 20 64 6f        to each do
213e0 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45  cument.</i>.  SE
213f0 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 6e 69 70  LECT title, snip
21400 70 65 74 28 64 6f 63 75 6d 65 6e 74 73 29 20 46  pet(documents) F
21410 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f  ROM documents JO
21420 49 4e 20 28 20 0a 20 20 20 20 20 20 53 45 4c 45  IN ( .      SELE
21430 43 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b 28 6d  CT docid, rank(m
21440 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e  atchinfo(documen
21450 74 73 29 2c 20 64 6f 63 75 6d 65 6e 74 73 5f 64  ts), documents_d
21460 61 74 61 2e 77 65 69 67 68 74 29 20 41 53 20 72  ata.weight) AS r
21470 61 6e 6b 0a 20 20 20 20 20 20 46 52 4f 4d 20 64  ank.      FROM d
21480 6f 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 64 6f  ocuments JOIN do
21490 63 75 6d 65 6e 74 73 5f 64 61 74 61 20 55 53 49  cuments_data USI
214a0 4e 47 28 64 6f 63 69 64 29 0a 20 20 20 20 20 20  NG(docid).      
214b0 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20  WHERE documents 
214c0 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26  MATCH &lt;query&
214d0 67 74 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20  gt;.      ORDER 
214e0 42 59 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20  BY rank DESC .  
214f0 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46      LIMIT 10 OFF
21500 53 45 54 20 30 0a 20 20 29 20 41 53 20 72 61 6e  SET 0.  ) AS ran
21510 6b 74 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63  ktable USING(doc
21520 69 64 29 0a 20 20 57 48 45 52 45 20 64 6f 63 75  id).  WHERE docu
21530 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b  ments MATCH &lt;
21540 71 75 65 72 79 26 67 74 3b 0a 20 20 4f 52 44 45  query&gt;.  ORDE
21550 52 20 42 59 20 72 61 6e 6b 74 61 62 6c 65 2e 72  R BY ranktable.r
21560 61 6e 6b 20 44 45 53 43 0a 3c 2f 63 6f 64 65 62  ank DESC.</codeb
21570 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 6c 6c  lock>..<p>.  All
21580 20 74 68 65 20 65 78 61 6d 70 6c 65 20 71 75 65   the example que
21590 72 69 65 73 20 61 62 6f 76 65 20 72 65 74 75 72  ries above retur
215a0 6e 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20 72  n the ten most r
215b0 65 6c 65 76 61 6e 74 20 71 75 65 72 79 20 72 65  elevant query re
215c0 73 75 6c 74 73 2e 0a 20 20 42 79 20 6d 6f 64 69  sults..  By modi
215d0 66 79 69 6e 67 20 74 68 65 20 76 61 6c 75 65 73  fying the values
215e0 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4f   used with the O
215f0 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 20  FFSET and LIMIT 
21600 63 6c 61 75 73 65 73 2c 20 61 20 71 75 65 72 79  clauses, a query
21610 20 0a 20 20 74 6f 20 72 65 74 75 72 6e 20 28 73   .  to return (s
21620 61 79 29 20 74 68 65 20 6e 65 78 74 20 74 65 6e  ay) the next ten
21630 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 72   most relevant r
21640 65 73 75 6c 74 73 20 69 73 20 65 61 73 79 20 74  esults is easy t
21650 6f 20 63 6f 6e 73 74 72 75 63 74 2e 20 0a 20 20  o construct. .  
21660 54 68 69 73 20 6d 61 79 20 62 65 20 75 73 65 64  This may be used
21670 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 64   to obtain the d
21680 61 74 61 20 72 65 71 75 69 72 65 64 20 66 6f 72  ata required for
21690 20 61 20 73 65 61 72 63 68 20 61 70 70 6c 69 63   a search applic
216a0 61 74 69 6f 6e 73 20 73 65 63 6f 6e 64 0a 20 20  ations second.  
216b0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 70  and subsequent p
216c0 61 67 65 73 20 6f 66 20 72 65 73 75 6c 74 73 2e  ages of results.
216d0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65 78 74  ..<p>.  The next
216e0 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
216f0 61 6e 20 65 78 61 6d 70 6c 65 20 72 61 6e 6b 20  an example rank 
21700 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
21710 65 73 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74  es matchinfo dat
21720 61 20 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64  a .  implemented
21730 20 69 6e 20 43 2e 20 49 6e 73 74 65 61 64 20 6f   in C. Instead o
21740 66 20 61 20 73 69 6e 67 6c 65 20 77 65 69 67 68  f a single weigh
21750 74 2c 20 69 74 20 61 6c 6c 6f 77 73 20 61 20 77  t, it allows a w
21760 65 69 67 68 74 20 74 6f 20 62 65 20 0a 20 20 65  eight to be .  e
21770 78 74 65 72 6e 61 6c 6c 79 20 61 73 73 69 67 6e  xternally assign
21780 65 64 20 74 6f 20 65 61 63 68 20 63 6f 6c 75 6d  ed to each colum
21790 6e 20 6f 66 20 65 61 63 68 20 64 6f 63 75 6d 65  n of each docume
217a0 6e 74 2e 20 49 74 20 6d 61 79 20 62 65 20 72 65  nt. It may be re
217b0 67 69 73 74 65 72 65 64 0a 20 20 77 69 74 68 20  gistered.  with 
217c0 53 51 4c 69 74 65 20 6c 69 6b 65 20 61 6e 79 20  SQLite like any 
217d0 6f 74 68 65 72 20 75 73 65 72 20 66 75 6e 63 74  other user funct
217e0 69 6f 6e 20 75 73 69 6e 67 20 5b 73 71 6c 69 74  ion using [sqlit
217f0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
21800 6f 6e 5d 2e 0a 0a 3c 70 3e 3c 62 3e 20 53 65 63  on]...<p><b> Sec
21810 75 72 69 74 79 20 57 61 72 6e 69 6e 67 3a 3c 2f  urity Warning:</
21820 62 3e 20 42 65 63 61 75 73 65 20 69 74 20 69 73  b> Because it is
21830 20 6a 75 73 74 20 61 6e 20 6f 72 64 69 6e 61 72   just an ordinar
21840 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2c 20  y SQL function, 
21850 0a 20 20 72 61 6e 6b 28 29 20 6d 61 79 20 62 65  .  rank() may be
21860 20 69 6e 76 6f 6b 65 64 20 61 73 20 70 61 72 74   invoked as part
21870 20 6f 66 20 61 6e 79 20 53 51 4c 20 71 75 65 72   of any SQL quer
21880 79 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  y in any context
21890 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 74  . This means.  t
218a0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 61 72  hat the first ar
218b0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 6d 61  gument passed ma
218c0 79 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  y not be a valid
218d0 20 6d 61 74 63 68 69 6e 66 6f 20 62 6c 6f 62 2e   matchinfo blob.
218e0 0a 20 20 49 6d 70 6c 65 6d 65 6e 74 6f 72 73 20  .  Implementors 
218f0 73 68 6f 75 6c 64 20 74 61 6b 65 20 63 61 72 65  should take care
21900 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20   to handle this 
21910 63 61 73 65 20 77 69 74 68 6f 75 74 20 63 61 75  case without cau
21920 73 69 6e 67 20 62 75 66 66 65 72 0a 20 20 6f 76  sing buffer.  ov
21930 65 72 72 75 6e 73 20 6f 72 20 6f 74 68 65 72 20  erruns or other 
21940 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
21950 74 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 0a 3c 63  ty problems...<c
21960 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69 3e 2f 2a 3c  odeblock>.<i>/*<
21970 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51 4c 69 74 65  /i>.<i>** SQLite
21980 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 66 75   user defined fu
21990 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65 20 77 69  nction to use wi
219a0 74 68 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 74  th matchinfo() t
219b0 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 3c  o calculate the<
219c0 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61  /i>.<i>** releva
219d0 6e 63 79 20 6f 66 20 61 6e 20 46 54 53 20 6d 61  ncy of an FTS ma
219e0 74 63 68 2e 20 54 68 65 20 76 61 6c 75 65 20 72  tch. The value r
219f0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 72  eturned is the r
21a00 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 3c 2f  elevancy score</
21a10 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20 72 65 61 6c  i>.<i>** (a real
21a20 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
21a30 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
21a40 7a 65 72 6f 29 2e 20 41 20 6c 61 72 67 65 72 20  zero). A larger 
21a50 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
21a60 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61 20 6d 6f 72  </i>.<i>** a mor
21a70 65 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  e relevant docum
21a80 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ent.</i>.<i>**</
21a90 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 6f 76 65  i>.<i>** The ove
21aa0 72 61 6c 6c 20 72 65 6c 65 76 61 6e 63 79 20 72  rall relevancy r
21ab0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
21ac0 75 6d 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  um of the releva
21ad0 6e 63 69 65 73 20 6f 66 20 65 61 63 68 20 3c 2f  ncies of each </
21ae0 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20  i>.<i>** column 
21af0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 46 54 53  value in the FTS
21b00 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 6c 65   table. The rele
21b10 76 61 6e 63 79 20 6f 66 20 61 20 63 6f 6c 75 6d  vancy of a colum
21b20 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 3c 2f  n value is the</
21b30 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20 6f 66 20  i>.<i>** sum of 
21b40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
21b50 72 20 65 61 63 68 20 72 65 70 6f 72 74 61 62 6c  r each reportabl
21b60 65 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  e phrase in the 
21b70 46 54 53 20 71 75 65 72 79 3a 3c 2f 69 3e 0a 3c  FTS query:</i>.<
21b80 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
21b90 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
21ba0 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
21bb0 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
21bc0 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
21bd0 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ht&gt;</i>.<i>**
21be0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68 65 72 65  </i>.<i>** where
21bf0 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67   &lt;hit count&g
21c00 74 3b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  t; is the number
21c10 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
21c20 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 74   the phrase in t
21c30 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  he</i>.<i>** col
21c40 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  umn value of the
21c50 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 6e 64   current row and
21c60 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69 74 20   &lt;global hit 
21c70 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
21c80 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c 69 3e 2a   number</i>.<i>*
21c90 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  * of instances o
21ca0 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
21cb0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
21cc0 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  of all rows in t
21cd0 68 65 20 46 54 53 3c 2f 69 3e 0a 3c 69 3e 2a 2a  he FTS</i>.<i>**
21ce0 20 74 61 62 6c 65 2e 20 54 68 65 20 26 6c 74 3b   table. The &lt;
21cf0 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26 67 74  column weight&gt
21d00 3b 20 69 73 20 61 20 77 65 69 67 68 74 69 6e 67  ; is a weighting
21d10 20 66 61 63 74 6f 72 20 61 73 73 69 67 6e 65 64   factor assigned
21d20 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a 3c 69 3e   to each</i>.<i>
21d30 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 65  ** column by the
21d40 20 63 61 6c 6c 65 72 20 28 73 65 65 20 62 65 6c   caller (see bel
21d50 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ow).</i>.<i>**</
21d60 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 66 69 72  i>.<i>** The fir
21d70 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
21d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
21d90 74 20 62 65 20 74 68 65 20 72 65 74 75 72 6e 20  t be the return 
21da0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 46 54 53  value of the FTS
21db0 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d 61 74 63   </i>.<i>** matc
21dc0 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e  hinfo() function
21dd0 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  . Following this
21de0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 61 72 67   must be one arg
21df0 75 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ument for each c
21e00 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn </i>.<i>**
21e10 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
21e20 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  e containing a n
21e30 75 6d 65 72 69 63 20 77 65 69 67 68 74 20 66 61  umeric weight fa
21e40 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 72  ctor for the cor
21e50 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f 69 3e 0a  responding </i>.
21e60 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 45 78  <i>** column. Ex
21e70 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ample:</i>.<i>**
21e80 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 43  </i>.<i>**     C
21e90 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
21ea0 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55 53  BLE documents US
21eb0 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20  ING fts3(title, 
21ec0 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a 3c 69 3e  content)</i>.<i>
21ed0 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65  **</i>.<i>** The
21ee0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
21ef0 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 6f 63   returns the doc
21f00 69 64 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ids of documents
21f10 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
21f20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69  full-text</i>.<i
21f30 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74 3b 71 75  >** query &lt;qu
21f40 65 72 79 26 67 74 3b 20 73 6f 72 74 65 64 20 66  ery&gt; sorted f
21f50 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65 61 73  rom most to leas
21f60 74 20 72 65 6c 65 76 61 6e 74 2e 20 57 68 65 6e  t relevant. When
21f70 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c 2f 69 3e   calculating</i>
21f80 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61 6e 63 65  .<i>** relevance
21f90 2c 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73  , query term ins
21fa0 74 61 6e 63 65 73 20 69 6e 20 74 68 65 20 27 74  tances in the 't
21fb0 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20 61 72 65  itle' column are
21fc0 20 67 69 76 65 6e 20 74 77 69 63 65 20 74 68 65   given twice the
21fd0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65 69 67 68  </i>.<i>** weigh
21fe0 74 69 6e 67 20 6f 66 20 74 68 6f 73 65 20 69 6e  ting of those in
21ff0 20 74 68 65 20 27 63 6f 6e 74 65 6e 74 27 20 63   the 'content' c
22000 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn.</i>.<i>**
22010 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 53  </i>.<i>**     S
22020 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
22030 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f 69 3e 0a   documents </i>.
22040 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45 52 45 20  <i>**     WHERE 
22050 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20  documents MATCH 
22060 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 3c 2f  &lt;query&gt; </
22070 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 4f 52 44  i>.<i>**     ORD
22080 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63 68  ER BY rank(match
22090 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c  info(documents),
220a0 20 31 2e 30 2c 20 30 2e 35 29 20 44 45 53 43 3c   1.0, 0.5) DESC<
220b0 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e 0a 73 74  /i>.<i>*/</i>.st
220c0 61 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 66 75  atic void rankfu
220d0 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
220e0 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 56  xt *pCtx, int nV
220f0 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  al, sqlite3_valu
22100 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 69 6e  e **apVal){.  in
22110 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f 3b 20 20  t *aMatchinfo;  
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
22130 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  >/* Return value
22140 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 28 29 20   of matchinfo() 
22150 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 4d 61  */</i>.  int nMa
22160 74 63 68 69 6e 66 6f 3b 20 20 20 20 20 20 20 20  tchinfo;        
22170 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e           <i>/* N
22180 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
22190 73 20 69 6e 20 61 4d 61 74 63 68 69 6e 66 6f 26  s in aMatchinfo&
221a0 23 78 35 42 3b 26 23 78 35 44 3b 20 2a 2f 3c 2f  #x5B;&#x5D; */</
221b0 69 3e 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i>.  int nCol = 
221c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
221d0 20 20 20 20 20 3c 69 3e 2f 2a 20 4e 75 6d 62 65       <i>/* Numbe
221e0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
221f0 74 68 65 20 74 61 62 6c 65 20 2a 2f 3c 2f 69 3e  the table */</i>
22200 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 20 3d  .  int nPhrase =
22210 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22220 20 20 20 3c 69 3e 2f 2a 20 4e 75 6d 62 65 72 20     <i>/* Number 
22230 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20 74 68  of phrases in th
22240 65 20 71 75 65 72 79 20 2a 2f 3c 2f 69 3e 0a 20  e query */</i>. 
22250 20 69 6e 74 20 69 50 68 72 61 73 65 3b 20 20 20   int iPhrase;   
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 3c 69 3e 2f 2a 20 43 75 72 72 65 6e 74 20 70   <i>/* Current p
22280 68 72 61 73 65 20 2a 2f 3c 2f 69 3e 0a 20 20 64  hrase */</i>.  d
22290 6f 75 62 6c 65 20 73 63 6f 72 65 20 3d 20 30 2e  ouble score = 0.
222a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 3c  0;             <
222b0 69 3e 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65  i>/* Value to re
222c0 74 75 72 6e 20 2a 2f 3c 2f 69 3e 0a 0a 20 20 61  turn */</i>..  a
222d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 6e  ssert( sizeof(in
222e0 74 29 3d 3d 34 20 29 3b 0a 0a 3c 69 3e 20 20 2f  t)==4 );..<i>  /
222f0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
22300 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
22310 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
22320 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22330 63 6f 72 72 65 63 74 2e 3c 2f 69 3e 0a 3c 69 3e  correct.</i>.<i>
22340 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 6a 75 6d    ** If not, jum
22350 70 20 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65  p to wrong_numbe
22360 72 5f 61 72 67 73 2e 20 53 65 74 20 61 4d 61 74  r_args. Set aMat
22370 63 68 69 6e 66 6f 20 74 6f 20 70 6f 69 6e 74 20  chinfo to point 
22380 74 6f 20 74 68 65 20 61 72 72 61 79 3c 2f 69 3e  to the array</i>
22390 0a 3c 69 3e 20 20 2a 2a 20 6f 66 20 75 6e 73 69  .<i>  ** of unsi
223a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
223b0 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
223c0 46 54 53 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74  FTS function mat
223d0 63 68 69 6e 66 6f 2e 20 53 65 74 3c 2f 69 3e 0a  chinfo. Set</i>.
223e0 3c 69 3e 20 20 2a 2a 20 6e 50 68 72 61 73 65 20  <i>  ** nPhrase 
223f0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
22400 75 6d 62 65 72 20 6f 66 20 72 65 70 6f 72 74 61  umber of reporta
22410 62 6c 65 20 70 68 72 61 73 65 73 20 69 6e 20 74  ble phrases in t
22420 68 65 20 75 73 65 72 73 20 66 75 6c 6c 2d 74 65  he users full-te
22430 78 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 71  xt</i>.<i>  ** q
22440 75 65 72 79 2c 20 61 6e 64 20 6e 43 6f 6c 20 74  uery, and nCol t
22450 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
22460 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
22470 61 62 6c 65 2e 20 54 68 65 6e 20 63 68 65 63 6b  able. Then check
22480 20 74 68 61 74 20 74 68 65 3c 2f 69 3e 0a 3c 69   that the</i>.<i
22490 3e 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  >  ** size of th
224a0 65 20 6d 61 74 63 68 69 6e 66 6f 20 62 6c 6f 62  e matchinfo blob
224b0 20 69 73 20 61 73 20 65 78 70 65 63 74 65 64 2e   is as expected.
224c0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
224d0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 3c 2f   if it is not.</
224e0 69 3e 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20  i>.<i>  */</i>. 
224f0 20 69 66 28 20 6e 56 61 6c 26 6c 74 3b 31 20 29   if( nVal&lt;1 )
22500 20 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62   goto wrong_numb
22510 65 72 5f 61 72 67 73 3b 0a 20 20 61 4d 61 74 63  er_args;.  aMatc
22520 68 69 6e 66 6f 20 3d 20 28 75 6e 73 69 67 6e 65  hinfo = (unsigne
22530 64 20 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 5f  d int *)sqlite3_
22540 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c  value_blob(apVal
22550 26 23 78 35 42 3b 30 26 23 78 35 44 3b 29 3b 0a  &#x5B;0&#x5D;);.
22560 20 20 6e 4d 61 74 63 68 69 6e 66 6f 20 3d 20 73    nMatchinfo = s
22570 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
22580 65 73 28 61 70 56 61 6c 26 23 78 35 42 3b 30 26  es(apVal&#x5B;0&
22590 23 78 35 44 3b 29 20 2f 20 73 69 7a 65 6f 66 28  #x5D;) / sizeof(
225a0 69 6e 74 29 3b 0a 20 20 69 66 28 20 6e 4d 61 74  int);.  if( nMat
225b0 63 68 69 6e 66 6f 26 67 74 3b 3d 32 20 29 7b 0a  chinfo&gt;=2 ){.
225c0 20 20 20 20 6e 50 68 72 61 73 65 20 3d 20 61 4d      nPhrase = aM
225d0 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 30 26  atchinfo&#x5B;0&
225e0 23 78 35 44 3b 3b 0a 20 20 20 20 6e 43 6f 6c 20  #x5D;;.    nCol 
225f0 3d 20 61 4d 61 74 63 68 69 6e 66 6f 26 23 78 35  = aMatchinfo&#x5
22600 42 3b 31 26 23 78 35 44 3b 3b 0a 20 20 7d 0a 20  B;1&#x5D;;.  }. 
22610 20 69 66 28 20 6e 4d 61 74 63 68 69 6e 66 6f 21   if( nMatchinfo!
22620 3d 28 32 2b 33 2a 6e 43 6f 6c 2a 6e 50 68 72 61  =(2+3*nCol*nPhra
22630 73 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  se) ){.    sqlit
22640 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
22650 70 43 74 78 2c 0a 20 20 20 20 20 20 22 69 6e 76  pCtx,.      "inv
22660 61 6c 69 64 20 6d 61 74 63 68 69 6e 66 6f 20 62  alid matchinfo b
22670 6c 6f 62 20 70 61 73 73 65 64 20 74 6f 20 66 75  lob passed to fu
22680 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29 22 2c 20  nction rank()", 
22690 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
226a0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 56 61 6c 21  .  }.  if( nVal!
226b0 3d 28 31 2b 6e 43 6f 6c 29 20 29 20 67 6f 74 6f  =(1+nCol) ) goto
226c0 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72   wrong_number_ar
226d0 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74 65  gs;..<i>  /* Ite
226e0 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63  rate through eac
226f0 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  h phrase in the 
22700 75 73 65 72 73 20 71 75 65 72 79 2e 20 2a 2f 3c  users query. */<
22710 2f 69 3e 0a 20 20 66 6f 72 28 69 50 68 72 61 73  /i>.  for(iPhras
22720 65 3d 30 3b 20 69 50 68 72 61 73 65 26 6c 74 3b  e=0; iPhrase&lt;
22730 6e 50 68 72 61 73 65 3b 20 69 50 68 72 61 73 65  nPhrase; iPhrase
22740 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
22750 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
22760 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72         <i>/* Cur
22770 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c 2f  rent column */</
22780 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e 6f  i>..<i>    /* No
22790 77 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  w iterate throug
227a0 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  h each column in
227b0 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79   the users query
227c0 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  . For each colum
227d0 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  n,</i>.<i>    **
227e0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
227f0 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 20 62  elevancy score b
22800 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  y:</i>.<i>    **
22810 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 20  </i>.<i>    **  
22820 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
22830 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
22840 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
22850 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
22860 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20 20  ht&gt;</i>.<i>  
22870 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20    **</i>.<i>    
22880 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23  ** aPhraseinfo&#
22890 78 35 42 3b 26 23 78 35 44 3b 20 70 6f 69 6e 74  x5B;&#x5D; point
228a0 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
228b0 66 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 70  f the data for p
228c0 68 72 61 73 65 20 69 50 68 72 61 73 65 2e 20 53  hrase iPhrase. S
228d0 6f 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20  o</i>.<i>    ** 
228e0 74 68 65 20 68 69 74 20 63 6f 75 6e 74 20 61 6e  the hit count an
228f0 64 20 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75  d global hit cou
22900 6e 74 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nts for each col
22910 75 6d 6e 20 61 72 65 20 66 6f 75 6e 64 20 69 6e  umn are found in
22920 20 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20   </i>.<i>    ** 
22930 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
22940 3b 69 43 6f 6c 2a 33 26 23 78 35 44 3b 20 61 6e  ;iCol*3&#x5D; an
22950 64 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  d aPhraseinfo&#x
22960 35 42 3b 69 43 6f 6c 2a 33 2b 31 26 23 78 35 44  5B;iCol*3+1&#x5D
22970 3b 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  ;, respectively.
22980 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c 2f  </i>.<i>    */</
22990 69 3e 0a 20 20 20 20 69 6e 74 20 2a 61 50 68 72  i>.    int *aPhr
229a0 61 73 65 69 6e 66 6f 20 3d 20 26 61 4d 61 74 63  aseinfo = &aMatc
229b0 68 69 6e 66 6f 26 23 78 35 42 3b 32 20 2b 20 69  hinfo&#x5B;2 + i
229c0 50 68 72 61 73 65 2a 6e 43 6f 6c 2a 33 26 23 78  Phrase*nCol*3&#x
229d0 35 44 3b 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f  5D;;.    for(iCo
229e0 6c 3d 30 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43 6f  l=0; iCol&lt;nCo
229f0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
22a00 20 20 69 6e 74 20 6e 48 69 74 43 6f 75 6e 74 20    int nHitCount 
22a10 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  = aPhraseinfo&#x
22a20 35 42 3b 33 2a 69 43 6f 6c 26 23 78 35 44 3b 3b  5B;3*iCol&#x5D;;
22a30 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 6c 6f 62  .      int nGlob
22a40 61 6c 48 69 74 43 6f 75 6e 74 20 3d 20 61 50 68  alHitCount = aPh
22a50 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 33 2a  raseinfo&#x5B;3*
22a60 69 43 6f 6c 2b 31 26 23 78 35 44 3b 3b 0a 20 20  iCol+1&#x5D;;.  
22a70 20 20 20 20 64 6f 75 62 6c 65 20 77 65 69 67 68      double weigh
22a80 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
22a90 65 5f 64 6f 75 62 6c 65 28 61 70 56 61 6c 26 23  e_double(apVal&#
22aa0 78 35 42 3b 69 43 6f 6c 2b 31 26 23 78 35 44 3b  x5B;iCol+1&#x5D;
22ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 48 69  );.      if( nHi
22ac0 74 43 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20  tCount>0 ){.    
22ad0 20 20 20 20 73 63 6f 72 65 20 2b 3d 20 28 28 64      score += ((d
22ae0 6f 75 62 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20  ouble)nHitCount 
22af0 2f 20 28 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61  / (double)nGloba
22b00 6c 48 69 74 43 6f 75 6e 74 29 20 2a 20 77 65 69  lHitCount) * wei
22b10 67 68 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ght;.      }.   
22b20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
22b30 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
22b40 70 43 74 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20  pCtx, score);.  
22b50 72 65 74 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a  return;..<i>  /*
22b60 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
22b70 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  e wrong number o
22b80 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
22b90 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
22ba0 75 6e 63 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77  unction */</i>.w
22bb0 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73  rong_number_args
22bc0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  :.  sqlite3_resu
22bd0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
22be0 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
22bf0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
22c00 63 74 69 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d  ction rank()", -
22c10 31 29 3b 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63  1);.}.</codebloc
22c20 6b 3e 0a                                         k>.