Documentation Source Text

Hex Artifact Content
Login

Artifact 1ea1c5a6fd94def221efad0c92b8840f83c02ae7001d08317912e45780a249ac:


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 6c 73 6f  "unicode61" also
19470 20 72 65 6d 6f 76 65 73 20 61 6c 6c 20 64 69 61   removes all dia
19480 63 72 69 74 69 63 73 20 66 72 6f 6d 20 4c 61 74  critics from Lat
19490 69 6e 20 73 63 72 69 70 74 0a 20 20 63 68 61 72  in script.  char
194a0 61 63 74 65 72 73 2e 20 54 68 69 73 20 62 65 68  acters. This beh
194b0 61 76 69 6f 75 72 20 63 61 6e 20 62 65 20 6f 76  aviour can be ov
194c0 65 72 72 69 64 64 65 6e 20 62 79 20 61 64 64 69  erridden by addi
194d0 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  ng the tokenizer
194e0 20 61 72 67 75 6d 65 6e 74 0a 20 20 22 72 65 6d   argument.  "rem
194f0 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73 3d 30  ove_diacritics=0
19500 22 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  ". For example:.
19510 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20  .<codeblock>.   
19520 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 74 61   <i>-- Create ta
19530 62 6c 65 73 20 74 68 61 74 20 72 65 6d 6f 76 65  bles that remove
19540 20 64 69 61 63 72 69 74 69 63 73 20 66 72 6f 6d   diacritics from
19550 20 4c 61 74 69 6e 20 73 63 72 69 70 74 20 63 68   Latin script ch
19560 61 72 61 63 74 65 72 73 3c 2f 69 3e 0a 20 20 20  aracters</i>.   
19570 20 3c 69 3e 2d 2d 20 61 73 20 70 61 72 74 20 6f   <i>-- as part o
19580 66 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2e 3c  f tokenization.<
19590 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56  /i>.    CREATE V
195a0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 78 74  IRTUAL TABLE txt
195b0 31 20 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b  1 USING fts4(tok
195c0 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31 29  enize=unicode61)
195d0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  ;.    CREATE VIR
195e0 54 55 41 4c 20 54 41 42 4c 45 20 74 78 74 32 20  TUAL TABLE txt2 
195f0 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e  USING fts4(token
19600 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31 20 22 72  ize=unicode61 "r
19610 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73  emove_diacritics
19620 3d 31 22 29 3b 0a 0a 20 20 20 20 3c 69 3e 2d 2d  =1");..    <i>--
19630 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   Create a table 
19640 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
19650 6d 6f 76 65 20 64 69 61 63 72 69 74 69 63 73 20  move diacritics 
19660 66 72 6f 6d 20 4c 61 74 69 6e 20 73 63 72 69 70  from Latin scrip
19670 74 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20  t</i>.    <i>-- 
19680 63 68 61 72 61 63 74 65 72 73 20 61 73 20 70 61  characters as pa
19690 72 74 20 6f 66 20 74 6f 6b 65 6e 69 7a 61 74 69  rt of tokenizati
196a0 6f 6e 2e 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41  on.</i>.    CREA
196b0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
196c0 20 74 78 74 33 20 55 53 49 4e 47 20 66 74 73 34   txt3 USING fts4
196d0 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64  (tokenize=unicod
196e0 65 36 31 20 22 72 65 6d 6f 76 65 5f 64 69 61 63  e61 "remove_diac
196f0 72 69 74 69 63 73 3d 30 22 29 3b 0a 3c 2f 63 6f  ritics=0");.</co
19700 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
19710 49 74 20 69 73 20 61 6c 73 6f 20 70 6f 73 73 69  It is also possi
19720 62 6c 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65  ble to customize
19730 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 64 65   the set of code
19740 70 6f 69 6e 74 73 20 74 68 61 74 20 75 6e 69 63  points that unic
19750 6f 64 65 36 31 20 74 72 65 61 74 73 0a 20 20 61  ode61 treats.  a
19760 73 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  s separator char
19770 61 63 74 65 72 73 2e 20 54 68 65 20 22 73 65 70  acters. The "sep
19780 61 72 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e  arators=" option
19790 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
197a0 73 70 65 63 69 66 79 20 6f 6e 65 0a 20 20 6f 72  specify one.  or
197b0 20 6d 6f 72 65 20 65 78 74 72 61 20 63 68 61 72   more extra char
197c0 61 63 74 65 72 73 20 74 68 61 74 20 73 68 6f 75  acters that shou
197d0 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
197e0 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
197f0 63 74 65 72 73 2c 20 61 6e 64 0a 20 20 74 68 65  cters, and.  the
19800 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f   "tokenchars=" o
19810 70 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ption may be use
19820 64 20 74 6f 20 73 70 65 63 69 66 79 20 6f 6e 65  d to specify one
19830 20 6f 72 20 6d 6f 72 65 20 65 78 74 72 61 20 63   or more extra c
19840 68 61 72 61 63 74 65 72 73 0a 20 20 74 68 61 74  haracters.  that
19850 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74   should be treat
19860 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 6f  ed as part of to
19870 6b 65 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20  kens instead of 
19880 61 73 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  as separator cha
19890 72 61 63 74 65 72 73 2e 0a 20 20 46 6f 72 20 65  racters..  For e
198a0 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
198b0 6f 63 6b 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 43  ock>.    <i>-- C
198c0 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 74 68  reate a table th
198d0 61 74 20 75 73 65 73 20 74 68 65 20 75 6e 69 63  at uses the unic
198e0 6f 64 65 36 31 20 74 6f 6b 65 6e 69 7a 65 72 2c  ode61 tokenizer,
198f0 20 62 75 74 20 63 6f 6e 73 69 64 65 72 73 20 22   but considers "
19900 2e 22 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d  ."</i>.    <i>--
19910 20 61 6e 64 20 22 3d 22 20 63 68 61 72 61 63 74   and "=" charact
19920 65 72 73 20 74 6f 20 62 65 20 70 61 72 74 20 6f  ers to be part o
19930 66 20 74 6f 6b 65 6e 73 2c 20 61 6e 64 20 63 61  f tokens, and ca
19940 70 69 74 61 6c 20 22 58 22 20 63 68 61 72 61 63  pital "X" charac
19950 74 65 72 73 20 74 6f 3c 2f 69 3e 0a 20 20 20 20  ters to</i>.    
19960 3c 69 3e 2d 2d 20 66 75 6e 63 74 69 6f 6e 20 61  <i>-- function a
19970 73 20 73 65 70 61 72 61 74 6f 72 73 2e 3c 2f 69  s separators.</i
19980 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  >.    CREATE VIR
19990 54 55 41 4c 20 54 41 42 4c 45 20 74 78 74 33 20  TUAL TABLE txt3 
199a0 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e  USING fts4(token
199b0 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31 20 22 74  ize=unicode61 "t
199c0 6f 6b 65 6e 63 68 61 72 73 3d 2e 3d 22 20 22 73  okenchars=.=" "s
199d0 65 70 61 72 61 74 6f 72 73 3d 58 22 29 3b 0a 0a  eparators=X");..
199e0 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65      <i>-- Create
199f0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
19a00 6e 73 69 64 65 72 73 20 73 70 61 63 65 20 63 68  nsiders space ch
19a10 61 72 61 63 74 65 72 73 20 28 63 6f 64 65 70 6f  aracters (codepo
19a20 69 6e 74 20 33 32 29 20 74 6f 20 62 65 3c 2f 69  int 32) to be</i
19a30 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 61 20 74 6f  >.    <i>-- a to
19a40 6b 65 6e 20 63 68 61 72 61 63 74 65 72 3c 2f 69  ken character</i
19a50 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  >.    CREATE VIR
19a60 54 55 41 4c 20 54 41 42 4c 45 20 74 78 74 34 20  TUAL TABLE txt4 
19a70 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e  USING fts4(token
19a80 69 7a 65 3d 75 6e 69 63 6f 64 65 36 31 20 22 74  ize=unicode61 "t
19a90 6f 6b 65 6e 63 68 61 72 73 3d 20 22 29 3b 0a 3c  okenchars= ");.<
19aa0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
19ab0 0a 20 20 49 66 20 61 20 63 68 61 72 61 63 74 65  .  If a characte
19ac0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  r specified as p
19ad0 61 72 74 20 6f 66 20 74 68 65 20 61 72 67 75 6d  art of the argum
19ae0 65 6e 74 20 74 6f 20 22 74 6f 6b 65 6e 63 68 61  ent to "tokencha
19af0 72 73 3d 22 20 69 73 20 63 6f 6e 73 69 64 65 72  rs=" is consider
19b00 65 64 0a 20 20 74 6f 20 62 65 20 61 20 74 6f 6b  ed.  to be a tok
19b10 65 6e 20 63 68 61 72 61 63 74 65 72 20 62 79 20  en character by 
19b20 64 65 66 61 75 6c 74 2c 20 69 74 20 69 73 20 69  default, it is i
19b30 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  gnored. This is 
19b40 74 72 75 65 20 65 76 65 6e 20 69 66 20 69 74 20  true even if it 
19b50 68 61 73 0a 20 20 62 65 65 6e 20 6d 61 72 6b 65  has.  been marke
19b60 64 20 61 73 20 61 20 73 65 70 61 72 61 74 6f 72  d as a separator
19b70 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 22   by an earlier "
19b80 73 65 70 61 72 61 74 6f 72 73 3d 22 20 6f 70 74  separators=" opt
19b90 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
19ba0 69 66 0a 20 20 61 20 63 68 61 72 61 63 74 65 72  if.  a character
19bb0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
19bc0 72 74 20 6f 66 20 61 20 22 73 65 70 61 72 61 74  rt of a "separat
19bd0 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 20 69 73 20  ors=" option is 
19be0 74 72 65 61 74 65 64 20 61 73 20 61 20 73 65 70  treated as a sep
19bf0 61 72 61 74 6f 72 0a 20 20 63 68 61 72 61 63 74  arator.  charact
19c00 65 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69  er by default, i
19c10 74 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 49 66  t is ignored. If
19c20 20 6d 75 6c 74 69 70 6c 65 20 22 74 6f 6b 65 6e   multiple "token
19c30 63 68 61 72 73 3d 22 20 6f 72 20 22 73 65 70 61  chars=" or "sepa
19c40 72 61 74 6f 72 73 3d 22 0a 20 20 6f 70 74 69 6f  rators=".  optio
19c50 6e 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ns are specified
19c60 2c 20 61 6c 6c 20 61 72 65 20 70 72 6f 63 65 73  , all are proces
19c70 73 65 64 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  sed. For example
19c80 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
19c90 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20     <i>-- Create 
19ca0 61 20 74 61 62 6c 65 20 74 68 61 74 20 75 73 65  a table that use
19cb0 73 20 74 68 65 20 75 6e 69 63 6f 64 65 36 31 20  s the unicode61 
19cc0 74 6f 6b 65 6e 69 7a 65 72 2c 20 62 75 74 20 63  tokenizer, but c
19cd0 6f 6e 73 69 64 65 72 73 20 22 2e 22 3c 2f 69 3e  onsiders "."</i>
19ce0 0a 20 20 20 20 3c 69 3e 2d 2d 20 61 6e 64 20 22  .    <i>-- and "
19cf0 3d 22 20 63 68 61 72 61 63 74 65 72 73 20 74 6f  =" characters to
19d00 20 62 65 20 70 61 72 74 20 6f 66 20 74 6f 6b 65   be part of toke
19d10 6e 73 2c 20 61 6e 64 20 63 61 70 69 74 61 6c 20  ns, and capital 
19d20 22 58 22 20 63 68 61 72 61 63 74 65 72 73 20 74  "X" characters t
19d30 6f 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20  o</i>.    <i>-- 
19d40 66 75 6e 63 74 69 6f 6e 20 61 73 20 73 65 70 61  function as sepa
19d50 72 61 74 6f 72 73 2e 20 42 6f 74 68 20 6f 66 20  rators. Both of 
19d60 74 68 65 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d  the "tokenchars=
19d70 22 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 70 72  " options are pr
19d80 6f 63 65 73 73 65 64 3c 2f 69 3e 0a 20 20 20 20  ocessed</i>.    
19d90 3c 69 3e 2d 2d 20 54 68 65 20 22 73 65 70 61 72  <i>-- The "separ
19da0 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e 20 69  ators=" option i
19db0 67 6e 6f 72 65 73 20 74 68 65 20 22 2e 22 20 70  gnores the "." p
19dc0 61 73 73 65 64 20 74 6f 20 69 74 2c 20 61 73 20  assed to it, as 
19dd0 22 2e 22 20 69 73 20 62 79 3c 2f 69 3e 0a 20 20  "." is by</i>.  
19de0 20 20 3c 69 3e 2d 2d 20 64 65 66 61 75 6c 74 20    <i>-- default 
19df0 61 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  a separator char
19e00 61 63 74 65 72 2c 20 65 76 65 6e 20 74 68 6f 75  acter, even thou
19e10 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 6d  gh it has been m
19e20 61 72 6b 65 64 20 61 73 20 61 20 74 6f 6b 65 6e  arked as a token
19e30 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 63  </i>.    <i>-- c
19e40 68 61 72 61 63 74 65 72 20 62 79 20 61 6e 20 65  haracter by an e
19e50 61 72 6c 69 65 72 20 22 74 6f 6b 65 6e 63 68 61  arlier "tokencha
19e60 72 73 3d 22 20 6f 70 74 69 6f 6e 2e 3c 2f 69 3e  rs=" option.</i>
19e70 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
19e80 55 41 4c 20 54 41 42 4c 45 20 74 78 74 35 20 55  UAL TABLE txt5 U
19e90 53 49 4e 47 20 66 74 73 34 28 0a 20 20 20 20 20  SING fts4(.     
19ea0 20 20 20 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63     tokenize=unic
19eb0 6f 64 65 36 31 20 22 74 6f 6b 65 6e 63 68 61 72  ode61 "tokenchar
19ec0 73 3d 2e 22 20 22 73 65 70 61 72 61 74 6f 72 73  s=." "separators
19ed0 3d 58 2e 22 20 22 74 6f 6b 65 6e 63 68 61 72 73  =X." "tokenchars
19ee0 3d 3d 22 0a 20 20 20 20 29 3b 0a 3c 2f 63 6f 64  ==".    );.</cod
19ef0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
19f00 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  he arguments pas
19f10 73 65 64 20 74 6f 20 74 68 65 20 22 74 6f 6b 65  sed to the "toke
19f20 6e 63 68 61 72 73 3d 22 20 6f 72 20 22 73 65 70  nchars=" or "sep
19f30 61 72 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e  arators=" option
19f40 73 20 61 72 65 20 0a 20 20 63 61 73 65 2d 73 65  s are .  case-se
19f50 6e 73 69 74 69 76 65 2e 20 49 6e 20 74 68 65 20  nsitive. In the 
19f60 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 73  example above, s
19f70 70 65 63 69 66 79 69 6e 67 20 74 68 61 74 20 22  pecifying that "
19f80 58 22 20 69 73 20 61 20 73 65 70 61 72 61 74 6f  X" is a separato
19f90 72 0a 20 20 63 68 61 72 61 63 74 65 72 20 64 6f  r.  character do
19fa0 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
19fb0 65 20 77 61 79 20 22 78 22 20 69 73 20 68 61 6e  e way "x" is han
19fc0 64 6c 65 64 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66  dled...<tcl>hd_f
19fd0 72 61 67 6d 65 6e 74 20 66 33 74 6b 6e 7a 72 20  ragment f3tknzr 
19fe0 7b 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 7d  {fts3_tokenizer}
19ff0 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 43 75 73 74 6f  </tcl>.<h2>Custo
1a000 6d 20 28 41 70 70 6c 69 63 61 74 69 6f 6e 20 44  m (Application D
1a010 65 66 69 6e 65 64 29 20 54 6f 6b 65 6e 69 7a 65  efined) Tokenize
1a020 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49  rs</h2>..<p>.  I
1a030 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 72  n addition to pr
1a040 6f 76 69 64 69 6e 67 20 62 75 69 6c 74 2d 69 6e  oviding built-in
1a050 20 22 73 69 6d 70 6c 65 22 2c 20 22 70 6f 72 74   "simple", "port
1a060 65 72 22 20 61 6e 64 20 28 70 6f 73 73 69 62 6c  er" and (possibl
1a070 79 29 20 22 69 63 75 22 20 61 6e 64 0a 20 20 22  y) "icu" and.  "
1a080 75 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b 65 6e  unicode61" token
1a090 69 7a 65 72 73 2c 0a 20 20 46 54 53 20 70 72 6f  izers,.  FTS pro
1a0a0 76 69 64 65 73 20 61 6e 20 69 6e 74 65 72 66 61  vides an interfa
1a0b0 63 65 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69  ce for applicati
1a0c0 6f 6e 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ons to implement
1a0d0 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 63 75   and register cu
1a0e0 73 74 6f 6d 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  stom.  tokenizer
1a0f0 73 20 77 72 69 74 74 65 6e 20 69 6e 20 43 2e 20  s written in C. 
1a100 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75   The interface u
1a110 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  sed to create a 
1a120 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  new tokenizer is
1a130 20 64 65 66 69 6e 65 64 0a 20 20 61 6e 64 20 64   defined.  and d
1a140 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
1a150 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68  fts3_tokenizer.h
1a160 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 0a 3c   source file...<
1a170 70 3e 0a 20 20 52 65 67 69 73 74 65 72 69 6e 67  p>.  Registering
1a180 20 61 20 6e 65 77 20 46 54 53 20 74 6f 6b 65 6e   a new FTS token
1a190 69 7a 65 72 20 69 73 20 73 69 6d 69 6c 61 72 20  izer is similar 
1a1a0 74 6f 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  to registering a
1a1b0 20 6e 65 77 0a 20 20 76 69 72 74 75 61 6c 20 74   new.  virtual t
1a1c0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77 69 74 68  able module with
1a1d0 20 53 51 4c 69 74 65 2e 20 54 68 65 20 75 73 65   SQLite. The use
1a1e0 72 20 70 61 73 73 65 73 20 61 20 70 6f 69 6e 74  r passes a point
1a1f0 65 72 20 74 6f 20 61 0a 20 20 73 74 72 75 63 74  er to a.  struct
1a200 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ure containing p
1a210 6f 69 6e 74 65 72 73 20 74 6f 20 76 61 72 69 6f  ointers to vario
1a220 75 73 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  us callback func
1a230 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 6d 61 6b  tions that.  mak
1a240 65 20 75 70 20 74 68 65 20 69 6d 70 6c 65 6d 65  e up the impleme
1a250 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ntation of the n
1a260 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 74 79 70  ew tokenizer typ
1a270 65 2e 20 46 6f 72 20 74 6f 6b 65 6e 69 7a 65 72  e. For tokenizer
1a280 73 2c 0a 20 20 74 68 65 20 73 74 72 75 63 74 75  s,.  the structu
1a290 72 65 20 28 64 65 66 69 6e 65 64 20 69 6e 20 66  re (defined in f
1a2a0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 29  ts3_tokenizer.h)
1a2b0 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 22 73 71   is called.  "sq
1a2c0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1a2d0 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70 3e 0a 20 20  module"...<p>.  
1a2e0 46 54 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 70  FTS does not exp
1a2f0 6f 73 65 20 61 20 43 2d 66 75 6e 63 74 69 6f 6e  ose a C-function
1a300 20 74 68 61 74 20 75 73 65 72 73 20 63 61 6c 6c   that users call
1a310 20 74 6f 20 72 65 67 69 73 74 65 72 20 6e 65 77   to register new
1a320 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 20 74 79 70  .  tokenizer typ
1a330 65 73 20 77 69 74 68 20 61 20 64 61 74 61 62 61  es with a databa
1a340 73 65 20 68 61 6e 64 6c 65 2e 20 49 6e 73 74 65  se handle. Inste
1a350 61 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ad, the pointer 
1a360 6d 75 73 74 0a 20 20 62 65 20 65 6e 63 6f 64 65  must.  be encode
1a370 64 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62  d as an SQL blob
1a380 20 76 61 6c 75 65 20 61 6e 64 20 70 61 73 73 65   value and passe
1a390 64 20 74 6f 20 46 54 53 20 74 68 72 6f 75 67 68  d to FTS through
1a3a0 20 74 68 65 20 53 51 4c 0a 20 20 65 6e 67 69 6e   the SQL.  engin
1a3b0 65 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20  e by evaluating 
1a3c0 61 20 73 70 65 63 69 61 6c 20 73 63 61 6c 61 72  a special scalar
1a3d0 20 66 75 6e 63 74 69 6f 6e 2c 20 22 66 74 73 33   function, "fts3
1a3e0 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 22 2e 0a 20  _tokenizer()".. 
1a3f0 20 54 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69   The fts3_tokeni
1a400 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  zer() function m
1a410 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ay be called wit
1a420 68 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72 67  h one or two arg
1a430 75 6d 65 6e 74 73 2c 0a 20 20 61 73 20 66 6f 6c  uments,.  as fol
1a440 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  lows:..<codebloc
1a450 6b 3e 0a 20 20 20 20 53 45 4c 45 43 54 20 66 74  k>.    SELECT ft
1a460 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74  s3_tokenizer(&lt
1a470 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26  ;tokenizer-name&
1a480 67 74 3b 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  gt;);.    SELECT
1a490 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
1a4a0 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61  &lt;tokenizer-na
1a4b0 6d 65 26 67 74 3b 2c 20 26 6c 74 3b 73 71 6c 69  me&gt;, &lt;sqli
1a4c0 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
1a4d0 64 75 6c 65 20 70 74 72 26 67 74 3b 29 3b 0a 3c  dule ptr&gt;);.<
1a4e0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
1a4f0 0a 20 20 57 68 65 72 65 20 26 6c 74 3b 74 6f 6b  .  Where &lt;tok
1a500 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 20  enizer-name&gt; 
1a510 69 73 20 61 20 73 74 72 69 6e 67 20 69 64 65 6e  is a string iden
1a520 74 69 66 79 69 6e 67 20 74 68 65 20 74 6f 6b 65  tifying the toke
1a530 6e 69 7a 65 72 20 61 6e 64 0a 20 20 26 6c 74 3b  nizer and.  &lt;
1a540 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
1a550 72 5f 6d 6f 64 75 6c 65 20 70 74 72 26 67 74 3b  r_module ptr&gt;
1a560 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1a570 20 61 6e 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65   an sqlite3_toke
1a580 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 0a 20 20 73  nizer_module.  s
1a590 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65 64  tructure encoded
1a5a0 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62 2e   as an SQL blob.
1a5b0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1a5c0 72 67 75 6d 65 6e 74 20 69 73 20 70 72 65 73 65  rgument is prese
1a5d0 6e 74 2c 0a 20 20 69 74 20 69 73 20 72 65 67 69  nt,.  it is regi
1a5e0 73 74 65 72 65 64 20 61 73 20 74 6f 6b 65 6e 69  stered as tokeni
1a5f0 7a 65 72 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  zer &lt;tokenize
1a600 72 2d 6e 61 6d 65 26 67 74 3b 20 61 6e 64 20 61  r-name&gt; and a
1a610 20 63 6f 70 79 20 6f 66 20 69 74 0a 20 20 72 65   copy of it.  re
1a620 74 75 72 6e 65 64 2e 20 49 66 20 6f 6e 6c 79 20  turned. If only 
1a630 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  one argument is 
1a640 70 61 73 73 65 64 2c 20 61 20 70 6f 69 6e 74 65  passed, a pointe
1a650 72 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a  r to the tokeniz
1a660 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74  er.  implementat
1a670 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 72 65  ion currently re
1a680 67 69 73 74 65 72 65 64 20 61 73 20 26 6c 74 3b  gistered as &lt;
1a690 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67  tokenizer-name&g
1a6a0 74 3b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  t; is returned,.
1a6b0 20 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62    encoded as a b
1a6c0 6c 6f 62 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73  lob. Or, if no s
1a6d0 75 63 68 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78  uch tokenizer ex
1a6e0 69 73 74 73 2c 20 61 6e 20 53 51 4c 20 65 78 63  ists, an SQL exc
1a6f0 65 70 74 69 6f 6e 0a 20 20 28 65 72 72 6f 72 29  eption.  (error)
1a700 20 69 73 20 72 61 69 73 65 64 2e 0a 0a 3c 70 3e   is raised...<p>
1a710 0a 20 20 42 65 63 61 75 73 65 20 6f 66 20 73 65  .  Because of se
1a720 63 75 72 69 74 79 20 63 6f 6e 63 65 72 6e 73 2c  curity concerns,
1a730 20 53 51 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e   SQLite [version
1a740 20 33 2e 31 31 2e 30 5d 20 28 5b 64 61 74 65 6f   3.11.0] ([dateo
1a750 66 3a 33 2e 31 31 2e 30 5d 29 0a 20 20 61 6e 64  f:3.11.0]).  and
1a760 20 6c 61 74 65 72 20 6f 6e 6c 79 20 65 6e 61 62   later only enab
1a770 6c 65 64 20 74 68 65 0a 20 20 73 65 63 6f 6e 64  led the.  second
1a780 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 66 74 73   form of the fts
1a790 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75  3_tokenizer() fu
1a7a0 6e 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  nction when the 
1a7b0 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
1a7c0 6c 65 64 0a 20 20 77 69 74 68 20 74 68 65 20 5b  led.  with the [
1a7d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1a7e0 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 7c 20 2d  S3_TOKENIZER | -
1a7f0 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  DSQLITE_ENABLE_F
1a800 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 5d 0a 20  TS3_TOKENIZER]. 
1a810 20 6f 70 74 69 6f 6e 2e 20 49 6e 20 65 61 72 6c   option. In earl
1a820 69 65 72 20 76 65 72 73 69 6f 6e 73 20 69 74 20  ier versions it 
1a830 77 61 73 0a 20 20 61 6c 77 61 79 73 20 61 76 61  was.  always ava
1a840 69 6c 61 62 6c 65 2e 20 20 42 65 67 69 6e 6e 69  ilable.  Beginni
1a850 6e 67 20 77 69 74 68 20 53 51 4c 69 74 65 20 5b  ng with SQLite [
1a860 76 65 72 73 69 6f 6e 20 33 2e 31 32 2e 30 5d 0a  version 3.12.0].
1a870 20 20 28 5b 64 61 74 65 6f 66 3a 33 2e 31 32 2e    ([dateof:3.12.
1a880 30 5d 29 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  0]), the second 
1a890 66 6f 72 6d 20 6f 66 0a 20 20 66 74 73 33 5f 74  form of.  fts3_t
1a8a0 6f 6b 65 6e 69 7a 65 72 28 29 20 63 61 6e 20 61  okenizer() can a
1a8b0 6c 73 6f 20 62 65 20 61 63 74 69 76 61 74 65 64  lso be activated
1a8c0 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   at run-time by 
1a8d0 63 61 6c 6c 69 6e 67 0a 20 20 5b 73 71 6c 69 74  calling.  [sqlit
1a8e0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 5d 28 64 62  e3_db_config](db
1a8f0 2c 5b 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  ,[SQLITE_DBCONFI
1a900 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
1a910 4b 45 4e 49 5a 45 52 5d 2c 31 2c 30 29 2e 0a 0a  KENIZER],1,0)...
1a920 3c 70 3e 0a 20 20 3c 62 3e 53 45 43 55 52 49 54  <p>.  <b>SECURIT
1a930 59 20 57 41 52 4e 49 4e 47 3c 2f 62 3e 3a 20 0a  Y WARNING</b>: .
1a940 20 20 49 66 20 61 20 76 65 72 73 69 6f 6e 20 6f    If a version o
1a950 66 20 74 68 65 20 66 74 73 33 2f 34 20 65 78 74  f the fts3/4 ext
1a960 65 6e 73 69 6f 6e 20 74 68 61 74 20 73 75 70 70  ension that supp
1a970 6f 72 74 73 20 74 68 65 20 74 77 6f 2d 61 72 67  orts the two-arg
1a980 75 6d 65 6e 74 20 66 6f 72 6d 20 6f 66 0a 20 20  ument form of.  
1a990 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
1a9a0 20 69 73 20 64 65 70 6c 6f 79 65 64 20 69 6e 20   is deployed in 
1a9b0 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 77  an environment w
1a9c0 68 65 72 65 20 6d 61 6c 69 63 69 6f 75 73 20 75  here malicious u
1a9d0 73 65 72 73 20 63 61 6e 0a 20 20 72 75 6e 20 61  sers can.  run a
1a9e0 72 62 69 74 72 61 72 79 20 53 51 4c 2c 20 74 68  rbitrary SQL, th
1a9f0 65 6e 20 74 68 6f 73 65 20 75 73 65 72 73 20 73  en those users s
1aa00 68 6f 75 6c 64 20 62 65 20 70 72 65 76 65 6e 74  hould be prevent
1aa10 65 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 69 6e 67  ed from invoking
1aa20 20 74 68 65 20 0a 20 20 74 77 6f 2d 61 72 67 75   the .  two-argu
1aa30 6d 65 6e 74 20 66 74 73 33 5f 74 6f 6b 65 6e 69  ment fts3_tokeni
1aa40 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  zer() function..
1aa50 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 64 6f    This can be do
1aa60 6e 65 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71  ne using the [sq
1aa70 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
1aa80 69 7a 65 72 28 29 7c 61 75 74 68 6f 72 69 7a 61  izer()|authoriza
1aa90 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 5d 2c 20  tion callback], 
1aaa0 0a 20 20 6f 72 20 62 79 20 64 69 73 61 62 6c 69  .  or by disabli
1aab0 6e 67 20 74 68 65 20 74 77 6f 2d 61 72 67 75 6d  ng the two-argum
1aac0 65 6e 74 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  ent fts3_tokeniz
1aad0 65 72 28 29 20 69 6e 74 65 72 66 61 63 65 20 75  er() interface u
1aae0 73 69 6e 67 20 61 0a 20 20 63 61 6c 6c 20 74 6f  sing a.  call to
1aaf0 0a 20 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 63  .  [sqlite3_db_c
1ab00 6f 6e 66 69 67 5d 28 64 62 2c 5b 53 51 4c 49 54  onfig](db,[SQLIT
1ab10 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
1ab20 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52  E_FTS3_TOKENIZER
1ab30 5d 2c 30 2c 30 29 2e 0a 0a 3c 70 3e 0a 20 20 54  ],0,0)...<p>.  T
1ab40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
1ab50 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  ck contains an e
1ab60 78 61 6d 70 6c 65 20 6f 66 20 63 61 6c 6c 69 6e  xample of callin
1ab70 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e  g the fts3_token
1ab80 69 7a 65 72 28 29 0a 20 20 66 75 6e 63 74 69 6f  izer().  functio
1ab90 6e 20 66 72 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a  n from C code:..
1aba0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
1abb0 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69 73 74 65  >/*.  ** Registe
1abc0 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  r a tokenizer im
1abd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 74  plementation wit
1abe0 68 20 46 54 53 33 20 6f 72 20 46 54 53 34 2e 0a  h FTS3 or FTS4..
1abf0 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 72    */</i>.  int r
1ac00 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72  egisterTokenizer
1ac10 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  (.    sqlite3 *d
1ac20 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  b,.    char *zNa
1ac30 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  me,.    const sq
1ac40 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
1ac50 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b 0a 20  module *p.  ){. 
1ac60 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
1ac70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1ac80 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  mt;.    const ch
1ac90 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
1aca0 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  CT fts3_tokenize
1acb0 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20 20 72  r(?, ?)";..    r
1acc0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1acd0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
1ace0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1acf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ad00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ad20 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ..    sqlite3_bi
1ad30 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
1ad40 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1ad50 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1ad60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1ad70 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26 70 2c  ob(pStmt, 2, &p,
1ad80 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51 4c 49   sizeof(p), SQLI
1ad90 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1ada0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1adb0 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  mt);..    return
1adc0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1add0 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  e(pStmt);.  }.. 
1ade0 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75 65 72   <i>/*.  ** Quer
1adf0 79 20 46 54 53 20 66 6f 72 20 74 68 65 20 74 6f  y FTS for the to
1ae00 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
1ae10 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61  tation named zNa
1ae20 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69  me..  */</i>.  i
1ae30 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e 69 7a 65  nt queryTokenize
1ae40 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  r(.    sqlite3 *
1ae50 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  db,.    char *zN
1ae60 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73  ame,.    const s
1ae70 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1ae80 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 20 20 29  _module **pp.  )
1ae90 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1aea0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1aeb0 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74  pStmt;.    const
1aec0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
1aed0 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e  ELECT fts3_token
1aee0 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 20 20 2a  izer(?)";..    *
1aef0 70 70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  pp = 0;.    rc =
1af00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1af10 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
1af20 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1af30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1af40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1af50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1af60 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1af70 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
1af80 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
1af90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
1afa0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
1afb0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1afc0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ) ){.      if( s
1afd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1afe0 70 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51  pe(pStmt, 0)==SQ
1aff0 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
1b000 20 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20       memcpy(pp, 
1b010 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1b020 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 20 73  lob(pStmt, 0), s
1b030 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20 20 20  izeof(*pp));.   
1b040 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1b050 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
1b060 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1b070 20 20 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e    }.</codeblock>
1b080 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
1b090 65 6e 74 20 66 74 73 33 74 6f 6b 20 7b 66 74 73  ent fts3tok {fts
1b0a0 33 74 6f 6b 65 6e 69 7a 65 7d 20 7b 66 74 73 33  3tokenize} {fts3
1b0b0 74 6f 6b 65 6e 69 7a 65 20 76 69 72 74 75 61 6c  tokenize virtual
1b0c0 20 74 61 62 6c 65 7d 3c 2f 74 63 6c 3e 0a 3c 68   table}</tcl>.<h
1b0d0 32 3e 51 75 65 72 79 69 6e 67 20 54 6f 6b 65 6e  2>Querying Token
1b0e0 69 7a 65 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54  izers</h2>..<p>T
1b0f0 68 65 20 22 66 74 73 33 74 6f 6b 65 6e 69 7a 65  he "fts3tokenize
1b100 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  " virtual table 
1b110 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 64  can be used to d
1b120 69 72 65 63 74 6c 79 20 61 63 63 65 73 73 20 61  irectly access a
1b130 6e 79 0a 20 20 20 74 6f 6b 65 6e 69 7a 65 72 2e  ny.   tokenizer.
1b140 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1b150 53 51 4c 20 64 65 6d 6f 6e 73 74 72 61 74 65 73  SQL demonstrates
1b160 20 68 6f 77 20 74 6f 20 63 72 65 61 74 65 20 61   how to create a
1b170 6e 20 69 6e 73 74 61 6e 63 65 20 0a 20 20 20 6f  n instance .   o
1b180 66 20 74 68 65 20 66 74 73 33 74 6f 6b 65 6e 69  f the fts3tokeni
1b190 7a 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ze virtual table
1b1a0 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 43  :..<codeblock>.C
1b1b0 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1b1c0 42 4c 45 20 74 6f 6b 31 20 55 53 49 4e 47 20 66  BLE tok1 USING f
1b1d0 74 73 33 74 6f 6b 65 6e 69 7a 65 28 27 70 6f 72  ts3tokenize('por
1b1e0 74 65 72 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  ter');.</codeblo
1b1f0 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 6e 61 6d 65  ck>..<p>The name
1b200 20 6f 66 20 74 68 65 20 64 65 73 69 72 65 64 20   of the desired 
1b210 74 6f 6b 65 6e 69 7a 65 72 20 73 68 6f 75 6c 64  tokenizer should
1b220 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
1b230 69 6e 20 70 6c 61 63 65 20 6f 66 0a 20 20 20 27  in place of.   '
1b240 70 6f 72 74 65 72 27 20 69 6e 20 74 68 65 20 65  porter' in the e
1b250 78 61 6d 70 6c 65 2c 20 6f 66 20 63 6f 75 72 73  xample, of cours
1b260 65 2e 20 20 49 66 20 74 68 65 20 74 6f 6b 65 6e  e.  If the token
1b270 69 7a 65 72 20 72 65 71 75 69 72 65 73 20 6f 6e  izer requires on
1b280 65 20 6f 72 0a 20 20 20 6d 6f 72 65 20 61 72 67  e or.   more arg
1b290 75 6d 65 6e 74 73 2c 20 74 68 65 79 20 73 68 6f  uments, they sho
1b2a0 75 6c 64 20 62 65 20 73 65 70 61 72 61 74 65 64  uld be separated
1b2b0 20 62 79 20 63 6f 6d 6d 61 73 20 69 6e 20 74 68   by commas in th
1b2c0 65 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 0a 20  e fts3tokenize. 
1b2d0 20 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 28 65    declaration (e
1b2e0 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
1b2f0 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
1b300 20 73 70 61 63 65 73 20 69 6e 20 64 65 63 6c 61   spaces in decla
1b310 72 61 74 69 6f 6e 73 0a 20 20 20 6f 66 20 72 65  rations.   of re
1b320 67 75 6c 61 72 20 66 74 73 34 20 74 61 62 6c 65  gular fts4 table
1b330 73 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s). The followin
1b340 67 20 63 72 65 61 74 65 73 20 66 74 73 34 20 61  g creates fts4 a
1b350 6e 64 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 0a  nd fts3tokenize.
1b360 20 20 20 74 61 62 6c 65 73 20 74 68 61 74 20 75     tables that u
1b370 73 65 20 74 68 65 20 73 61 6d 65 20 74 6f 6b 65  se the same toke
1b380 6e 69 7a 65 72 3a 0a 3c 63 6f 64 65 62 6c 6f 63  nizer:.<codebloc
1b390 6b 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  k>.  CREATE VIRT
1b3a0 55 41 4c 20 54 41 42 4c 45 20 74 65 78 74 31 20  UAL TABLE text1 
1b3b0 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e  USING fts4(token
1b3c0 69 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29 3b 0a  ize=icu en_AU);.
1b3d0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1b3e0 20 54 41 42 4c 45 20 74 6f 6b 65 6e 73 31 20 55   TABLE tokens1 U
1b3f0 53 49 4e 47 20 66 74 73 33 74 6f 6b 65 6e 69 7a  SING fts3tokeniz
1b400 65 28 69 63 75 2c 20 65 6e 5f 41 55 29 3b 0a 0a  e(icu, en_AU);..
1b410 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1b420 20 54 41 42 4c 45 20 74 65 78 74 32 20 55 53 49   TABLE text2 USI
1b430 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
1b440 3d 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65  =unicode61 "toke
1b450 6e 63 68 61 72 73 3d 40 2e 22 20 22 73 65 70 61  nchars=@." "sepa
1b460 72 61 74 6f 72 73 3d 31 32 33 22 29 3b 0a 20 20  rators=123");.  
1b470 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1b480 41 42 4c 45 20 74 6f 6b 65 6e 73 32 20 55 53 49  ABLE tokens2 USI
1b490 4e 47 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 28  NG fts3tokenize(
1b4a0 75 6e 69 63 6f 64 65 36 31 2c 20 22 74 6f 6b 65  unicode61, "toke
1b4b0 6e 63 68 61 72 73 3d 40 2e 22 2c 20 22 73 65 70  nchars=@.", "sep
1b4c0 61 72 61 74 6f 72 73 3d 31 32 33 22 29 3b 0a 3c  arators=123");.<
1b4d0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 0a  /codeblock>.   .
1b4e0 3c 70 3e 0a 20 20 20 4f 6e 63 65 20 74 68 65 20  <p>.   Once the 
1b4f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
1b500 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 61 6e   created, it can
1b510 20 62 65 20 71 75 65 72 69 65 64 20 61 73 20 66   be queried as f
1b520 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c  ollows:..<codebl
1b530 6f 63 6b 3e 0a 53 45 4c 45 43 54 20 74 6f 6b 65  ock>.SELECT toke
1b540 6e 2c 20 73 74 61 72 74 2c 20 65 6e 64 2c 20 70  n, start, end, p
1b550 6f 73 69 74 69 6f 6e 20 0a 20 20 46 52 4f 4d 20  osition .  FROM 
1b560 74 6f 6b 31 0a 20 57 48 45 52 45 20 69 6e 70 75  tok1. WHERE inpu
1b570 74 3d 27 54 68 69 73 20 69 73 20 61 20 74 65 73  t='This is a tes
1b580 74 20 73 65 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f  t sentence.';.</
1b590 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54  codeblock>..<p>T
1b5a0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1b5b0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 6f 6e 65   will return one
1b5c0 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 66   row of output f
1b5d0 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
1b5e0 20 74 68 65 0a 20 20 20 69 6e 70 75 74 20 73 74   the.   input st
1b5f0 72 69 6e 67 2e 20 20 54 68 65 20 22 74 6f 6b 65  ring.  The "toke
1b600 6e 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  n" column is the
1b610 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 6f 6b   text of the tok
1b620 65 6e 2e 20 20 54 68 65 20 22 73 74 61 72 74 22  en.  The "start"
1b630 0a 20 20 20 61 6e 64 20 22 65 6e 64 22 20 63 6f  .   and "end" co
1b640 6c 75 6d 6e 73 20 61 72 65 20 74 68 65 20 62 79  lumns are the by
1b650 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  te offset to the
1b660 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65   beginning and e
1b670 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 74 6f 6b  nd of the.   tok
1b680 65 6e 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  en in the origin
1b690 61 6c 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e  al input string.
1b6a0 20 20 0a 20 20 20 54 68 65 20 22 70 6f 73 69 74    .   The "posit
1b6b0 69 6f 6e 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  ion" column is t
1b6c0 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  he sequence numb
1b6d0 65 72 0a 20 20 20 6f 66 20 74 68 65 20 74 6f 6b  er.   of the tok
1b6e0 65 6e 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  en in the origin
1b6f0 61 6c 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e  al input string.
1b700 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20    There is also 
1b710 61 6e 20 22 69 6e 70 75 74 22 0a 20 20 20 63 6f  an "input".   co
1b720 6c 75 6d 6e 20 77 68 69 63 68 20 69 73 20 73 69  lumn which is si
1b730 6d 70 6c 79 20 61 20 63 6f 70 79 20 6f 66 20 74  mply a copy of t
1b740 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
1b750 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69 65  that is specifie
1b760 64 20 69 6e 0a 20 20 20 74 68 65 20 57 48 45 52  d in.   the WHER
1b770 45 20 63 6c 61 75 73 65 2e 20 20 4e 6f 74 65 20  E clause.  Note 
1b780 74 68 61 74 20 61 20 63 6f 6e 73 74 72 61 69 6e  that a constrain
1b790 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 69  t of the form "i
1b7a0 6e 70 75 74 3d 3f 22 20 6d 75 73 74 0a 20 20 20  nput=?" must.   
1b7b0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 57 48  appear in the WH
1b7c0 45 52 45 20 63 6c 61 75 73 65 20 6f 72 20 65 6c  ERE clause or el
1b7d0 73 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  se the virtual t
1b7e0 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  able will have n
1b7f0 6f 20 69 6e 70 75 74 0a 20 20 20 74 6f 20 74 6f  o input.   to to
1b800 6b 65 6e 69 7a 65 20 61 6e 64 20 77 69 6c 6c 20  kenize and will 
1b810 72 65 74 75 72 6e 20 6e 6f 20 72 6f 77 73 2e 20  return no rows. 
1b820 20 54 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   The example abo
1b830 76 65 20 67 65 6e 65 72 61 74 65 73 0a 20 20 20  ve generates.   
1b840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 75  the following ou
1b850 74 70 75 74 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  tput:..<codebloc
1b860 6b 3e 0a 74 68 69 7c 30 7c 34 7c 30 0a 69 73 7c  k>.thi|0|4|0.is|
1b870 35 7c 37 7c 31 0a 61 7c 38 7c 39 7c 32 0a 74 65  5|7|1.a|8|9|2.te
1b880 73 74 7c 31 30 7c 31 34 7c 33 0a 73 65 6e 74 65  st|10|14|3.sente
1b890 6e 63 7c 31 35 7c 32 33 7c 34 0a 3c 2f 63 6f 64  nc|15|23|4.</cod
1b8a0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 4e 6f 74 69  eblock>..<p>Noti
1b8b0 63 65 20 74 68 61 74 20 74 68 65 20 74 6f 6b 65  ce that the toke
1b8c0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1b8d0 20 73 65 74 20 66 72 6f 6d 20 74 68 65 20 66 74   set from the ft
1b8e0 73 33 74 6f 6b 65 6e 69 7a 65 20 76 69 72 74 75  s3tokenize virtu
1b8f0 61 6c 0a 20 20 20 74 61 62 6c 65 20 68 61 76 65  al.   table have
1b900 20 62 65 65 6e 20 74 72 61 6e 73 66 6f 72 6d 65   been transforme
1b910 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
1b920 68 65 20 72 75 6c 65 73 20 6f 66 20 74 68 65 20  he rules of the 
1b930 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 20 53 69  tokenizer..   Si
1b940 6e 63 65 20 74 68 69 73 20 65 78 61 6d 70 6c 65  nce this example
1b950 20 75 73 65 64 20 74 68 65 20 22 70 6f 72 74 65   used the "porte
1b960 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68  r" tokenizer, th
1b970 65 20 22 54 68 69 73 22 20 74 6f 6b 65 6e 20 77  e "This" token w
1b980 61 73 0a 20 20 20 63 6f 6e 76 65 72 74 65 64 20  as.   converted 
1b990 69 6e 74 6f 20 22 74 68 69 22 2e 20 20 49 66 20  into "thi".  If 
1b9a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
1b9b0 74 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 69  t of the token i
1b9c0 73 20 64 65 73 69 72 65 64 2c 0a 20 20 20 69 74  s desired,.   it
1b9d0 20 63 61 6e 20 62 65 20 72 65 74 72 69 65 76 65   can be retrieve
1b9e0 64 20 75 73 69 6e 67 20 74 68 65 20 22 73 74 61  d using the "sta
1b9f0 72 74 22 20 61 6e 64 20 22 65 6e 64 22 20 63 6f  rt" and "end" co
1ba00 6c 75 6d 6e 73 20 77 69 74 68 20 74 68 65 0a 20  lumns with the. 
1ba10 20 20 5b 73 75 62 73 74 72 28 29 5d 20 66 75 6e    [substr()] fun
1ba20 63 74 69 6f 6e 2e 20 20 46 6f 72 20 65 78 61 6d  ction.  For exam
1ba30 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
1ba40 3e 0a 53 45 4c 45 43 54 20 73 75 62 73 74 72 28  >.SELECT substr(
1ba50 69 6e 70 75 74 2c 20 73 74 61 72 74 2b 31 2c 20  input, start+1, 
1ba60 65 6e 64 2d 73 74 61 72 74 29 2c 20 74 6f 6b 65  end-start), toke
1ba70 6e 2c 20 70 6f 73 69 74 69 6f 6e 0a 20 20 46 52  n, position.  FR
1ba80 4f 4d 20 74 6f 6b 31 0a 20 57 48 45 52 45 20 69  OM tok1. WHERE i
1ba90 6e 70 75 74 3d 27 54 68 69 73 20 69 73 20 61 20  nput='This is a 
1baa0 74 65 73 74 20 73 65 6e 74 65 6e 63 65 2e 27 3b  test sentence.';
1bab0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
1bac0 70 3e 54 68 65 20 66 74 73 33 74 6f 6b 65 6e 69  p>The fts3tokeni
1bad0 7a 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ze virtual table
1bae0 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
1baf0 61 6e 79 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 72  any tokenizer, r
1bb00 65 67 61 72 64 6c 65 73 73 0a 20 20 20 6f 66 20  egardless.   of 
1bb10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1bb20 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 46  here exists an F
1bb30 54 53 33 20 6f 72 20 46 54 53 34 20 74 61 62 6c  TS3 or FTS4 tabl
1bb40 65 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  e that actually 
1bb50 75 73 65 73 0a 20 20 20 74 68 61 74 20 74 6f 6b  uses.   that tok
1bb60 65 6e 69 7a 65 72 2e 0a 0a 20 0a 3c 68 31 20 74  enizer... .<h1 t
1bb70 61 67 73 3d 22 73 65 67 6d 65 6e 74 20 62 74 72  ags="segment btr
1bb80 65 65 22 3e 44 61 74 61 20 53 74 72 75 63 74 75  ee">Data Structu
1bb90 72 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  res</h1>..<p>.  
1bba0 54 68 69 73 20 73 65 63 74 69 6f 6e 20 64 65 73  This section des
1bbb0 63 72 69 62 65 73 20 61 74 20 61 20 68 69 67 68  cribes at a high
1bbc0 2d 6c 65 76 65 6c 20 74 68 65 20 77 61 79 20 74  -level the way t
1bbd0 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 20 73 74  he FTS module st
1bbe0 6f 72 65 73 20 69 74 73 0a 20 20 69 6e 64 65 78  ores its.  index
1bbf0 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69 6e 20   and content in 
1bc00 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 74  the database. It
1bc10 20 69 73 20 3c 62 3e 6e 6f 74 20 6e 65 63 65 73   is <b>not neces
1bc20 73 61 72 79 20 74 6f 20 72 65 61 64 20 6f 72 20  sary to read or 
1bc30 0a 20 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  .  understand th
1bc40 65 20 6d 61 74 65 72 69 61 6c 20 69 6e 20 74 68  e material in th
1bc50 69 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6f 72  is section in or
1bc60 64 65 72 20 74 6f 20 75 73 65 20 46 54 53 3c 2f  der to use FTS</
1bc70 62 3e 20 69 6e 20 61 6e 20 0a 20 20 61 70 70 6c  b> in an .  appl
1bc80 69 63 61 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72  ication. However
1bc90 2c 20 69 74 20 6d 61 79 20 62 65 20 75 73 65 66  , it may be usef
1bca0 75 6c 20 74 6f 20 61 70 70 6c 69 63 61 74 69 6f  ul to applicatio
1bcb0 6e 20 64 65 76 65 6c 6f 70 65 72 73 20 61 74 74  n developers att
1bcc0 65 6d 70 74 69 6e 67 20 0a 20 20 74 6f 20 61 6e  empting .  to an
1bcd0 61 6c 79 7a 65 20 61 6e 64 20 75 6e 64 65 72 73  alyze and unders
1bce0 74 61 6e 64 20 46 54 53 20 70 65 72 66 6f 72 6d  tand FTS perform
1bcf0 61 6e 63 65 20 63 68 61 72 61 63 74 65 72 69 73  ance characteris
1bd00 74 69 63 73 2c 20 6f 72 20 74 6f 20 64 65 76 65  tics, or to deve
1bd10 6c 6f 70 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d  lopers .  contem
1bd20 70 6c 61 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d  plating enhancem
1bd30 65 6e 74 73 20 74 6f 20 74 68 65 20 65 78 69 73  ents to the exis
1bd40 74 69 6e 67 20 46 54 53 20 66 65 61 74 75 72 65  ting FTS feature
1bd50 20 73 65 74 2e 0a 3c 2f 70 3e 0a 0a 3c 74 63 6c   set..</p>..<tcl
1bd60 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 73 68  >hd_fragment *sh
1bd70 61 64 6f 77 74 61 62 20 7b 46 54 53 20 73 68 61  adowtab {FTS sha
1bd80 64 6f 77 20 74 61 62 6c 65 73 7d 3c 2f 74 63 6c  dow tables}</tcl
1bd90 3e 0a 3c 68 32 20 74 61 67 73 3d 22 73 68 61 64  >.<h2 tags="shad
1bda0 6f 77 74 61 62 73 22 3e 53 68 61 64 6f 77 20 54  owtabs">Shadow T
1bdb0 61 62 6c 65 73 3c 2f 68 32 3e 0a 3c 70 3e 0a 20  ables</h2>.<p>. 
1bdc0 20 46 6f 72 20 65 61 63 68 20 46 54 53 20 76 69   For each FTS vi
1bdd0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 61  rtual table in a
1bde0 20 64 61 74 61 62 61 73 65 2c 20 74 68 72 65 65   database, three
1bdf0 20 74 6f 20 66 69 76 65 20 72 65 61 6c 20 28 6e   to five real (n
1be00 6f 6e 2d 76 69 72 74 75 61 6c 29 20 74 61 62 6c  on-virtual) tabl
1be10 65 73 0a 20 20 61 72 65 20 63 72 65 61 74 65 64  es.  are created
1be20 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 75 6e   to store the un
1be30 64 65 72 6c 79 69 6e 67 20 64 61 74 61 2e 20 20  derlying data.  
1be40 54 68 65 73 65 20 72 65 61 6c 20 74 61 62 6c 65  These real table
1be50 73 20 61 72 65 20 63 61 6c 6c 65 64 20 22 73 68  s are called "sh
1be60 61 64 6f 77 20 74 61 62 6c 65 73 22 2e 0a 20 20  adow tables"..  
1be70 54 68 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20  The real tables 
1be80 61 72 65 20 6e 61 6d 65 64 20 22 25 5f 63 6f 6e  are named "%_con
1be90 74 65 6e 74 22 2c 0a 20 20 22 25 5f 73 65 67 64  tent",.  "%_segd
1bea0 69 72 22 2c 20 22 25 5f 73 65 67 6d 65 6e 74 73  ir", "%_segments
1beb0 22 2c 20 22 25 5f 73 74 61 74 22 2c 20 61 6e 64  ", "%_stat", and
1bec0 20 22 25 5f 64 6f 63 73 69 7a 65 22 2c 20 77 68   "%_docsize", wh
1bed0 65 72 65 20 22 25 22 20 69 73 20 72 65 70 6c 61  ere "%" is repla
1bee0 63 65 64 20 62 79 20 74 68 65 20 6e 61 6d 65 0a  ced by the name.
1bef0 20 20 6f 66 20 74 68 65 20 46 54 53 20 76 69 72    of the FTS vir
1bf00 74 75 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e  tual table...<p>
1bf10 0a 20 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20  .  The leftmost 
1bf20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22 25  column of the "%
1bf30 5f 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 20  _content" table 
1bf40 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
1bf50 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 0a  IMARY KEY field.
1bf60 20 20 6e 61 6d 65 64 20 22 64 6f 63 69 64 22 2e    named "docid".
1bf70 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   Following this 
1bf80 69 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f  is one column fo
1bf90 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
1bfa0 20 74 68 65 20 46 54 53 0a 20 20 76 69 72 74 75   the FTS.  virtu
1bfb0 61 6c 20 74 61 62 6c 65 20 61 73 20 64 65 63 6c  al table as decl
1bfc0 61 72 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ared by the user
1bfd0 2c 20 6e 61 6d 65 64 20 62 79 20 70 72 65 70 65  , named by prepe
1bfe0 6e 64 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  nding the column
1bff0 20 6e 61 6d 65 0a 20 20 73 75 70 70 6c 69 65 64   name.  supplied
1c000 20 62 79 20 74 68 65 20 75 73 65 72 20 77 69 74   by the user wit
1c010 68 20 22 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77  h "c<i>N</i>", w
1c020 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73  here <i>N</i> is
1c030 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1c040 65 20 0a 20 20 63 6f 6c 75 6d 6e 20 77 69 74 68  e .  column with
1c050 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6e 75  in the table, nu
1c060 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
1c070 20 74 6f 20 72 69 67 68 74 20 73 74 61 72 74 69   to right starti
1c080 6e 67 20 77 69 74 68 20 30 2e 20 44 61 74 61 0a  ng with 0. Data.
1c090 20 20 74 79 70 65 73 20 73 75 70 70 6c 69 65 64    types supplied
1c0a0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1c0b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65  virtual table de
1c0c0 63 6c 61 72 61 74 69 6f 6e 20 61 72 65 20 6e 6f  claration are no
1c0d0 74 20 75 73 65 64 20 61 73 0a 20 20 70 61 72 74  t used as.  part
1c0e0 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   of the %_conten
1c0f0 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  t table declarat
1c100 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
1c110 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
1c120 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74   <i>-- Virtual t
1c130 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
1c140 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
1c150 52 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20  RTUAL TABLE abc 
1c160 55 53 49 4e 47 20 66 74 73 34 28 61 20 4e 55 4d  USING fts4(a NUM
1c170 42 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b  BER, b TEXT, c);
1c180 0a 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73  ..  <i>-- Corres
1c190 70 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e  ponding %_conten
1c1a0 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  t table declarat
1c1b0 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ion</i>.  CREATE
1c1c0 20 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65   TABLE abc_conte
1c1d0 6e 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52  nt(docid INTEGER
1c1e0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 30   PRIMARY KEY, c0
1c1f0 61 2c 20 63 31 62 2c 20 63 32 63 29 3b 0a 3c 2f  a, c1b, c2c);.</
1c200 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
1c210 20 20 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20    The %_content 
1c220 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  table contains t
1c230 68 65 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  he unadulterated
1c240 20 64 61 74 61 20 69 6e 73 65 72 74 65 64 20 62   data inserted b
1c250 79 20 74 68 65 20 75 73 65 72 20 0a 20 20 69 6e  y the user .  in
1c260 74 6f 20 74 68 65 20 46 54 53 20 76 69 72 74 75  to the FTS virtu
1c270 61 6c 20 74 61 62 6c 65 20 62 79 20 74 68 65 20  al table by the 
1c280 75 73 65 72 2e 20 49 66 20 74 68 65 20 75 73 65  user. If the use
1c290 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  r does not expli
1c2a0 63 69 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61  citly.  supply a
1c2b0 20 22 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77   "docid" value w
1c2c0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65  hen inserting re
1c2d0 63 6f 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65  cords, one is se
1c2e0 6c 65 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63  lected automatic
1c2f0 61 6c 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79  ally.  by the sy
1c300 73 74 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  stem...<p>.  The
1c310 20 25 5f 73 74 61 74 20 61 6e 64 20 25 5f 64 6f   %_stat and %_do
1c320 63 73 69 7a 65 20 74 61 62 6c 65 73 20 61 72 65  csize tables are
1c330 20 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 69 66   only created if
1c340 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 75   the FTS table u
1c350 73 65 73 20 74 68 65 0a 20 20 46 54 53 34 20 6d  ses the.  FTS4 m
1c360 6f 64 75 6c 65 2c 20 6e 6f 74 20 46 54 53 33 2e  odule, not FTS3.
1c370 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
1c380 65 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c  e %_docsize tabl
1c390 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
1c3a0 74 68 65 0a 20 20 46 54 53 34 20 74 61 62 6c 65  the.  FTS4 table
1c3b0 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68   is created with
1c3c0 20 74 68 65 20 5b 46 54 53 34 20 6d 61 74 63 68   the [FTS4 match
1c3d0 69 6e 66 6f 20 6f 70 74 69 6f 6e 7c 22 6d 61 74  info option|"mat
1c3e0 63 68 69 6e 66 6f 3d 66 74 73 33 22 5d 20 64 69  chinfo=fts3"] di
1c3f0 72 65 63 74 69 76 65 0a 20 20 73 70 65 63 69 66  rective.  specif
1c400 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
1c410 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
1c420 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
1c430 74 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 63  t. If they are c
1c440 72 65 61 74 65 64 2c 0a 20 20 74 68 65 20 73 63  reated,.  the sc
1c450 68 65 6d 61 20 6f 66 20 74 68 65 20 74 77 6f 20  hema of the two 
1c460 74 61 62 6c 65 73 20 69 73 20 61 73 20 66 6f 6c  tables is as fol
1c470 6c 6f 77 73 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  lows:.<codeblock
1c480 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  >.  CREATE TABLE
1c490 20 25 5f 73 74 61 74 28 0a 20 20 20 20 69 64 20   %_stat(.    id 
1c4a0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1c4b0 4b 45 59 2c 20 0a 20 20 20 20 76 61 6c 75 65 20  KEY, .    value 
1c4c0 42 4c 4f 42 0a 20 20 29 3b 0a 0a 20 20 43 52 45  BLOB.  );..  CRE
1c4d0 41 54 45 20 54 41 42 4c 45 20 25 5f 64 6f 63 73  ATE TABLE %_docs
1c4e0 69 7a 65 28 0a 20 20 20 20 64 6f 63 69 64 20 49  ize(.    docid I
1c4f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1c500 45 59 2c 0a 20 20 20 20 73 69 7a 65 20 42 4c 4f  EY,.    size BLO
1c510 42 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  B.  );.</codeblo
1c520 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65  ck>..<p>.  For e
1c530 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 46  ach row in the F
1c540 54 53 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f  TS table, the %_
1c550 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 63 6f  docsize table co
1c560 6e 74 61 69 6e 73 20 61 20 63 6f 72 72 65 73 70  ntains a corresp
1c570 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 20 77 69 74  onding.  row wit
1c580 68 20 74 68 65 20 73 61 6d 65 20 22 64 6f 63 69  h the same "doci
1c590 64 22 20 76 61 6c 75 65 2e 20 54 68 65 20 22 73  d" value. The "s
1c5a0 69 7a 65 22 20 66 69 65 6c 64 20 63 6f 6e 74 61  ize" field conta
1c5b0 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69  ins a blob consi
1c5c0 73 74 69 6e 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c  sting.  of <i>N<
1c5d0 2f 69 3e 20 46 54 53 20 76 61 72 69 6e 74 73 2c  /i> FTS varints,
1c5e0 20 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20   where <i>N</i> 
1c5f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1c600 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
1c610 6c 75 6d 6e 73 0a 20 20 69 6e 20 74 68 65 20 74  lumns.  in the t
1c620 61 62 6c 65 2e 20 45 61 63 68 20 76 61 72 69 6e  able. Each varin
1c630 74 20 69 6e 20 74 68 65 20 22 73 69 7a 65 22 20  t in the "size" 
1c640 62 6c 6f 62 20 69 73 20 74 68 65 20 6e 75 6d 62  blob is the numb
1c650 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20  er of tokens in 
1c660 74 68 65 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64  the.  correspond
1c670 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ing column of th
1c680 65 20 61 73 73 6f 63 69 61 74 65 64 20 72 6f 77  e associated row
1c690 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
1c6a0 65 2e 20 54 68 65 20 25 5f 73 74 61 74 20 74 61  e. The %_stat ta
1c6b0 62 6c 65 0a 20 20 61 6c 77 61 79 73 20 63 6f 6e  ble.  always con
1c6c0 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  tains a single r
1c6d0 6f 77 20 77 69 74 68 20 74 68 65 20 22 69 64 22  ow with the "id"
1c6e0 20 63 6f 6c 75 6d 6e 20 73 65 74 20 74 6f 20 30   column set to 0
1c6f0 2e 20 54 68 65 20 22 76 61 6c 75 65 22 20 0a 20  . The "value" . 
1c700 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
1c710 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69   a blob consisti
1c720 6e 67 20 6f 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e  ng of <i>N+1</i>
1c730 20 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68   FTS varints, wh
1c740 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69  ere <i>N</i>.  i
1c750 73 20 61 67 61 69 6e 20 74 68 65 20 6e 75 6d 62  s again the numb
1c760 65 72 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  er of user-defin
1c770 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
1c780 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
1c790 20 66 69 72 73 74 0a 20 20 76 61 72 69 6e 74 20   first.  varint 
1c7a0 69 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 73  in the blob is s
1c7b0 65 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  et to the total 
1c7c0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1c7d0 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  n the FTS table.
1c7e0 20 54 68 65 0a 20 20 73 65 63 6f 6e 64 20 61 6e   The.  second an
1c7f0 64 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 72  d subsequent var
1c800 69 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  ints contain the
1c810 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c820 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69   tokens stored i
1c830 6e 0a 20 20 74 68 65 20 63 6f 72 72 65 73 70 6f  n.  the correspo
1c840 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 6f 72  nding column for
1c850 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
1c860 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e   FTS table...<p>
1c870 0a 20 20 54 68 65 20 74 77 6f 20 72 65 6d 61 69  .  The two remai
1c880 6e 69 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f 73  ning tables, %_s
1c890 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65  egments and %_se
1c8a0 67 64 69 72 2c 20 61 72 65 20 75 73 65 64 20 74  gdir, are used t
1c8b0 6f 20 73 74 6f 72 65 20 74 68 65 20 0a 20 20 66  o store the .  f
1c8c0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
1c8d0 43 6f 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68  Conceptually, th
1c8e0 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 6c 6f  is index is a lo
1c8f0 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
1c900 6d 61 70 73 20 65 61 63 68 20 0a 20 20 74 65 72  maps each .  ter
1c910 6d 20 28 77 6f 72 64 29 20 74 6f 20 74 68 65 20  m (word) to the 
1c920 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c  set of docid val
1c930 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ues correspondin
1c940 67 20 74 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  g to records in 
1c950 74 68 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74  the .  %_content
1c960 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
1c970 61 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ain one or more 
1c980 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
1c990 68 65 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65  he term. To.  re
1c9a0 74 72 69 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d  trieve all docum
1c9b0 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
1c9c0 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 74 65  n a specified te
1c9d0 72 6d 2c 20 74 68 65 20 46 54 53 20 6d 6f 64 75  rm, the FTS modu
1c9e0 6c 65 0a 20 20 71 75 65 72 69 65 73 20 74 68 69  le.  queries thi
1c9f0 73 20 69 6e 64 65 78 20 74 6f 20 64 65 74 65 72  s index to deter
1ca00 6d 69 6e 65 20 74 68 65 20 73 65 74 20 6f 66 20  mine the set of 
1ca10 64 6f 63 69 64 20 76 61 6c 75 65 73 20 66 6f 72  docid values for
1ca20 20 72 65 63 6f 72 64 73 20 74 68 61 74 0a 20 20   records that.  
1ca30 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d  contain the term
1ca40 2c 20 74 68 65 6e 20 72 65 74 72 69 65 76 65 73  , then retrieves
1ca50 20 74 68 65 20 72 65 71 75 69 72 65 64 20 64 6f   the required do
1ca60 63 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  cuments from the
1ca70 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62   %_content.  tab
1ca80 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  le. Regardless o
1ca90 66 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  f the schema of 
1caa0 74 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20  the FTS virtual 
1cab0 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 73 65 67  table, the %_seg
1cac0 6d 65 6e 74 73 0a 20 20 61 6e 64 20 25 5f 73 65  ments.  and %_se
1cad0 67 64 69 72 20 74 61 62 6c 65 73 20 61 72 65 20  gdir tables are 
1cae0 61 6c 77 61 79 73 20 63 72 65 61 74 65 64 20 61  always created a
1caf0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64  s follows:..<cod
1cb00 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45  eblock>.  CREATE
1cb10 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74   TABLE %_segment
1cb20 73 28 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49  s(.    blockid I
1cb30 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1cb40 45 59 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20  EY,       <i>-- 
1cb50 42 2d 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f  B-tree node id</
1cb60 69 3e 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f  i>.    block blo
1cb70 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
1cb80 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
1cb90 42 2d 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61  B-tree node data
1cba0 3c 2f 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45  </i>.  );..  CRE
1cbb0 41 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64  ATE TABLE %_segd
1cbc0 69 72 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e  ir(.    level IN
1cbd0 54 45 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49  TEGER,.    idx I
1cbe0 4e 54 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72  NTEGER,.    star
1cbf0 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c  t_block INTEGER,
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
1cc10 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20  i>-- Blockid of 
1cc20 66 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f  first node in %_
1cc30 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20  segments</i>.   
1cc40 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
1cc50 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20  k INTEGER,      
1cc60 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
1cc70 64 20 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e  d of last leaf n
1cc80 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74  ode in %_segment
1cc90 73 3c 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c  s</i>.    end_bl
1cca0 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20  ock INTEGER,    
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
1ccc0 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61  -- Blockid of la
1ccd0 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67  st node in %_seg
1cce0 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f  ments</i>.    ro
1ccf0 6f 74 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20  ot BLOB,        
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f   <i>-- B-tree ro
1cd20 6f 74 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20  ot node</i>.    
1cd30 50 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65  PRIMARY KEY(leve
1cd40 6c 2c 20 69 64 78 29 0a 20 20 29 3b 0a 3c 2f 63  l, idx).  );.</c
1cd50 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
1cd60 20 54 68 65 20 73 63 68 65 6d 61 20 64 65 70 69   The schema depi
1cd70 63 74 65 64 20 61 62 6f 76 65 20 69 73 20 6e 6f  cted above is no
1cd80 74 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 74  t designed to st
1cd90 6f 72 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ore the full-tex
1cda0 74 20 69 6e 64 65 78 20 0a 20 20 64 69 72 65 63  t index .  direc
1cdb0 74 6c 79 2e 20 49 6e 73 74 65 61 64 2c 20 69 74  tly. Instead, it
1cdc0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
1cdd0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 2d  e one or more b-
1cde0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73 2e  tree structures.
1cdf0 20 54 68 65 72 65 0a 20 20 69 73 20 6f 6e 65 20   There.  is one 
1ce00 62 2d 74 72 65 65 20 66 6f 72 20 65 61 63 68 20  b-tree for each 
1ce10 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67  row in the %_seg
1ce20 64 69 72 20 74 61 62 6c 65 2e 20 54 68 65 20 25  dir table. The %
1ce30 5f 73 65 67 64 69 72 20 74 61 62 6c 65 0a 20 20  _segdir table.  
1ce40 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  row contains the
1ce50 20 72 6f 6f 74 20 6e 6f 64 65 20 61 6e 64 20 76   root node and v
1ce60 61 72 69 6f 75 73 20 6d 65 74 61 2d 64 61 74 61  arious meta-data
1ce70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ce80 20 74 68 65 0a 20 20 62 2d 74 72 65 65 20 73 74   the.  b-tree st
1ce90 72 75 63 74 75 72 65 2c 20 61 6e 64 20 74 68 65  ructure, and the
1cea0 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
1ceb0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 6f  e contains all o
1cec0 74 68 65 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29 0a  ther (non-root).
1ced0 20 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 2e 20    b-tree nodes. 
1cee0 45 61 63 68 20 62 2d 74 72 65 65 20 69 73 20 72  Each b-tree is r
1cef0 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 61 20  eferred to as a 
1cf00 22 73 65 67 6d 65 6e 74 22 2e 20 4f 6e 63 65 20  "segment". Once 
1cf10 69 74 20 68 61 73 0a 20 20 62 65 65 6e 20 63 72  it has.  been cr
1cf20 65 61 74 65 64 2c 20 61 20 73 65 67 6d 65 6e 74  eated, a segment
1cf30 20 62 2d 74 72 65 65 20 69 73 20 6e 65 76 65 72   b-tree is never
1cf40 20 75 70 64 61 74 65 64 20 28 61 6c 74 68 6f 75   updated (althou
1cf50 67 68 20 69 74 20 6d 61 79 20 62 65 0a 20 20 64  gh it may be.  d
1cf60 65 6c 65 74 65 64 20 61 6c 74 6f 67 65 74 68 65  eleted altogethe
1cf70 72 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6b  r)...<p>.  The k
1cf80 65 79 73 20 75 73 65 64 20 62 79 20 65 61 63 68  eys used by each
1cf90 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1cfa0 61 72 65 20 74 65 72 6d 73 20 28 77 6f 72 64 73  are terms (words
1cfb0 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  ). As well as th
1cfc0 65 0a 20 20 6b 65 79 2c 20 65 61 63 68 20 73 65  e.  key, each se
1cfd0 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 65 6e 74  gment b-tree ent
1cfe0 72 79 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69  ry has an associ
1cff0 61 74 65 64 20 22 64 6f 63 6c 69 73 74 22 20 28  ated "doclist" (
1d000 64 6f 63 75 6d 65 6e 74 20 6c 69 73 74 29 2e 0a  document list)..
1d010 20 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73    A doclist cons
1d020 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ists of zero or 
1d030 6d 6f 72 65 20 65 6e 74 72 69 65 73 2c 20 77 68  more entries, wh
1d040 65 72 65 20 65 61 63 68 20 65 6e 74 72 79 20 63  ere each entry c
1d050 6f 6e 73 69 73 74 73 20 6f 66 3a 0a 0a 3c 75 6c  onsists of:..<ul
1d060 3e 0a 20 20 3c 6c 69 3e 20 41 20 64 6f 63 69 64  >.  <li> A docid
1d070 20 28 64 6f 63 75 6d 65 6e 74 20 69 64 29 2c 20   (document id), 
1d080 61 6e 64 0a 20 20 3c 6c 69 3e 20 41 20 6c 69 73  and.  <li> A lis
1d090 74 20 6f 66 20 74 65 72 6d 20 6f 66 66 73 65 74  t of term offset
1d0a0 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
1d0b0 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68  occurrence of th
1d0c0 65 20 74 65 72 6d 20 77 69 74 68 69 6e 0a 20 20  e term within.  
1d0d0 20 20 20 20 20 74 68 65 20 64 6f 63 75 6d 65 6e       the documen
1d0e0 74 2e 20 41 20 74 65 72 6d 20 6f 66 66 73 65 74  t. A term offset
1d0f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 6e   indicates the n
1d100 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
1d110 28 77 6f 72 64 73 29 0a 20 20 20 20 20 20 20 74  (words).       t
1d120 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
1d130 20 74 68 65 20 74 65 72 6d 20 69 6e 20 71 75 65   the term in que
1d140 73 74 69 6f 6e 2c 20 6e 6f 74 20 74 68 65 20 6e  stion, not the n
1d150 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
1d160 65 72 73 0a 20 20 20 20 20 20 20 6f 72 20 62 79  ers.       or by
1d170 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  tes. For example
1d180 2c 20 74 68 65 20 74 65 72 6d 20 6f 66 66 73 65  , the term offse
1d190 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 77  t of the term "w
1d1a0 61 72 22 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ar" in the.     
1d1b0 20 20 70 68 72 61 73 65 20 22 41 6e 63 65 73 74    phrase "Ancest
1d1c0 72 61 6c 20 76 6f 69 63 65 73 20 70 72 6f 70 68  ral voices proph
1d1d0 65 73 79 69 6e 67 20 77 61 72 21 22 20 69 73 20  esying war!" is 
1d1e0 33 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  3..</ul>..<p>.  
1d1f0 45 6e 74 72 69 65 73 20 77 69 74 68 69 6e 20 61  Entries within a
1d200 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73 6f 72   doclist are sor
1d210 74 65 64 20 62 79 20 64 6f 63 69 64 2e 20 50 6f  ted by docid. Po
1d220 73 69 74 69 6f 6e 73 20 77 69 74 68 69 6e 20 61  sitions within a
1d230 20 64 6f 63 6c 69 73 74 0a 20 20 65 6e 74 72 79   doclist.  entry
1d240 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
1d250 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1d260 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65  .<p>.  The conte
1d270 6e 74 73 20 6f 66 20 74 68 65 20 6c 6f 67 69 63  nts of the logic
1d280 61 6c 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  al full-text ind
1d290 65 78 20 69 73 20 66 6f 75 6e 64 20 62 79 20 6d  ex is found by m
1d2a0 65 72 67 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e  erging the.  con
1d2b0 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 73 65 67  tents of all seg
1d2c0 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 49 66  ment b-trees. If
1d2d0 20 61 20 74 65 72 6d 20 69 73 20 70 72 65 73 65   a term is prese
1d2e0 6e 74 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20  nt in more than 
1d2f0 6f 6e 65 0a 20 20 73 65 67 6d 65 6e 74 20 62 2d  one.  segment b-
1d300 74 72 65 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  tree, then it ma
1d310 70 73 20 74 6f 20 74 68 65 20 75 6e 69 6f 6e 20  ps to the union 
1d320 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
1d330 61 6c 20 64 6f 63 6c 69 73 74 2e 20 49 66 2c 0a  al doclist. If,.
1d340 20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74    for a single t
1d350 65 72 6d 2c 20 74 68 65 20 73 61 6d 65 20 64 6f  erm, the same do
1d360 63 69 64 20 6f 63 63 75 72 73 20 69 6e 20 6d 6f  cid occurs in mo
1d370 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 6f 63 6c  re than one docl
1d380 69 73 74 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 20  ist, then only. 
1d390 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
1d3a0 74 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  t is part of the
1d3b0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
1d3c0 72 65 61 74 65 64 20 73 65 67 6d 65 6e 74 20 62  reated segment b
1d3d0 2d 74 72 65 65 20 69 73 20 0a 20 20 63 6f 6e 73  -tree is .  cons
1d3e0 69 64 65 72 65 64 20 76 61 6c 69 64 2e 20 0a 0a  idered valid. ..
1d3f0 3c 70 3e 0a 20 20 4d 75 6c 74 69 70 6c 65 20 62  <p>.  Multiple b
1d400 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
1d410 20 61 72 65 20 75 73 65 64 20 69 6e 73 74 65 61   are used instea
1d420 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 2d  d of a single b-
1d430 74 72 65 65 20 74 6f 20 72 65 64 75 63 65 0a 20  tree to reduce. 
1d440 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e 73   the cost of ins
1d450 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69  erting records i
1d460 6e 74 6f 20 46 54 53 20 74 61 62 6c 65 73 2e 20  nto FTS tables. 
1d470 57 68 65 6e 20 61 20 6e 65 77 20 72 65 63 6f 72  When a new recor
1d480 64 20 69 73 20 0a 20 20 69 6e 73 65 72 74 65 64  d is .  inserted
1d490 20 69 6e 74 6f 20 61 6e 20 46 54 53 20 74 61 62   into an FTS tab
1d4a0 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79 20  le that already 
1d4b0 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20 6f  contains a lot o
1d4c0 66 20 64 61 74 61 2c 20 69 74 20 69 73 0a 20 20  f data, it is.  
1d4d0 6c 69 6b 65 6c 79 20 74 68 61 74 20 6d 61 6e 79  likely that many
1d4e0 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 69 6e   of the terms in
1d4f0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
1d500 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
1d510 65 6e 74 20 69 6e 0a 20 20 61 20 6c 61 72 67 65  ent in.  a large
1d520 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 69 73 74   number of exist
1d530 69 6e 67 20 72 65 63 6f 72 64 73 2e 20 49 66 20  ing records. If 
1d540 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20  a single b-tree 
1d550 77 65 72 65 20 75 73 65 64 2c 20 74 68 65 6e 0a  were used, then.
1d560 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74 20    large doclist 
1d570 73 74 72 75 63 74 75 72 65 73 20 77 6f 75 6c 64  structures would
1d580 20 68 61 76 65 20 74 6f 20 62 65 20 6c 6f 61 64   have to be load
1d590 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1d5a0 62 61 73 65 2c 0a 20 20 61 6d 65 6e 64 65 64 20  base,.  amended 
1d5b0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
1d5c0 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 65 72  ew docid and ter
1d5d0 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 2c 20 74  m-offset list, t
1d5e0 68 65 6e 20 77 72 69 74 74 65 6e 20 62 61 63 6b  hen written back
1d5f0 0a 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  .  to the databa
1d600 73 65 2e 20 55 73 69 6e 67 20 6d 75 6c 74 69 70  se. Using multip
1d610 6c 65 20 62 2d 74 72 65 65 20 74 61 62 6c 65 73  le b-tree tables
1d620 20 61 6c 6c 6f 77 73 20 74 68 69 73 20 74 6f 20   allows this to 
1d630 62 65 20 61 76 6f 69 64 65 64 0a 20 20 62 79 20  be avoided.  by 
1d640 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 62  creating a new b
1d650 2d 74 72 65 65 20 77 68 69 63 68 20 63 61 6e 20  -tree which can 
1d660 62 65 20 6d 65 72 67 65 64 20 77 69 74 68 20 74  be merged with t
1d670 68 65 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  he existing b-tr
1d680 65 65 0a 20 20 28 6f 72 20 62 2d 74 72 65 65 73  ee.  (or b-trees
1d690 29 20 6c 61 74 65 72 20 6f 6e 2e 20 4d 65 72 67  ) later on. Merg
1d6a0 69 6e 67 20 6f 66 20 62 2d 74 72 65 65 20 73 74  ing of b-tree st
1d6b0 72 75 63 74 75 72 65 73 20 63 61 6e 20 62 65 20  ructures can be 
1d6c0 70 65 72 66 6f 72 6d 65 64 20 61 73 0a 20 20 61  performed as.  a
1d6d0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 61 73 6b   background task
1d6e0 2c 20 6f 72 20 6f 6e 63 65 20 61 20 63 65 72 74  , or once a cert
1d6f0 61 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  ain number of se
1d700 70 61 72 61 74 65 20 62 2d 74 72 65 65 20 73 74  parate b-tree st
1d710 72 75 63 74 75 72 65 73 0a 20 20 68 61 76 65 20  ructures.  have 
1d720 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 65 64  been accumulated
1d730 2e 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68 69  . Of course, thi
1d740 73 20 73 63 68 65 6d 65 20 6d 61 6b 65 73 20 71  s scheme makes q
1d750 75 65 72 69 65 73 20 6d 6f 72 65 20 65 78 70 65  ueries more expe
1d760 6e 73 69 76 65 0a 20 20 28 61 73 20 74 68 65 20  nsive.  (as the 
1d770 46 54 53 20 63 6f 64 65 20 6d 61 79 20 68 61 76  FTS code may hav
1d780 65 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e 64  e to look up ind
1d790 69 76 69 64 75 61 6c 20 74 65 72 6d 73 20 69 6e  ividual terms in
1d7a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
1d7b0 20 62 2d 74 72 65 65 20 61 6e 64 20 6d 65 72 67   b-tree and merg
1d7c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 29 2c 20  e the results), 
1d7d0 62 75 74 20 69 74 20 68 61 73 20 62 65 65 6e 20  but it has been 
1d7e0 66 6f 75 6e 64 20 74 68 61 74 20 69 6e 20 70 72  found that in pr
1d7f0 61 63 74 69 63 65 20 74 68 69 73 0a 20 20 6f 76  actice this.  ov
1d800 65 72 68 65 61 64 20 69 73 20 6f 66 74 65 6e 20  erhead is often 
1d810 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20 0a 3c  negligible..  .<
1d820 68 32 3e 56 61 72 69 61 62 6c 65 20 4c 65 6e 67  h2>Variable Leng
1d830 74 68 20 49 6e 74 65 67 65 72 20 28 76 61 72 69  th Integer (vari
1d840 6e 74 29 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a  nt) Format</h2>.
1d850 0a 3c 70 3e 0a 20 20 49 6e 74 65 67 65 72 20 76  .<p>.  Integer v
1d860 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20  alues stored as 
1d870 70 61 72 74 20 6f 66 20 73 65 67 6d 65 6e 74 20  part of segment 
1d880 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 61 72 65  b-tree nodes are
1d890 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74   encoded using t
1d8a0 68 65 0a 20 20 46 54 53 20 76 61 72 69 6e 74 20  he.  FTS varint 
1d8b0 66 6f 72 6d 61 74 2e 20 54 68 69 73 20 65 6e 63  format. This enc
1d8c0 6f 64 69 6e 67 20 69 73 20 73 69 6d 69 6c 61 72  oding is similar
1d8d0 2c 20 62 75 74 20 3c 62 3e 6e 6f 74 20 69 64 65  , but <b>not ide
1d8e0 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20 74 6f 0a 20  ntical</b>, to. 
1d8f0 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22 66 69   the <a href="fi
1d900 6c 65 66 6f 72 6d 61 74 2e 68 74 6d 6c 23 76 61  leformat.html#va
1d910 72 69 6e 74 5f 66 6f 72 6d 61 74 22 3e 53 51 4c  rint_format">SQL
1d920 69 74 65 20 76 61 72 69 6e 74 20 66 6f 72 6d 61  ite varint forma
1d930 74 3c 2f 61 3e 2e 0a 0a 3c 70 3e 0a 20 20 41 6e  t</a>...<p>.  An
1d940 20 65 6e 63 6f 64 65 64 20 46 54 53 20 76 61 72   encoded FTS var
1d950 69 6e 74 20 63 6f 6e 73 75 6d 65 73 20 62 65 74  int consumes bet
1d960 77 65 65 6e 20 6f 6e 65 20 61 6e 64 20 74 65 6e  ween one and ten
1d970 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 2e   bytes of space.
1d980 20 54 68 65 0a 20 20 6e 75 6d 62 65 72 20 6f 66   The.  number of
1d990 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1d9a0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
1d9b0 20 74 68 65 20 73 69 67 6e 20 61 6e 64 20 6d 61   the sign and ma
1d9c0 67 6e 69 74 75 64 65 20 6f 66 20 74 68 65 0a 20  gnitude of the. 
1d9d0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65   integer value e
1d9e0 6e 63 6f 64 65 64 2e 20 4d 6f 72 65 20 61 63 63  ncoded. More acc
1d9f0 75 72 61 74 65 6c 79 2c 20 74 68 65 20 6e 75 6d  urately, the num
1da00 62 65 72 20 6f 66 20 62 79 74 65 73 20 75 73 65  ber of bytes use
1da10 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 74 68 65  d to store.  the
1da20 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72   encoded integer
1da30 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
1da40 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
1da50 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
1da60 20 73 65 74 20 62 69 74 0a 20 20 69 6e 20 74 68   set bit.  in th
1da70 65 20 36 34 2d 62 69 74 20 74 77 6f 73 2d 63 6f  e 64-bit twos-co
1da80 6d 70 6c 65 6d 65 6e 74 20 72 65 70 72 65 73 65  mplement represe
1da90 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
1daa0 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 4e 65  nteger value. Ne
1dab0 67 61 74 69 76 65 0a 20 20 76 61 6c 75 65 73 20  gative.  values 
1dac0 61 6c 77 61 79 73 20 68 61 76 65 20 74 68 65 20  always have the 
1dad0 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
1dae0 20 62 69 74 20 73 65 74 20 28 74 68 65 20 73 69   bit set (the si
1daf0 67 6e 20 62 69 74 29 2c 20 61 6e 64 20 73 6f 20  gn bit), and so 
1db00 61 72 65 0a 20 20 61 6c 77 61 79 73 20 73 74 6f  are.  always sto
1db10 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 66 75  red using the fu
1db20 6c 6c 20 74 65 6e 20 62 79 74 65 73 2e 20 50 6f  ll ten bytes. Po
1db30 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 76  sitive integer v
1db40 61 6c 75 65 73 20 6d 61 79 20 62 65 0a 20 20 73  alues may be.  s
1db50 74 6f 72 65 64 20 75 73 69 6e 67 20 6c 65 73 73  tored using less
1db60 20 73 70 61 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54   space...<p>.  T
1db70 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f 66  he final byte of
1db80 20 61 6e 20 65 6e 63 6f 64 65 64 20 46 54 53 20   an encoded FTS 
1db90 76 61 72 69 6e 74 20 68 61 73 20 69 74 73 20 6d  varint has its m
1dba0 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20  ost significant 
1dbb0 62 69 74 20 0a 20 20 63 6c 65 61 72 65 64 2e 20  bit .  cleared. 
1dbc0 41 6c 6c 20 70 72 65 63 65 64 69 6e 67 20 62 79  All preceding by
1dbd0 74 65 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73  tes have the mos
1dbe0 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69  t significant bi
1dbf0 74 20 73 65 74 2e 20 44 61 74 61 0a 20 20 69 73  t set. Data.  is
1dc00 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
1dc10 65 6d 61 69 6e 69 6e 67 20 73 65 76 65 6e 20 6c  emaining seven l
1dc20 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
1dc30 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 62 79   bits of each by
1dc40 74 65 2e 0a 20 20 54 68 65 20 66 69 72 73 74 20  te..  The first 
1dc50 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e 63 6f  byte of the enco
1dc60 64 65 64 20 72 65 70 72 65 73 65 6e 74 61 74 69  ded representati
1dc70 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
1dc80 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e  least significan
1dc90 74 0a 20 20 73 65 76 65 6e 20 62 69 74 73 20 6f  t.  seven bits o
1dca0 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69 6e  f the encoded in
1dcb0 74 65 67 65 72 20 76 61 6c 75 65 2e 20 54 68 65  teger value. The
1dcc0 20 73 65 63 6f 6e 64 20 62 79 74 65 20 6f 66 20   second byte of 
1dcd0 74 68 65 20 65 6e 63 6f 64 65 64 0a 20 20 72 65  the encoded.  re
1dce0 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 69 66  presentation, if
1dcf0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c 20   it is present, 
1dd00 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65 76  contains the sev
1dd10 65 6e 20 6e 65 78 74 20 6c 65 61 73 74 20 73 69  en next least si
1dd20 67 6e 69 66 69 63 61 6e 74 0a 20 20 62 69 74 73  gnificant.  bits
1dd30 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
1dd40 76 61 6c 75 65 2c 20 61 6e 64 20 73 6f 20 6f 6e  value, and so on
1dd50 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1dd60 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 65  table contains e
1dd70 78 61 6d 70 6c 65 73 0a 20 20 6f 66 20 65 6e 63  xamples.  of enc
1dd80 6f 64 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  oded integer val
1dd90 75 65 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ues:..<table str
1dda0 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
1ddb0 68 3e 44 65 63 69 6d 61 6c 3c 74 68 3e 48 65 78  h>Decimal<th>Hex
1ddc0 61 64 65 63 69 6d 61 6c 3c 74 68 20 77 69 64 74  adecimal<th widt
1ddd0 68 3d 31 30 30 25 3e 45 6e 63 6f 64 65 64 20 52  h=100%>Encoded R
1dde0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 20 20  epresentation.  
1ddf0 3c 74 72 3e 3c 74 64 3e 34 33 3c 74 64 3e 30 78  <tr><td>43<td>0x
1de00 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 42  000000000000002B
1de10 3c 74 64 3e 30 78 32 42 20 0a 20 20 3c 74 72 3e  <td>0x2B .  <tr>
1de20 3c 74 64 3e 32 30 30 38 31 35 3c 74 64 3e 30 78  <td>200815<td>0x
1de30 30 30 30 30 30 30 30 30 30 30 30 33 31 30 36 46  000000000003106F
1de40 3c 74 64 3e 30 78 39 43 20 30 78 41 30 20 30 78  <td>0x9C 0xA0 0x
1de50 30 43 0a 20 20 3c 74 72 3e 3c 74 64 3e 2d 31 3c  0C.  <tr><td>-1<
1de60 74 64 3e 30 78 46 46 46 46 46 46 46 46 46 46 46  td>0xFFFFFFFFFFF
1de70 46 46 46 46 46 3c 74 64 3e 30 78 46 46 20 30 78  FFFFF<td>0xFF 0x
1de80 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
1de90 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46  F 0xFF 0xFF 0xFF
1dea0 20 30 78 46 46 20 30 78 30 31 0a 3c 2f 74 61 62   0xFF 0x01.</tab
1deb0 6c 65 3e 0a 20 20 0a 0a 3c 68 32 3e 53 65 67 6d  le>.  ..<h2>Segm
1dec0 65 6e 74 20 42 2d 54 72 65 65 20 46 6f 72 6d 61  ent B-Tree Forma
1ded0 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 53 65  t</h2>..<p>.  Se
1dee0 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61 72  gment b-trees ar
1def0 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  e prefix-compres
1df00 73 65 64 20 62 2b 2d 74 72 65 65 73 2e 20 54 68  sed b+-trees. Th
1df10 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d 65  ere is one segme
1df20 6e 74 20 62 2d 74 72 65 65 0a 20 20 66 6f 72 20  nt b-tree.  for 
1df30 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1df40 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 28  %_segdir table (
1df50 73 65 65 20 61 62 6f 76 65 29 2e 20 54 68 65 20  see above). The 
1df60 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65  root node of the
1df70 20 73 65 67 6d 65 6e 74 0a 20 20 62 2d 74 72 65   segment.  b-tre
1df80 65 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  e is stored as a
1df90 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f   blob in the "ro
1dfa0 6f 74 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ot" field of the
1dfb0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
1dfc0 6f 77 0a 20 20 6f 66 20 74 68 65 20 25 5f 73 65  ow.  of the %_se
1dfd0 67 64 69 72 20 74 61 62 6c 65 2e 20 41 6c 6c 20  gdir table. All 
1dfe0 6f 74 68 65 72 20 6e 6f 64 65 73 20 28 69 66 20  other nodes (if 
1dff0 61 6e 79 20 65 78 69 73 74 29 20 61 72 65 20 73  any exist) are s
1e000 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 20 20  tored in the .  
1e010 22 62 6c 6f 62 22 20 63 6f 6c 75 6d 6e 20 6f 66  "blob" column of
1e020 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
1e030 74 61 62 6c 65 2e 20 4e 6f 64 65 73 20 77 69 74  table. Nodes wit
1e040 68 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  hin the %_segmen
1e050 74 73 20 74 61 62 6c 65 20 61 72 65 0a 20 20 69  ts table are.  i
1e060 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
1e070 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
1e080 6e 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 66 69  n the blockid fi
1e090 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65  eld of the corre
1e0a0 73 70 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 2e 20  sponding.  row. 
1e0b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
1e0c0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
1e0d0 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
1e0e0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a 0a  %_segdir table:.
1e0f0 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d  .<table striped=
1e100 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c  1>.  <tr><th>Col
1e110 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 3c 74  umn           <t
1e120 68 20 77 69 64 74 68 3d 31 30 30 25 3e 49 6e 74  h width=100%>Int
1e130 65 72 70 72 65 74 61 74 69 6f 6e 0a 20 20 3c 74  erpretation.  <t
1e140 72 3e 3c 74 64 3e 6c 65 76 65 6c 20 20 20 20 20  r><td>level     
1e150 20 20 20 20 20 20 20 3c 74 64 3e 20 0a 20 20 20         <td> .   
1e160 20 42 65 74 77 65 65 6e 20 74 68 65 6d 2c 20 74   Between them, t
1e170 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e180 68 65 20 22 6c 65 76 65 6c 22 20 61 6e 64 20 22  he "level" and "
1e190 69 64 78 22 20 66 69 65 6c 64 73 20 64 65 66 69  idx" fields defi
1e1a0 6e 65 20 74 68 65 0a 20 20 20 20 72 65 6c 61 74  ne the.    relat
1e1b0 69 76 65 20 61 67 65 20 6f 66 20 74 68 65 20 73  ive age of the s
1e1c0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 54  egment b-tree. T
1e1d0 68 65 20 73 6d 61 6c 6c 65 72 20 74 68 65 20 76  he smaller the v
1e1e0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
1e1f0 68 65 0a 20 20 20 20 22 6c 65 76 65 6c 22 20 66  he.    "level" f
1e200 69 65 6c 64 2c 20 74 68 65 20 6d 6f 72 65 20 72  ield, the more r
1e210 65 63 65 6e 74 6c 79 20 74 68 65 20 73 65 67 6d  ecently the segm
1e220 65 6e 74 20 62 2d 74 72 65 65 20 77 61 73 20 63  ent b-tree was c
1e230 72 65 61 74 65 64 2e 20 49 66 20 74 77 6f 0a 20  reated. If two. 
1e240 20 20 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65     segment b-tre
1e250 65 73 20 61 72 65 20 6f 66 20 74 68 65 20 73 61  es are of the sa
1e260 6d 65 20 22 6c 65 76 65 6c 22 2c 20 74 68 65 20  me "level", the 
1e270 73 65 67 6d 65 6e 74 20 77 69 74 68 20 74 68 65  segment with the
1e280 20 6c 61 72 67 65 72 0a 20 20 20 20 76 61 6c 75   larger.    valu
1e290 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1e2a0 22 69 64 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  "idx" column is 
1e2b0 6d 6f 72 65 20 72 65 63 65 6e 74 2e 20 54 68 65  more recent. The
1e2c0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1e2d0 73 74 72 61 69 6e 74 0a 20 20 20 20 6f 6e 20 74  straint.    on t
1e2e0 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
1e2f0 65 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20 74  e prevents any t
1e300 77 6f 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  wo segments from
1e310 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65   having the same
1e320 20 76 61 6c 75 65 0a 20 20 20 20 66 6f 72 20 62   value.    for b
1e330 6f 74 68 20 74 68 65 20 22 6c 65 76 65 6c 22 20  oth the "level" 
1e340 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64 73  and "idx" fields
1e350 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 69 64 78 20  ..  <tr><td>idx 
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64               <td
1e370 3e 20 53 65 65 20 61 62 6f 76 65 2e 0a 20 20 3c  > See above..  <
1e380 74 72 3e 3c 74 64 3e 73 74 61 72 74 5f 62 6c 6f  tr><td>start_blo
1e390 63 6b 20 20 20 20 20 20 3c 74 64 3e 0a 20 20 20  ck      <td>.   
1e3a0 20 54 68 65 20 62 6c 6f 63 6b 69 64 20 74 68 61   The blockid tha
1e3b0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1e3c0 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20 74   the node with t
1e3d0 68 65 20 73 6d 61 6c 6c 65 73 74 20 62 6c 6f 63  he smallest bloc
1e3e0 6b 69 64 20 74 68 61 74 20 0a 20 20 20 20 62 65  kid that .    be
1e3f0 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65  longs to this se
1e400 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72  gment b-tree. Or
1e410 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74   zero if the ent
1e420 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  ire segment b-tr
1e430 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e 20 74  ee.    fits on t
1e440 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66  he root node. If
1e450 20 69 74 20 65 78 69 73 74 73 2c 20 74 68 69 73   it exists, this
1e460 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
1e470 61 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 20 20 3c  a leaf node..  <
1e480 74 72 3e 3c 74 64 3e 6c 65 61 76 65 73 5f 65 6e  tr><td>leaves_en
1e490 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20  d_block <td>.   
1e4a0 20 54 68 65 20 62 6c 6f 63 6b 69 64 20 74 68 61   The blockid tha
1e4b0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1e4c0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77   the leaf node w
1e4d0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1e4e0 62 6c 6f 63 6b 69 64 20 0a 20 20 20 20 74 68 61  blockid .    tha
1e4f0 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69  t belongs to thi
1e500 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  s segment b-tree
1e510 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68 65  . Or zero if the
1e520 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 20   entire segment 
1e530 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74 73 20  b-tree.    fits 
1e540 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  on the root node
1e550 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 65 6e 64 5f  ..  <tr><td>end_
1e560 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54  block <td>.    T
1e570 68 69 73 20 66 69 65 6c 64 20 6d 61 79 20 63 6f  his field may co
1e580 6e 74 61 69 6e 20 65 69 74 68 65 72 20 61 6e 20  ntain either an 
1e590 69 6e 74 65 67 65 72 20 6f 72 20 61 20 74 65 78  integer or a tex
1e5a0 74 20 66 69 65 6c 64 20 63 6f 6e 73 69 73 74 69  t field consisti
1e5b0 6e 67 20 6f 66 0a 20 20 20 20 74 77 6f 20 69 6e  ng of.    two in
1e5c0 74 65 67 65 72 73 20 73 65 70 61 72 61 74 65 64  tegers separated
1e5d0 20 62 79 20 61 20 73 70 61 63 65 20 63 68 61 72   by a space char
1e5e0 61 63 74 65 72 20 28 75 6e 69 63 6f 64 65 20 63  acter (unicode c
1e5f0 6f 64 65 70 6f 69 6e 74 20 30 78 32 30 29 2e 0a  odepoint 0x20)..
1e600 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e  <p style="margin
1e610 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e 2d 72  -left:0;margin-r
1e620 69 67 68 74 3a 30 22 3e 0a 20 20 20 20 54 68 65  ight:0">.    The
1e630 20 66 69 72 73 74 2c 20 6f 72 20 6f 6e 6c 79 2c   first, or only,
1e640 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65 20   integer is the 
1e650 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72  blockid that cor
1e660 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
1e670 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 6e 6f 64  interior.    nod
1e680 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1e690 73 74 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20  st blockid that 
1e6a0 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20  belongs to this 
1e6b0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20  segment b-tree. 
1e6c0 4f 72 20 7a 65 72 6f 0a 20 20 20 20 69 66 20 74  Or zero.    if t
1e6d0 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e  he entire segmen
1e6e0 74 20 62 2d 74 72 65 65 20 66 69 74 73 20 6f 6e  t b-tree fits on
1e6f0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
1e700 49 66 20 69 74 20 65 78 69 73 74 73 2c 20 74 68  If it exists, th
1e710 69 73 20 6e 6f 64 65 0a 20 20 20 20 69 73 20 61  is node.    is a
1e720 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 72 69 6f  lways an interio
1e730 72 20 6e 6f 64 65 2e 0a 3c 70 20 73 74 79 6c 65  r node..<p style
1e740 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 30 3b  ="margin-left:0;
1e750 6d 61 72 67 69 6e 2d 72 69 67 68 74 3a 30 3b 6d  margin-right:0;m
1e760 61 72 67 69 6e 2d 62 6f 74 74 6f 6d 3a 30 22 3e  argin-bottom:0">
1e770 0a 20 20 20 20 54 68 65 20 73 65 63 6f 6e 64 20  .    The second 
1e780 69 6e 74 65 67 65 72 2c 20 69 66 20 69 74 20 69  integer, if it i
1e790 73 20 70 72 65 73 65 6e 74 2c 20 69 73 20 74 68  s present, is th
1e7a0 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65  e aggregate size
1e7b0 20 6f 66 20 61 6c 6c 20 64 61 74 61 0a 20 20 20   of all data.   
1e7c0 20 73 74 6f 72 65 64 20 6f 6e 20 6c 65 61 66 20   stored on leaf 
1e7d0 70 61 67 65 73 20 69 6e 20 62 79 74 65 73 2e 20  pages in bytes. 
1e7e0 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
1e7f0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
1e800 68 65 20 73 65 67 6d 65 6e 74 0a 20 20 20 20 69  he segment.    i
1e810 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  s the output of 
1e820 61 6e 20 75 6e 66 69 6e 69 73 68 65 64 20 69 6e  an unfinished in
1e830 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
1e840 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74  operation, and t
1e850 68 65 0a 20 20 20 20 61 62 73 6f 6c 75 74 65 20  he.    absolute 
1e860 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74  value is current
1e870 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e 0a   size in bytes..
1e880 0a 20 20 3c 74 72 3e 3c 74 64 3e 72 6f 6f 74 20  .  <tr><td>root 
1e890 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e              <td>
1e8a0 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 61 69  .    Blob contai
1e8b0 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ning the root no
1e8c0 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
1e8d0 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61 62 6c  t b-tree..</tabl
1e8e0 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72 74 20  e>..<p>.  Apart 
1e8f0 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6e 6f  from the root no
1e900 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20 74 68  de, the nodes th
1e910 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69 6e  at make up a sin
1e920 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  gle segment b-tr
1e930 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79 73 20  ee are.  always 
1e940 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61 20 63  stored using a c
1e950 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
1e960 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 2e 20  ce of blockids. 
1e970 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
1e980 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20 6d 61  .  nodes that ma
1e990 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20 6c  ke up a single l
1e9a0 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72  evel of the b-tr
1e9b0 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c 76 65  ee are themselve
1e9c0 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20 61 20  s stored as.  a 
1e9d0 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63 6b  contiguous block
1e9e0 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72 64 65  , in b-tree orde
1e9f0 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f 75  r. The contiguou
1ea00 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 6c  s sequence of bl
1ea10 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20 74 6f  ockids.  used to
1ea20 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74 72 65   store the b-tre
1ea30 65 20 6c 65 61 76 65 73 20 61 72 65 20 61 6c 6c  e leaves are all
1ea40 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e 67 20  ocated starting 
1ea50 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 69 64  with the blockid
1ea60 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  .  value stored 
1ea70 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f 62 6c  in the "start_bl
1ea80 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ock" column of t
1ea90 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1eaa0 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c 0a 20   %_segdir row,. 
1eab0 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67 20 61   and finishing a
1eac0 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 76 61  t the blockid va
1ead0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
1eae0 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  e "leaves_end_bl
1eaf0 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f 66 20  ock".  field of 
1eb00 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 49 74  the same row. It
1eb10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 70 6f   is therefore po
1eb20 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
1eb30 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  e through all th
1eb40 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20 61 20  e.  leaves of a 
1eb50 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20  segment b-tree, 
1eb60 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20 62 79  in key order, by
1eb70 20 74 72 61 76 65 72 73 69 6e 67 20 74 68 65 20   traversing the 
1eb80 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 74 61  %_segments .  ta
1eb90 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64 20 6f  ble in blockid o
1eba0 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61 72 74  rder from "start
1ebb0 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65 61 76  _block" to "leav
1ebc0 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20 20  es_end_block".  
1ebd0 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42 2d  ..<h3>Segment B-
1ebe0 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 73 3c  Tree Leaf Nodes<
1ebf0 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  /h3>..<p>.  The 
1ec00 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61  following diagra
1ec10 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f  m depicts the fo
1ec20 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e  rmat of a segmen
1ec30 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f  t b-tree leaf no
1ec40 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20  de...<center>.  
1ec50 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f  <img src=images/
1ec60 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65 2e 70  fts3_leaf_node.p
1ec70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65 67 6d 65 6e  ng>.  <p> Segmen
1ec80 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f  t B-Tree Leaf No
1ec90 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74  de Format.</cent
1eca0 65 72 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  er>..<p>.  The f
1ecb0 69 72 73 74 20 74 65 72 6d 20 73 74 6f 72 65 64  irst term stored
1ecc0 20 6f 6e 20 65 61 63 68 20 6e 6f 64 65 20 28 22   on each node ("
1ecd0 54 65 72 6d 20 31 22 20 69 6e 20 74 68 65 20 66  Term 1" in the f
1ece0 69 67 75 72 65 20 61 62 6f 76 65 29 20 69 73 0a  igure above) is.
1ecf0 20 20 73 74 6f 72 65 64 20 76 65 72 62 61 74 69    stored verbati
1ed00 6d 2e 20 45 61 63 68 20 73 75 62 73 65 71 75 65  m. Each subseque
1ed10 6e 74 20 74 65 72 6d 20 69 73 20 70 72 65 66 69  nt term is prefi
1ed20 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 77 69 74  x-compressed wit
1ed30 68 20 72 65 73 70 65 63 74 0a 20 20 74 6f 20 69  h respect.  to i
1ed40 74 73 20 70 72 65 64 65 63 65 73 73 6f 72 2e 20  ts predecessor. 
1ed50 54 65 72 6d 73 20 61 72 65 20 73 74 6f 72 65 64  Terms are stored
1ed60 20 77 69 74 68 69 6e 20 61 20 70 61 67 65 20 69   within a page i
1ed70 6e 20 73 6f 72 74 65 64 20 28 6d 65 6d 63 6d 70  n sorted (memcmp
1ed80 29 0a 20 20 6f 72 64 65 72 2e 0a 0a 3c 68 33 3e  ).  order...<h3>
1ed90 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 49  Segment B-Tree I
1eda0 6e 74 65 72 69 6f 72 20 4e 6f 64 65 73 3c 2f 68  nterior Nodes</h
1edb0 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f  3>..<p>.  The fo
1edc0 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d 20  llowing diagram 
1edd0 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72 6d  depicts the form
1ede0 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20  at of a segment 
1edf0 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f 72 20  b-tree interior 
1ee00 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 6e 6f  .  (non-leaf) no
1ee10 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20  de...<center>.  
1ee20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f  <img src=images/
1ee30 66 74 73 33 5f 69 6e 74 65 72 69 6f 72 5f 6e 6f  fts3_interior_no
1ee40 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65  de.png>.  <p> Se
1ee50 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 49 6e 74  gment B-Tree Int
1ee60 65 72 69 6f 72 20 4e 6f 64 65 20 46 6f 72 6d 61  erior Node Forma
1ee70 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 0a 3c 68  t.</center>...<h
1ee80 32 3e 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74  2>Doclist Format
1ee90 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41 20 64  </h2>..<p>.  A d
1eea0 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20  oclist consists 
1eeb0 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20 36  of an array of 6
1eec0 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1eed0 65 67 65 72 73 2c 20 73 65 72 69 61 6c 69 7a 65  egers, serialize
1eee0 64 20 75 73 69 6e 67 0a 20 20 74 68 65 20 46 54  d using.  the FT
1eef0 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e  S varint format.
1ef00 20 45 61 63 68 20 64 6f 63 6c 69 73 74 20 65 6e   Each doclist en
1ef10 74 72 79 20 69 73 20 6d 61 64 65 20 75 70 20 6f  try is made up o
1ef20 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 74 77  f a series of tw
1ef30 6f 20 0a 20 20 6f 72 20 6d 6f 72 65 20 69 6e 74  o .  or more int
1ef40 65 67 65 72 73 2c 20 61 73 20 66 6f 6c 6c 6f 77  egers, as follow
1ef50 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20  s:..<ol>.  <li> 
1ef60 54 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65 2e  The docid value.
1ef70 20 54 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   The first entry
1ef80 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 63 6f   in a doclist co
1ef90 6e 74 61 69 6e 73 20 74 68 65 20 6c 69 74 65 72  ntains the liter
1efa0 61 6c 20 64 6f 63 69 64 0a 20 20 20 20 20 20 20  al docid.       
1efb0 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
1efc0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
1efd0 75 62 73 65 71 75 65 6e 74 20 64 6f 63 6c 69 73  ubsequent doclis
1efe0 74 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  t entry contains
1eff0 20 74 68 65 20 0a 20 20 20 20 20 20 20 64 69 66   the .       dif
1f000 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1f010 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20 61 6e  the new docid an
1f020 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  d the previous o
1f030 6e 65 20 28 61 6c 77 61 79 73 20 61 20 70 6f 73  ne (always a pos
1f040 69 74 69 76 65 20 0a 20 20 20 20 20 20 20 6e 75  itive .       nu
1f050 6d 62 65 72 29 2e 0a 20 20 3c 6c 69 3e 20 5a 65  mber)..  <li> Ze
1f060 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d  ro or more term-
1f070 6f 66 66 73 65 74 20 6c 69 73 74 73 2e 20 41 20  offset lists. A 
1f080 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
1f090 20 69 73 20 70 72 65 73 65 6e 74 20 66 6f 72 20   is present for 
1f0a0 65 61 63 68 0a 20 20 20 20 20 20 20 63 6f 6c 75  each.       colu
1f0b0 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 76 69  mn of the FTS vi
1f0c0 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
1f0d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
1f0e0 72 6d 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65  rm. A term-offse
1f0f0 74 0a 20 20 20 20 20 20 20 6c 69 73 74 20 63 6f  t.       list co
1f100 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f  nsists of the fo
1f110 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 3c 6f  llowing:.     <o
1f120 6c 3e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 43  l>.       <li> C
1f130 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 31 2e  onstant value 1.
1f140 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 6f   This field is o
1f150 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74  mitted for any t
1f160 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a  erm-offset list.
1f170 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 6f              asso
1f180 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75  ciated with colu
1f190 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69  mn 0..       <li
1f1a0 3e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  > The column num
1f1b0 62 65 72 20 28 31 20 66 6f 72 20 74 68 65 20 73  ber (1 for the s
1f1c0 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74 20 63  econd leftmost c
1f1d0 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29 2e 20 54 68  olumn, etc.). Th
1f1e0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  is.            f
1f1f0 69 65 6c 64 20 69 73 20 6f 6d 69 74 74 65 64 20  ield is omitted 
1f200 66 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66  for any term-off
1f210 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61  set list associa
1f220 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ted with column 
1f230 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20 41  0..       <li> A
1f240 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 2d 6f 66   list of term-of
1f250 66 73 65 74 73 2c 20 73 6f 72 74 65 64 20 66 72  fsets, sorted fr
1f260 6f 6d 20 73 6d 61 6c 6c 65 73 74 20 74 6f 20 6c  om smallest to l
1f270 61 72 67 65 73 74 2e 20 49 6e 73 74 65 61 64 0a  argest. Instead.
1f280 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 73              of s
1f290 74 6f 72 69 6e 67 20 74 68 65 20 74 65 72 6d 2d  toring the term-
1f2a0 6f 66 66 73 65 74 20 76 61 6c 75 65 20 6c 69 74  offset value lit
1f2b0 65 72 61 6c 6c 79 2c 20 65 61 63 68 20 69 6e 74  erally, each int
1f2c0 65 67 65 72 20 73 74 6f 72 65 64 20 0a 20 20 20  eger stored .   
1f2d0 20 20 20 20 20 20 20 20 20 69 73 20 74 68 65 20           is the 
1f2e0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1f2f0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
1f300 65 72 6d 2d 6f 66 66 73 65 74 20 61 6e 64 20 74  erm-offset and t
1f310 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
1f320 20 20 20 20 20 20 20 20 20 6f 6e 65 20 28 6f 72           one (or
1f330 20 7a 65 72 6f 20 69 66 20 74 68 65 20 63 75 72   zero if the cur
1f340 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74  rent term-offset
1f350 20 69 73 20 74 68 65 20 66 69 72 73 74 29 2c 20   is the first), 
1f360 70 6c 75 73 20 32 2e 0a 20 20 20 20 20 3c 2f 6f  plus 2..     </o
1f370 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61  l>.  <li> Consta
1f380 6e 74 20 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f 6c  nt value 0..</ol
1f390 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c 69  >..<center>.  <i
1f3a0 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66 74  mg src=images/ft
1f3b0 73 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67 3e  s3_doclist2.png>
1f3c0 0a 20 20 3c 70 3e 20 46 54 53 33 20 44 6f 63 6c  .  <p> FTS3 Docl
1f3d0 69 73 74 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e  ist Format.</cen
1f3e0 74 65 72 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20  ter>..<center>. 
1f3f0 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73   <img src=images
1f400 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 2e 70 6e  /fts3_doclist.pn
1f410 67 3e 0a 20 20 3c 70 3e 20 46 54 53 20 44 6f 63  g>.  <p> FTS Doc
1f420 6c 69 73 74 20 45 6e 74 72 79 20 46 6f 72 6d 61  list Entry Forma
1f430 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e  t.</center>..<p>
1f440 0a 20 20 46 6f 72 20 64 6f 63 6c 69 73 74 73 20  .  For doclists 
1f450 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74 65  for which the te
1f460 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 6d 6f  rm appears in mo
1f470 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
1f480 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a 20 20  mn of the FTS.  
1f490 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74  virtual table, t
1f4a0 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73  erm-offset lists
1f4b0 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63 6c   within the docl
1f4c0 69 73 74 20 61 72 65 20 73 74 6f 72 65 64 20 69  ist are stored i
1f4d0 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d 62  n column .  numb
1f4e0 65 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20 65  er order. This e
1f4f0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1f500 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
1f510 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f520 20 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69 66   .  column 0 (if
1f530 20 61 6e 79 29 20 69 73 20 61 6c 77 61 79 73 20   any) is always 
1f540 66 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67 20  first, allowing 
1f550 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  the first two fi
1f560 65 6c 64 73 20 6f 66 20 74 68 65 0a 20 20 74 65  elds of the.  te
1f570 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 74  rm-offset list t
1f580 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 69 6e 20  o be omitted in 
1f590 74 68 69 73 20 63 61 73 65 2e 0a 0a 3c 68 31 20  this case...<h1 
1f5a0 69 64 3d 61 70 70 65 6e 64 69 78 5f 61 20 6e 6f  id=appendix_a no
1f5b0 6e 75 6d 62 65 72 20 74 61 67 73 3d 22 73 65 61  number tags="sea
1f5c0 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  rch application 
1f5d0 74 69 70 73 22 3e 0a 20 20 41 70 70 65 6e 64 69  tips">.  Appendi
1f5e0 78 20 41 3a 20 53 65 61 72 63 68 20 41 70 70 6c  x A: Search Appl
1f5f0 69 63 61 74 69 6f 6e 20 54 69 70 73 0a 3c 2f 68  ication Tips.</h
1f600 31 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 69 73  1>..<p>.  FTS is
1f610 20 70 72 69 6d 61 72 69 6c 79 20 64 65 73 69 67   primarily desig
1f620 6e 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 42  ned to support B
1f630 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d 74 65 78 74  oolean full-text
1f640 20 71 75 65 72 69 65 73 20 2d 20 71 75 65 72 69   queries - queri
1f650 65 73 0a 20 20 74 6f 20 66 69 6e 64 20 74 68 65  es.  to find the
1f660 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74   set of document
1f670 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 20 73  s that match a s
1f680 70 65 63 69 66 69 65 64 20 63 72 69 74 65 72 69  pecified criteri
1f690 61 2e 20 48 6f 77 65 76 65 72 2c 20 6d 61 6e 79  a. However, many
1f6a0 20 0a 20 20 28 6d 6f 73 74 3f 29 20 73 65 61 72   .  (most?) sear
1f6b0 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ch applications 
1f6c0 72 65 71 75 69 72 65 20 74 68 61 74 20 72 65 73  require that res
1f6d0 75 6c 74 73 20 61 72 65 20 73 6f 6d 65 68 6f 77  ults are somehow
1f6e0 20 72 61 6e 6b 65 64 20 69 6e 20 6f 72 64 65 72   ranked in order
1f6f0 0a 20 20 6f 66 20 22 72 65 6c 65 76 61 6e 63 65  .  of "relevance
1f700 22 2c 20 77 68 65 72 65 20 22 72 65 6c 65 76 61  ", where "releva
1f710 6e 63 65 22 20 69 73 20 64 65 66 69 6e 65 64 20  nce" is defined 
1f720 61 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  as the likelihoo
1f730 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 0a  d that the user.
1f740 20 20 77 68 6f 20 70 65 72 66 6f 72 6d 65 64 20    who performed 
1f750 74 68 65 20 73 65 61 72 63 68 20 69 73 20 69 6e  the search is in
1f760 74 65 72 65 73 74 65 64 20 69 6e 20 61 20 73 70  terested in a sp
1f770 65 63 69 66 69 63 20 65 6c 65 6d 65 6e 74 20 6f  ecific element o
1f780 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 20  f the returned. 
1f790 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74   set of document
1f7a0 73 2e 20 57 68 65 6e 20 75 73 69 6e 67 20 61 20  s. When using a 
1f7b0 73 65 61 72 63 68 20 65 6e 67 69 6e 65 20 74 6f  search engine to
1f7c0 20 66 69 6e 64 20 64 6f 63 75 6d 65 6e 74 73 20   find documents 
1f7d0 6f 6e 20 74 68 65 20 77 6f 72 6c 64 0a 20 20 77  on the world.  w
1f7e0 69 64 65 20 77 65 62 2c 20 74 68 65 20 75 73 65  ide web, the use
1f7f0 72 20 65 78 70 65 63 74 73 20 74 68 61 74 20 74  r expects that t
1f800 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 2c 20  he most useful, 
1f810 6f 72 20 22 72 65 6c 65 76 61 6e 74 22 2c 20 64  or "relevant", d
1f820 6f 63 75 6d 65 6e 74 73 20 0a 20 20 77 69 6c 6c  ocuments .  will
1f830 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 73 20   be returned as 
1f840 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1f850 66 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 74  f results, and t
1f860 68 61 74 20 65 61 63 68 20 73 75 62 73 65 71 75  hat each subsequ
1f870 65 6e 74 20 70 61 67 65 20 0a 20 20 63 6f 6e 74  ent page .  cont
1f880 61 69 6e 73 20 70 72 6f 67 72 65 73 73 69 76 65  ains progressive
1f890 6c 79 20 6c 65 73 73 20 72 65 6c 65 76 61 6e 74  ly less relevant
1f8a0 20 72 65 73 75 6c 74 73 2e 20 45 78 61 63 74 6c   results. Exactl
1f8b0 79 20 68 6f 77 20 61 20 6d 61 63 68 69 6e 65 20  y how a machine 
1f8c0 63 61 6e 20 0a 20 20 64 65 74 65 72 6d 69 6e 65  can .  determine
1f8d0 20 64 6f 63 75 6d 65 6e 74 20 72 65 6c 65 76 61   document releva
1f8e0 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 61 20 75  nce based on a u
1f8f0 73 65 72 73 20 71 75 65 72 79 20 69 73 20 61 20  sers query is a 
1f900 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 72 6f 62  complicated prob
1f910 6c 65 6d 0a 20 20 61 6e 64 20 74 68 65 20 73 75  lem.  and the su
1f920 62 6a 65 63 74 20 6f 66 20 6d 75 63 68 20 6f 6e  bject of much on
1f930 67 6f 69 6e 67 20 72 65 73 65 61 72 63 68 2e 0a  going research..
1f940 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76 65 72 79 20  .<p>.  One very 
1f950 73 69 6d 70 6c 65 20 73 63 68 65 6d 65 20 6d 69  simple scheme mi
1f960 67 68 74 20 62 65 20 74 6f 20 63 6f 75 6e 74 20  ght be to count 
1f970 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
1f980 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a  stances of the .
1f990 20 20 75 73 65 72 73 20 73 65 61 72 63 68 20 74    users search t
1f9a0 65 72 6d 73 20 69 6e 20 65 61 63 68 20 72 65 73  erms in each res
1f9b0 75 6c 74 20 64 6f 63 75 6d 65 6e 74 2e 20 54 68  ult document. Th
1f9c0 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  ose documents th
1f9d0 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 6d 61 6e  at contain.  man
1f9e0 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  y instances of t
1f9f0 68 65 20 74 65 72 6d 73 20 61 72 65 20 63 6f 6e  he terms are con
1fa00 73 69 64 65 72 65 64 20 6d 6f 72 65 20 72 65 6c  sidered more rel
1fa10 65 76 61 6e 74 20 74 68 61 6e 20 74 68 6f 73 65  evant than those
1fa20 20 77 69 74 68 0a 20 20 61 20 73 6d 61 6c 6c 20   with.  a small 
1fa30 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e  number of instan
1fa40 63 65 73 20 6f 66 20 65 61 63 68 20 74 65 72 6d  ces of each term
1fa50 2e 20 49 6e 20 61 6e 20 46 54 53 20 61 70 70 6c  . In an FTS appl
1fa60 69 63 61 74 69 6f 6e 2c 20 74 68 65 20 0a 20 20  ication, the .  
1fa70 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 20 69  number of term i
1fa80 6e 73 74 61 6e 63 65 73 20 69 6e 20 65 61 63 68  nstances in each
1fa90 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
1faa0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
1fab0 6f 75 6e 74 69 6e 67 0a 20 20 74 68 65 20 6e 75  ounting.  the nu
1fac0 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
1fad0 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
1fae0 61 6c 75 65 20 6f 66 20 74 68 65 20 5b 6f 66 66  alue of the [off
1faf0 73 65 74 73 5d 20 66 75 6e 63 74 69 6f 6e 2e 0a  sets] function..
1fb00 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1fb10 65 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 61 20  example shows a 
1fb20 71 75 65 72 79 20 74 68 61 74 20 63 6f 75 6c 64  query that could
1fb30 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61   be used to obta
1fb40 69 6e 20 74 68 65 0a 20 20 74 65 6e 20 6d 6f 73  in the.  ten mos
1fb50 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75 6c  t relevant resul
1fb60 74 73 20 66 6f 72 20 61 20 71 75 65 72 79 20 65  ts for a query e
1fb70 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 75 73  ntered by the us
1fb80 65 72 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  er:..<codeblock>
1fb90 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 65 78  .  <i>-- This ex
1fba0 61 6d 70 6c 65 20 28 61 6e 64 20 61 6c 6c 20 6f  ample (and all o
1fbb0 74 68 65 72 73 20 69 6e 20 74 68 69 73 20 73 65  thers in this se
1fbc0 63 74 69 6f 6e 29 20 61 73 73 75 6d 65 73 20 74  ction) assumes t
1fbd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68  he following sch
1fbe0 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ema</i>.  CREATE
1fbf0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
1fc00 6f 63 75 6d 65 6e 74 73 20 55 53 49 4e 47 20 66  ocuments USING f
1fc10 74 73 33 28 74 69 74 6c 65 2c 20 63 6f 6e 74 65  ts3(title, conte
1fc20 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 73  nt);..  <i>-- As
1fc30 73 75 6d 69 6e 67 20 74 68 65 20 61 70 70 6c 69  suming the appli
1fc40 63 61 74 69 6f 6e 20 68 61 73 20 73 75 70 70 6c  cation has suppl
1fc50 69 65 64 20 61 6e 20 53 51 4c 69 74 65 20 75 73  ied an SQLite us
1fc60 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
1fc70 64 20 22 63 6f 75 6e 74 69 6e 74 65 67 65 72 73  d "countintegers
1fc80 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  "</i>.  <i>-- th
1fc90 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  at returns the n
1fca0 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 2d 73  umber of space-s
1fcb0 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72  eparated integer
1fcc0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69  s contained in i
1fcd0 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ts only argument
1fce0 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  ,</i>.  <i>-- th
1fcf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
1fd00 79 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  y could be used 
1fd10 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 74 69  to return the ti
1fd20 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20 64  tles of the 10 d
1fd30 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
1fd40 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ntain</i>.  <i>-
1fd50 2d 20 74 68 65 20 67 72 65 61 74 65 73 74 20 6e  - the greatest n
1fd60 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
1fd70 65 73 20 6f 66 20 74 68 65 20 75 73 65 72 73 20  es of the users 
1fd80 71 75 65 72 79 20 74 65 72 6d 73 2e 20 48 6f 70  query terms. Hop
1fd90 65 66 75 6c 6c 79 2c 20 74 68 65 73 65 20 31 30  efully, these 10
1fda0 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f 63  </i>.  <i>-- doc
1fdb0 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 74  uments will be t
1fdc0 68 6f 73 65 20 74 68 61 74 20 74 68 65 20 75 73  hose that the us
1fdd0 65 72 73 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f  ers considers mo
1fde0 72 65 20 6f 72 20 6c 65 73 73 20 74 68 65 20 6d  re or less the m
1fdf0 6f 73 74 20 22 72 65 6c 65 76 61 6e 74 22 2e 3c  ost "relevant".<
1fe00 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74  /i>.  SELECT tit
1fe10 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74  le FROM document
1fe20 73 20 0a 20 20 20 20 57 48 45 52 45 20 64 6f 63  s .    WHERE doc
1fe30 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74  uments MATCH &lt
1fe40 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20 4f  ;query&gt;.    O
1fe50 52 44 45 52 20 42 59 20 63 6f 75 6e 74 69 6e 74  RDER BY countint
1fe60 65 67 65 72 73 28 6f 66 66 73 65 74 73 28 64 6f  egers(offsets(do
1fe70 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a 20  cuments)) DESC. 
1fe80 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53     LIMIT 10 OFFS
1fe90 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ET 0.</codeblock
1fea0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 71 75 65  >..<p>.  The que
1feb0 72 79 20 61 62 6f 76 65 20 63 6f 75 6c 64 20 62  ry above could b
1fec0 65 20 6d 61 64 65 20 74 6f 20 72 75 6e 20 66 61  e made to run fa
1fed0 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 74 68  ster by using th
1fee0 65 20 46 54 53 20 5b 6d 61 74 63 68 69 6e 66 6f  e FTS [matchinfo
1fef0 5d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ].  function to 
1ff00 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  determine the nu
1ff10 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65  mber of query te
1ff20 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 74 68 61  rm instances tha
1ff30 74 20 61 70 70 65 61 72 20 69 6e 20 65 61 63 68  t appear in each
1ff40 0a 20 20 72 65 73 75 6c 74 2e 20 54 68 65 20 6d  .  result. The m
1ff50 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
1ff60 6e 20 69 73 20 6d 75 63 68 20 6d 6f 72 65 20 65  n is much more e
1ff70 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20 74 68  fficient than th
1ff80 65 20 6f 66 66 73 65 74 73 20 0a 20 20 66 75 6e  e offsets .  fun
1ff90 63 74 69 6f 6e 2e 20 46 75 72 74 68 65 72 6d 6f  ction. Furthermo
1ffa0 72 65 2c 20 74 68 65 20 6d 61 74 63 68 69 6e 66  re, the matchinf
1ffb0 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69  o function provi
1ffc0 64 65 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  des extra inform
1ffd0 61 74 69 6f 6e 0a 20 20 72 65 67 61 72 64 69 6e  ation.  regardin
1ffe0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 6e 75  g the overall nu
1fff0 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65 6e  mber of occurren
20000 63 65 73 20 6f 66 20 65 61 63 68 20 71 75 65 72  ces of each quer
20010 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 65 6e  y term in the en
20020 74 69 72 65 0a 20 20 64 6f 63 75 6d 65 6e 74 20  tire.  document 
20030 73 65 74 20 28 6e 6f 74 20 6a 75 73 74 20 74 68  set (not just th
20040 65 20 63 75 72 72 65 6e 74 20 72 6f 77 29 20 61  e current row) a
20050 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
20060 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 77 68   documents in wh
20070 69 63 68 20 0a 20 20 65 61 63 68 20 71 75 65 72  ich .  each quer
20080 79 20 74 65 72 6d 20 61 70 70 65 61 72 73 2e 20  y term appears. 
20090 54 68 69 73 20 6d 61 79 20 62 65 20 75 73 65 64  This may be used
200a0 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 74   (for example) t
200b0 6f 20 61 74 74 61 63 68 20 61 20 68 69 67 68 65  o attach a highe
200c0 72 0a 20 20 77 65 69 67 68 74 20 74 6f 20 6c 65  r.  weight to le
200d0 73 73 20 63 6f 6d 6d 6f 6e 20 74 65 72 6d 73 20  ss common terms 
200e0 77 68 69 63 68 20 6d 61 79 20 69 6e 63 72 65 61  which may increa
200f0 73 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63  se the overall c
20100 6f 6d 70 75 74 65 64 20 72 65 6c 65 76 61 6e 63  omputed relevanc
20110 79 20 0a 20 20 6f 66 20 74 68 6f 73 65 20 72 65  y .  of those re
20120 73 75 6c 74 73 20 74 68 65 20 75 73 65 72 20 63  sults the user c
20130 6f 6e 73 69 64 65 72 73 20 6d 6f 72 65 20 69 6e  onsiders more in
20140 74 65 72 65 73 74 69 6e 67 2e 0a 0a 3c 63 6f 64  teresting...<cod
20150 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
20160 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  If the applicati
20170 6f 6e 20 73 75 70 70 6c 69 65 73 20 61 6e 20 53  on supplies an S
20180 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e 63 74  QLite user funct
20190 69 6f 6e 20 63 61 6c 6c 65 64 20 22 72 61 6e 6b  ion called "rank
201a0 22 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e  " that</i>.  <i>
201b0 2d 2d 20 69 6e 74 65 72 70 72 65 74 73 20 74 68  -- interprets th
201c0 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 72  e blob of data r
201d0 65 74 75 72 6e 65 64 20 62 79 20 6d 61 74 63 68  eturned by match
201e0 69 6e 66 6f 20 61 6e 64 20 72 65 74 75 72 6e 73  info and returns
201f0 20 61 20 6e 75 6d 65 72 69 63 3c 2f 69 3e 0a 20   a numeric</i>. 
20200 20 3c 69 3e 2d 2d 20 72 65 6c 65 76 61 6e 63 79   <i>-- relevancy
20210 20 62 61 73 65 64 20 6f 6e 20 69 74 2c 20 74 68   based on it, th
20220 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
20230 20 53 51 4c 20 6d 61 79 20 62 65 20 75 73 65 64   SQL may be used
20240 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 3c 2f   to return the</
20250 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 69 74 6c 65  i>.  <i>-- title
20260 73 20 6f 66 20 74 68 65 20 31 30 20 6d 6f 73 74  s of the 10 most
20270 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65   relevant docume
20280 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 73  nts in the datas
20290 65 74 20 66 6f 72 20 61 20 75 73 65 72 73 20 71  et for a users q
202a0 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  uery.</i>.  SELE
202b0 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f  CT title FROM do
202c0 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57 48 45  cuments .    WHE
202d0 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
202e0 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
202f0 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61  .    ORDER BY ra
20300 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63  nk(matchinfo(doc
20310 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a 20 20  uments)) DESC.  
20320 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45    LIMIT 10 OFFSE
20330 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  T 0.</codeblock>
20340 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c 20  ..<p>.  The SQL 
20350 71 75 65 72 79 20 69 6e 20 74 68 65 20 65 78 61  query in the exa
20360 6d 70 6c 65 20 61 62 6f 76 65 20 75 73 65 73 20  mple above uses 
20370 6c 65 73 73 20 43 50 55 20 74 68 61 6e 20 74 68  less CPU than th
20380 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 0a  e first example.
20390 20 20 69 6e 20 74 68 69 73 20 73 65 63 74 69 6f    in this sectio
203a0 6e 2c 20 62 75 74 20 73 74 69 6c 6c 20 68 61 73  n, but still has
203b0 20 61 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 70   a non-obvious p
203c0 65 72 66 6f 72 6d 61 6e 63 65 20 70 72 6f 62 6c  erformance probl
203d0 65 6d 2e 20 53 51 4c 69 74 65 0a 20 20 73 61 74  em. SQLite.  sat
203e0 69 73 66 69 65 73 20 74 68 69 73 20 71 75 65 72  isfies this quer
203f0 79 20 62 79 20 72 65 74 72 69 65 76 69 6e 67 20  y by retrieving 
20400 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
20410 20 22 74 69 74 6c 65 22 20 63 6f 6c 75 6d 6e 20   "title" column 
20420 61 6e 64 0a 20 20 6d 61 74 63 68 69 6e 66 6f 20  and.  matchinfo 
20430 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 46 54  data from the FT
20440 53 20 6d 6f 64 75 6c 65 20 66 6f 72 20 65 76 65  S module for eve
20450 72 79 20 72 6f 77 20 6d 61 74 63 68 65 64 20 62  ry row matched b
20460 79 20 74 68 65 20 75 73 65 72 73 0a 20 20 71 75  y the users.  qu
20470 65 72 79 20 62 65 66 6f 72 65 20 69 74 20 73 6f  ery before it so
20480 72 74 73 20 61 6e 64 20 6c 69 6d 69 74 73 20 74  rts and limits t
20490 68 65 20 72 65 73 75 6c 74 73 2e 20 42 65 63 61  he results. Beca
204a0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
204b0 51 4c 69 74 65 27 73 0a 20 20 76 69 72 74 75 61  QLite's.  virtua
204c0 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61 63  l table interfac
204d0 65 20 77 6f 72 6b 73 2c 20 72 65 74 72 69 65 76  e works, retriev
204e0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
204f0 20 74 68 65 20 22 74 69 74 6c 65 22 20 63 6f 6c   the "title" col
20500 75 6d 6e 0a 20 20 72 65 71 75 69 72 65 73 20 6c  umn.  requires l
20510 6f 61 64 69 6e 67 20 74 68 65 20 65 6e 74 69 72  oading the entir
20520 65 20 72 6f 77 20 66 72 6f 6d 20 64 69 73 6b 20  e row from disk 
20530 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 22  (including the "
20540 63 6f 6e 74 65 6e 74 22 20 66 69 65 6c 64 2c 0a  content" field,.
20550 20 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 71    which may be q
20560 75 69 74 65 20 6c 61 72 67 65 29 2e 20 54 68 69  uite large). Thi
20570 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  s means that if 
20580 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79 20  the users query 
20590 6d 61 74 63 68 65 73 0a 20 20 73 65 76 65 72 61  matches.  severa
205a0 6c 20 74 68 6f 75 73 61 6e 64 20 64 6f 63 75 6d  l thousand docum
205b0 65 6e 74 73 2c 20 6d 61 6e 79 20 6d 65 67 61 62  ents, many megab
205c0 79 74 65 73 20 6f 66 20 22 74 69 74 6c 65 22 20  ytes of "title" 
205d0 61 6e 64 20 22 63 6f 6e 74 65 6e 74 22 20 64 61  and "content" da
205e0 74 61 0a 20 20 6d 61 79 20 62 65 20 6c 6f 61 64  ta.  may be load
205f0 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69 6e 74  ed from disk int
20600 6f 20 6d 65 6d 6f 72 79 20 65 76 65 6e 20 74 68  o memory even th
20610 6f 75 67 68 20 74 68 65 79 20 77 69 6c 6c 20 6e  ough they will n
20620 65 76 65 72 20 62 65 20 75 73 65 64 0a 20 20 66  ever be used.  f
20630 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 20  or any purpose. 
20640 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c 20  ..<p>.  The SQL 
20650 71 75 65 72 79 20 69 6e 20 74 68 65 20 66 6f 6c  query in the fol
20660 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 62  lowing example b
20670 6c 6f 63 6b 20 69 73 20 6f 6e 65 20 73 6f 6c 75  lock is one solu
20680 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 0a 20 20  tion to this .  
20690 70 72 6f 62 6c 65 6d 2e 20 49 6e 20 53 51 4c 69  problem. In SQLi
206a0 74 65 2c 20 77 68 65 6e 20 61 20 3c 61 20 68 72  te, when a <a hr
206b0 65 66 3d 22 6f 70 74 6f 76 65 72 76 69 65 77 2e  ef="optoverview.
206c0 68 74 6d 6c 23 66 6c 61 74 74 65 6e 69 6e 67 22  html#flattening"
206d0 3e 73 75 62 2d 71 75 65 72 79 20 0a 20 20 75 73  >sub-query .  us
206e0 65 64 20 69 6e 20 61 20 6a 6f 69 6e 20 63 6f 6e  ed in a join con
206f0 74 61 69 6e 73 20 61 20 4c 49 4d 49 54 20 63 6c  tains a LIMIT cl
20700 61 75 73 65 3c 2f 61 3e 2c 20 74 68 65 20 72 65  ause</a>, the re
20710 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
20720 2d 71 75 65 72 79 20 61 72 65 0a 20 20 63 61 6c  -query are.  cal
20730 63 75 6c 61 74 65 64 20 61 6e 64 20 73 74 6f 72  culated and stor
20740 65 64 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ed in temporary 
20750 74 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 65  table before the
20760 20 6d 61 69 6e 20 71 75 65 72 79 20 69 73 20 65   main query is e
20770 78 65 63 75 74 65 64 2e 0a 20 20 54 68 69 73 20  xecuted..  This 
20780 6d 65 61 6e 73 20 74 68 61 74 20 53 51 4c 69 74  means that SQLit
20790 65 20 77 69 6c 6c 20 6c 6f 61 64 20 6f 6e 6c 79  e will load only
207a0 20 74 68 65 20 64 6f 63 69 64 20 61 6e 64 20 6d   the docid and m
207b0 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66 6f  atchinfo data fo
207c0 72 20 65 61 63 68 0a 20 20 72 6f 77 20 6d 61 74  r each.  row mat
207d0 63 68 69 6e 67 20 74 68 65 20 75 73 65 72 73 20  ching the users 
207e0 71 75 65 72 79 20 69 6e 74 6f 20 6d 65 6d 6f 72  query into memor
207f0 79 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  y, determine the
20800 20 64 6f 63 69 64 20 76 61 6c 75 65 73 0a 20 20   docid values.  
20810 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
20820 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20 72 65   the ten most re
20830 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e 74 73  levant documents
20840 2c 20 74 68 65 6e 20 6c 6f 61 64 20 6f 6e 6c 79  , then load only
20850 20 74 68 65 20 74 69 74 6c 65 0a 20 20 61 6e 64   the title.  and
20860 20 63 6f 6e 74 65 6e 74 20 69 6e 66 6f 72 6d 61   content informa
20870 74 69 6f 6e 20 66 6f 72 20 74 68 6f 73 65 20 31  tion for those 1
20880 30 20 64 6f 63 75 6d 65 6e 74 73 20 6f 6e 6c 79  0 documents only
20890 2e 20 42 65 63 61 75 73 65 20 62 6f 74 68 20 74  . Because both t
208a0 68 65 20 6d 61 74 63 68 69 6e 66 6f 0a 20 20 61  he matchinfo.  a
208b0 6e 64 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20  nd docid values 
208c0 61 72 65 20 67 6c 65 61 6e 65 64 20 65 6e 74 69  are gleaned enti
208d0 72 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 66 75  rely from the fu
208e0 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20 74  ll-text index, t
208f0 68 69 73 20 72 65 73 75 6c 74 73 0a 20 20 69 6e  his results.  in
20900 20 64 72 61 6d 61 74 69 63 61 6c 6c 79 20 6c 65   dramatically le
20910 73 73 20 64 61 74 61 20 62 65 69 6e 67 20 6c 6f  ss data being lo
20920 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
20930 74 61 62 61 73 65 20 69 6e 74 6f 20 6d 65 6d 6f  tabase into memo
20940 72 79 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ry...<codeblock>
20950 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65 20  .  SELECT title 
20960 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a  FROM documents J
20970 4f 49 4e 20 28 20 0a 20 20 20 20 20 20 53 45 4c  OIN ( .      SEL
20980 45 43 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b 28  ECT docid, rank(
20990 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65  matchinfo(docume
209a0 6e 74 73 29 29 20 41 53 20 72 61 6e 6b 20 0a 20  nts)) AS rank . 
209b0 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65       FROM docume
209c0 6e 74 73 0a 20 20 20 20 20 20 57 48 45 52 45 20  nts.      WHERE 
209d0 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20  documents MATCH 
209e0 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20  &lt;query&gt;.  
209f0 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e      ORDER BY ran
20a00 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20 4c 49  k DESC .      LI
20a10 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 30 0a  MIT 10 OFFSET 0.
20a20 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62 6c 65    ) AS ranktable
20a30 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20 20   USING(docid).  
20a40 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 74 61 62  ORDER BY ranktab
20a50 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a 3c 2f 63  le.rank DESC.</c
20a60 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
20a70 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
20a80 6f 66 20 53 51 4c 20 65 6e 68 61 6e 63 65 73 20  of SQL enhances 
20a90 74 68 65 20 71 75 65 72 79 20 77 69 74 68 20 73  the query with s
20aa0 6f 6c 75 74 69 6f 6e 73 20 74 6f 20 74 77 6f 20  olutions to two 
20ab0 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 73 0a 20  other problems. 
20ac0 20 74 68 61 74 20 6d 61 79 20 61 72 69 73 65 20   that may arise 
20ad0 69 6e 20 64 65 76 65 6c 6f 70 69 6e 67 20 73 65  in developing se
20ae0 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
20af0 73 20 75 73 69 6e 67 20 46 54 53 3a 0a 0a 3c 6f  s using FTS:..<o
20b00 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20  l>.  <li> <p>.  
20b10 20 20 20 20 20 54 68 65 20 5b 73 6e 69 70 70 65       The [snippe
20b20 74 5d 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  t] function cann
20b30 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
20b40 74 68 65 20 61 62 6f 76 65 20 71 75 65 72 79 2e  the above query.
20b50 20 42 65 63 61 75 73 65 0a 20 20 20 20 20 20 20   Because.       
20b60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20b70 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
20b80 20 61 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41   a "WHERE ... MA
20b90 54 43 48 22 20 63 6c 61 75 73 65 2c 20 74 68 65  TCH" clause, the
20ba0 20 73 6e 69 70 70 65 74 20 0a 20 20 20 20 20 20   snippet .      
20bb0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 6f   function may no
20bc0 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 69  t be used with i
20bd0 74 2e 20 4f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20  t. One solution 
20be0 69 73 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  is to duplicate 
20bf0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 20 20  the WHERE.      
20c00 20 63 6c 61 75 73 65 20 75 73 65 64 20 62 79 20   clause used by 
20c10 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 6e  the sub-query in
20c20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20c30 2e 20 54 68 65 20 6f 76 65 72 68 65 61 64 20 61  . The overhead a
20c40 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
20c50 20 77 69 74 68 20 74 68 69 73 20 69 73 20 75 73   with this is us
20c60 75 61 6c 6c 79 20 6e 65 67 6c 69 67 69 62 6c 65  ually negligible
20c70 2e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20 20  ..  <li> <p>.   
20c80 20 20 20 20 54 68 65 20 72 65 6c 65 76 61 6e 63      The relevanc
20c90 79 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74 20  y of a document 
20ca0 6d 61 79 20 64 65 70 65 6e 64 20 6f 6e 20 73 6f  may depend on so
20cb0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
20cc0 61 6e 20 6a 75 73 74 0a 20 20 20 20 20 20 20 74  an just.       t
20cd0 68 65 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c  he data availabl
20ce0 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  e in the return 
20cf0 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e  value of matchin
20d00 66 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a  fo. For example.
20d10 20 20 20 20 20 20 20 65 61 63 68 20 64 6f 63 75         each docu
20d20 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  ment in the data
20d30 62 61 73 65 20 6d 61 79 20 62 65 20 61 73 73 69  base may be assi
20d40 67 6e 65 64 20 61 20 73 74 61 74 69 63 20 77 65  gned a static we
20d50 69 67 68 74 20 62 61 73 65 64 0a 20 20 20 20 20  ight based.     
20d60 20 20 6f 6e 20 66 61 63 74 6f 72 73 20 75 6e 72    on factors unr
20d70 65 6c 61 74 65 64 20 74 6f 20 69 74 73 20 63 6f  elated to its co
20d80 6e 74 65 6e 74 20 28 6f 72 69 67 69 6e 2c 20 61  ntent (origin, a
20d90 75 74 68 6f 72 2c 20 61 67 65 2c 20 6e 75 6d 62  uthor, age, numb
20da0 65 72 0a 20 20 20 20 20 20 20 6f 66 20 72 65 66  er.       of ref
20db0 65 72 65 6e 63 65 73 20 65 74 63 2e 29 2e 20 54  erences etc.). T
20dc0 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20  hese values can 
20dd0 62 65 20 73 74 6f 72 65 64 20 62 79 20 74 68 65  be stored by the
20de0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 20 20   application.   
20df0 20 20 20 20 69 6e 20 61 20 73 65 70 61 72 61 74      in a separat
20e00 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e  e table that can
20e10 20 62 65 20 6a 6f 69 6e 65 64 20 61 67 61 69 6e   be joined again
20e20 73 74 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73  st the documents
20e30 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 69 6e   table.       in
20e40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 73   the sub-query s
20e50 6f 20 74 68 61 74 20 74 68 65 20 72 61 6e 6b 20  o that the rank 
20e60 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 63 63  function may acc
20e70 65 73 73 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a  ess them..</ol>.
20e80 0a 3c 70 3e 0a 20 20 54 68 69 73 20 76 65 72 73  .<p>.  This vers
20e90 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79  ion of the query
20ea0 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
20eb0 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79   to that used by
20ec0 20 74 68 65 20 0a 20 20 3c 61 20 68 72 65 66 3d   the .  <a href=
20ed0 22 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69  "http://www.sqli
20ee0 74 65 2e 6f 72 67 2f 73 65 61 72 63 68 3f 71 3d  te.org/search?q=
20ef0 66 74 73 33 22 3e 73 71 6c 69 74 65 2e 6f 72 67  fts3">sqlite.org
20f00 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73   documentation s
20f10 65 61 72 63 68 3c 2f 61 3e 20 0a 20 20 61 70 70  earch</a> .  app
20f20 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c 63 6f 64 65  lication...<code
20f30 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54  block>.  <i>-- T
20f40 68 69 73 20 74 61 62 6c 65 20 73 74 6f 72 65 73  his table stores
20f50 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69 67   the static weig
20f60 68 74 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  ht assigned to e
20f70 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20  ach document in 
20f80 46 54 53 20 74 61 62 6c 65 3c 2f 69 3e 0a 20 20  FTS table</i>.  
20f90 3c 69 3e 2d 2d 20 22 64 6f 63 75 6d 65 6e 74 73  <i>-- "documents
20fa0 22 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  ". For each row 
20fb0 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73  in the documents
20fc0 20 74 61 62 6c 65 20 74 68 65 72 65 20 69 73 20   table there is 
20fd0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
20fe0 72 6f 77 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  row</i>.  <i>-- 
20ff0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 64 6f  with the same do
21000 63 69 64 20 76 61 6c 75 65 20 69 6e 20 74 68 69  cid value in thi
21010 73 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43  s table.</i>.  C
21020 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f 63 75  REATE TABLE docu
21030 6d 65 6e 74 73 5f 64 61 74 61 28 64 6f 63 69 64  ments_data(docid
21040 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
21050 20 4b 45 59 2c 20 77 65 69 67 68 74 29 3b 0a 0a   KEY, weight);..
21060 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65    <i>-- This que
21070 72 79 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ry is similar to
21080 20 74 68 65 20 6f 6e 65 20 69 6e 20 74 68 65 20   the one in the 
21090 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 65 78 63  block above, exc
210a0 65 70 74 20 74 68 61 74 3a 3c 2f 69 3e 0a 20 20  ept that:</i>.  
210b0 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
210c0 2d 20 20 20 31 2e 20 49 74 20 72 65 74 75 72 6e  -   1. It return
210d0 73 20 61 20 22 73 6e 69 70 70 65 74 22 20 6f 66  s a "snippet" of
210e0 20 74 65 78 74 20 61 6c 6f 6e 67 20 77 69 74 68   text along with
210f0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74 69   the document ti
21100 74 6c 65 20 66 6f 72 20 64 69 73 70 6c 61 79 2e  tle for display.
21110 20 53 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   So</i>.  <i>-- 
21120 20 20 20 20 20 74 68 61 74 20 74 68 65 20 73 6e       that the sn
21130 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 6d  ippet function m
21140 61 79 20 62 65 20 75 73 65 64 2c 20 74 68 65 20  ay be used, the 
21150 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43 48  "WHERE ... MATCH
21160 20 2e 2e 2e 22 20 63 6c 61 75 73 65 20 66 72 6f   ..." clause fro
21170 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  m</i>.  <i>--   
21180 20 20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79     the sub-query
21190 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 20 69   is duplicated i
211a0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
211b0 79 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  y.</i>.  <i>--</
211c0 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 32 2e 20  i>.  <i>--   2. 
211d0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 6a 6f  The sub-query jo
211e0 69 6e 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  ins the document
211f0 73 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  s table with the
21200 20 64 6f 63 75 6d 65 6e 74 5f 64 61 74 61 20 74   document_data t
21210 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 3c 2f 69  able, so that</i
21220 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 69  >.  <i>--      i
21230 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21240 20 74 68 65 20 72 61 6e 6b 20 66 75 6e 63 74 69   the rank functi
21250 6f 6e 20 68 61 73 20 61 63 63 65 73 73 20 74 6f  on has access to
21260 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69 67   the static weig
21270 68 74 20 61 73 73 69 67 6e 65 64 3c 2f 69 3e 0a  ht assigned</i>.
21280 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 6f 20    <i>--      to 
21290 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 3c 2f  each document.</
212a0 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c  i>.  SELECT titl
212b0 65 2c 20 73 6e 69 70 70 65 74 28 64 6f 63 75 6d  e, snippet(docum
212c0 65 6e 74 73 29 20 46 52 4f 4d 20 64 6f 63 75 6d  ents) FROM docum
212d0 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20  ents JOIN ( .   
212e0 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c     SELECT docid,
212f0 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28   rank(matchinfo(
21300 64 6f 63 75 6d 65 6e 74 73 29 2c 20 64 6f 63 75  documents), docu
21310 6d 65 6e 74 73 5f 64 61 74 61 2e 77 65 69 67 68  ments_data.weigh
21320 74 29 20 41 53 20 72 61 6e 6b 0a 20 20 20 20 20  t) AS rank.     
21330 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
21340 4a 4f 49 4e 20 64 6f 63 75 6d 65 6e 74 73 5f 64  JOIN documents_d
21350 61 74 61 20 55 53 49 4e 47 28 64 6f 63 69 64 29  ata USING(docid)
21360 0a 20 20 20 20 20 20 57 48 45 52 45 20 64 6f 63  .      WHERE doc
21370 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74  uments MATCH &lt
21380 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20 20  ;query&gt;.     
21390 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20 44   ORDER BY rank D
213a0 45 53 43 20 0a 20 20 20 20 20 20 4c 49 4d 49 54  ESC .      LIMIT
213b0 20 31 30 20 4f 46 46 53 45 54 20 30 0a 20 20 29   10 OFFSET 0.  )
213c0 20 41 53 20 72 61 6e 6b 74 61 62 6c 65 20 55 53   AS ranktable US
213d0 49 4e 47 28 64 6f 63 69 64 29 0a 20 20 57 48 45  ING(docid).  WHE
213e0 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
213f0 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
21400 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b  .  ORDER BY rank
21410 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a  table.rank DESC.
21420 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
21430 3e 0a 20 20 41 6c 6c 20 74 68 65 20 65 78 61 6d  >.  All the exam
21440 70 6c 65 20 71 75 65 72 69 65 73 20 61 62 6f 76  ple queries abov
21450 65 20 72 65 74 75 72 6e 20 74 68 65 20 74 65 6e  e return the ten
21460 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 71   most relevant q
21470 75 65 72 79 20 72 65 73 75 6c 74 73 2e 0a 20 20  uery results..  
21480 42 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  By modifying the
21490 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 69 74   values used wit
214a0 68 20 74 68 65 20 4f 46 46 53 45 54 20 61 6e 64  h the OFFSET and
214b0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2c 20   LIMIT clauses, 
214c0 61 20 71 75 65 72 79 20 0a 20 20 74 6f 20 72 65  a query .  to re
214d0 74 75 72 6e 20 28 73 61 79 29 20 74 68 65 20 6e  turn (say) the n
214e0 65 78 74 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c  ext ten most rel
214f0 65 76 61 6e 74 20 72 65 73 75 6c 74 73 20 69 73  evant results is
21500 20 65 61 73 79 20 74 6f 20 63 6f 6e 73 74 72 75   easy to constru
21510 63 74 2e 20 0a 20 20 54 68 69 73 20 6d 61 79 20  ct. .  This may 
21520 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  be used to obtai
21530 6e 20 74 68 65 20 64 61 74 61 20 72 65 71 75 69  n the data requi
21540 72 65 64 20 66 6f 72 20 61 20 73 65 61 72 63 68  red for a search
21550 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 65   applications se
21560 63 6f 6e 64 0a 20 20 61 6e 64 20 73 75 62 73 65  cond.  and subse
21570 71 75 65 6e 74 20 70 61 67 65 73 20 6f 66 20 72  quent pages of r
21580 65 73 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20 20 54  esults...<p>.  T
21590 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 63 6f  he next block co
215a0 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c  ntains an exampl
215b0 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20  e rank function 
215c0 74 68 61 74 20 75 73 65 73 20 6d 61 74 63 68 69  that uses matchi
215d0 6e 66 6f 20 64 61 74 61 20 0a 20 20 69 6d 70 6c  nfo data .  impl
215e0 65 6d 65 6e 74 65 64 20 69 6e 20 43 2e 20 49 6e  emented in C. In
215f0 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c  stead of a singl
21600 65 20 77 65 69 67 68 74 2c 20 69 74 20 61 6c 6c  e weight, it all
21610 6f 77 73 20 61 20 77 65 69 67 68 74 20 74 6f 20  ows a weight to 
21620 62 65 20 0a 20 20 65 78 74 65 72 6e 61 6c 6c 79  be .  externally
21630 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
21640 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63 68  h column of each
21650 20 64 6f 63 75 6d 65 6e 74 2e 20 49 74 20 6d 61   document. It ma
21660 79 20 62 65 20 72 65 67 69 73 74 65 72 65 64 0a  y be registered.
21670 20 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 69    with SQLite li
21680 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 75 73 65  ke any other use
21690 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  r function using
216a0 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   [sqlite3_create
216b0 5f 66 75 6e 63 74 69 6f 6e 5d 2e 0a 0a 3c 70 3e  _function]...<p>
216c0 3c 62 3e 20 53 65 63 75 72 69 74 79 20 57 61 72  <b> Security War
216d0 6e 69 6e 67 3a 3c 2f 62 3e 20 42 65 63 61 75 73  ning:</b> Becaus
216e0 65 20 69 74 20 69 73 20 6a 75 73 74 20 61 6e 20  e it is just an 
216f0 6f 72 64 69 6e 61 72 79 20 53 51 4c 20 66 75 6e  ordinary SQL fun
21700 63 74 69 6f 6e 2c 20 0a 20 20 72 61 6e 6b 28 29  ction, .  rank()
21710 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
21720 61 73 20 70 61 72 74 20 6f 66 20 61 6e 79 20 53  as part of any S
21730 51 4c 20 71 75 65 72 79 20 69 6e 20 61 6e 79 20  QL query in any 
21740 63 6f 6e 74 65 78 74 2e 20 54 68 69 73 20 6d 65  context. This me
21750 61 6e 73 0a 20 20 74 68 61 74 20 74 68 65 20 66  ans.  that the f
21760 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
21770 73 73 65 64 20 6d 61 79 20 6e 6f 74 20 62 65 20  ssed may not be 
21780 61 20 76 61 6c 69 64 20 6d 61 74 63 68 69 6e 66  a valid matchinf
21790 6f 20 62 6c 6f 62 2e 0a 20 20 49 6d 70 6c 65 6d  o blob..  Implem
217a0 65 6e 74 6f 72 73 20 73 68 6f 75 6c 64 20 74 61  entors should ta
217b0 6b 65 20 63 61 72 65 20 74 6f 20 68 61 6e 64 6c  ke care to handl
217c0 65 20 74 68 69 73 20 63 61 73 65 20 77 69 74 68  e this case with
217d0 6f 75 74 20 63 61 75 73 69 6e 67 20 62 75 66 66  out causing buff
217e0 65 72 0a 20 20 6f 76 65 72 72 75 6e 73 20 6f 72  er.  overruns or
217f0 20 6f 74 68 65 72 20 70 6f 74 65 6e 74 69 61 6c   other potential
21800 20 73 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65   security proble
21810 6d 73 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ms...<codeblock>
21820 0a 3c 69 3e 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  .<i>/*</i>.<i>**
21830 20 53 51 4c 69 74 65 20 75 73 65 72 20 64 65 66   SQLite user def
21840 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ined function to
21850 20 75 73 65 20 77 69 74 68 20 6d 61 74 63 68 69   use with matchi
21860 6e 66 6f 28 29 20 74 6f 20 63 61 6c 63 75 6c 61  nfo() to calcula
21870 74 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a  te the</i>.<i>**
21880 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 6e   relevancy of an
21890 20 46 54 53 20 6d 61 74 63 68 2e 20 54 68 65 20   FTS match. The 
218a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
218b0 73 20 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20  s the relevancy 
218c0 73 63 6f 72 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  score</i>.<i>** 
218d0 28 61 20 72 65 61 6c 20 76 61 6c 75 65 20 67 72  (a real value gr
218e0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
218f0 75 61 6c 20 74 6f 20 7a 65 72 6f 29 2e 20 41 20  ual to zero). A 
21900 6c 61 72 67 65 72 20 76 61 6c 75 65 20 69 6e 64  larger value ind
21910 69 63 61 74 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a  icates </i>.<i>*
21920 2a 20 61 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e  * a more relevan
21930 74 20 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a  t document.</i>.
21940 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
21950 54 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 6c 65  The overall rele
21960 76 61 6e 63 79 20 72 65 74 75 72 6e 65 64 20 69  vancy returned i
21970 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
21980 20 72 65 6c 65 76 61 6e 63 69 65 73 20 6f 66 20   relevancies of 
21990 65 61 63 68 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  each </i>.<i>** 
219a0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
219b0 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54  the FTS table. T
219c0 68 65 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20  he relevancy of 
219d0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  a column value i
219e0 73 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  s the</i>.<i>** 
219f0 73 75 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  sum of the follo
21a00 77 69 6e 67 20 66 6f 72 20 65 61 63 68 20 72 65  wing for each re
21a10 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 20  portable phrase 
21a20 69 6e 20 74 68 65 20 46 54 53 20 71 75 65 72 79  in the FTS query
21a30 3a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a  :</i>.<i>**</i>.
21a40 3c 69 3e 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74  <i>**   (&lt;hit
21a50 20 63 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74   count&gt; / &lt
21a60 3b 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e  ;global hit coun
21a70 74 26 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75  t&gt) * &lt;colu
21a80 6d 6e 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69  mn weight&gt;</i
21a90 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
21aa0 2a 20 77 68 65 72 65 20 26 6c 74 3b 68 69 74 20  * where &lt;hit 
21ab0 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
21ac0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
21ad0 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72 61  nces of the phra
21ae0 73 65 20 69 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69  se in the</i>.<i
21af0 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  >** column value
21b00 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
21b10 72 6f 77 20 61 6e 64 20 26 6c 74 3b 67 6c 6f 62  row and &lt;glob
21b20 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74 3b  al hit count&gt;
21b30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 3c 2f   is the number</
21b40 69 3e 0a 3c 69 3e 2a 2a 20 6f 66 20 69 6e 73 74  i>.<i>** of inst
21b50 61 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72  ances of the phr
21b60 61 73 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ase in the same 
21b70 63 6f 6c 75 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f  column of all ro
21b80 77 73 20 69 6e 20 74 68 65 20 46 54 53 3c 2f 69  ws in the FTS</i
21b90 3e 0a 3c 69 3e 2a 2a 20 74 61 62 6c 65 2e 20 54  >.<i>** table. T
21ba0 68 65 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65  he &lt;column we
21bb0 69 67 68 74 26 67 74 3b 20 69 73 20 61 20 77 65  ight&gt; is a we
21bc0 69 67 68 74 69 6e 67 20 66 61 63 74 6f 72 20 61  ighting factor a
21bd0 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 3c  ssigned to each<
21be0 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e  /i>.<i>** column
21bf0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28   by the caller (
21c00 73 65 65 20 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a  see below).</i>.
21c10 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
21c20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
21c30 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
21c40 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
21c50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
21c60 74 68 65 20 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e  the FTS </i>.<i>
21c70 2a 2a 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66  ** matchinfo() f
21c80 75 6e 63 74 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69  unction. Followi
21c90 6e 67 20 74 68 69 73 20 6d 75 73 74 20 62 65 20  ng this must be 
21ca0 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  one argument for
21cb0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69   each column </i
21cc0 3e 0a 3c 69 3e 2a 2a 20 6f 66 20 74 68 65 20 46  >.<i>** of the F
21cd0 54 53 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  TS table contain
21ce0 69 6e 67 20 61 20 6e 75 6d 65 72 69 63 20 77 65  ing a numeric we
21cf0 69 67 68 74 20 66 61 63 74 6f 72 20 66 6f 72 20  ight factor for 
21d00 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
21d10 67 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  g </i>.<i>** col
21d20 75 6d 6e 2e 20 45 78 61 6d 70 6c 65 3a 3c 2f 69  umn. Example:</i
21d30 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
21d40 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 52  *     CREATE VIR
21d50 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d  TUAL TABLE docum
21d60 65 6e 74 73 20 55 53 49 4e 47 20 66 74 73 33 28  ents USING fts3(
21d70 74 69 74 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3c  title, content)<
21d80 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69  /i>.<i>**</i>.<i
21d90 3e 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >** The followin
21da0 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  g query returns 
21db0 74 68 65 20 64 6f 63 69 64 73 20 6f 66 20 64 6f  the docids of do
21dc0 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74  cuments that mat
21dd0 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ch the full-text
21de0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 71 75 65 72 79  </i>.<i>** query
21df0 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 73   &lt;query&gt; s
21e00 6f 72 74 65 64 20 66 72 6f 6d 20 6d 6f 73 74 20  orted from most 
21e10 74 6f 20 6c 65 61 73 74 20 72 65 6c 65 76 61 6e  to least relevan
21e20 74 2e 20 57 68 65 6e 20 63 61 6c 63 75 6c 61 74  t. When calculat
21e30 69 6e 67 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65  ing</i>.<i>** re
21e40 6c 65 76 61 6e 63 65 2c 20 71 75 65 72 79 20 74  levance, query t
21e50 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e  erm instances in
21e60 20 74 68 65 20 27 74 69 74 6c 65 27 20 63 6f 6c   the 'title' col
21e70 75 6d 6e 20 61 72 65 20 67 69 76 65 6e 20 74 77  umn are given tw
21e80 69 63 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a  ice the</i>.<i>*
21e90 2a 20 77 65 69 67 68 74 69 6e 67 20 6f 66 20 74  * weighting of t
21ea0 68 6f 73 65 20 69 6e 20 74 68 65 20 27 63 6f 6e  hose in the 'con
21eb0 74 65 6e 74 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69  tent' column.</i
21ec0 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
21ed0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  *     SELECT doc
21ee0 69 64 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74  id FROM document
21ef0 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20  s </i>.<i>**    
21f00 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73   WHERE documents
21f10 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79   MATCH &lt;query
21f20 26 67 74 3b 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  &gt; </i>.<i>** 
21f30 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e      ORDER BY ran
21f40 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75  k(matchinfo(docu
21f50 6d 65 6e 74 73 29 2c 20 31 2e 30 2c 20 30 2e 35  ments), 1.0, 0.5
21f60 29 20 44 45 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f  ) DESC</i>.<i>*/
21f70 3c 2f 69 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  </i>.static void
21f80 20 72 61 6e 6b 66 75 6e 63 28 73 71 6c 69 74 65   rankfunc(sqlite
21f90 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
21fa0 20 69 6e 74 20 6e 56 61 6c 2c 20 73 71 6c 69 74   int nVal, sqlit
21fb0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
21fc0 29 7b 0a 20 20 69 6e 74 20 2a 61 4d 61 74 63 68  ){.  int *aMatch
21fd0 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  info;           
21fe0 20 20 20 20 20 3c 69 3e 2f 2a 20 52 65 74 75 72       <i>/* Retur
21ff0 6e 20 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68  n value of match
22000 69 6e 66 6f 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20  info() */</i>.  
22010 69 6e 74 20 6e 4d 61 74 63 68 69 6e 66 6f 3b 20  int nMatchinfo; 
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 3c 69 3e 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  <i>/* Number of 
22040 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 4d 61 74  elements in aMat
22050 63 68 69 6e 66 6f 26 23 78 35 42 3b 26 23 78 35  chinfo&#x5B;&#x5
22060 44 3b 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  D; */</i>.  int 
22070 6e 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nCol = 0;       
22080 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
22090 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
220a0 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
220b0 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50   */</i>.  int nP
220c0 68 72 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  hrase = 0;      
220d0 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
220e0 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65  Number of phrase
220f0 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a  s in the query *
22100 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68 72  /</i>.  int iPhr
22110 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
22120 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75          <i>/* Cu
22130 72 72 65 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c  rrent phrase */<
22140 2f 69 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f  /i>.  double sco
22150 72 65 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20  re = 0.0;       
22160 20 20 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75        <i>/* Valu
22170 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f  e to return */</
22180 69 3e 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  i>..  assert( si
22190 7a 65 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a  zeof(int)==4 );.
221a0 0a 3c 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74  .<i>  /* Check t
221b0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
221c0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
221d0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
221e0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 3c  ion is correct.<
221f0 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e  /i>.<i>  ** If n
22200 6f 74 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e  ot, jump to wron
22210 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20 53  g_number_args. S
22220 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f  et aMatchinfo to
22230 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 72   point to the ar
22240 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  ray</i>.<i>  ** 
22250 6f 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  of unsigned inte
22260 67 65 72 20 76 61 6c 75 65 73 20 72 65 74 75 72  ger values retur
22270 6e 65 64 20 62 79 20 46 54 53 20 66 75 6e 63 74  ned by FTS funct
22280 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53  ion matchinfo. S
22290 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e  et</i>.<i>  ** n
222a0 50 68 72 61 73 65 20 74 6f 20 63 6f 6e 74 61 69  Phrase to contai
222b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
222c0 72 65 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73  reportable phras
222d0 65 73 20 69 6e 20 74 68 65 20 75 73 65 72 73 20  es in the users 
222e0 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69  full-text</i>.<i
222f0 3e 20 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64  >  ** query, and
22300 20 6e 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d   nCol to the num
22310 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
22320 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65  n the table. The
22330 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  n check that the
22340 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 73 69 7a  </i>.<i>  ** siz
22350 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  e of the matchin
22360 66 6f 20 62 6c 6f 62 20 69 73 20 61 73 20 65 78  fo blob is as ex
22370 70 65 63 74 65 64 2e 20 52 65 74 75 72 6e 20 61  pected. Return a
22380 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 69 73  n error if it is
22390 20 6e 6f 74 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 2a   not.</i>.<i>  *
223a0 2f 3c 2f 69 3e 0a 20 20 69 66 28 20 6e 56 61 6c  /</i>.  if( nVal
223b0 26 6c 74 3b 31 20 29 20 67 6f 74 6f 20 77 72 6f  &lt;1 ) goto wro
223c0 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3b 0a  ng_number_args;.
223d0 20 20 61 4d 61 74 63 68 69 6e 66 6f 20 3d 20 28    aMatchinfo = (
223e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 73  unsigned int *)s
223f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
22400 62 28 61 70 56 61 6c 26 23 78 35 42 3b 30 26 23  b(apVal&#x5B;0&#
22410 78 35 44 3b 29 3b 0a 20 20 6e 4d 61 74 63 68 69  x5D;);.  nMatchi
22420 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  nfo = sqlite3_va
22430 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 26  lue_bytes(apVal&
22440 23 78 35 42 3b 30 26 23 78 35 44 3b 29 20 2f 20  #x5B;0&#x5D;) / 
22450 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 69  sizeof(int);.  i
22460 66 28 20 6e 4d 61 74 63 68 69 6e 66 6f 26 67 74  f( nMatchinfo&gt
22470 3b 3d 32 20 29 7b 0a 20 20 20 20 6e 50 68 72 61  ;=2 ){.    nPhra
22480 73 65 20 3d 20 61 4d 61 74 63 68 69 6e 66 6f 26  se = aMatchinfo&
22490 23 78 35 42 3b 30 26 23 78 35 44 3b 3b 0a 20 20  #x5B;0&#x5D;;.  
224a0 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68 69    nCol = aMatchi
224b0 6e 66 6f 26 23 78 35 42 3b 31 26 23 78 35 44 3b  nfo&#x5B;1&#x5D;
224c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 74  ;.  }.  if( nMat
224d0 63 68 69 6e 66 6f 21 3d 28 32 2b 33 2a 6e 43 6f  chinfo!=(2+3*nCo
224e0 6c 2a 6e 50 68 72 61 73 65 29 20 29 7b 0a 20 20  l*nPhrase) ){.  
224f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
22500 5f 65 72 72 6f 72 28 70 43 74 78 2c 0a 20 20 20  _error(pCtx,.   
22510 20 20 20 22 69 6e 76 61 6c 69 64 20 6d 61 74 63     "invalid matc
22520 68 69 6e 66 6f 20 62 6c 6f 62 20 70 61 73 73 65  hinfo blob passe
22530 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72 61  d to function ra
22540 6e 6b 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20  nk()", -1);.    
22550 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
22560 28 20 6e 56 61 6c 21 3d 28 31 2b 6e 43 6f 6c 29  ( nVal!=(1+nCol)
22570 20 29 20 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75   ) goto wrong_nu
22580 6d 62 65 72 5f 61 72 67 73 3b 0a 0a 3c 69 3e 20  mber_args;..<i> 
22590 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
225a0 75 67 68 20 65 61 63 68 20 70 68 72 61 73 65 20  ugh each phrase 
225b0 69 6e 20 74 68 65 20 75 73 65 72 73 20 71 75 65  in the users que
225c0 72 79 2e 20 2a 2f 3c 2f 69 3e 0a 20 20 66 6f 72  ry. */</i>.  for
225d0 28 69 50 68 72 61 73 65 3d 30 3b 20 69 50 68 72  (iPhrase=0; iPhr
225e0 61 73 65 26 6c 74 3b 6e 50 68 72 61 73 65 3b 20  ase&lt;nPhrase; 
225f0 69 50 68 72 61 73 65 2b 2b 29 7b 0a 20 20 20 20  iPhrase++){.    
22600 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
22620 3e 2f 2a 20 43 75 72 72 65 6e 74 20 63 6f 6c 75  >/* Current colu
22630 6d 6e 20 2a 2f 3c 2f 69 3e 0a 0a 3c 69 3e 20 20  mn */</i>..<i>  
22640 20 20 2f 2a 20 4e 6f 77 20 69 74 65 72 61 74 65    /* Now iterate
22650 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 63 6f   through each co
22660 6c 75 6d 6e 20 69 6e 20 74 68 65 20 75 73 65 72  lumn in the user
22670 73 20 71 75 65 72 79 2e 20 46 6f 72 20 65 61 63  s query. For eac
22680 68 20 63 6f 6c 75 6d 6e 2c 3c 2f 69 3e 0a 3c 69  h column,</i>.<i
22690 3e 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e  >    ** incremen
226a0 74 20 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20  t the relevancy 
226b0 73 63 6f 72 65 20 62 79 3a 3c 2f 69 3e 0a 3c 69  score by:</i>.<i
226c0 3e 20 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20  >    **</i>.<i> 
226d0 20 20 20 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74     **   (&lt;hit
226e0 20 63 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74   count&gt; / &lt
226f0 3b 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e  ;global hit coun
22700 74 26 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75  t&gt) * &lt;colu
22710 6d 6e 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69  mn weight&gt;</i
22720 3e 0a 3c 69 3e 20 20 20 20 2a 2a 3c 2f 69 3e 0a  >.<i>    **</i>.
22730 3c 69 3e 20 20 20 20 2a 2a 20 61 50 68 72 61 73  <i>    ** aPhras
22740 65 69 6e 66 6f 26 23 78 35 42 3b 26 23 78 35 44  einfo&#x5B;&#x5D
22750 3b 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  ; points to the 
22760 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 61 74  start of the dat
22770 61 20 66 6f 72 20 70 68 72 61 73 65 20 69 50 68  a for phrase iPh
22780 72 61 73 65 2e 20 53 6f 3c 2f 69 3e 0a 3c 69 3e  rase. So</i>.<i>
22790 20 20 20 20 2a 2a 20 74 68 65 20 68 69 74 20 63      ** the hit c
227a0 6f 75 6e 74 20 61 6e 64 20 67 6c 6f 62 61 6c 20  ount and global 
227b0 68 69 74 20 63 6f 75 6e 74 73 20 66 6f 72 20 65  hit counts for e
227c0 61 63 68 20 63 6f 6c 75 6d 6e 20 61 72 65 20 66  ach column are f
227d0 6f 75 6e 64 20 69 6e 20 3c 2f 69 3e 0a 3c 69 3e  ound in </i>.<i>
227e0 20 20 20 20 2a 2a 20 61 50 68 72 61 73 65 69 6e      ** aPhrasein
227f0 66 6f 26 23 78 35 42 3b 69 43 6f 6c 2a 33 26 23  fo&#x5B;iCol*3&#
22800 78 35 44 3b 20 61 6e 64 20 61 50 68 72 61 73 65  x5D; and aPhrase
22810 69 6e 66 6f 26 23 78 35 42 3b 69 43 6f 6c 2a 33  info&#x5B;iCol*3
22820 2b 31 26 23 78 35 44 3b 2c 20 72 65 73 70 65 63  +1&#x5D;, respec
22830 74 69 76 65 6c 79 2e 3c 2f 69 3e 0a 3c 69 3e 20  tively.</i>.<i> 
22840 20 20 20 2a 2f 3c 2f 69 3e 0a 20 20 20 20 69 6e     */</i>.    in
22850 74 20 2a 61 50 68 72 61 73 65 69 6e 66 6f 20 3d  t *aPhraseinfo =
22860 20 26 61 4d 61 74 63 68 69 6e 66 6f 26 23 78 35   &aMatchinfo&#x5
22870 42 3b 32 20 2b 20 69 50 68 72 61 73 65 2a 6e 43  B;2 + iPhrase*nC
22880 6f 6c 2a 33 26 23 78 35 44 3b 3b 0a 20 20 20 20  ol*3&#x5D;;.    
22890 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
228a0 26 6c 74 3b 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  &lt;nCol; iCol++
228b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  ){.      int nHi
228c0 74 43 6f 75 6e 74 20 3d 20 61 50 68 72 61 73 65  tCount = aPhrase
228d0 69 6e 66 6f 26 23 78 35 42 3b 33 2a 69 43 6f 6c  info&#x5B;3*iCol
228e0 26 23 78 35 44 3b 3b 0a 20 20 20 20 20 20 69 6e  &#x5D;;.      in
228f0 74 20 6e 47 6c 6f 62 61 6c 48 69 74 43 6f 75 6e  t nGlobalHitCoun
22900 74 20 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26  t = aPhraseinfo&
22910 23 78 35 42 3b 33 2a 69 43 6f 6c 2b 31 26 23 78  #x5B;3*iCol+1&#x
22920 35 44 3b 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  5D;;.      doubl
22930 65 20 77 65 69 67 68 74 20 3d 20 73 71 6c 69 74  e weight = sqlit
22940 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
22950 61 70 56 61 6c 26 23 78 35 42 3b 69 43 6f 6c 2b  apVal&#x5B;iCol+
22960 31 26 23 78 35 44 3b 29 3b 0a 20 20 20 20 20 20  1&#x5D;);.      
22970 69 66 28 20 6e 48 69 74 43 6f 75 6e 74 3e 30 20  if( nHitCount>0 
22980 29 7b 0a 20 20 20 20 20 20 20 20 73 63 6f 72 65  ){.        score
22990 20 2b 3d 20 28 28 64 6f 75 62 6c 65 29 6e 48 69   += ((double)nHi
229a0 74 43 6f 75 6e 74 20 2f 20 28 64 6f 75 62 6c 65  tCount / (double
229b0 29 6e 47 6c 6f 62 61 6c 48 69 74 43 6f 75 6e 74  )nGlobalHitCount
229c0 29 20 2a 20 77 65 69 67 68 74 3b 0a 20 20 20 20  ) * weight;.    
229d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
229e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
229f0 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 73 63 6f  double(pCtx, sco
22a00 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  re);.  return;..
22a10 3c 69 3e 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  <i>  /* Jump her
22a20 65 20 69 66 20 74 68 65 20 77 72 6f 6e 67 20 6e  e if the wrong n
22a30 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22a40 74 73 20 61 72 65 20 70 61 73 73 65 64 20 74 6f  ts are passed to
22a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
22a60 2f 3c 2f 69 3e 0a 77 72 6f 6e 67 5f 6e 75 6d 62  /</i>.wrong_numb
22a70 65 72 5f 61 72 67 73 3a 0a 20 20 73 71 6c 69 74  er_args:.  sqlit
22a80 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
22a90 70 43 74 78 2c 20 22 77 72 6f 6e 67 20 6e 75 6d  pCtx, "wrong num
22aa0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22ab0 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e   to function ran
22ac0 6b 28 29 22 2c 20 2d 31 29 3b 0a 7d 0a 3c 2f 63  k()", -1);.}.</c
22ad0 6f 64 65 62 6c 6f 63 6b 3e 0a                    odeblock>.