Documentation Source Text

Hex Artifact Content
Login

Artifact 39c29217ac641974dd51472f3e4ed96cc1970b19:


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 73  contents>..<h2 s
0080: 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66  tyle="margin-lef
0090: 74 3a 31 2e 30 65 6d 22 20 6e 6f 74 6f 63 3e 20  t:1.0em" notoc> 
00a0: 4f 76 65 72 76 69 65 77 3c 2f 68 32 3e 0a 0a 3c  Overview</h2>..<
00b0: 70 3e 0a 20 20 46 54 53 33 20 61 6e 64 20 46 54  p>.  FTS3 and FT
00c0: 53 34 20 61 72 65 20 61 6e 20 53 51 4c 69 74 65  S4 are an SQLite
00d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
00e0: 6f 64 75 6c 65 73 20 74 68 61 74 20 61 6c 6c 6f  odules that allo
00f0: 77 73 20 75 73 65 72 73 20 74 6f 20 70 65 72 66  ws users to perf
0100: 6f 72 6d 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74  orm .  full-text
0110: 20 73 65 61 72 63 68 65 73 20 6f 6e 20 61 20 73   searches on a s
0120: 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 2e  et of documents.
0130: 20 54 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   The most common
0140: 20 28 61 6e 64 20 65 66 66 65 63 74 69 76 65 29   (and effective)
0150: 20 0a 20 20 77 61 79 20 74 6f 20 64 65 73 63 72   .  way to descr
0160: 69 62 65 20 66 75 6c 6c 2d 74 65 78 74 20 73 65  ibe full-text se
0170: 61 72 63 68 65 73 20 69 73 20 22 77 68 61 74 20  arches is "what 
0180: 47 6f 6f 67 6c 65 2c 20 59 61 68 6f 6f 20 61 6e  Google, Yahoo an
0190: 64 20 41 6c 74 61 76 69 73 74 61 20 64 6f 0a 20  d Altavista do. 
01a0: 20 77 69 74 68 20 64 6f 63 75 6d 65 6e 74 73 20   with documents 
01b0: 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 57 6f  placed on the Wo
01c0: 72 6c 64 20 57 69 64 65 20 57 65 62 22 2e 20 55  rld Wide Web". U
01d0: 73 65 72 73 20 69 6e 70 75 74 20 61 20 74 65 72  sers input a ter
01e0: 6d 2c 20 6f 72 20 73 65 72 69 65 73 20 0a 20 20  m, or series .  
01f0: 6f 66 20 74 65 72 6d 73 2c 20 70 65 72 68 61 70  of terms, perhap
0200: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 61  s connected by a
0210: 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72   binary operator
0220: 20 6f 72 20 67 72 6f 75 70 65 64 20 74 6f 67 65   or grouped toge
0230: 74 68 65 72 20 69 6e 74 6f 20 61 20 0a 20 20 70  ther into a .  p
0240: 68 72 61 73 65 2c 20 61 6e 64 20 74 68 65 20 66  hrase, and the f
0250: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73  ull-text query s
0260: 79 73 74 65 6d 20 66 69 6e 64 73 20 74 68 65 20  ystem finds the 
0270: 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  set of documents
0280: 20 74 68 61 74 20 62 65 73 74 20 0a 20 20 6d 61   that best .  ma
0290: 74 63 68 65 73 20 74 68 6f 73 65 20 74 65 72 6d  tches those term
02a0: 73 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  s considering th
02b0: 65 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20  e operators and 
02c0: 67 72 6f 75 70 69 6e 67 73 20 74 68 65 20 75 73  groupings the us
02d0: 65 72 20 68 61 73 20 0a 20 20 73 70 65 63 69 66  er has .  specif
02e0: 69 65 64 2e 20 54 68 69 73 20 61 72 74 69 63 6c  ied. This articl
02f0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
0300: 64 65 70 6c 6f 79 6d 65 6e 74 20 61 6e 64 20 75  deployment and u
0310: 73 61 67 65 20 6f 66 20 46 54 53 33 20 61 6e 64  sage of FTS3 and
0320: 20 46 54 53 34 2e 0a 0a 3c 70 3e 0a 20 20 46 54   FTS4...<p>.  FT
0330: 53 31 20 61 6e 64 20 46 54 53 32 20 61 72 65 20  S1 and FTS2 are 
0340: 6f 62 73 6f 6c 65 74 65 20 66 75 6c 6c 2d 74 65  obsolete full-te
0350: 78 74 20 73 65 61 72 63 68 20 6d 6f 64 75 6c 65  xt search module
0360: 73 20 66 6f 72 20 53 51 4c 69 74 65 2e 20 20 54  s for SQLite.  T
0370: 68 65 72 65 20 61 72 65 20 6b 6e 6f 77 6e 0a 20  here are known. 
0380: 20 69 73 73 75 65 73 20 77 69 74 68 20 74 68 65   issues with the
0390: 73 65 20 6f 6c 64 65 72 20 6d 6f 64 75 6c 65 73  se older modules
03a0: 20 61 6e 64 20 74 68 65 69 72 20 75 73 65 20 73   and their use s
03b0: 68 6f 75 6c 64 20 62 65 20 61 76 6f 69 64 65 64  hould be avoided
03c0: 2e 0a 20 20 50 6f 72 74 69 6f 6e 73 20 6f 66 20  ..  Portions of 
03d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 46 54 53  the original FTS
03e0: 33 20 63 6f 64 65 20 77 65 72 65 20 63 6f 6e 74  3 code were cont
03f0: 72 69 62 75 74 65 64 20 74 6f 20 74 68 65 20 53  ributed to the S
0400: 51 4c 69 74 65 20 70 72 6f 6a 65 63 74 20 0a 20  QLite project . 
0410: 20 62 79 20 53 63 6f 74 74 20 48 65 73 73 20 6f   by Scott Hess o
0420: 66 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a  f <a href="http:
0430: 2f 2f 77 77 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d  //www.google.com
0440: 22 3e 47 6f 6f 67 6c 65 3c 2f 61 3e 2e 20 49 74  ">Google</a>. It
0450: 20 69 73 20 6e 6f 77 20 0a 20 20 64 65 76 65 6c   is now .  devel
0460: 6f 70 65 64 20 61 6e 64 20 6d 61 69 6e 74 61 69  oped and maintai
0470: 6e 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 53  ned as part of S
0480: 51 4c 69 74 65 2e 0a 0a 3c 68 31 3e 49 6e 74 72  QLite...<h1>Intr
0490: 6f 64 75 63 74 69 6f 6e 20 74 6f 20 46 54 53 33  oduction to FTS3
04a0: 20 61 6e 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a   and FTS4</h1>..
04b0: 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20 61  <p>.  The FTS3 a
04c0: 6e 64 20 46 54 53 34 20 65 78 74 65 6e 73 69 6f  nd FTS4 extensio
04d0: 6e 20 6d 6f 64 75 6c 65 73 20 61 6c 6c 6f 77 73  n modules allows
04e0: 20 75 73 65 72 73 20 74 6f 20 63 72 65 61 74 65   users to create
04f0: 20 73 70 65 63 69 61 6c 20 74 61 62 6c 65 73 20   special tables 
0500: 77 69 74 68 20 61 20 0a 20 20 62 75 69 6c 74 2d  with a .  built-
0510: 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  in full-text ind
0520: 65 78 20 28 68 65 72 65 61 66 74 65 72 20 22 46  ex (hereafter "F
0530: 54 53 20 74 61 62 6c 65 73 22 29 2e 20 54 68 65  TS tables"). The
0540: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
0550: 0a 20 20 61 6c 6c 6f 77 73 20 74 68 65 20 75 73  .  allows the us
0560: 65 72 20 74 6f 20 65 66 66 69 63 69 65 6e 74 6c  er to efficientl
0570: 79 20 71 75 65 72 79 20 74 68 65 20 64 61 74 61  y query the data
0580: 62 61 73 65 20 66 6f 72 20 61 6c 6c 20 72 6f 77  base for all row
0590: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20  s that contain. 
05a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 6f 72   one or more wor
05b0: 64 73 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ds (hereafter "t
05c0: 6f 6b 65 6e 73 22 29 2c 20 65 76 65 6e 20 69 66  okens"), even if
05d0: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 63 6f 6e   the table.  con
05e0: 74 61 69 6e 73 20 6d 61 6e 79 20 6c 61 72 67 65  tains many large
05f0: 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 3c 70 3e   documents...<p>
0600: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
0610: 69 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 35  if each of the 5
0620: 31 37 34 33 30 20 64 6f 63 75 6d 65 6e 74 73 20  17430 documents 
0630: 69 6e 20 74 68 65 20 0a 20 20 22 3c 61 20 68 72  in the .  "<a hr
0640: 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 63  ef="http://www.c
0650: 73 2e 63 6d 75 2e 65 64 75 2f 7e 65 6e 72 6f 6e  s.cmu.edu/~enron
0660: 2f 22 3e 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20  /">Enron E-Mail 
0670: 44 61 74 61 73 65 74 3c 2f 61 3e 22 0a 20 20 69  Dataset</a>".  i
0680: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
0690: 62 6f 74 68 20 61 6e 20 46 54 53 20 74 61 62 6c  both an FTS tabl
06a0: 65 20 61 6e 64 20 61 6e 20 6f 72 64 69 6e 61 72  e and an ordinar
06b0: 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65 0a 20  y SQLite table. 
06c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
06d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
06e0: 20 73 63 72 69 70 74 3a 0a 0a 3c 63 6f 64 65 62   script:..<codeb
06f0: 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56  lock>.  CREATE V
0700: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 6e 72  IRTUAL TABLE enr
0710: 6f 6e 64 61 74 61 31 20 55 53 49 4e 47 20 66 74  ondata1 USING ft
0720: 73 33 28 63 6f 6e 74 65 6e 74 20 54 45 58 54 29  s3(content TEXT)
0730: 3b 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61  ;     /* FTS3 ta
0740: 62 6c 65 20 2a 2f 0a 20 20 43 52 45 41 54 45 20  ble */.  CREATE 
0750: 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61 32  TABLE enrondata2
0760: 28 63 6f 6e 74 65 6e 74 20 54 45 58 54 29 3b 20  (content TEXT); 
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61         /* Ordina
0790: 72 79 20 74 61 62 6c 65 20 2a 2f 0a 3c 2f 63 6f  ry table */.</co
07a0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
07b0: 54 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74  Then either of t
07c0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 62  he two queries b
07d0: 65 6c 6f 77 20 6d 61 79 20 62 65 20 65 78 65 63  elow may be exec
07e0: 75 74 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  uted to find the
07f0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 64 6f 63   number of.  doc
0800: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
0810: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
0820: 61 69 6e 20 74 68 65 20 77 6f 72 64 20 22 6c 69  ain the word "li
0830: 6e 75 78 22 20 28 33 35 31 29 2e 20 55 73 69 6e  nux" (351). Usin
0840: 67 20 6f 6e 65 0a 20 20 64 65 73 6b 74 6f 70 20  g one.  desktop 
0850: 50 43 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  PC hardware conf
0860: 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20 71  iguration, the q
0870: 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33  uery on the FTS3
0880: 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 69   table returns i
0890: 6e 0a 20 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  n.  approximatel
08a0: 79 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 2c 20  y 0.03 seconds, 
08b0: 76 65 72 73 75 73 20 32 32 2e 35 20 66 6f 72 20  versus 22.5 for 
08c0: 71 75 65 72 79 69 6e 67 20 74 68 65 20 6f 72 64  querying the ord
08d0: 69 6e 61 72 79 20 74 61 62 6c 65 2e 0a 0a 3c 63  inary table...<c
08e0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45  odeblock>.  SELE
08f0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0900: 20 65 6e 72 6f 6e 64 61 74 61 31 20 57 48 45 52   enrondata1 WHER
0910: 45 20 63 6f 6e 74 65 6e 74 20 4d 41 54 43 48 20  E content MATCH 
0920: 27 6c 69 6e 75 78 27 3b 20 20 2f 2a 20 30 2e 30  'linux';  /* 0.0
0930: 33 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 53  3 seconds */.  S
0940: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0950: 52 4f 4d 20 65 6e 72 6f 6e 64 61 74 61 32 20 57  ROM enrondata2 W
0960: 48 45 52 45 20 63 6f 6e 74 65 6e 74 20 4c 49 4b  HERE content LIK
0970: 45 20 27 25 6c 69 6e 75 78 25 27 3b 20 2f 2a 20  E '%linux%'; /* 
0980: 32 32 2e 35 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  22.5 seconds */.
0990: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
09a0: 3e 0a 20 20 4f 66 20 63 6f 75 72 73 65 2c 20 74  >.  Of course, t
09b0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 61  he two queries a
09c0: 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 65 6e 74  bove are not ent
09d0: 69 72 65 6c 79 20 65 71 75 69 76 61 6c 65 6e 74  irely equivalent
09e0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a 20 20  . For example.  
09f0: 74 68 65 20 4c 49 4b 45 20 71 75 65 72 79 20 6d  the LIKE query m
0a00: 61 74 63 68 65 73 20 72 6f 77 73 20 74 68 61 74  atches rows that
0a10: 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 73   contain terms s
0a20: 75 63 68 20 61 73 20 22 6c 69 6e 75 78 6f 70 68  uch as "linuxoph
0a30: 6f 62 65 22 0a 20 20 6f 72 20 22 45 6e 74 65 72  obe".  or "Enter
0a40: 70 72 69 73 65 4c 69 6e 75 78 22 20 28 61 73 20  priseLinux" (as 
0a50: 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  it happens, the 
0a60: 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20 44 61 74  Enron E-Mail Dat
0a70: 61 73 65 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  aset does not.  
0a80: 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  actually contain
0a90: 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d 73 29   any such terms)
0aa0: 2c 20 77 68 65 72 65 61 73 20 74 68 65 20 4d 41  , whereas the MA
0ab0: 54 43 48 20 71 75 65 72 79 20 6f 6e 20 74 68 65  TCH query on the
0ac0: 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20 73 65   FTS3 table.  se
0ad0: 6c 65 63 74 73 20 6f 6e 6c 79 20 74 68 6f 73 65  lects only those
0ae0: 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e 74 61   rows that conta
0af0: 69 6e 20 22 6c 69 6e 75 78 22 20 61 73 20 61 20  in "linux" as a 
0b00: 64 69 73 63 72 65 74 65 20 74 6f 6b 65 6e 2e 20  discrete token. 
0b10: 42 6f 74 68 20 0a 20 20 73 65 61 72 63 68 65 73  Both .  searches
0b20: 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65 6e 73   are case-insens
0b30: 69 74 69 76 65 2e 20 54 68 65 20 46 54 53 33 20  itive. The FTS3 
0b40: 74 61 62 6c 65 20 63 6f 6e 73 75 6d 65 73 20 61  table consumes a
0b50: 72 6f 75 6e 64 20 32 30 30 36 20 4d 42 20 6f 6e  round 2006 MB on
0b60: 0a 20 20 64 69 73 6b 20 63 6f 6d 70 61 72 65 64  .  disk compared
0b70: 20 74 6f 20 6a 75 73 74 20 31 34 35 33 20 4d 42   to just 1453 MB
0b80: 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e 61 72   for the ordinar
0b90: 79 20 74 61 62 6c 65 2e 20 55 73 69 6e 67 20 74  y table. Using t
0ba0: 68 65 20 73 61 6d 65 0a 20 20 68 61 72 64 77 61  he same.  hardwa
0bb0: 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  re configuration
0bc0: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
0bd0: 20 74 68 65 20 53 45 4c 45 43 54 20 71 75 65 72   the SELECT quer
0be0: 69 65 73 20 61 62 6f 76 65 2c 20 74 68 65 20 46  ies above, the F
0bf0: 54 53 33 0a 20 20 74 61 62 6c 65 20 74 6f 6f 6b  TS3.  table took
0c00: 20 6a 75 73 74 20 75 6e 64 65 72 20 33 31 20 6d   just under 31 m
0c10: 69 6e 75 74 65 73 20 74 6f 20 70 6f 70 75 6c 61  inutes to popula
0c20: 74 65 2c 20 76 65 72 73 75 73 20 32 35 20 66 6f  te, versus 25 fo
0c30: 72 20 74 68 65 20 6f 72 64 69 6e 61 72 79 0a 20  r the ordinary. 
0c40: 20 74 61 62 6c 65 2e 0a 0a 3c 68 32 3e 44 69 66   table...<h2>Dif
0c50: 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e  ferences between
0c60: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 3c 2f   FTS3 and FTS4</
0c70: 68 32 3e 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  h2>.<tcl>hd_frag
0c80: 6d 65 6e 74 20 66 74 73 34 20 46 54 53 34 3c 2f  ment fts4 FTS4</
0c90: 74 63 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  tcl>..<p>.  FTS3
0ca0: 20 61 6e 64 20 46 54 53 34 20 61 72 65 20 6e 65   and FTS4 are ne
0cb0: 61 72 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  arly identical. 
0cc0: 54 68 65 79 20 73 68 61 72 65 20 6d 6f 73 74 20  They share most 
0cd0: 6f 66 20 74 68 65 69 72 20 63 6f 64 65 20 69 6e  of their code in
0ce0: 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 61 6e 64 20 74   common,.  and t
0cf0: 68 65 69 72 20 69 6e 74 65 72 66 61 63 65 73 20  heir interfaces 
0d00: 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 54 68  are the same. Th
0d10: 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 61 72  e differences ar
0d20: 65 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20  e:..<ul>.  <li> 
0d30: 3c 70 3e 46 54 53 34 20 63 6f 6e 74 61 69 6e 73  <p>FTS4 contains
0d40: 20 71 75 65 72 79 20 70 65 72 66 6f 72 6d 61 6e   query performan
0d50: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ce optimizations
0d60: 20 74 68 61 74 20 6d 61 79 20 73 69 67 6e 69 66   that may signif
0d70: 69 63 61 6e 74 6c 79 0a 20 20 20 20 20 20 20 69  icantly.       i
0d80: 6d 70 72 6f 76 65 20 74 68 65 20 70 65 72 66 6f  mprove the perfo
0d90: 72 6d 61 6e 63 65 20 6f 66 20 66 75 6c 6c 2d 74  rmance of full-t
0da0: 65 78 74 20 71 75 65 72 69 65 73 20 74 68 61 74  ext queries that
0db0: 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 74   contain terms t
0dc0: 68 61 74 20 61 72 65 0a 20 20 20 20 20 20 20 76  hat are.       v
0dd0: 65 72 79 20 63 6f 6d 6d 6f 6e 20 28 70 72 65 73  ery common (pres
0de0: 65 6e 74 20 69 6e 20 61 20 6c 61 72 67 65 20 70  ent in a large p
0df0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 61 62  ercentage of tab
0e00: 6c 65 20 72 6f 77 73 29 2e 0a 0a 20 20 3c 6c 69  le rows)...  <li
0e10: 3e 20 3c 70 3e 46 54 53 34 20 73 75 70 70 6f 72  > <p>FTS4 suppor
0e20: 74 73 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  ts some addition
0e30: 61 6c 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  al options that 
0e40: 6d 61 79 20 75 73 65 64 20 77 69 74 68 20 74 68  may used with th
0e50: 65 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d 0a  e [matchinfo()].
0e60: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e         function.
0e70: 20 0a 0a 20 20 3c 6c 69 3e 20 3c 70 3e 42 65 63   ..  <li> <p>Bec
0e80: 61 75 73 65 20 69 74 20 73 74 6f 72 65 73 20 65  ause it stores e
0e90: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
0ea0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 74 77 6f 20   on disk in two 
0eb0: 6e 65 77 20 0a 20 20 20 20 20 20 20 5b 46 54 53  new .       [FTS
0ec0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 7c 73   shadow tables|s
0ed0: 68 61 64 6f 77 20 74 61 62 6c 65 73 5d 20 69 6e  hadow tables] in
0ee0: 20 6f 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72   order to suppor
0ef0: 74 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  t the performanc
0f00: 65 0a 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a  e.       optimiz
0f10: 61 74 69 6f 6e 73 20 61 6e 64 20 65 78 74 72 61  ations and extra
0f20: 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6f 70 74   matchinfo() opt
0f30: 69 6f 6e 73 2c 20 46 54 53 34 20 74 61 62 6c 65  ions, FTS4 table
0f40: 73 20 6d 61 79 20 63 6f 6e 73 75 6d 65 20 6d 6f  s may consume mo
0f50: 72 65 0a 20 20 20 20 20 20 20 64 69 73 6b 20 73  re.       disk s
0f60: 70 61 63 65 20 74 68 61 6e 20 74 68 65 20 65 71  pace than the eq
0f70: 75 69 76 61 6c 65 6e 74 20 74 61 62 6c 65 20 63  uivalent table c
0f80: 72 65 61 74 65 64 20 75 73 69 6e 67 20 46 54 53  reated using FTS
0f90: 33 2e 20 55 73 75 61 6c 6c 79 20 74 68 65 20 6f  3. Usually the o
0fa0: 76 65 72 68 65 61 64 0a 20 20 20 20 20 20 20 69  verhead.       i
0fb0: 73 20 31 2d 32 25 20 6f 72 20 6c 65 73 73 2c 20  s 1-2% or less, 
0fc0: 62 75 74 20 6d 61 79 20 62 65 20 61 73 20 68 69  but may be as hi
0fd0: 67 68 20 61 73 20 31 30 25 20 69 66 20 74 68 65  gh as 10% if the
0fe0: 20 64 6f 63 75 6d 65 6e 74 73 20 73 74 6f 72 65   documents store
0ff0: 64 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  d in the.       
1000: 46 54 53 20 74 61 62 6c 65 20 61 72 65 20 76 65  FTS table are ve
1010: 72 79 20 73 6d 61 6c 6c 2e 20 54 68 65 20 6f 76  ry small. The ov
1020: 65 72 68 65 61 64 20 6d 61 79 20 62 65 20 72 65  erhead may be re
1030: 64 75 63 65 64 20 62 79 20 73 70 65 63 69 66 79  duced by specify
1040: 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 64  ing the.       d
1050: 69 72 65 63 74 69 76 65 20 5b 46 54 53 34 20 6d  irective [FTS4 m
1060: 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 7c  atchinfo option|
1070: 22 6d 61 74 63 68 69 6e 66 6f 3d 66 74 73 33 22  "matchinfo=fts3"
1080: 5d 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  ] as part of the
1090: 20 46 54 53 34 20 74 61 62 6c 65 0a 20 20 20 20   FTS4 table.    
10a0: 20 20 20 64 65 63 6c 61 72 61 74 69 6f 6e 2c 20     declaration, 
10b0: 62 75 74 20 74 68 69 73 20 63 6f 6d 65 73 20 61  but this comes a
10c0: 74 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66  t the expense of
10d0: 20 73 61 63 72 69 66 69 63 69 6e 67 20 73 6f 6d   sacrificing som
10e0: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
10f0: 65 78 74 72 61 20 73 75 70 70 6f 72 74 65 64 20  extra supported 
1100: 6d 61 74 63 68 69 6e 66 6f 28 29 20 6f 70 74 69  matchinfo() opti
1110: 6f 6e 73 2e 0a 0a 20 20 3c 6c 69 3e 20 3c 70 3e  ons...  <li> <p>
1120: 46 54 53 34 20 70 72 6f 76 69 64 65 73 20 68 6f  FTS4 provides ho
1130: 6f 6b 73 20 28 74 68 65 20 63 6f 6d 70 72 65 73  oks (the compres
1140: 73 20 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73  s and uncompress
1150: 20 0a 20 20 20 20 20 20 20 5b 46 54 53 34 20 6f   .       [FTS4 o
1160: 70 74 69 6f 6e 73 7c 6f 70 74 69 6f 6e 73 5d 29  ptions|options])
1170: 20 61 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20 74   allowing data t
1180: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
1190: 20 63 6f 6d 70 72 65 73 73 65 64 20 0a 20 20 20   compressed .   
11a0: 20 20 20 20 66 6f 72 6d 2c 20 72 65 64 75 63 69      form, reduci
11b0: 6e 67 20 64 69 73 6b 20 75 73 61 67 65 20 61 6e  ng disk usage an
11c0: 64 20 49 4f 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e  d IO..</ul>..<p>
11d0: 0a 20 20 46 54 53 34 20 69 73 20 61 6e 20 65 6e  .  FTS4 is an en
11e0: 68 61 6e 63 65 6d 65 6e 74 20 74 6f 20 46 54 53  hancement to FTS
11f0: 33 2e 20 20 46 54 53 33 20 68 61 73 20 62 65 65  3.  FTS3 has bee
1200: 6e 20 61 76 61 69 6c 61 62 6c 65 20 73 69 6e 63  n available sinc
1210: 65 20 53 51 4c 69 74 65 20 5b 76 65 72 73 69 6f  e SQLite [versio
1220: 6e 20 33 2e 35 2e 30 5d 20 69 6e 0a 20 20 32 30  n 3.5.0] in.  20
1230: 30 37 2d 30 39 2d 30 34 2e 20 20 54 68 65 20 65  07-09-04.  The e
1240: 6e 68 61 6e 63 65 6d 65 6e 74 73 20 66 6f 72 20  nhancements for 
1250: 46 54 53 34 20 77 65 72 65 20 61 64 64 65 64 20  FTS4 were added 
1260: 77 69 74 68 20 53 51 4c 69 74 65 20 5b 76 65 72  with SQLite [ver
1270: 73 69 6f 6e 20 33 2e 37 2e 34 5d 20 6f 6e 20 32  sion 3.7.4] on 2
1280: 30 31 30 2d 31 32 2d 30 38 2e 0a 0a 3c 70 3e 0a  010-12-08...<p>.
1290: 20 20 57 68 69 63 68 20 6d 6f 64 75 6c 65 2c 20    Which module, 
12a0: 46 54 53 33 20 6f 72 20 46 54 53 34 2c 20 73 68  FTS3 or FTS4, sh
12b0: 6f 75 6c 64 20 79 6f 75 20 75 73 65 20 69 6e 20  ould you use in 
12c0: 79 6f 75 72 20 61 70 70 6c 69 63 61 74 69 6f 6e  your application
12d0: 3f 20 20 46 54 53 34 20 69 73 0a 20 20 73 6f 6d  ?  FTS4 is.  som
12e0: 65 74 69 6d 65 73 20 73 69 67 6e 69 66 69 63 61  etimes significa
12f0: 6e 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  ntly faster than
1300: 20 46 54 53 33 2c 20 65 76 65 6e 20 6f 72 64 65   FTS3, even orde
1310: 72 73 20 6f 66 20 6d 61 67 6e 69 74 75 64 65 20  rs of magnitude 
1320: 66 61 73 74 65 72 0a 20 20 64 65 70 65 6e 64 69  faster.  dependi
1330: 6e 67 20 6f 6e 20 74 68 65 20 71 75 65 72 79 2c  ng on the query,
1340: 20 74 68 6f 75 67 68 20 69 6e 20 74 68 65 20 63   though in the c
1350: 6f 6d 6d 6f 6e 20 63 61 73 65 20 74 68 65 20 70  ommon case the p
1360: 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
1370: 65 20 74 77 6f 0a 20 20 6d 6f 64 75 6c 65 73 20  e two.  modules 
1380: 69 73 20 73 69 6d 69 6c 61 72 2e 20 46 54 53 34  is similar. FTS4
1390: 20 61 6c 73 6f 20 6f 66 66 65 72 73 20 74 68 65   also offers the
13a0: 20 65 6e 68 61 6e 63 65 64 20 5b 6d 61 74 63 68   enhanced [match
13b0: 69 6e 66 6f 28 29 5d 20 6f 75 74 70 75 74 73 20  info()] outputs 
13c0: 77 68 69 63 68 0a 20 20 63 61 6e 20 62 65 20 75  which.  can be u
13d0: 73 65 66 75 6c 20 69 6e 20 72 61 6e 6b 69 6e 67  seful in ranking
13e0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
13f0: 61 20 5b 46 54 53 20 4d 41 54 43 48 7c 4d 41 54  a [FTS MATCH|MAT
1400: 43 48 5d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  CH] operation.  
1410: 4f 6e 20 74 68 65 0a 20 20 6f 74 68 65 72 20 68  On the.  other h
1420: 61 6e 64 2c 20 69 6e 20 74 68 65 20 61 62 73 65  and, in the abse
1430: 6e 63 65 20 6f 66 20 61 20 5b 46 54 53 34 20 6d  nce of a [FTS4 m
1440: 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 7c  atchinfo option|
1450: 6d 61 74 63 68 69 6e 66 6f 3d 66 74 73 33 5d 20  matchinfo=fts3] 
1460: 64 69 72 65 63 74 69 76 65 20 46 54 53 34 20 72  directive FTS4 r
1470: 65 71 75 69 72 65 73 20 61 20 6c 69 74 74 6c 65  equires a little
1480: 0a 20 20 6d 6f 72 65 20 64 69 73 6b 20 73 70 61  .  more disk spa
1490: 63 65 20 74 68 61 6e 20 46 54 53 33 2c 20 74 68  ce than FTS3, th
14a0: 6f 75 67 68 20 6f 6e 6c 79 20 61 20 70 65 72 63  ough only a perc
14b0: 65 6e 74 20 6f 66 20 74 77 6f 20 69 6e 20 6d 6f  ent of two in mo
14c0: 73 74 20 63 61 73 65 73 2e 0a 0a 3c 70 3e 0a 20  st cases...<p>. 
14d0: 20 46 6f 72 20 6e 65 77 65 72 20 61 70 70 6c 69   For newer appli
14e0: 63 61 74 69 6f 6e 73 2c 20 46 54 53 34 20 69 73  cations, FTS4 is
14f0: 20 72 65 63 6f 6d 6d 65 6e 64 65 64 3b 20 74 68   recommended; th
1500: 6f 75 67 68 20 69 66 20 63 6f 6d 70 61 74 69 62  ough if compatib
1510: 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
1520: 20 0a 20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   .  versions of 
1530: 53 51 4c 69 74 65 20 69 73 20 69 6d 70 6f 72 74  SQLite is import
1540: 61 6e 74 2c 20 74 68 65 6e 20 46 54 53 33 20 77  ant, then FTS3 w
1550: 69 6c 6c 20 75 73 75 61 6c 6c 79 20 73 65 72 76  ill usually serv
1560: 65 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 2e 20  e just as well. 
1570: 20 0a 0a 3c 68 32 3e 43 72 65 61 74 69 6e 67 20   ..<h2>Creating 
1580: 61 6e 64 20 44 65 73 74 72 6f 79 69 6e 67 20 46  and Destroying F
1590: 54 53 20 54 61 62 6c 65 73 3c 2f 68 32 3e 0a 0a  TS Tables</h2>..
15a0: 3c 70 3e 0a 20 20 4c 69 6b 65 20 6f 74 68 65 72  <p>.  Like other
15b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
15c0: 79 70 65 73 2c 20 6e 65 77 20 46 54 53 20 74 61  ypes, new FTS ta
15d0: 62 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  bles are created
15e0: 20 75 73 69 6e 67 20 61 20 0a 20 20 5b 43 52 45   using a .  [CRE
15f0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1600: 45 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  E] statement. Th
1610: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 2c 20 77  e module name, w
1620: 68 69 63 68 20 66 6f 6c 6c 6f 77 73 0a 20 20 74  hich follows.  t
1630: 68 65 20 55 53 49 4e 47 20 6b 65 79 77 6f 72 64  he USING keyword
1640: 2c 20 69 73 20 65 69 74 68 65 72 20 22 66 74 73  , is either "fts
1650: 33 22 20 6f 72 20 22 66 74 73 34 22 2e 20 54 68  3" or "fts4". Th
1660: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1670: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73  module arguments
1680: 20 6d 61 79 0a 20 20 62 65 20 6c 65 66 74 20 65   may.  be left e
1690: 6d 70 74 79 2c 20 69 6e 20 77 68 69 63 68 20 63  mpty, in which c
16a0: 61 73 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65  ase an FTS table
16b0: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 75   with a single u
16c0: 73 65 72 2d 64 65 66 69 6e 65 64 20 0a 20 20 63  ser-defined .  c
16d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 63 6f 6e  olumn named "con
16e0: 74 65 6e 74 22 20 69 73 20 63 72 65 61 74 65 64  tent" is created
16f0: 2e 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  . Alternatively,
1700: 20 74 68 65 20 6d 6f 64 75 6c 65 20 61 72 67 75   the module argu
1710: 6d 65 6e 74 73 0a 20 20 6d 61 79 20 62 65 20 70  ments.  may be p
1720: 61 73 73 65 64 20 61 20 6c 69 73 74 20 6f 66 20  assed a list of 
1730: 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20  comma separated 
1740: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 0a 0a  column names. ..
1750: 3c 70 3e 0a 20 20 49 66 20 63 6f 6c 75 6d 6e 20  <p>.  If column 
1760: 6e 61 6d 65 73 20 61 72 65 20 65 78 70 6c 69 63  names are explic
1770: 69 74 6c 79 20 70 72 6f 76 69 64 65 64 20 66 6f  itly provided fo
1780: 72 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  r the FTS table 
1790: 61 73 20 70 61 72 74 20 6f 66 0a 20 20 74 68 65  as part of.  the
17a0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
17b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
17c0: 20 74 68 65 6e 20 61 20 64 61 74 61 74 79 70 65   then a datatype
17d0: 20 6e 61 6d 65 20 6d 61 79 20 62 65 20 6f 70 74   name may be opt
17e0: 69 6f 6e 61 6c 6c 79 20 0a 20 20 73 70 65 63 69  ionally .  speci
17f0: 66 69 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  fied for each co
1800: 6c 75 6d 6e 2e 20 54 68 69 73 20 69 73 20 70 75  lumn. This is pu
1810: 72 65 20 73 79 6e 74 61 63 74 69 63 20 73 75 67  re syntactic sug
1820: 61 72 2c 20 74 68 65 0a 20 20 73 75 70 70 6c 69  ar, the.  suppli
1830: 65 64 20 74 79 70 65 6e 61 6d 65 73 20 61 72 65  ed typenames are
1840: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 46 54 53   not used by FTS
1850: 20 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 63   or the SQLite c
1860: 6f 72 65 20 66 6f 72 20 61 6e 79 0a 20 20 70 75  ore for any.  pu
1870: 72 70 6f 73 65 2e 20 54 68 65 20 73 61 6d 65 20  rpose. The same 
1880: 61 70 70 6c 69 65 73 20 74 6f 20 61 6e 79 20 63  applies to any c
1890: 6f 6e 73 74 72 61 69 6e 74 73 20 73 70 65 63 69  onstraints speci
18a0: 66 69 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  fied along with 
18b0: 61 6e 0a 20 20 46 54 53 20 63 6f 6c 75 6d 6e 20  an.  FTS column 
18c0: 6e 61 6d 65 20 2d 20 74 68 65 79 20 61 72 65 20  name - they are 
18d0: 70 61 72 73 65 64 20 62 75 74 20 6e 6f 74 20 75  parsed but not u
18e0: 73 65 64 20 6f 72 20 72 65 63 6f 72 64 65 64 20  sed or recorded 
18f0: 62 79 20 74 68 65 20 73 79 73 74 65 6d 0a 20 20  by the system.  
1900: 69 6e 20 61 6e 79 20 77 61 79 2e 0a 0a 3c 63 6f  in any way...<co
1910: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
1920: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 20 74   Create an FTS t
1930: 61 62 6c 65 20 6e 61 6d 65 64 20 22 64 61 74 61  able named "data
1940: 22 20 77 69 74 68 20 6f 6e 65 20 63 6f 6c 75 6d  " with one colum
1950: 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22 3a 3c 2f  n - "content":</
1960: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
1970: 55 41 4c 20 54 41 42 4c 45 20 64 61 74 61 20 55  UAL TABLE data U
1980: 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 0a 20 20  SING fts3();..  
1990: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
19a0: 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  FTS table named 
19b0: 22 70 61 67 65 73 22 20 77 69 74 68 20 74 68 72  "pages" with thr
19c0: 65 65 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e 0a  ee columns:</i>.
19d0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
19e0: 20 54 41 42 4c 45 20 70 61 67 65 73 20 55 53 49   TABLE pages USI
19f0: 4e 47 20 66 74 73 34 28 74 69 74 6c 65 2c 20 6b  NG fts4(title, k
1a00: 65 79 77 6f 72 64 73 2c 20 62 6f 64 79 29 3b 0a  eywords, body);.
1a10: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
1a20: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d  an FTS table nam
1a30: 65 64 20 22 6d 61 69 6c 22 20 77 69 74 68 20 74  ed "mail" with t
1a40: 77 6f 20 63 6f 6c 75 6d 6e 73 2e 20 44 61 74 61  wo columns. Data
1a50: 74 79 70 65 73 0a 20 20 2d 2d 20 61 6e 64 20 63  types.  -- and c
1a60: 6f 6c 75 6d 6e 20 63 6f 6e 73 74 72 61 69 6e 74  olumn constraint
1a70: 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  s are specified 
1a80: 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1a90: 63 6f 6c 75 6d 6e 2e 20 54 68 65 73 65 0a 20 20  column. These.  
1aa0: 2d 2d 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  -- are completel
1ab0: 79 20 69 67 6e 6f 72 65 64 20 62 79 20 46 54 53  y ignored by FTS
1ac0: 20 61 6e 64 20 53 51 4c 69 74 65 2e 20 3c 2f 69   and SQLite. </i
1ad0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
1ae0: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
1af0: 49 4e 47 20 66 74 73 33 28 0a 20 20 20 20 73 75  ING fts3(.    su
1b00: 62 6a 65 63 74 20 56 41 52 43 48 41 52 28 32 35  bject VARCHAR(25
1b10: 36 29 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20  6) NOT NULL,.   
1b20: 20 62 6f 64 79 20 54 45 58 54 20 43 48 45 43 4b   body TEXT CHECK
1b30: 28 6c 65 6e 67 74 68 28 62 6f 64 79 29 26 6c 74  (length(body)&lt
1b40: 3b 31 30 32 34 30 29 0a 20 20 29 3b 0a 3c 2f 63  ;10240).  );.</c
1b50: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
1b60: 20 41 73 20 77 65 6c 6c 20 61 73 20 61 20 6c 69   As well as a li
1b70: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 74  st of columns, t
1b80: 68 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65  he module argume
1b90: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  nts passed to a 
1ba0: 43 52 45 41 54 45 0a 20 20 56 49 52 54 55 41 4c  CREATE.  VIRTUAL
1bb0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1bc0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
1bd0: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d 61 79  an FTS table may
1be0: 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 63   be used to spec
1bf0: 69 66 79 0a 20 20 61 20 5b 74 6f 6b 65 6e 69 7a  ify.  a [tokeniz
1c00: 65 72 5d 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  er]. This is don
1c10: 65 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20  e by specifying 
1c20: 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20  a string of the 
1c30: 66 6f 72 6d 0a 20 20 22 74 6f 6b 65 6e 69 7a 65  form.  "tokenize
1c40: 3d 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e  =&lt;tokenizer n
1c50: 61 6d 65 26 67 74 3b 20 26 6c 74 3b 74 6f 6b 65  ame&gt; &lt;toke
1c60: 6e 69 7a 65 72 20 61 72 67 73 26 67 74 3b 22 20  nizer args&gt;" 
1c70: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 63 6f  in place of a co
1c80: 6c 75 6d 6e 0a 20 20 6e 61 6d 65 2c 20 77 68 65  lumn.  name, whe
1c90: 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  re &lt;tokenizer
1ca0: 20 6e 61 6d 65 26 67 74 3b 20 69 73 20 74 68 65   name&gt; is the
1cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 6f 6b   name of the tok
1cc0: 65 6e 69 7a 65 72 20 74 6f 20 75 73 65 20 61 6e  enizer to use an
1cd0: 64 0a 20 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  d.  &lt;tokenize
1ce0: 72 20 61 72 67 73 26 67 74 3b 20 69 73 20 61 6e  r args&gt; is an
1cf0: 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   optional list o
1d00: 66 20 77 68 69 74 65 73 70 61 63 65 20 73 65 70  f whitespace sep
1d10: 61 72 61 74 65 64 20 71 75 61 6c 69 66 69 65 72  arated qualifier
1d20: 73 0a 20 20 74 6f 20 70 61 73 73 20 74 6f 20 74  s.  to pass to t
1d30: 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70  he tokenizer imp
1d40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 41 20 74  lementation. A t
1d50: 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63 69 66 69  okenizer specifi
1d60: 63 61 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20  cation may be.  
1d70: 70 6c 61 63 65 64 20 61 6e 79 77 68 65 72 65 20  placed anywhere 
1d80: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1d90: 73 74 2c 20 62 75 74 20 61 74 20 6d 6f 73 74 20  st, but at most 
1da0: 6f 6e 65 20 74 6f 6b 65 6e 69 7a 65 72 20 64 65  one tokenizer de
1db0: 63 6c 61 72 61 74 69 6f 6e 20 69 73 0a 20 20 61  claration is.  a
1dc0: 6c 6c 6f 77 65 64 20 66 6f 72 20 65 61 63 68 20  llowed for each 
1dd0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1de0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1df0: 5b 74 6f 6b 65 6e 69 7a 65 72 7c 53 65 65 20 62  [tokenizer|See b
1e00: 65 6c 6f 77 5d 20 66 6f 72 20 61 20 0a 20 20 64  elow] for a .  d
1e10: 65 74 61 69 6c 65 64 20 64 65 73 63 72 69 70 74  etailed descript
1e20: 69 6f 6e 20 6f 66 20 75 73 69 6e 67 20 28 61 6e  ion of using (an
1e30: 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
1e40: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 29 20 61   implementing) a
1e50: 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 0a 3c 63 6f   tokenizer...<co
1e60: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
1e70: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 20 74   Create an FTS t
1e80: 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61 70 65  able named "pape
1e90: 72 73 22 20 77 69 74 68 20 74 77 6f 20 63 6f 6c  rs" with two col
1ea0: 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73 3c 2f  umns that uses</
1eb0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 74  i>.  <i>-- the t
1ec0: 6f 6b 65 6e 69 7a 65 72 20 22 70 6f 72 74 65 72  okenizer "porter
1ed0: 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  ".</i>.  CREATE 
1ee0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
1ef0: 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33 28  pers USING fts3(
1f00: 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74  author, document
1f10: 2c 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65  , tokenize=porte
1f20: 72 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  r);..  <i>-- Cre
1f30: 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65  ate an FTS table
1f40: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63   with a single c
1f50: 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74  olumn - "content
1f60: 22 20 2d 20 74 68 61 74 20 75 73 65 73 3c 2f 69  " - that uses</i
1f70: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 22 73  >.  <i>-- the "s
1f80: 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72  imple" tokenizer
1f90: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
1fa0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61 74  IRTUAL TABLE dat
1fb0: 61 20 55 53 49 4e 47 20 66 74 73 34 28 74 6f 6b  a USING fts4(tok
1fc0: 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 0a  enize=simple);..
1fd0: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
1fe0: 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69 74 68  n FTS table with
1ff0: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 74 68 61   two columns tha
2000: 74 20 75 73 65 73 20 74 68 65 20 22 69 63 75 22  t uses the "icu"
2010: 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f 69 3e 0a   tokenizer.</i>.
2020: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 71 75 61 6c    <i>-- The qual
2030: 69 66 69 65 72 20 22 65 6e 5f 41 55 22 20 69 73  ifier "en_AU" is
2040: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 74   passed to the t
2050: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
2060: 6e 74 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52  ntation</i>.  CR
2070: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2080: 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e 47 20 66  LE names USING f
2090: 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b 65 6e 69  ts3(a, b, tokeni
20a0: 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29 3b 0a 3c  ze=icu en_AU);.<
20b0: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
20c0: 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20 6d 61  .  FTS tables ma
20d0: 79 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  y be dropped fro
20e0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  m the database u
20f0: 73 69 6e 67 20 61 6e 20 6f 72 64 69 6e 61 72 79  sing an ordinary
2100: 20 5b 44 52 4f 50 20 54 41 42 4c 45 5d 0a 20 20   [DROP TABLE].  
2110: 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f 72 20 65  statement. For e
2120: 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
2130: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  ock>.  <i>-- Cre
2140: 61 74 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  ate, then immedi
2150: 61 74 65 6c 79 20 64 72 6f 70 2c 20 61 6e 20 46  ately drop, an F
2160: 54 53 34 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  TS4 table.</i>. 
2170: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
2180: 54 41 42 4c 45 20 64 61 74 61 20 55 53 49 4e 47  TABLE data USING
2190: 20 66 74 73 34 28 29 3b 0a 20 20 44 52 4f 50 20   fts4();.  DROP 
21a0: 54 41 42 4c 45 20 64 61 74 61 3b 0a 3c 2f 63 6f  TABLE data;.</co
21b0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 3e 50 6f  deblock>..<h2>Po
21c0: 70 75 6c 61 74 69 6e 67 20 46 54 53 20 54 61 62  pulating FTS Tab
21d0: 6c 65 73 3c 2f 68 32 3e 0a 0a 20 20 3c 70 3e 0a  les</h2>..  <p>.
21e0: 20 20 20 20 46 54 53 20 74 61 62 6c 65 73 20 61      FTS tables a
21f0: 72 65 20 70 6f 70 75 6c 61 74 65 64 20 75 73 69  re populated usi
2200: 6e 67 20 5b 49 4e 53 45 52 54 5d 2c 20 5b 55 50  ng [INSERT], [UP
2210: 44 41 54 45 5d 20 61 6e 64 20 5b 44 45 4c 45 54  DATE] and [DELET
2220: 45 5d 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74  E].    statement
2230: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
2240: 79 20 61 73 20 6f 72 64 69 6e 61 72 79 20 53 51  y as ordinary SQ
2250: 4c 69 74 65 20 74 61 62 6c 65 73 20 61 72 65 2e  Lite tables are.
2260: 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 41 73 20 77  ..  <p>.    As w
2270: 65 6c 6c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  ell as the colum
2280: 6e 73 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ns named by the 
2290: 75 73 65 72 20 28 6f 72 20 74 68 65 20 22 63 6f  user (or the "co
22a0: 6e 74 65 6e 74 22 20 63 6f 6c 75 6d 6e 20 69 66  ntent" column if
22b0: 20 6e 6f 0a 20 20 20 20 6d 6f 64 75 6c 65 20 61   no.    module a
22c0: 72 67 75 6d 65 6e 74 73 20 77 65 72 65 20 73 70  rguments were sp
22d0: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
22e0: 6f 66 20 74 68 65 20 5b 43 52 45 41 54 45 20 56  of the [CREATE V
22f0: 49 52 54 55 41 4c 20 54 41 42 4c 45 5d 20 0a 20  IRTUAL TABLE] . 
2300: 20 20 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 65     statement), e
2310: 61 63 68 20 46 54 53 20 74 61 62 6c 65 20 68 61  ach FTS table ha
2320: 73 20 61 20 22 72 6f 77 69 64 22 20 63 6f 6c 75  s a "rowid" colu
2330: 6d 6e 2e 20 54 68 65 20 72 6f 77 69 64 20 6f 66  mn. The rowid of
2340: 20 61 6e 20 46 54 53 0a 20 20 20 20 74 61 62 6c   an FTS.    tabl
2350: 65 20 62 65 68 61 76 65 73 20 69 6e 20 74 68 65  e behaves in the
2360: 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65   same way as the
2370: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66   rowid column of
2380: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c   an ordinary SQL
2390: 69 74 65 20 0a 20 20 20 20 74 61 62 6c 65 2c 20  ite .    table, 
23a0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
23b0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
23c0: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
23d0: 6e 20 6f 66 20 61 6e 20 46 54 53 20 74 61 62 6c  n of an FTS tabl
23e0: 65 20 0a 20 20 20 20 72 65 6d 61 69 6e 20 75 6e  e .    remain un
23f0: 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 64  changed if the d
2400: 61 74 61 62 61 73 65 20 69 73 20 72 65 62 75 69  atabase is rebui
2410: 6c 74 20 75 73 69 6e 67 20 74 68 65 20 5b 56 41  lt using the [VA
2420: 43 55 55 4d 5d 20 63 6f 6d 6d 61 6e 64 2e 20 0a  CUUM] command. .
2430: 20 20 20 20 46 6f 72 20 46 54 53 20 74 61 62 6c      For FTS tabl
2440: 65 73 2c 20 22 64 6f 63 69 64 22 20 69 73 20 61  es, "docid" is a
2450: 6c 6c 6f 77 65 64 20 61 73 20 61 6e 20 61 6c 69  llowed as an ali
2460: 61 73 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  as along with th
2470: 65 20 75 73 75 61 6c 20 22 72 6f 77 69 64 22 2c  e usual "rowid",
2480: 0a 20 20 20 20 22 6f 69 64 22 20 61 6e 64 20 22  .    "oid" and "
2490: 5f 6f 69 64 5f 22 20 69 64 65 6e 74 69 66 69 65  _oid_" identifie
24a0: 72 73 2e 20 41 74 74 65 6d 70 74 69 6e 67 20 74  rs. Attempting t
24b0: 6f 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61  o insert or upda
24c0: 74 65 20 61 20 72 6f 77 20 77 69 74 68 20 61 20  te a row with a 
24d0: 0a 20 20 20 20 64 6f 63 69 64 20 76 61 6c 75 65  .    docid value
24e0: 20 74 68 61 74 20 61 6c 72 65 61 64 79 20 65 78   that already ex
24f0: 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ists in the tabl
2500: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2c 20 6a  e is an error, j
2510: 75 73 74 20 61 73 20 69 74 20 77 6f 75 6c 64 20  ust as it would 
2520: 0a 20 20 20 20 62 65 20 77 69 74 68 20 61 6e 20  .    be with an 
2530: 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20  ordinary SQLite 
2540: 74 61 62 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20  table...  <p>.  
2550: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2560: 74 68 65 72 20 73 75 62 74 6c 65 20 64 69 66 66  ther subtle diff
2570: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 22  erence between "
2580: 64 6f 63 69 64 22 20 61 6e 64 20 74 68 65 20 6e  docid" and the n
2590: 6f 72 6d 61 6c 20 53 51 4c 69 74 65 0a 20 20 20  ormal SQLite.   
25a0: 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65   aliases for the
25b0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 4e   rowid column. N
25c0: 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 49  ormally, if an I
25d0: 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
25e0: 73 74 61 74 65 6d 65 6e 74 20 0a 20 20 20 20 61  statement .    a
25f0: 73 73 69 67 6e 73 20 64 69 73 63 72 65 74 65 20  ssigns discrete 
2600: 76 61 6c 75 65 73 20 74 6f 20 74 77 6f 20 6f 72  values to two or
2610: 20 6d 6f 72 65 20 61 6c 69 61 73 65 73 20 6f 66   more aliases of
2620: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
2630: 6e 2c 20 53 51 4c 69 74 65 20 0a 20 20 20 20 77  n, SQLite .    w
2640: 72 69 74 65 73 20 74 68 65 20 72 69 67 68 74 6d  rites the rightm
2650: 6f 73 74 20 6f 66 20 73 75 63 68 20 76 61 6c 75  ost of such valu
2660: 65 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  es specified in 
2670: 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50  the INSERT or UP
2680: 44 41 54 45 0a 20 20 20 20 73 74 61 74 65 6d 65  DATE.    stateme
2690: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
26a0: 73 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 73 73  se. However, ass
26b0: 69 67 6e 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55 4c  igning a non-NUL
26c0: 4c 20 76 61 6c 75 65 20 74 6f 20 62 6f 74 68 0a  L value to both.
26d0: 20 20 20 20 74 68 65 20 22 64 6f 63 69 64 22 20      the "docid" 
26e0: 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
26f0: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 72 6f  of the SQLite ro
2700: 77 69 64 20 61 6c 69 61 73 65 73 20 77 68 65 6e  wid aliases when
2710: 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 0a 20 20   inserting or.  
2720: 20 20 75 70 64 61 74 69 6e 67 20 61 6e 20 46 54    updating an FT
2730: 53 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69  S table is consi
2740: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 20  dered an error. 
2750: 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e  See below for an
2760: 20 65 78 61 6d 70 6c 65 2e 0a 0a 3c 63 6f 64 65   example...<code
2770: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
2780: 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  reate an FTS tab
2790: 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  le</i>.  CREATE 
27a0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
27b0: 67 65 73 20 55 53 49 4e 47 20 66 74 73 34 28 74  ges USING fts4(t
27c0: 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a 20 20  itle, body);..  
27d0: 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20 72  <i>-- Insert a r
27e0: 6f 77 20 77 69 74 68 20 61 20 73 70 65 63 69 66  ow with a specif
27f0: 69 63 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 3c  ic docid value.<
2800: 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  /i>.  INSERT INT
2810: 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c 20 74  O pages(docid, t
2820: 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c 55  itle, body) VALU
2830: 45 53 28 35 33 2c 20 27 48 6f 6d 65 20 50 61 67  ES(53, 'Home Pag
2840: 65 27 2c 20 27 53 51 4c 69 74 65 20 69 73 20 61  e', 'SQLite is a
2850: 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27 29 3b 0a   software...');.
2860: 0a 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20  .  <i>-- Insert 
2870: 61 20 72 6f 77 20 61 6e 64 20 61 6c 6c 6f 77 20  a row and allow 
2880: 46 54 53 20 74 6f 20 61 73 73 69 67 6e 20 61 20  FTS to assign a 
2890: 64 6f 63 69 64 20 76 61 6c 75 65 20 75 73 69 6e  docid value usin
28a0: 67 20 74 68 65 20 73 61 6d 65 20 61 6c 67 6f 72  g the same algor
28b0: 69 74 68 6d 20 61 73 3c 2f 69 3e 0a 20 20 3c 69  ithm as</i>.  <i
28c0: 3e 2d 2d 20 53 51 4c 69 74 65 20 75 73 65 73 20  >-- SQLite uses 
28d0: 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74 61 62  for ordinary tab
28e0: 6c 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  les. In this cas
28f0: 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20  e the new docid 
2900: 77 69 6c 6c 20 62 65 20 35 34 2c 3c 2f 69 3e 0a  will be 54,</i>.
2910: 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 67 72 65 61    <i>-- one grea
2920: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
2930: 67 65 73 74 20 64 6f 63 69 64 20 63 75 72 72 65  gest docid curre
2940: 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20  ntly present in 
2950: 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  the table.</i>. 
2960: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
2970: 65 73 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 20  es(title, body) 
2980: 56 41 4c 55 45 53 28 27 44 6f 77 6e 6c 6f 61 64  VALUES('Download
2990: 27 2c 20 27 41 6c 6c 20 53 51 4c 69 74 65 20 73  ', 'All SQLite s
29a0: 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e 27 29 3b  ource code...');
29b0: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 68 61 6e 67 65  ..  <i>-- Change
29c0: 20 74 68 65 20 74 69 74 6c 65 20 6f 66 20 74 68   the title of th
29d0: 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72  e row just inser
29e0: 74 65 64 2e 3c 2f 69 3e 0a 20 20 55 50 44 41 54  ted.</i>.  UPDAT
29f0: 45 20 70 61 67 65 73 20 53 45 54 20 74 69 74 6c  E pages SET titl
2a00: 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64 20 53 51  e = 'Download SQ
2a10: 4c 69 74 65 27 20 57 48 45 52 45 20 72 6f 77 69  Lite' WHERE rowi
2a20: 64 20 3d 20 35 34 3b 0a 0a 20 20 3c 69 3e 2d 2d  d = 54;..  <i>--
2a30: 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 69   Delete the enti
2a40: 72 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  re table content
2a50: 73 2e 3c 2f 69 3e 0a 20 20 44 45 4c 45 54 45 20  s.</i>.  DELETE 
2a60: 46 52 4f 4d 20 70 61 67 65 73 3b 0a 0a 20 20 3c  FROM pages;..  <
2a70: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
2a80: 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  ng is an error. 
2a90: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
2aa0: 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 6e 6f 6e  le to assign non
2ab0: 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 74 6f 20  -NULL values to 
2ac0: 62 6f 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  both</i>.  <i>--
2ad0: 20 74 68 65 20 72 6f 77 69 64 20 61 6e 64 20 64   the rowid and d
2ae0: 6f 63 69 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ocid columns of 
2af0: 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69  an FTS table.</i
2b00: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
2b10: 70 61 67 65 73 28 72 6f 77 69 64 2c 20 64 6f 63  pages(rowid, doc
2b20: 69 64 2c 20 74 69 74 6c 65 2c 20 62 6f 64 79 29  id, title, body)
2b30: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 27 41   VALUES(1, 2, 'A
2b40: 20 74 69 74 6c 65 27 2c 20 27 41 20 64 6f 63 75   title', 'A docu
2b50: 6d 65 6e 74 20 62 6f 64 79 27 29 3b 0a 3c 2f 63  ment body');.</c
2b60: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e  odeblock>..  <p>
2b70: 0a 20 20 20 20 54 6f 20 73 75 70 70 6f 72 74 20  .    To support 
2b80: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
2b90: 73 2c 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73  s, FTS maintains
2ba0: 20 61 6e 20 69 6e 76 65 72 74 65 64 20 69 6e 64   an inverted ind
2bb0: 65 78 20 74 68 61 74 20 6d 61 70 73 0a 20 20 20  ex that maps.   
2bc0: 20 66 72 6f 6d 20 65 61 63 68 20 75 6e 69 71 75   from each uniqu
2bd0: 65 20 74 65 72 6d 20 6f 72 20 77 6f 72 64 20 74  e term or word t
2be0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
2bf0: 68 65 20 64 61 74 61 73 65 74 20 74 6f 20 74 68  he dataset to th
2c00: 65 20 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 20 20  e locations.    
2c10: 69 6e 20 77 68 69 63 68 20 69 74 20 61 70 70 65  in which it appe
2c20: 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  ars within the t
2c30: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 20 46  able contents. F
2c40: 6f 72 20 74 68 65 20 63 75 72 69 6f 75 73 2c 20  or the curious, 
2c50: 61 20 0a 20 20 20 20 63 6f 6d 70 6c 65 74 65 20  a .    complete 
2c60: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
2c70: 68 65 20 5b 73 65 67 6d 65 6e 74 20 62 74 72 65  he [segment btre
2c80: 65 7c 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e|data structure
2c90: 5d 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  ] used to store.
2ca0: 20 20 20 20 74 68 69 73 20 69 6e 64 65 78 20 77      this index w
2cb0: 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61  ithin the databa
2cc0: 73 65 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  se file appears 
2cd0: 62 65 6c 6f 77 2e 20 41 20 66 65 61 74 75 72 65  below. A feature
2ce0: 20 6f 66 0a 20 20 20 20 74 68 69 73 20 64 61 74   of.    this dat
2cf0: 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 74  a structure is t
2d00: 68 61 74 20 61 74 20 61 6e 79 20 74 69 6d 65 20  hat at any time 
2d10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
2d20: 20 63 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20 20 20   contain not.   
2d30: 20 6f 6e 65 20 69 6e 64 65 78 20 62 2d 74 72 65   one index b-tre
2d40: 65 2c 20 62 75 74 20 73 65 76 65 72 61 6c 20 64  e, but several d
2d50: 69 66 66 65 72 65 6e 74 20 62 2d 74 72 65 65 73  ifferent b-trees
2d60: 20 74 68 61 74 20 61 72 65 20 69 6e 63 72 65 6d   that are increm
2d70: 65 6e 74 61 6c 6c 79 0a 20 20 20 20 6d 65 72 67  entally.    merg
2d80: 65 64 20 61 73 20 72 6f 77 73 20 61 72 65 20 69  ed as rows are i
2d90: 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74 65 64  nserted, updated
2da0: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 54 68   and deleted. Th
2db0: 69 73 20 74 65 63 68 6e 69 71 75 65 20 69 6d 70  is technique imp
2dc0: 72 6f 76 65 73 20 0a 20 20 20 20 70 65 72 66 6f  roves .    perfo
2dd0: 72 6d 61 6e 63 65 20 77 68 65 6e 20 77 72 69 74  rmance when writ
2de0: 69 6e 67 20 74 6f 20 61 6e 20 46 54 53 20 74 61  ing to an FTS ta
2df0: 62 6c 65 2c 20 62 75 74 20 63 61 75 73 65 73 20  ble, but causes 
2e00: 73 6f 6d 65 20 6f 76 65 72 68 65 61 64 20 66 6f  some overhead fo
2e10: 72 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78 74 20  r.    full-text 
2e20: 71 75 65 72 69 65 73 20 74 68 61 74 20 75 73 65  queries that use
2e30: 20 74 68 65 20 69 6e 64 65 78 2e 20 45 78 65 63   the index. Exec
2e40: 75 74 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61  uting an SQL sta
2e50: 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  tement of the.  
2e60: 20 20 66 6f 72 6d 20 22 49 4e 53 45 52 54 20 49    form "INSERT I
2e70: 4e 54 4f 20 26 6c 74 3b 66 74 73 2d 74 61 62 6c  NTO &lt;fts-tabl
2e80: 65 26 67 74 3b 28 26 6c 74 3b 66 74 73 2d 74 61  e&gt;(&lt;fts-ta
2e90: 62 6c 65 26 67 74 3b 29 20 56 41 4c 55 45 53 28  ble&gt;) VALUES(
2ea0: 27 6f 70 74 69 6d 69 7a 65 27 29 22 0a 20 20 20  'optimize')".   
2eb0: 20 63 61 75 73 65 73 20 46 54 53 20 74 6f 20 6d   causes FTS to m
2ec0: 65 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69 6e  erge all existin
2ed0: 67 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20  g index b-trees 
2ee0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61  into a single la
2ef0: 72 67 65 0a 20 20 20 20 62 2d 74 72 65 65 20 63  rge.    b-tree c
2f00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
2f10: 74 69 72 65 20 69 6e 64 65 78 2e 20 54 68 69 73  tire index. This
2f20: 20 63 61 6e 20 62 65 20 61 6e 20 65 78 70 65 6e   can be an expen
2f30: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 0a  sive operation,.
2f40: 20 20 20 20 62 75 74 20 6d 61 79 20 73 70 65 65      but may spee
2f50: 64 20 75 70 20 66 75 74 75 72 65 20 71 75 65 72  d up future quer
2f60: 69 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20 20  ies. ..  <p>.   
2f70: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f   For example, to
2f80: 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 66 75   optimize the fu
2f90: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f  ll-text index fo
2fa0: 72 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e  r an FTS table n
2fb0: 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73 22 3a  amed.    "docs":
2fc0: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
2fd0: 3c 69 3e 2d 2d 20 4f 70 74 69 6d 69 7a 65 20 74  <i>-- Optimize t
2fe0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 75  he internal stru
2ff0: 63 74 75 72 65 20 6f 66 20 46 54 53 20 74 61 62  cture of FTS tab
3000: 6c 65 20 22 64 6f 63 73 22 2e 3c 2f 69 3e 0a 20  le "docs".</i>. 
3010: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63   INSERT INTO doc
3020: 73 28 64 6f 63 73 29 20 56 41 4c 55 45 53 28 27  s(docs) VALUES('
3030: 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 3c 2f 63 6f  optimize');.</co
3040: 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e 0a  deblock>..  <p>.
3050: 20 20 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e      The statemen
3060: 74 20 61 62 6f 76 65 20 6d 61 79 20 61 70 70 65  t above may appe
3070: 61 72 20 73 79 6e 74 61 63 74 69 63 61 6c 6c 79  ar syntactically
3080: 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20 73 6f   incorrect to so
3090: 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20 20 20  me. Refer to.   
30a0: 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64 65 73   the section des
30b0: 63 72 69 62 69 6e 67 20 74 68 65 20 5b 73 69 6d  cribing the [sim
30c0: 70 6c 65 20 66 74 73 20 71 75 65 72 69 65 73 5d  ple fts queries]
30d0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
30e0: 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  ion...  <p>.    
30f0: 54 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  There is another
3100: 2c 20 64 65 70 72 65 63 61 74 65 64 2c 20 6d 65  , deprecated, me
3110: 74 68 6f 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  thod for invokin
3120: 67 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 20 0a  g the optimize .
3130: 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 75 73      operation us
3140: 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
3150: 74 65 6d 65 6e 74 2e 20 4e 65 77 20 63 6f 64 65  tement. New code
3160: 20 73 68 6f 75 6c 64 20 75 73 65 20 73 74 61 74   should use stat
3170: 65 6d 65 6e 74 73 0a 20 20 20 20 73 69 6d 69 6c  ements.    simil
3180: 61 72 20 74 6f 20 74 68 65 20 49 4e 53 45 52 54  ar to the INSERT
3190: 20 61 62 6f 76 65 20 74 6f 20 6f 70 74 69 6d 69   above to optimi
31a0: 7a 65 20 46 54 53 20 73 74 72 75 63 74 75 72 65  ze FTS structure
31b0: 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22 73 69  s...<h2 tags="si
31c0: 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65 73  mple fts queries
31d0: 22 3e 53 69 6d 70 6c 65 20 46 54 53 20 51 75 65  ">Simple FTS Que
31e0: 72 69 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  ries</h2>..<p>. 
31f0: 20 41 73 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65   As for all othe
3200: 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c  r SQLite tables,
3210: 20 76 69 72 74 75 61 6c 20 6f 72 20 6f 74 68 65   virtual or othe
3220: 72 77 69 73 65 2c 20 64 61 74 61 20 69 73 20 72  rwise, data is r
3230: 65 74 72 69 65 76 65 64 0a 20 20 66 72 6f 6d 20  etrieved.  from 
3240: 46 54 53 20 74 61 62 6c 65 73 20 75 73 69 6e 67  FTS tables using
3250: 20 61 20 5b 53 45 4c 45 43 54 5d 20 73 74 61 74   a [SELECT] stat
3260: 65 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 46 54  ement...<p>.  FT
3270: 53 20 74 61 62 6c 65 73 20 63 61 6e 20 62 65 20  S tables can be 
3280: 71 75 65 72 69 65 64 20 65 66 66 69 63 69 65 6e  queried efficien
3290: 74 6c 79 20 75 73 69 6e 67 20 53 45 4c 45 43 54  tly using SELECT
32a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
32b0: 77 6f 0a 20 20 64 69 66 66 65 72 65 6e 74 20 66  wo.  different f
32c0: 6f 72 6d 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  orms:..<ul>.  <l
32d0: 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 51 75 65  i><p>.    <b>Que
32e0: 72 79 20 62 79 20 72 6f 77 69 64 3c 2f 62 3e 2e  ry by rowid</b>.
32f0: 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
3300: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
3310: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
3320: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 75 62 2d   contains a sub-
3330: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
3340: 72 6d 20 22 72 6f 77 69 64 20 3d 20 3f 22 2c 20  rm "rowid = ?", 
3350: 77 68 65 72 65 20 3f 20 69 73 20 61 6e 20 53 51  where ? is an SQ
3360: 4c 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 20 20  L expression,.  
3370: 20 20 46 54 53 20 69 73 20 61 62 6c 65 20 74 6f    FTS is able to
3380: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
3390: 71 75 65 73 74 65 64 20 72 6f 77 20 64 69 72 65  quested row dire
33a0: 63 74 6c 79 20 75 73 69 6e 67 20 74 68 65 20 65  ctly using the e
33b0: 71 75 69 76 61 6c 65 6e 74 20 0a 20 20 20 20 6f  quivalent .    o
33c0: 66 20 61 6e 20 53 51 4c 69 74 65 20 5b 49 4e 54  f an SQLite [INT
33d0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
33e0: 5d 20 69 6e 64 65 78 2e 0a 0a 20 20 3c 6c 69 3e  ] index...  <li>
33f0: 3c 70 3e 0a 20 20 20 20 3c 62 3e 46 75 6c 6c 2d  <p>.    <b>Full-
3400: 74 65 78 74 20 71 75 65 72 79 3c 2f 62 3e 2e 20  text query</b>. 
3410: 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
3420: 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
3430: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
3440: 61 69 6e 73 0a 20 20 20 20 61 20 73 75 62 2d 63  ains.    a sub-c
3450: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
3460: 6d 20 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26 67 74  m "&lt;column&gt
3470: 3b 20 4d 41 54 43 48 20 3f 22 2c 20 46 54 53 20  ; MATCH ?", FTS 
3480: 69 73 20 61 62 6c 65 20 74 6f 20 75 73 65 20 0a  is able to use .
3490: 20 20 20 20 74 68 65 20 62 75 69 6c 74 2d 69 6e      the built-in
34a0: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
34b0: 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
34c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 6f 73 65   search to those
34d0: 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20   documents .    
34e0: 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 66  that match the f
34f0: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73  ull-text query s
3500: 74 72 69 6e 67 20 73 70 65 63 69 66 69 65 64 20  tring specified 
3510: 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
3520: 64 20 6f 70 65 72 61 6e 64 0a 20 20 20 20 6f 66  d operand.    of
3530: 20 74 68 65 20 4d 41 54 43 48 20 63 6c 61 75 73   the MATCH claus
3540: 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  e..</ul>..<p>.  
3550: 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68  If neither of th
3560: 65 73 65 20 74 77 6f 20 71 75 65 72 79 20 73 74  ese two query st
3570: 72 61 74 65 67 69 65 73 20 63 61 6e 20 62 65 20  rategies can be 
3580: 75 73 65 64 2c 20 61 6c 6c 0a 20 20 71 75 65 72  used, all.  quer
3590: 69 65 73 20 6f 6e 20 46 54 53 20 74 61 62 6c 65  ies on FTS table
35a0: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  s are implemente
35b0: 64 20 75 73 69 6e 67 20 61 20 6c 69 6e 65 61 72  d using a linear
35c0: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
35d0: 69 72 65 0a 20 20 74 61 62 6c 65 2e 20 49 66 20  ire.  table. If 
35e0: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
35f0: 6e 73 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 73  ns large amounts
3600: 20 6f 66 20 64 61 74 61 2c 20 74 68 69 73 20 6d   of data, this m
3610: 61 79 20 62 65 20 61 6e 20 0a 20 20 69 6d 70 72  ay be an .  impr
3620: 61 63 74 69 63 61 6c 20 61 70 70 72 6f 61 63 68  actical approach
3630: 20 28 74 68 65 20 66 69 72 73 74 20 65 78 61 6d   (the first exam
3640: 70 6c 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65  ple on this page
3650: 20 73 68 6f 77 73 20 74 68 61 74 20 61 20 6c 69   shows that a li
3660: 6e 65 61 72 0a 20 20 73 63 61 6e 20 6f 66 20 31  near.  scan of 1
3670: 2e 35 20 47 42 20 6f 66 20 64 61 74 61 20 74 61  .5 GB of data ta
3680: 6b 65 73 20 61 72 6f 75 6e 64 20 33 30 20 73 65  kes around 30 se
3690: 63 6f 6e 64 73 20 75 73 69 6e 67 20 61 20 6d 6f  conds using a mo
36a0: 64 65 72 6e 20 50 43 29 2e 0a 0a 3c 63 6f 64 65  dern PC)...<code
36b0: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54  block>.  <i>-- T
36c0: 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e 20 74  he examples in t
36d0: 68 69 73 20 62 6c 6f 63 6b 20 61 73 73 75 6d 65  his block assume
36e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 46   the following F
36f0: 54 53 20 74 61 62 6c 65 3a 3c 2f 69 3e 0a 20 20  TS table:</i>.  
3700: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3710: 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20  ABLE mail USING 
3720: 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f  fts3(subject, bo
3730: 64 79 29 3b 0a 0a 20 20 53 45 4c 45 43 54 20 2a  dy);..  SELECT *
3740: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
3750: 20 72 6f 77 69 64 20 3d 20 31 35 3b 20 20 20 20   rowid = 15;    
3760: 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d              <i>-
3770: 2d 20 46 61 73 74 2e 20 52 6f 77 69 64 20 6c 6f  - Fast. Rowid lo
3780: 6f 6b 75 70 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  okup.</i>.  SELE
3790: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
37a0: 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48 20  HERE body MATCH 
37b0: 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20  'sqlite';       
37c0: 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c  <i>-- Fast. Full
37d0: 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e  -text query.</i>
37e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
37f0: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
3800: 20 4d 41 54 43 48 20 27 73 65 61 72 63 68 27 3b   MATCH 'search';
3810: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73         <i>-- Fas
3820: 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65  t. Full-text que
3830: 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ry.</i>.  SELECT
3840: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
3850: 52 45 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e  RE rowid BETWEEN
3860: 20 31 35 20 41 4e 44 20 32 30 3b 20 20 20 3c 69   15 AND 20;   <i
3870: 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72  >-- Slow. Linear
3880: 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c   scan.</i>.  SEL
3890: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20  ECT * FROM mail 
38a0: 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 3d 20  WHERE subject = 
38b0: 27 64 61 74 61 62 61 73 65 27 3b 20 20 20 20 20  'database';     
38c0: 20 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e   <i>-- Slow. Lin
38d0: 65 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20  ear scan.</i>.  
38e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
38f0: 69 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63 74  il WHERE subject
3900: 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65   MATCH 'database
3910: 27 3b 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20  ';  <i>-- Fast. 
3920: 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e  Full-text query.
3930: 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  </i>.</codeblock
3940: 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c 20  >..<p>.  In all 
3950: 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  of the full-text
3960: 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c 20   queries above, 
3970: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  the right-hand o
3980: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d 41  perand of the MA
3990: 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72 20 69  TCH.  operator i
39a0: 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  s a string consi
39b0: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
39c0: 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73 20  e term. In this 
39d0: 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43 48 0a  case, the MATCH.
39e0: 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61    expression eva
39f0: 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 66  luates to true f
3a00: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
3a10: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e   that contain on
3a20: 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e 73  e or more .  ins
3a30: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73 70  tances of the sp
3a40: 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 22 73  ecified word ("s
3a50: 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63 68 22  qlite", "search"
3a60: 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2c 20   or "database", 
3a70: 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e 20  depending .  on 
3a80: 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20 79 6f  which example yo
3a90: 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65 63  u look at). Spec
3aa0: 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  ifying a single 
3ab0: 74 65 72 6d 20 61 73 20 74 68 65 20 72 69 67 68  term as the righ
3ac0: 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64  t-hand.  operand
3ad0: 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70   of the MATCH op
3ae0: 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73 20 69  erator results i
3af0: 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20 61  n the simplest a
3b00: 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 74  nd most common t
3b10: 79 70 65 20 0a 20 20 6f 66 20 66 75 6c 6c 2d 74  ype .  of full-t
3b20: 65 78 74 20 71 75 65 72 79 20 70 6f 73 73 69 62  ext query possib
3b30: 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d 6f 72 65  le. However more
3b40: 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 71 75 65   complicated que
3b50: 72 69 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  ries are possibl
3b60: 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e 67 20 70  e,.  including p
3b70: 68 72 61 73 65 20 73 65 61 72 63 68 65 73 2c 20  hrase searches, 
3b80: 74 65 72 6d 2d 70 72 65 66 69 78 20 73 65 61 72  term-prefix sear
3b90: 63 68 65 73 20 61 6e 64 20 73 65 61 72 63 68 65  ches and searche
3ba0: 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20  s for documents 
3bb0: 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  .  containing co
3bc0: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 65  mbinations of te
3bd0: 72 6d 73 20 6f 63 63 75 72 72 69 6e 67 20 77 69  rms occurring wi
3be0: 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64 20 70  thin a defined p
3bf0: 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68  roximity of each
3c00: 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20 76 61  .  other. The va
3c10: 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20 77 68  rious ways in wh
3c20: 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ich the full-tex
3c30: 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65 20 71  t index may be q
3c40: 75 65 72 69 65 64 20 61 72 65 0a 20 20 5b 46 54  ueried are.  [FT
3c50: 53 20 4d 41 54 43 48 7c 64 65 73 63 72 69 62 65  S MATCH|describe
3c60: 64 20 62 65 6c 6f 77 5d 2e 0a 0a 3c 70 3e 0a 20  d below]...<p>. 
3c70: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 66 75 6c 6c 2d   Normally, full-
3c80: 74 65 78 74 20 71 75 65 72 69 65 73 20 61 72 65  text queries are
3c90: 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
3ca0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  e. However, this
3cb0: 0a 20 20 69 73 20 64 65 70 65 6e 64 65 6e 74 20  .  is dependent 
3cc0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 63 20  on the specific 
3cd0: 5b 74 6f 6b 65 6e 69 7a 65 72 5d 20 75 73 65 64  [tokenizer] used
3ce0: 20 62 79 20 74 68 65 20 46 54 53 20 74 61 62 6c   by the FTS tabl
3cf0: 65 0a 20 20 62 65 69 6e 67 20 71 75 65 72 69 65  e.  being querie
3d00: 64 2e 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  d. Refer to the 
3d10: 73 65 63 74 69 6f 6e 20 6f 6e 20 5b 74 6f 6b 65  section on [toke
3d20: 6e 69 7a 65 72 7c 74 6f 6b 65 6e 69 7a 65 72 73  nizer|tokenizers
3d30: 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a  ] for details...
3d40: 3c 70 3e 0a 20 20 54 68 65 20 70 61 72 61 67 72  <p>.  The paragr
3d50: 61 70 68 20 61 62 6f 76 65 20 6e 6f 74 65 73 20  aph above notes 
3d60: 74 68 61 74 20 61 20 4d 41 54 43 48 20 6f 70 65  that a MATCH ope
3d70: 72 61 74 6f 72 20 77 69 74 68 20 61 20 73 69 6d  rator with a sim
3d80: 70 6c 65 20 74 65 72 6d 20 61 73 20 74 68 65 0a  ple term as the.
3d90: 20 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65    right-hand ope
3da0: 72 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74  rand evaluates t
3db0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  o true for all d
3dc0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
3dd0: 6e 74 61 69 6e 20 74 68 65 0a 20 20 73 70 65 63  ntain the.  spec
3de0: 69 66 69 65 64 20 74 65 72 6d 2e 20 49 6e 20 74  ified term. In t
3df0: 68 69 73 20 63 6f 6e 74 65 78 74 2c 20 74 68 65  his context, the
3e00: 20 22 64 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20   "document" may 
3e10: 72 65 66 65 72 20 74 6f 20 65 69 74 68 65 72 20  refer to either 
3e20: 74 68 65 20 0a 20 20 64 61 74 61 20 73 74 6f 72  the .  data stor
3e30: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 63  ed in a single c
3e40: 6f 6c 75 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f  olumn of a row o
3e50: 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2c 20  f an FTS table, 
3e60: 6f 72 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  or to the conten
3e70: 74 73 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  ts.  of all colu
3e80: 6d 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  mns in a single 
3e90: 72 6f 77 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  row, depending o
3ea0: 6e 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  n the identifier
3eb0: 20 75 73 65 64 20 61 73 20 74 68 65 0a 20 20 6c   used as the.  l
3ec0: 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft-hand operand
3ed0: 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70   to the MATCH op
3ee0: 65 72 61 74 6f 72 2e 20 49 66 20 74 68 65 20 69  erator. If the i
3ef0: 64 65 6e 74 69 66 69 65 72 20 73 70 65 63 69 66  dentifier specif
3f00: 69 65 64 20 61 73 0a 20 20 74 68 65 20 6c 65 66  ied as.  the lef
3f10: 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f  t-hand operand o
3f20: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
3f30: 61 74 6f 72 20 69 73 20 61 6e 20 46 54 53 20 74  ator is an FTS t
3f40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  able column name
3f50: 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 64 6f 63  ,.  then the doc
3f60: 75 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ument that the s
3f70: 65 61 72 63 68 20 74 65 72 6d 20 6d 75 73 74 20  earch term must 
3f80: 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  be contained in 
3f90: 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 73  is the value.  s
3fa0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 70 65  tored in the spe
3fb0: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 48  cified column. H
3fc0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 69  owever, if the i
3fd0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
3fe0: 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46   name.  of the F
3ff0: 54 53 20 3c 69 3e 74 61 62 6c 65 3c 2f 69 3e 20  TS <i>table</i> 
4000: 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74 68 65  itself, then the
4010: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
4020: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
4030: 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
4040: 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
4050: 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e 79 20  e for which any 
4060: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
4070: 74 68 65 20 73 65 61 72 63 68 20 0a 20 20 74 65  the search .  te
4080: 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm. The followin
4090: 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e 73  g example demons
40a0: 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a 3c 63  trates this:..<c
40b0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
40c0: 2d 20 45 78 61 6d 70 6c 65 20 73 63 68 65 6d 61  - Example schema
40d0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
40e0: 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c  RTUAL TABLE mail
40f0: 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a   USING fts3(subj
4100: 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c  ect, body);..  <
4110: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 74 61 62  i>-- Example tab
4120: 6c 65 20 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69  le population</i
4130: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
4140: 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a  mail(docid, subj
4150: 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45  ect, body) VALUE
4160: 53 28 31 2c 20 27 73 6f 66 74 77 61 72 65 20 66  S(1, 'software f
4170: 65 65 64 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64  eedback', 'found
4180: 20 69 74 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a   it too slow');.
4190: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
41a0: 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63  il(docid, subjec
41b0: 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28  t, body) VALUES(
41c0: 32 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65  2, 'software fee
41d0: 64 62 61 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64  dback', 'no feed
41e0: 62 61 63 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54  back');.  INSERT
41f0: 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64   INTO mail(docid
4200: 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  , subject, body)
4210: 20 56 41 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77   VALUES(3, 'slow
4220: 20 6c 75 6e 63 68 20 6f 72 64 65 72 27 2c 20 20   lunch order',  
4230: 27 77 61 73 20 61 20 73 6f 66 74 77 61 72 65 20  'was a software 
4240: 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69  problem');..  <i
4250: 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72  >-- Example quer
4260: 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ies</i>.  SELECT
4270: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
4280: 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43 48  RE subject MATCH
4290: 20 27 73 6f 66 74 77 61 72 65 27 3b 20 20 20 20   'software';    
42a0: 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f  <i>-- Selects ro
42b0: 77 73 20 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20  ws 1 and 2</i>. 
42c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
42d0: 61 69 6c 20 57 48 45 52 45 20 62 6f 64 79 20 20  ail WHERE body  
42e0: 20 20 4d 41 54 43 48 20 27 66 65 65 64 62 61 63    MATCH 'feedbac
42f0: 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  k';    <i>-- Sel
4300: 65 63 74 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20  ects row 2</i>. 
4310: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
4320: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 20  ail WHERE mail  
4330: 20 20 4d 41 54 43 48 20 27 73 6f 66 74 77 61 72    MATCH 'softwar
4340: 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  e';    <i>-- Sel
4350: 65 63 74 73 20 72 6f 77 73 20 31 2c 20 32 20 61  ects rows 1, 2 a
4360: 6e 64 20 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  nd 3</i>.  SELEC
4370: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
4380: 45 52 45 20 6d 61 69 6c 20 20 20 20 4d 41 54 43  ERE mail    MATC
4390: 48 20 27 73 6c 6f 77 27 3b 20 20 20 20 20 20 20  H 'slow';       
43a0: 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72   <i>-- Selects r
43b0: 6f 77 73 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a  ows 1 and 3</i>.
43c0: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 0a  </codeblock>.  .
43d0: 3c 70 3e 0a 20 20 41 74 20 66 69 72 73 74 20 67  <p>.  At first g
43e0: 6c 61 6e 63 65 2c 20 74 68 65 20 66 69 6e 61 6c  lance, the final
43f0: 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78 74 20 71   two full-text q
4400: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 65 78  ueries in the ex
4410: 61 6d 70 6c 65 20 61 62 6f 76 65 20 73 65 65 6d  ample above seem
4420: 0a 20 20 74 6f 20 62 65 20 73 79 6e 74 61 63 74  .  to be syntact
4430: 69 63 61 6c 6c 79 20 69 6e 63 6f 72 72 65 63 74  ically incorrect
4440: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 20  , as there is a 
4450: 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d 61 69  table name ("mai
4460: 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20 61 6e  l") used as.  an
4470: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
4480: 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73   The reason this
4490: 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 69   is acceptable i
44a0: 73 20 74 68 61 74 20 65 61 63 68 20 46 54 53 20  s that each FTS 
44b0: 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c 6c 79  table.  actually
44c0: 20 68 61 73 20 61 20 5b 73 71 6c 69 74 65 33 5f   has a [sqlite3_
44d0: 64 65 63 6c 61 72 65 5f 76 74 61 62 7c 48 49 44  declare_vtab|HID
44e0: 44 45 4e 5d 20 63 6f 6c 75 6d 6e 20 77 69 74 68  DEN] column with
44f0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 0a 20   the same name. 
4500: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 69 74   as the table it
4510: 73 65 6c 66 20 28 69 6e 20 74 68 69 73 20 63 61  self (in this ca
4520: 73 65 2c 20 22 6d 61 69 6c 22 29 2e 20 54 68 65  se, "mail"). The
4530: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
4540: 20 74 68 69 73 0a 20 20 63 6f 6c 75 6d 6e 20 69   this.  column i
4550: 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c  s not meaningful
4560: 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74   to the applicat
4570: 69 6f 6e 2c 20 62 75 74 20 63 61 6e 20 62 65 20  ion, but can be 
4580: 75 73 65 64 20 61 73 20 74 68 65 20 0a 20 20 6c  used as the .  l
4590: 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft-hand operand
45a0: 20 74 6f 20 61 20 4d 41 54 43 48 20 6f 70 65 72   to a MATCH oper
45b0: 61 74 6f 72 2e 20 54 68 69 73 20 73 70 65 63 69  ator. This speci
45c0: 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 61 6c  al column may al
45d0: 73 6f 20 62 65 0a 20 20 70 61 73 73 65 64 20 61  so be.  passed a
45e0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
45f0: 20 74 68 65 20 5b 73 6e 69 70 70 65 74 28 29 7c   the [snippet()|
4600: 46 54 53 20 61 75 78 69 6c 69 61 72 79 20 66 75  FTS auxiliary fu
4610: 6e 63 74 69 6f 6e 73 5d 2e 0a 0a 3c 70 3e 0a 20  nctions]...<p>. 
4620: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   The following e
4630: 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74  xample illustrat
4640: 65 73 20 74 68 65 20 61 62 6f 76 65 2e 20 54 68  es the above. Th
4650: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 22 64  e expressions "d
4660: 6f 63 73 22 2c 20 0a 20 20 22 64 6f 63 73 2e 64  ocs", .  "docs.d
4670: 6f 63 73 22 20 61 6e 64 20 22 6d 61 69 6e 2e 64  ocs" and "main.d
4680: 6f 63 73 2e 64 6f 63 73 22 20 61 6c 6c 20 72 65  ocs.docs" all re
4690: 66 65 72 20 74 6f 20 63 6f 6c 75 6d 6e 20 22 64  fer to column "d
46a0: 6f 63 73 22 2e 20 48 6f 77 65 76 65 72 2c 20 74  ocs". However, t
46b0: 68 65 20 0a 20 20 65 78 70 72 65 73 73 69 6f 6e  he .  expression
46c0: 20 22 6d 61 69 6e 2e 64 6f 63 73 22 20 64 6f 65   "main.docs" doe
46d0: 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  s not refer to a
46e0: 6e 79 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 63 6f  ny column. It co
46f0: 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 0a  uld be used to .
4700: 20 20 72 65 66 65 72 20 74 6f 20 61 20 74 61 62    refer to a tab
4710: 6c 65 2c 20 62 75 74 20 61 20 74 61 62 6c 65 20  le, but a table 
4720: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  name is not allo
4730: 77 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  wed in the conte
4740: 78 74 20 69 6e 20 77 68 69 63 68 0a 20 20 69 74  xt in which.  it
4750: 20 69 73 20 75 73 65 64 20 62 65 6c 6f 77 2e 0a   is used below..
4760: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
4770: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73 63 68  i>-- Example sch
4780: 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ema</i>.  CREATE
4790: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
47a0: 6f 63 73 20 55 53 49 4e 47 20 66 74 73 34 28 63  ocs USING fts4(c
47b0: 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d  ontent);..  <i>-
47c0: 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72 69 65  - Example querie
47d0: 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  s</i>.  SELECT *
47e0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
47f0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
4800: 69 74 65 27 3b 20 20 20 20 20 20 20 20 20 20 20  ite';           
4810: 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e     <i>-- OK.</i>
4820: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
4830: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
4840: 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c  .docs MATCH 'sql
4850: 69 74 65 27 3b 20 20 20 20 20 20 20 20 20 3c 69  ite';         <i
4860: 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45  >-- OK.</i>.  SE
4870: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
4880: 20 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73   WHERE main.docs
4890: 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c  .docs MATCH 'sql
48a0: 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 4f  ite';    <i>-- O
48b0: 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  K.</i>.  SELECT 
48c0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
48d0: 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d 41 54 43  E main.docs MATC
48e0: 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20  H 'sqlite';     
48f0: 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72 6f 72 2e      <i>-- Error.
4900: 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  </i>.</codeblock
4910: 3e 0a 20 0a 3c 68 32 3e 53 75 6d 6d 61 72 79 3c  >. .<h2>Summary<
4920: 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 72 6f 6d  /h2>..<p>.  From
4930: 20 74 68 65 20 75 73 65 72 73 20 70 6f 69 6e 74   the users point
4940: 20 6f 66 20 76 69 65 77 2c 20 46 54 53 20 74 61   of view, FTS ta
4950: 62 6c 65 73 20 61 72 65 20 73 69 6d 69 6c 61 72  bles are similar
4960: 20 74 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c   to ordinary SQL
4970: 69 74 65 0a 20 20 74 61 62 6c 65 73 20 69 6e 20  ite.  tables in 
4980: 6d 61 6e 79 20 77 61 79 73 2e 20 44 61 74 61 20  many ways. Data 
4990: 6d 61 79 20 62 65 20 61 64 64 65 64 20 74 6f 2c  may be added to,
49a0: 20 6d 6f 64 69 66 69 65 64 20 77 69 74 68 69 6e   modified within
49b0: 20 61 6e 64 20 72 65 6d 6f 76 65 64 20 0a 20 20   and removed .  
49c0: 66 72 6f 6d 20 46 54 53 20 74 61 62 6c 65 73 20  from FTS tables 
49d0: 75 73 69 6e 67 20 74 68 65 20 49 4e 53 45 52 54  using the INSERT
49e0: 2c 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c  , UPDATE and DEL
49f0: 45 54 45 20 63 6f 6d 6d 61 6e 64 73 20 6a 75 73  ETE commands jus
4a00: 74 20 61 73 20 0a 20 20 69 74 20 6d 61 79 20 62  t as .  it may b
4a10: 65 20 77 69 74 68 20 6f 72 64 69 6e 61 72 79 20  e with ordinary 
4a20: 74 61 62 6c 65 73 2e 20 53 69 6d 69 6c 61 72 6c  tables. Similarl
4a30: 79 2c 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  y, the SELECT co
4a40: 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20 75 73 65  mmand may be use
4a50: 64 20 0a 20 20 74 6f 20 71 75 65 72 79 20 64 61  d .  to query da
4a60: 74 61 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ta. The followin
4a70: 67 20 6c 69 73 74 20 73 75 6d 6d 61 72 69 7a 65  g list summarize
4a80: 73 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  s the difference
4a90: 73 20 62 65 74 77 65 65 6e 20 46 54 53 0a 20 20  s between FTS.  
4aa0: 61 6e 64 20 6f 72 64 69 6e 61 72 79 20 74 61 62  and ordinary tab
4ab0: 6c 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  les:..<ol>.  <li
4ac0: 3e 3c 70 3e 20 0a 20 20 20 20 41 73 20 77 69 74  ><p> .    As wit
4ad0: 68 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  h all virtual ta
4ae0: 62 6c 65 20 74 79 70 65 73 2c 20 69 74 20 69 73  ble types, it is
4af0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
4b00: 20 63 72 65 61 74 65 20 69 6e 64 69 63 65 73 20   create indices 
4b10: 6f 72 0a 20 20 20 20 74 72 69 67 67 65 72 73 20  or.    triggers 
4b20: 61 74 74 61 63 68 65 64 20 74 6f 20 46 54 53 20  attached to FTS 
4b30: 74 61 62 6c 65 73 2e 20 4e 6f 72 20 69 73 20 69  tables. Nor is i
4b40: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
4b50: 65 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c  e the ALTER TABL
4b60: 45 0a 20 20 20 20 63 6f 6d 6d 61 6e 64 20 74 6f  E.    command to
4b70: 20 61 64 64 20 65 78 74 72 61 20 63 6f 6c 75 6d   add extra colum
4b80: 6e 73 20 74 6f 20 46 54 53 20 74 61 62 6c 65 73  ns to FTS tables
4b90: 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 69 73   (although it is
4ba0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
4bb0: 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45  .    ALTER TABLE
4bc0: 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e 20 46 54   to rename an FT
4bd0: 53 20 74 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c 69  S table)...  <li
4be0: 3e 3c 70 3e 20 0a 20 20 20 20 44 61 74 61 2d 74  ><p> .    Data-t
4bf0: 79 70 65 73 20 73 70 65 63 69 66 69 65 64 20 61  ypes specified a
4c00: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 43  s part of the "C
4c10: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4c20: 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 0a 20  BLE" statement. 
4c30: 20 20 20 75 73 65 64 20 74 6f 20 63 72 65 61 74     used to creat
4c40: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 61  e an FTS table a
4c50: 72 65 20 69 67 6e 6f 72 65 64 20 63 6f 6d 70 6c  re ignored compl
4c60: 65 74 65 6c 79 2e 20 49 6e 73 74 65 61 64 20 6f  etely. Instead o
4c70: 66 20 74 68 65 0a 20 20 20 20 6e 6f 72 6d 61 6c  f the.    normal
4c80: 20 72 75 6c 65 73 20 66 6f 72 20 61 70 70 6c 79   rules for apply
4c90: 69 6e 67 20 74 79 70 65 20 5b 61 66 66 69 6e 69  ing type [affini
4ca0: 74 79 5d 20 74 6f 20 69 6e 73 65 72 74 65 64 20  ty] to inserted 
4cb0: 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20 20 20  values, all.    
4cc0: 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20  values inserted 
4cd0: 69 6e 74 6f 20 46 54 53 20 74 61 62 6c 65 20 63  into FTS table c
4ce0: 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74 20 74  olumns (except t
4cf0: 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77 69 64  he special rowid
4d00: 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61 72 65  .    column) are
4d10: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 79   converted to ty
4d20: 70 65 20 54 45 58 54 20 62 65 66 6f 72 65 20 62  pe TEXT before b
4d30: 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a 20 20  eing stored...  
4d40: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46 54 53  <li><p> .    FTS
4d50: 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74 20 74   tables permit t
4d60: 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69 61 73  he special alias
4d70: 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65 20 75   "docid" to be u
4d80: 73 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  sed to refer to 
4d90: 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20 63 6f  the.    rowid co
4da0: 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64 20 62  lumn supported b
4db0: 79 20 61 6c 6c 20 5b 76 69 72 74 75 61 6c 20 74  y all [virtual t
4dc0: 61 62 6c 65 73 5d 2e 0a 0a 20 20 3c 6c 69 3e 3c  ables]...  <li><
4dd0: 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46 54 53  p> .    The [FTS
4de0: 20 4d 41 54 43 48 5d 20 6f 70 65 72 61 74 6f 72   MATCH] operator
4df0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
4e00: 72 20 71 75 65 72 69 65 73 20 62 61 73 65 64 20  r queries based 
4e10: 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0a  on the built-in.
4e20: 20 20 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e      full-text in
4e30: 64 65 78 2e 20 0a 0a 20 20 3c 6c 69 3e 3c 70 3e  dex. ..  <li><p>
4e40: 20 0a 20 20 20 20 54 68 65 20 5b 46 54 53 20 61   .    The [FTS a
4e50: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
4e60: 6e 73 5d 2c 20 5b 73 6e 69 70 70 65 74 28 29 5d  ns], [snippet()]
4e70: 2c 20 5b 6f 66 66 73 65 74 73 28 29 5d 2c 20 61  , [offsets()], a
4e80: 6e 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d  nd [matchinfo()]
4e90: 20 61 72 65 20 0a 20 20 20 20 61 76 61 69 6c 61   are .    availa
4ea0: 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 66  ble to support f
4eb0: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
4ec0: 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20  ...  <li><p>.   
4ed0: 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e   <tcl>hd_fragmen
4ee0: 74 20 68 69 64 64 65 6e 63 6f 6c 20 7b 46 54 53  t hiddencol {FTS
4ef0: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 7d 3c   hidden column}<
4f00: 2f 74 63 6c 3e 0a 20 20 20 20 45 76 65 72 79 20  /tcl>.    Every 
4f10: 46 54 53 20 74 61 62 6c 65 20 68 61 73 20 61 20  FTS table has a 
4f20: 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20  [hidden column] 
4f30: 77 69 74 68 20 74 68 65 20 0a 20 20 20 20 73 61  with the .    sa
4f40: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  me name as the t
4f50: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54 68 65  able itself. The
4f60: 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 65 64   value contained
4f70: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66 6f 72   in each row for
4f80: 20 74 68 65 0a 20 20 20 20 68 69 64 64 65 6e 20   the.    hidden 
4f90: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
4fa0: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 75 73   that is only us
4fb0: 65 66 75 6c 20 61 73 20 74 68 65 20 6c 65 66 74  eful as the left
4fc0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 0a 20 20   operand of a.  
4fd0: 20 20 5b 46 54 53 20 4d 41 54 43 48 7c 4d 41 54    [FTS MATCH|MAT
4fe0: 43 48 5d 20 6f 70 65 72 61 74 6f 72 2c 20 6f 72  CH] operator, or
4ff0: 20 61 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   as the left-mos
5000: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 6e  t argument to on
5010: 65 0a 20 20 20 20 6f 66 20 74 68 65 20 5b 46 54  e.    of the [FT
5020: 53 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  S auxiliary func
5030: 74 69 6f 6e 73 5d 2e 0a 20 20 20 20 0a 0a 3c 2f  tions]..    ..</
5040: 6f 6c 3e 0a 0a 0a 3c 68 31 20 74 61 67 73 3d 22  ol>...<h1 tags="
5050: 63 6f 6d 70 69 6c 65 20 66 74 73 22 3e 43 6f 6d  compile fts">Com
5060: 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61 62 6c  piling and Enabl
5070: 69 6e 67 20 46 54 53 33 20 61 6e 64 20 46 54 53  ing FTS3 and FTS
5080: 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6c  4</h1>..<p>.  Al
5090: 74 68 6f 75 67 68 20 46 54 53 33 20 61 6e 64 20  though FTS3 and 
50a0: 46 54 53 34 20 61 72 65 20 69 6e 63 6c 75 64 65  FTS4 are include
50b0: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 69 74  d with the SQLit
50c0: 65 20 63 6f 72 65 20 73 6f 75 72 63 65 20 63 6f  e core source co
50d0: 64 65 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  de, they are not
50e0: 0a 20 20 65 6e 61 62 6c 65 64 20 62 79 20 64 65  .  enabled by de
50f0: 66 61 75 6c 74 2e 20 54 6f 20 62 75 69 6c 64 20  fault. To build 
5100: 53 51 4c 69 74 65 20 77 69 74 68 20 46 54 53 20  SQLite with FTS 
5110: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 65 6e  functionality en
5120: 61 62 6c 65 64 2c 20 64 65 66 69 6e 65 0a 20 20  abled, define.  
5130: 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72  the preprocessor
5140: 20 6d 61 63 72 6f 20 5b 53 51 4c 49 54 45 5f 45   macro [SQLITE_E
5150: 4e 41 42 4c 45 5f 46 54 53 33 5d 20 77 68 65 6e  NABLE_FTS3] when
5160: 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65 77 20   compiling. New 
5170: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 73  applications.  s
5180: 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66 69 6e  hould also defin
5190: 65 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 45 4e  e the [SQLITE_EN
51a0: 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54  ABLE_FTS3_PARENT
51b0: 48 45 53 49 53 5d 20 6d 61 63 72 6f 20 74 6f 20  HESIS] macro to 
51c0: 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5b 65 6e  enable the.  [en
51d0: 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e  hanced query syn
51e0: 74 61 78 5d 20 28 73 65 65 20 62 65 6c 6f 77 29  tax] (see below)
51f0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
5200: 69 73 20 64 6f 6e 65 20 62 79 20 61 64 64 69 6e  is done by addin
5210: 67 20 74 68 65 20 0a 20 20 66 6f 6c 6c 6f 77 69  g the .  followi
5220: 6e 67 20 74 77 6f 20 73 77 69 74 63 68 65 73 20  ng two switches 
5230: 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  to the compiler 
5240: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 3a 0a 0a 3c  command line:..<
5250: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 2d 44 53  codeblock>.  -DS
5260: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
5270: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
5280: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
5290: 45 53 49 53 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ESIS.</codeblock
52a0: 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 74 65 20 74 68  >..<p>.  Note th
52b0: 61 74 20 65 6e 61 62 6c 69 6e 67 20 46 54 53 33  at enabling FTS3
52c0: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 46 54 53 34   also makes FTS4
52d0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 65   available.  The
52e0: 72 65 20 69 73 20 6e 6f 74 20 61 20 73 65 70 61  re is not a sepa
52f0: 72 61 74 65 0a 20 20 53 51 4c 49 54 45 5f 45 4e  rate.  SQLITE_EN
5300: 41 42 4c 45 5f 46 54 53 34 20 63 6f 6d 70 69 6c  ABLE_FTS4 compil
5310: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  e-time option.  
5320: 41 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  A build of SQLit
5330: 65 20 65 69 74 68 65 72 20 73 75 70 70 6f 72 74  e either support
5340: 73 0a 20 20 62 6f 74 68 20 46 54 53 33 20 61 6e  s.  both FTS3 an
5350: 64 20 46 54 53 34 20 6f 72 20 69 74 20 73 75 70  d FTS4 or it sup
5360: 70 6f 72 74 73 20 6e 65 69 74 68 65 72 2e 0a 0a  ports neither...
5370: 3c 70 3e 0a 20 20 49 66 20 75 73 69 6e 67 20 74  <p>.  If using t
5380: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
5390: 61 75 74 6f 63 6f 6e 66 20 62 61 73 65 64 20 62  autoconf based b
53a0: 75 69 6c 64 20 73 79 73 74 65 6d 2c 20 73 65 74  uild system, set
53b0: 74 69 6e 67 20 74 68 65 20 43 50 50 46 4c 41 47  ting the CPPFLAG
53c0: 53 0a 20 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  S.  environment 
53d0: 76 61 72 69 61 62 6c 65 20 77 68 69 6c 65 20 72  variable while r
53e0: 75 6e 6e 69 6e 67 20 74 68 65 20 27 63 6f 6e 66  unning the 'conf
53f0: 69 67 75 72 65 27 20 73 63 72 69 70 74 20 69 73  igure' script is
5400: 20 61 6e 20 65 61 73 79 0a 20 20 77 61 79 20 74   an easy.  way t
5410: 6f 20 73 65 74 20 74 68 65 73 65 20 6d 61 63 72  o set these macr
5420: 6f 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  os. For example,
5430: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
5440: 6f 6d 6d 61 6e 64 3a 0a 0a 3c 63 6f 64 65 62 6c  ommand:..<codebl
5450: 6f 63 6b 3e 0a 20 20 43 50 50 46 4c 41 47 53 3d  ock>.  CPPFLAGS=
5460: 22 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  "-DSQLITE_ENABLE
5470: 5f 46 54 53 33 20 2d 44 53 51 4c 49 54 45 5f 45  _FTS3 -DSQLITE_E
5480: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
5490: 54 48 45 53 49 53 22 20 2e 2f 63 6f 6e 66 69 67  THESIS" ./config
54a0: 75 72 65 20 26 6c 74 3b 63 6f 6e 66 69 67 75 72  ure &lt;configur
54b0: 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 0a 3c 2f  e options&gt;.</
54c0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
54d0: 20 20 77 68 65 72 65 20 3c 69 3e 26 6c 74 3b 63    where <i>&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 3c 2f 69 3e 20 61 72 65 20 74 68 6f  &gt;</i> are tho
5500: 73 65 20 6f 70 74 69 6f 6e 73 20 6e 6f 72 6d 61  se options norma
5510: 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 0a 20 20  lly passed to.  
5520: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 20 73 63  the configure sc
5530: 72 69 70 74 2c 20 69 66 20 61 6e 79 2e 0a 0a 3c  ript, if any...<
5540: 70 3e 0a 20 20 42 65 63 61 75 73 65 20 46 54 53  p>.  Because FTS
5550: 33 20 61 6e 64 20 46 54 53 34 20 61 72 65 20 76  3 and FTS4 are v
5560: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 54  irtual tables, T
5570: 68 65 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42 4c  he [SQLITE_ENABL
5580: 45 5f 46 54 53 33 5d 20 63 6f 6d 70 69 6c 65 2d  E_FTS3] compile-
5590: 74 69 6d 65 20 6f 70 74 69 6f 6e 0a 20 20 69 73  time option.  is
55a0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 77 69   incompatible wi
55b0: 74 68 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 4f  th the [SQLITE_O
55c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
55d0: 5d 20 6f 70 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a 20  ] option...<p>. 
55e0: 20 49 66 20 61 20 62 75 69 6c 64 20 6f 66 20 53   If a build of S
55f0: 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 69  QLite does not i
5600: 6e 63 6c 75 64 65 20 74 68 65 20 46 54 53 20 6d  nclude the FTS m
5610: 6f 64 75 6c 65 73 2c 20 74 68 65 6e 20 61 6e 79  odules, then any
5620: 20 61 74 74 65 6d 70 74 20 74 6f 20 70 72 65 70   attempt to prep
5630: 61 72 65 20 61 6e 0a 20 20 53 51 4c 20 73 74 61  are an.  SQL sta
5640: 74 65 6d 65 6e 74 20 74 6f 20 63 72 65 61 74 65  tement to create
5650: 20 61 6e 20 46 54 53 33 20 6f 72 20 46 54 53 34   an FTS3 or FTS4
5660: 20 74 61 62 6c 65 20 6f 72 20 74 6f 20 64 72 6f   table or to dro
5670: 70 20 6f 72 20 61 63 63 65 73 73 20 61 6e 20 65  p or access an e
5680: 78 69 73 74 69 6e 67 20 0a 20 20 46 54 53 20 74  xisting .  FTS t
5690: 61 62 6c 65 20 69 6e 20 61 6e 79 20 77 61 79 20  able in any way 
56a0: 77 69 6c 6c 20 66 61 69 6c 2e 20 54 68 65 20 65  will fail. The e
56b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65 74  rror message ret
56c0: 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 69  urned will be si
56d0: 6d 69 6c 61 72 20 0a 20 20 74 6f 20 22 6e 6f 20  milar .  to "no 
56e0: 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 66 74 73  such module: fts
56f0: 4e 22 20 28 77 68 65 72 65 20 4e 20 69 73 20 65  N" (where N is e
5700: 69 74 68 65 72 20 33 20 6f 72 20 34 29 2e 0a 0a  ither 3 or 4)...
5710: 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 43 20 76  <p>.  If the C v
5720: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 3c 61  ersion of the <a
5730: 20 68 72 65 66 3d 68 74 74 70 3a 2f 2f 73 69 74   href=http://sit
5740: 65 2e 69 63 75 2d 70 72 6f 6a 65 63 74 2e 6f 72  e.icu-project.or
5750: 67 2f 3e 49 43 55 20 6c 69 62 72 61 72 79 3c 2f  g/>ICU library</
5760: 61 3e 0a 20 20 69 73 20 61 76 61 69 6c 61 62 6c  a>.  is availabl
5770: 65 2c 20 74 68 65 6e 20 46 54 53 20 6d 61 79 20  e, then FTS may 
5780: 61 6c 73 6f 20 62 65 20 63 6f 6d 70 69 6c 65 64  also be compiled
5790: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
57a0: 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 70 72  _ENABLE_ICU.  pr
57b0: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
57c0: 6f 20 64 65 66 69 6e 65 64 2e 20 43 6f 6d 70 69  o defined. Compi
57d0: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 20 6d  ling with this m
57e0: 61 63 72 6f 20 65 6e 61 62 6c 65 73 20 61 6e 20  acro enables an 
57f0: 46 54 53 0a 20 20 5b 74 6f 6b 65 6e 69 7a 65 72  FTS.  [tokenizer
5800: 5d 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  ] that uses the 
5810: 49 43 55 20 6c 69 62 72 61 72 79 20 74 6f 20 73  ICU library to s
5820: 70 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e 74 20  plit a document 
5830: 69 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28 77 6f  into terms.  (wo
5840: 72 64 73 29 20 75 73 69 6e 67 20 74 68 65 20 63  rds) using the c
5850: 6f 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72 20 61  onventions for a
5860: 20 73 70 65 63 69 66 69 65 64 20 6c 61 6e 67 75   specified langu
5870: 61 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65 2e 0a  age and locale..
5880: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 2d  .<codeblock>.  -
5890: 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  DSQLITE_ENABLE_I
58a0: 43 55 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  CU.</codeblock>.
58b0: 20 20 0a 0a 3c 68 31 20 74 61 67 73 3d 22 46 54    ..<h1 tags="FT
58c0: 53 20 4d 41 54 43 48 22 3e 46 75 6c 6c 2d 74 65  S MATCH">Full-te
58d0: 78 74 20 49 6e 64 65 78 20 51 75 65 72 69 65 73  xt Index Queries
58e0: 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h1>..<p>.  The
58f0: 20 6d 6f 73 74 20 75 73 65 66 75 6c 20 74 68 69   most useful thi
5900: 6e 67 20 61 62 6f 75 74 20 46 54 53 20 74 61 62  ng about FTS tab
5910: 6c 65 73 20 69 73 20 74 68 65 20 71 75 65 72 69  les is the queri
5920: 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 0a  es that may be .
5930: 20 20 70 65 72 66 6f 72 6d 65 64 20 75 73 69 6e    performed usin
5940: 67 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66  g the built-in f
5950: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
5960: 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  Full-text querie
5970: 73 20 61 72 65 20 0a 20 20 70 65 72 66 6f 72 6d  s are .  perform
5980: 65 64 20 62 79 20 73 70 65 63 69 66 79 69 6e 67  ed by specifying
5990: 20 61 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65   a clause of the
59a0: 20 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b 63 6f   form .  "&lt;co
59b0: 6c 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20 26  lumn&gt; MATCH &
59c0: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
59d0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
59e0: 3b 22 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ;" as part of th
59f0: 65 20 57 48 45 52 45 20 0a 20 20 63 6c 61 75 73  e WHERE .  claus
5a00: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
5a10: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65 61  atement that rea
5a20: 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ds data from an 
5a30: 46 54 53 20 74 61 62 6c 65 2e 20 0a 20 20 5b 73  FTS table. .  [s
5a40: 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65  imple fts querie
5a50: 73 7c 53 69 6d 70 6c 65 20 46 54 53 20 71 75 65  s|Simple FTS que
5a60: 72 69 65 73 5d 20 74 68 61 74 20 72 65 74 75 72  ries] that retur
5a70: 6e 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  n all documents 
5a80: 74 68 61 74 20 0a 20 20 63 6f 6e 74 61 69 6e 20  that .  contain 
5a90: 61 20 67 69 76 65 6e 20 74 65 72 6d 20 61 72 65  a given term are
5aa0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
5ab0: 2e 20 49 6e 20 74 68 61 74 20 64 69 73 63 75 73  . In that discus
5ac0: 73 69 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  sion the right-h
5ad0: 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64 20 6f 66  and.  operand of
5ae0: 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61   the MATCH opera
5af0: 74 6f 72 20 77 61 73 20 61 73 73 75 6d 65 64 20  tor was assumed 
5b00: 74 6f 20 62 65 20 61 20 73 74 72 69 6e 67 20 63  to be a string c
5b10: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 0a 20  onsisting of a. 
5b20: 20 73 69 6e 67 6c 65 20 74 65 72 6d 2e 20 54 68   single term. Th
5b30: 69 73 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72  is section descr
5b40: 69 62 65 73 20 74 68 65 20 6d 6f 72 65 20 63 6f  ibes the more co
5b50: 6d 70 6c 65 78 20 71 75 65 72 79 20 74 79 70 65  mplex query type
5b60: 73 20 73 75 70 70 6f 72 74 65 64 20 0a 20 20 62  s supported .  b
5b70: 79 20 46 54 53 20 74 61 62 6c 65 73 2c 20 61 6e  y FTS tables, an
5b80: 64 20 68 6f 77 20 74 68 65 79 20 6d 61 79 20 62  d how they may b
5b90: 65 20 75 74 69 6c 69 7a 65 64 20 62 79 20 73 70  e utilized by sp
5ba0: 65 63 69 66 79 69 6e 67 20 61 20 6d 6f 72 65 0a  ecifying a more.
5bb0: 20 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79 20    complex query 
5bc0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 74 68  expression as th
5bd0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
5be0: 72 61 6e 64 20 6f 66 20 61 20 4d 41 54 43 48 20  rand of a MATCH 
5bf0: 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20  operator...<p>. 
5c00: 20 46 54 53 20 74 61 62 6c 65 73 20 73 75 70 70   FTS tables supp
5c10: 6f 72 74 20 74 68 72 65 65 20 62 61 73 69 63 20  ort three basic 
5c20: 71 75 65 72 79 20 74 79 70 65 73 3a 0a 0a 3c 75  query types:..<u
5c30: 6c 3e 0a 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61  l>.  <tcl>hd_fra
5c40: 67 6d 65 6e 74 20 74 65 72 6d 70 72 65 66 69 78  gment termprefix
5c50: 20 7b 70 72 65 66 69 78 20 71 75 65 72 79 7d 20   {prefix query} 
5c60: 7b 70 72 65 66 69 78 20 71 75 65 72 69 65 73 7d  {prefix queries}
5c70: 3c 2f 74 63 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e  </tcl>.  <li><p>
5c80: 3c 62 3e 54 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  <b>Token or toke
5c90: 6e 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73  n prefix queries
5ca0: 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 6e 20 46 54  </b>. .    An FT
5cb0: 53 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 71  S table may be q
5cc0: 75 65 72 69 65 64 20 66 6f 72 20 61 6c 6c 20 64  ueried for all d
5cd0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
5ce0: 6e 74 61 69 6e 20 61 20 73 70 65 63 69 66 69 65  ntain a specifie
5cf0: 64 0a 20 20 20 20 74 65 72 6d 20 28 74 68 65 20  d.    term (the 
5d00: 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72  [simple fts quer
5d10: 69 65 73 7c 73 69 6d 70 6c 65 20 63 61 73 65 5d  ies|simple case]
5d20: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
5d30: 29 2c 20 6f 72 20 66 6f 72 0a 20 20 20 20 61 6c  ), or for.    al
5d40: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
5d50: 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20   contain a term 
5d60: 77 69 74 68 20 61 20 73 70 65 63 69 66 69 65 64  with a specified
5d70: 20 70 72 65 66 69 78 2e 20 41 73 20 77 65 20 68   prefix. As we h
5d80: 61 76 65 0a 20 20 20 20 73 65 65 6e 2c 20 74 68  ave.    seen, th
5d90: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
5da0: 6f 6e 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  on for a specifi
5db0: 63 20 74 65 72 6d 20 69 73 20 73 69 6d 70 6c 79  c term is simply
5dc0: 20 74 68 65 20 74 65 72 6d 20 69 74 73 65 6c 66   the term itself
5dd0: 2e 0a 20 20 20 20 54 68 65 20 71 75 65 72 79 20  ..    The query 
5de0: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
5df0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 61 20  to search for a 
5e00: 74 65 72 6d 20 70 72 65 66 69 78 20 69 73 20 74  term prefix is t
5e10: 68 65 20 70 72 65 66 69 78 0a 20 20 20 20 69 74  he prefix.    it
5e20: 73 65 6c 66 20 77 69 74 68 20 61 20 27 2a 27 20  self with a '*' 
5e30: 63 68 61 72 61 63 74 65 72 20 61 70 70 65 6e 64  character append
5e40: 65 64 20 74 6f 20 69 74 2e 20 46 6f 72 20 65 78  ed to it. For ex
5e50: 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63  ample:.</ul>..<c
5e60: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
5e70: 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  - Virtual table 
5e80: 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a  declaration</i>.
5e90: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
5ea0: 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e   TABLE docs USIN
5eb0: 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20 62 6f  G fts3(title, bo
5ec0: 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  dy);..  <i>-- Qu
5ed0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
5ee0: 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  ments containing
5ef0: 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78   the term "linux
5f00: 22 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ":</i>.  SELECT 
5f10: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
5f20: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69  E docs MATCH 'li
5f30: 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  nux';..  <i>-- Q
5f40: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
5f50: 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e  uments containin
5f60: 67 20 61 20 74 65 72 6d 20 77 69 74 68 20 74 68  g a term with th
5f70: 65 20 70 72 65 66 69 78 20 22 6c 69 6e 22 2e 20  e prefix "lin". 
5f80: 54 68 69 73 20 77 69 6c 6c 20 6d 61 74 63 68 3c  This will match<
5f90: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6c 6c 20  /i>.  <i>-- all 
5fa0: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
5fb0: 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22 2c 20  ontain "linux", 
5fc0: 62 75 74 20 61 6c 73 6f 20 74 68 6f 73 65 20 74  but also those t
5fd0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d  hat contain term
5fe0: 73 20 22 6c 69 6e 65 61 72 22 2c 3c 2f 69 3e 0a  s "linear",</i>.
5ff0: 20 20 3c 69 3e 2d 2d 22 6c 69 6e 6b 65 72 22 2c    <i>--"linker",
6000: 20 22 6c 69 6e 67 75 69 73 74 69 63 22 20 61 6e   "linguistic" an
6010: 64 20 73 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20 20 53  d so on.</i>.  S
6020: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
6030: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
6040: 43 48 20 27 6c 69 6e 2a 27 3b 0a 3c 2f 63 6f 64  CH 'lin*';.</cod
6050: 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20  eblock>..<ul>.  
6060: 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d  <li style="list-
6070: 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a  style:none"><p>.
6080: 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20      Normally, a 
6090: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
60a0: 72 65 66 69 78 20 71 75 65 72 79 20 69 73 20 6d  refix query is m
60b0: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
60c0: 68 65 20 46 54 53 20 74 61 62 6c 65 20 0a 20 20  he FTS table .  
60d0: 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69    column specifi
60e0: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ed as the right-
60f0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
6100: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
6110: 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20   Or, if the.    
6120: 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 77  special column w
6130: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
6140: 65 20 61 73 20 74 68 65 20 46 54 53 20 74 61 62  e as the FTS tab
6150: 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73 70 65  le itself is spe
6160: 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67 61 69  cified,.    agai
6170: 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2e  nst all columns.
6180: 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f 76 65   This may be ove
6190: 72 72 69 64 64 65 6e 20 62 79 20 73 70 65 63 69  rridden by speci
61a0: 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 2d 6e  fying a column-n
61b0: 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77 65 64  ame.    followed
61c0: 20 62 79 20 61 20 22 3a 22 20 63 68 61 72 61 63   by a ":" charac
61d0: 74 65 72 20 62 65 66 6f 72 65 20 61 20 62 61 73  ter before a bas
61e0: 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e 20 54  ic term query. T
61f0: 68 65 72 65 20 6d 61 79 20 62 65 20 73 70 61 63  here may be spac
6200: 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20 74 68  e.    between th
6210: 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20 74 65  e ":" and the te
6220: 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72 2c  rm to query for,
6230: 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65 65 6e   but not between
6240: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61 6d 65   the column-name
6250: 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22 3a 22  .    and the ":"
6260: 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f 72 20   character. For 
6270: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 20  example:.</ul>. 
6280: 20 20 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20    .<codeblock>. 
6290: 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 74 68 65   <i>-- Query the
62a0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 64 6f   database for do
62b0: 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68 69 63  cuments for whic
62c0: 68 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75  h the term "linu
62d0: 78 22 20 61 70 70 65 61 72 73 20 69 6e 3c 2f 69  x" appears in</i
62e0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f  >.  <i>-- the do
62f0: 63 75 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e  cument title, an
6300: 64 20 74 68 65 20 74 65 72 6d 20 22 70 72 6f 62  d the term "prob
6310: 6c 65 6d 73 22 20 61 70 70 65 61 72 73 20 69 6e  lems" appears in
6320: 20 65 69 74 68 65 72 20 74 68 65 20 74 69 74 6c   either the titl
6330: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72  e</i>.  <i>-- or
6340: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63   body of the doc
6350: 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c  ument.</i>.  SEL
6360: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
6370: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
6380: 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 70 72   'title:linux pr
6390: 6f 62 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e 2d  oblems';..  <i>-
63a0: 2d 20 51 75 65 72 79 20 74 68 65 20 64 61 74 61  - Query the data
63b0: 62 61 73 65 20 66 6f 72 20 64 6f 63 75 6d 65 6e  base for documen
63c0: 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ts for which the
63d0: 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 20 61 70   term "linux" ap
63e0: 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c  pears in</i>.  <
63f0: 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75 6d 65 6e  i>-- the documen
6400: 74 20 74 69 74 6c 65 2c 20 61 6e 64 20 74 68 65  t title, and the
6410: 20 74 65 72 6d 20 22 64 72 69 76 65 72 22 20 61   term "driver" a
6420: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 62 6f  ppears in the bo
6430: 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  dy of the docume
6440: 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 28  nt</i>.  <i>-- (
6450: 22 64 72 69 76 65 72 22 20 6d 61 79 20 61 6c 73  "driver" may als
6460: 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  o appear in the 
6470: 74 69 74 6c 65 2c 20 62 75 74 20 74 68 69 73 20  title, but this 
6480: 61 6c 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 73  alone will not s
6490: 61 74 69 73 66 79 20 74 68 65 3c 2f 69 3e 2e 0a  atisfy the</i>..
64a0: 20 20 3c 69 3e 2d 2d 20 71 75 65 72 79 20 63 72    <i>-- query cr
64b0: 69 74 65 72 69 61 29 2e 3c 2f 69 3e 0a 20 20 53  iteria).</i>.  S
64c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
64d0: 73 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54  s WHERE body MAT
64e0: 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20  CH 'title:linux 
64f0: 64 72 69 76 65 72 27 3b 0a 3c 2f 63 6f 64 65 62  driver';.</codeb
6500: 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  lock>..<ul>.  <l
6510: 69 3e 3c 70 3e 3c 62 3e 50 68 72 61 73 65 20 71  i><p><b>Phrase q
6520: 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20 20 20 20  ueries</b>..    
6530: 41 20 70 68 72 61 73 65 20 71 75 65 72 79 20 69  A phrase query i
6540: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 72  s a query that r
6550: 65 74 72 69 65 76 65 73 20 61 6c 6c 20 64 6f 63  etrieves all doc
6560: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
6570: 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d 69 6e 61  ain a.    nomina
6580: 74 65 64 20 73 65 74 20 6f 66 20 74 65 72 6d 73  ted set of terms
6590: 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 65   or term prefixe
65a0: 73 20 69 6e 20 61 20 73 70 65 63 69 66 69 65 64  s in a specified
65b0: 20 6f 72 64 65 72 20 77 69 74 68 20 6e 6f 0a 20   order with no. 
65c0: 20 20 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74     intervening t
65d0: 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65 20 71 75  okens. Phrase qu
65e0: 65 72 69 65 73 20 61 72 65 20 73 70 65 63 69 66  eries are specif
65f0: 69 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e 67  ied by enclosing
6600: 20 61 20 73 70 61 63 65 0a 20 20 20 20 73 65 70   a space.    sep
6610: 61 72 61 74 65 64 20 73 65 71 75 65 6e 63 65 20  arated sequence 
6620: 6f 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d  of terms or term
6630: 20 70 72 65 66 69 78 65 73 20 69 6e 20 64 6f 75   prefixes in dou
6640: 62 6c 65 20 71 75 6f 74 65 73 20 28 22 29 2e 0a  ble quotes (")..
6650: 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a      For example:
6660: 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f  .</ul>..<codeblo
6670: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ck>.  <i>-- Quer
6680: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
6690: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
66a0: 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69 6e   the phrase "lin
66b0: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
66c0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
66d0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
66e0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
66f0: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
6700: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  "';..  <i>-- Que
6710: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
6720: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
6730: 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74 20  n a phrase that 
6740: 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61 70  matches "lin* ap
6750: 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c  p*". As well as<
6760: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e  /i>.  <i>-- "lin
6770: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
6780: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  , this will matc
6790: 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73  h common phrases
67a0: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65   such as "linole
67b0: 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f  um appliances"</
67c0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c  i>.  <i>-- or "l
67d0: 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22 2e  ink apprentice".
67e0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
67f0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
6800: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e  docs MATCH '"lin
6810: 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63 6f 64 65  * app*"';.</code
6820: 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c  block>..<ul>.  <
6830: 6c 69 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20 71 75  li><p><b>NEAR qu
6840: 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20  eries</b>. .    
6850: 41 20 4e 45 41 52 20 71 75 65 72 79 20 69 73 20  A NEAR query is 
6860: 61 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74  a query that ret
6870: 75 72 6e 73 20 64 6f 63 75 6d 65 6e 74 73 20 74  urns documents t
6880: 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 77  hat contain a tw
6890: 6f 20 6f 72 0a 20 20 20 20 6d 6f 72 65 20 6e 6f  o or.    more no
68a0: 6d 69 6e 61 74 65 64 20 74 65 72 6d 73 20 6f 72  minated terms or
68b0: 20 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20   phrases within 
68c0: 61 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78  a specified prox
68d0: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 0a 20  imity of each . 
68e0: 20 20 20 6f 74 68 65 72 20 28 62 79 20 64 65 66     other (by def
68f0: 61 75 6c 74 20 77 69 74 68 20 31 30 20 6f 72 20  ault with 10 or 
6900: 6c 65 73 73 20 69 6e 74 65 72 76 65 6e 69 6e 67  less intervening
6910: 20 74 65 72 6d 73 29 2e 20 41 20 4e 45 41 52 20   terms). A NEAR 
6920: 71 75 65 72 79 20 69 73 20 0a 20 20 20 20 73 70  query is .    sp
6930: 65 63 69 66 69 65 64 20 62 79 20 70 75 74 74 69  ecified by putti
6940: 6e 67 20 74 68 65 20 6b 65 79 77 6f 72 64 20 22  ng the keyword "
6950: 4e 45 41 52 22 20 62 65 74 77 65 65 6e 20 74 77  NEAR" between tw
6960: 6f 20 70 68 72 61 73 65 2c 20 74 65 72 6d 20 6f  o phrase, term o
6970: 72 20 0a 20 20 20 20 5b 70 72 65 66 69 78 20 71  r .    [prefix q
6980: 75 65 72 69 65 73 5d 2e 20 54 6f 20 73 70 65 63  ueries]. To spec
6990: 69 66 79 20 61 20 70 72 6f 78 69 6d 69 74 79 20  ify a proximity 
69a0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
69b0: 65 66 61 75 6c 74 2c 0a 20 20 20 20 61 6e 20 6f  efault,.    an o
69c0: 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 20 66  perator of the f
69d0: 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e 26 6c 74  orm "NEAR/<i>&lt
69e0: 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d 61 79 20  ;N&gt;</i>" may 
69f0: 62 65 20 75 73 65 64 2c 20 77 68 65 72 65 0a 20  be used, where. 
6a00: 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67 74 3b 3c     <i>&lt;N&gt;<
6a10: 2f 69 3e 20 69 73 20 74 68 65 20 6d 61 78 69 6d  /i> is the maxim
6a20: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  um number of int
6a30: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 20 61  ervening terms a
6a40: 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46 6f 72 20  llowed..    For 
6a50: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a  example:.</ul>..
6a60: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
6a70: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
6a80: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 3c 2f  e declaration.</
6a90: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
6aa0: 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55  UAL TABLE docs U
6ab0: 53 49 4e 47 20 66 74 73 34 28 29 3b 0a 0a 20 20  SING fts4();..  
6ac0: 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61  <i>-- Virtual ta
6ad0: 62 6c 65 20 64 61 74 61 2e 3c 2f 69 3e 0a 20 20  ble data.</i>.  
6ae0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73  INSERT INTO docs
6af0: 20 56 41 4c 55 45 53 28 27 53 51 4c 69 74 65 20   VALUES('SQLite 
6b00: 69 73 20 61 6e 20 41 43 49 44 20 63 6f 6d 70 6c  is an ACID compl
6b10: 69 61 6e 74 20 65 6d 62 65 64 64 65 64 20 72 65  iant embedded re
6b20: 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73  lational databas
6b30: 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 79 73  e management sys
6b40: 74 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  tem');..  <i>-- 
6b50: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
6b60: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
6b70: 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73  ins the terms "s
6b80: 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  qlite" and "data
6b90: 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  base" with</i>. 
6ba0: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20   <i>-- not more 
6bb0: 74 68 61 6e 20 31 30 20 69 6e 74 65 72 76 65 6e  than 10 interven
6bc0: 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20  ing terms. This 
6bd0: 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e 6c 79  matches the only
6be0: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f 69 3e   document in</i>
6bf0: 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 64  .  <i>-- table d
6c00: 6f 63 73 20 28 73 69 6e 63 65 20 74 68 65 72 65  ocs (since there
6c10: 20 61 72 65 20 6f 6e 6c 79 20 73 69 78 20 74 65   are only six te
6c20: 72 6d 73 20 62 65 74 77 65 65 6e 20 22 53 51 4c  rms between "SQL
6c30: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
6c40: 73 65 22 3c 2f 69 3e 20 0a 20 20 3c 69 3e 2d 2d  se"</i> .  <i>--
6c50: 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
6c60: 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c 45 43 54 20  )</i>..  SELECT 
6c70: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
6c80: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
6c90: 6c 69 74 65 20 4e 45 41 52 20 64 61 74 61 62 61  lite NEAR databa
6ca0: 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  se';..  <i>-- Se
6cb0: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
6cc0: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
6cd0: 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c  s the terms "sql
6ce0: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
6cf0: 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c  se" with</i>.  <
6d00: 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68  i>-- not more th
6d10: 61 6e 20 36 20 69 6e 74 65 72 76 65 6e 69 6e 67  an 6 intervening
6d20: 20 74 65 72 6d 73 2e 20 54 68 69 73 20 61 6c 73   terms. This als
6d30: 6f 20 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e  o matches the on
6d40: 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f  ly document in</
6d50: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65  i>.  <i>-- table
6d60: 20 64 6f 63 73 2e 20 4e 6f 74 65 20 74 68 61 74   docs. Note that
6d70: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
6d80: 69 63 68 20 74 68 65 20 74 65 72 6d 73 20 61 70  ich the terms ap
6d90: 70 65 61 72 20 69 6e 20 74 68 65 20 64 6f 63 75  pear in the docu
6da0: 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ment</i>.  <i>--
6db0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
6dc0: 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  o be the same as
6dd0: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
6de0: 69 63 68 20 74 68 65 79 20 61 70 70 65 61 72 20  ich they appear 
6df0: 69 6e 20 74 68 65 20 71 75 65 72 79 2e 3c 2f 69  in the query.</i
6e00: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
6e10: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
6e20: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
6e30: 65 20 4e 45 41 52 2f 36 20 73 71 6c 69 74 65 27  e NEAR/6 sqlite'
6e40: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63  ;..  <i>-- Searc
6e50: 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74  h for a document
6e60: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6e70: 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65  he terms "sqlite
6e80: 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65 22  " and "database"
6e90: 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   with</i>.  <i>-
6ea0: 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20  - not more than 
6eb0: 35 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65  5 intervening te
6ec0: 72 6d 73 2e 20 54 68 69 73 20 71 75 65 72 79 20  rms. This query 
6ed0: 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d  matches no docum
6ee0: 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ents.</i>.  SELE
6ef0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
6f00: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
6f10: 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 35  'database NEAR/5
6f20: 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e   sqlite';..  <i>
6f30: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
6f40: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
6f50: 6e 74 61 69 6e 73 20 74 68 65 20 70 68 72 61 73  ntains the phras
6f60: 65 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  e "ACID complian
6f70: 74 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d 3c  t" and the term<
6f80: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 61 74  /i>.  <i>-- "dat
6f90: 61 62 61 73 65 22 20 77 69 74 68 20 6e 6f 74 20  abase" with not 
6fa0: 6d 6f 72 65 20 74 68 61 6e 20 32 20 74 65 72 6d  more than 2 term
6fb0: 73 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65  s separating the
6fc0: 20 74 77 6f 2e 20 54 68 69 73 20 6d 61 74 63 68   two. This match
6fd0: 65 73 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  es the</i>.  <i>
6fe0: 2d 2d 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72  -- document stor
6ff0: 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73  ed in table docs
7000: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
7010: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7020: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
7030: 61 62 61 73 65 20 4e 45 41 52 2f 32 20 22 41 43  abase NEAR/2 "AC
7040: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 27 3b 0a  ID compliant"';.
7050: 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20  .  <i>-- Search 
7060: 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74  for a document t
7070: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
7080: 20 70 68 72 61 73 65 20 22 41 43 49 44 20 63 6f   phrase "ACID co
7090: 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65  mpliant" and the
70a0: 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   term</i>.  <i>-
70b0: 2d 20 22 73 71 6c 69 74 65 22 20 77 69 74 68 20  - "sqlite" with 
70c0: 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20  not more than 2 
70d0: 74 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67  terms separating
70e0: 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20 61   the two. This a
70f0: 6c 73 6f 20 6d 61 74 63 68 65 73 3c 2f 69 3e 0a  lso matches</i>.
7100: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 6f 6e 6c 79    <i>-- the only
7110: 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64   document stored
7120: 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73 2e 3c   in table docs.<
7130: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
7140: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
7150: 6f 63 73 20 4d 41 54 43 48 20 27 22 41 43 49 44  ocs MATCH '"ACID
7160: 20 63 6f 6d 70 6c 69 61 6e 74 22 20 4e 45 41 52   compliant" NEAR
7170: 2f 32 20 73 71 6c 69 74 65 27 3b 0a 3c 2f 63 6f  /2 sqlite';.</co
7180: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20  deblock>..<ul>. 
7190: 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74   <li style="list
71a0: 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65 22 3e 3c 70  -style: none"><p
71b0: 3e 0a 20 20 20 20 4d 6f 72 65 20 74 68 61 6e 20  >.    More than 
71c0: 6f 6e 65 20 4e 45 41 52 20 6f 70 65 72 61 74 6f  one NEAR operato
71d0: 72 20 6d 61 79 20 61 70 70 65 61 72 20 69 6e 20  r may appear in 
71e0: 61 20 73 69 6e 67 6c 65 20 71 75 65 72 79 2e 20  a single query. 
71f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  In this case eac
7200: 68 0a 20 20 20 20 70 61 69 72 20 6f 66 20 74 65  h.    pair of te
7210: 72 6d 73 20 6f 72 20 70 68 72 61 73 65 73 20 73  rms or phrases s
7220: 65 70 61 72 61 74 65 64 20 62 79 20 61 20 4e 45  eparated by a NE
7230: 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  AR operator must
7240: 20 61 70 70 65 61 72 20 77 69 74 68 69 6e 20 74   appear within t
7250: 68 65 0a 20 20 20 20 73 70 65 63 69 66 69 65 64  he.    specified
7260: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
7270: 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
7280: 64 6f 63 75 6d 65 6e 74 2e 20 55 73 69 6e 67 20  document. Using 
7290: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61  the same table a
72a0: 6e 64 0a 20 20 20 20 64 61 74 61 20 61 73 20 69  nd.    data as i
72b0: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 65  n the block of e
72c0: 78 61 6d 70 6c 65 73 20 61 62 6f 76 65 3a 0a 3c  xamples above:.<
72d0: 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  /ul>..<codeblock
72e0: 3e 20 0a 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  > . <i>-- The fo
72f0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 73 65  llowing query se
7300: 6c 65 63 74 73 20 64 6f 63 75 6d 65 6e 74 73 20  lects documents 
7310: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  that contains an
7320: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7330: 20 74 65 72 6d 20 3c 2f 69 3e 0a 20 20 3c 69 3e   term </i>.  <i>
7340: 2d 2d 20 22 73 71 6c 69 74 65 22 20 73 65 70 61  -- "sqlite" sepa
7350: 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f 72 20  rated by two or 
7360: 66 65 77 65 72 20 74 65 72 6d 73 20 66 72 6f 6d  fewer terms from
7370: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
7380: 74 68 65 20 74 65 72 6d 20 22 61 63 69 64 22 2c  the term "acid",
7390: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 68 69  </i>.  <i>-- whi
73a0: 63 68 20 69 73 20 69 6e 20 74 75 72 6e 20 73 65  ch is in turn se
73b0: 70 61 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f  parated by two o
73c0: 72 20 66 65 77 65 72 20 74 65 72 6d 73 20 66 72  r fewer terms fr
73d0: 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  om an instance o
73e0: 66 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20  f the term</i>. 
73f0: 20 3c 69 3e 2d 2d 20 22 72 65 6c 61 74 69 6f 6e   <i>-- "relation
7400: 61 6c 22 2e 20 41 73 20 69 74 20 68 61 70 70 65  al". As it happe
7410: 6e 73 2c 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63  ns, the only doc
7420: 75 6d 65 6e 74 20 69 6e 20 74 61 62 6c 65 20 64  ument in table d
7430: 6f 63 73 20 73 61 74 69 73 66 69 65 73 20 74 68  ocs satisfies th
7440: 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e  is criteria.</i>
7450: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
7460: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
7470: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4e   MATCH 'sqlite N
7480: 45 41 52 2f 32 20 61 63 69 64 20 4e 45 41 52 2f  EAR/2 acid NEAR/
7490: 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 0a  2 relational';..
74a0: 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65    <i>-- This que
74b0: 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f  ry matches no do
74c0: 63 75 6d 65 6e 74 73 2e 20 54 68 65 72 65 20 69  cuments. There i
74d0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
74e0: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
74f0: 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69  e" with</i>.  <i
7500: 3e 2d 2d 20 73 75 66 66 69 63 69 65 6e 74 20 70  >-- sufficient p
7510: 72 6f 78 69 6d 69 74 79 20 74 6f 20 61 6e 20 69  roximity to an i
7520: 6e 73 74 61 6e 63 65 20 6f 66 20 22 61 63 69 64  nstance of "acid
7530: 22 20 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20  " but it is not 
7540: 73 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f  sufficiently clo
7550: 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  se</i>.  <i>-- t
7560: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
7570: 20 74 68 65 20 74 65 72 6d 20 22 72 65 6c 61 74   the term "relat
7580: 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a 20 20 53 45  ional".</i>.  SE
7590: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
75a0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
75b0: 48 20 27 61 63 69 64 20 4e 45 41 52 2f 32 20 73  H 'acid NEAR/2 s
75c0: 71 6c 69 74 65 20 4e 45 41 52 2f 32 20 72 65 6c  qlite NEAR/2 rel
75d0: 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f 63 6f 64 65  ational';.</code
75e0: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 50 68  block>..<p>.  Ph
75f0: 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20 71 75  rase and NEAR qu
7600: 65 72 69 65 73 20 6d 61 79 20 6e 6f 74 20 73 70  eries may not sp
7610: 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  an multiple colu
7620: 6d 6e 73 20 77 69 74 68 69 6e 20 61 20 72 6f 77  mns within a row
7630: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74 68 72  ...<p>.  The thr
7640: 65 65 20 62 61 73 69 63 20 71 75 65 72 79 20 74  ee basic query t
7650: 79 70 65 73 20 64 65 73 63 72 69 62 65 64 20 61  ypes described a
7660: 62 6f 76 65 20 6d 61 79 20 62 65 20 75 73 65 64  bove may be used
7670: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 66 75   to query the fu
7680: 6c 6c 2d 74 65 78 74 0a 20 20 69 6e 64 65 78 20  ll-text.  index 
7690: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
76a0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61  ocuments that ma
76b0: 74 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  tch the specifie
76c0: 64 20 63 72 69 74 65 72 69 61 2e 20 55 73 69 6e  d criteria. Usin
76d0: 67 20 74 68 65 0a 20 20 46 54 53 20 71 75 65 72  g the.  FTS quer
76e0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 61 6e  y expression lan
76f0: 67 75 61 67 65 20 69 74 20 69 73 20 70 6f 73 73  guage it is poss
7700: 69 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  ible to perform 
7710: 76 61 72 69 6f 75 73 20 73 65 74 20 0a 20 20 6f  various set .  o
7720: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  perations on the
7730: 20 72 65 73 75 6c 74 73 20 6f 66 20 62 61 73 69   results of basi
7740: 63 20 71 75 65 72 69 65 73 2e 20 54 68 65 72 65  c queries. There
7750: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 74   are currently t
7760: 68 72 65 65 20 0a 20 20 73 75 70 70 6f 72 74 65  hree .  supporte
7770: 64 20 6f 70 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c  d operations:..<
7780: 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20 41  ul>.  <li> The A
7790: 4e 44 20 6f 70 65 72 61 74 6f 72 20 64 65 74 65  ND operator dete
77a0: 72 6d 69 6e 65 73 20 74 68 65 20 3c 62 3e 69 6e  rmines the <b>in
77b0: 74 65 72 73 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f  tersection</b> o
77c0: 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f  f two sets of do
77d0: 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e  cuments...  <li>
77e0: 20 54 68 65 20 4f 52 20 6f 70 65 72 61 74 6f 72   The OR operator
77f0: 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20   calculates the 
7800: 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20  <b>union</b> of 
7810: 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75  two sets of docu
7820: 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54  ments...  <li> T
7830: 68 65 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 20  he NOT operator 
7840: 28 6f 72 2c 20 69 66 20 75 73 69 6e 67 20 74 68  (or, if using th
7850: 65 20 73 74 61 6e 64 61 72 64 20 73 79 6e 74 61  e standard synta
7860: 78 2c 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f  x, a unary "-" o
7870: 70 65 72 61 74 6f 72 29 0a 20 20 20 20 20 20 20  perator).       
7880: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 63  may be used to c
7890: 6f 6d 70 75 74 65 20 74 68 65 20 3c 62 3e 72 65  ompute the <b>re
78a0: 6c 61 74 69 76 65 20 63 6f 6d 70 6c 65 6d 65 6e  lative complemen
78b0: 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65 20 73 65 74  t</b> of one set
78c0: 20 6f 66 0a 20 20 20 20 20 20 20 64 6f 63 75 6d   of.       docum
78d0: 65 6e 74 73 20 77 69 74 68 20 72 65 73 70 65 63  ents with respec
78e0: 74 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f  t to another..</
78f0: 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46  ul>..<p>.  The F
7900: 54 53 20 6d 6f 64 75 6c 65 73 20 6d 61 79 20 62  TS modules may b
7910: 65 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 75 73  e compiled to us
7920: 65 20 6f 6e 65 20 6f 66 20 74 77 6f 20 73 6c 69  e one of two sli
7930: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20  ghtly different 
7940: 76 65 72 73 69 6f 6e 73 0a 20 20 6f 66 20 74 68  versions.  of th
7950: 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  e full-text quer
7960: 79 20 73 79 6e 74 61 78 2c 20 74 68 65 20 22 73  y syntax, the "s
7970: 74 61 6e 64 61 72 64 22 20 71 75 65 72 79 20 73  tandard" query s
7980: 79 6e 74 61 78 20 61 6e 64 20 74 68 65 20 22 65  yntax and the "e
7990: 6e 68 61 6e 63 65 64 22 20 0a 20 20 71 75 65 72  nhanced" .  quer
79a0: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 20 62 61  y syntax. The ba
79b0: 73 69 63 20 74 65 72 6d 2c 20 74 65 72 6d 2d 70  sic term, term-p
79c0: 72 65 66 69 78 2c 20 70 68 72 61 73 65 20 61 6e  refix, phrase an
79d0: 64 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 64  d NEAR queries d
79e0: 65 73 63 72 69 62 65 64 20 0a 20 20 61 62 6f 76  escribed .  abov
79f0: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 69  e are the same i
7a00: 6e 20 62 6f 74 68 20 76 65 72 73 69 6f 6e 73 20  n both versions 
7a10: 6f 66 20 74 68 65 20 73 79 6e 74 61 78 2e 20 54  of the syntax. T
7a20: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
7a30: 73 65 74 20 0a 20 20 6f 70 65 72 61 74 69 6f 6e  set .  operation
7a40: 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  s are specified 
7a50: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
7a60: 65 72 65 6e 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  erent. The follo
7a70: 77 69 6e 67 20 74 77 6f 20 73 75 62 2d 73 65 63  wing two sub-sec
7a80: 74 69 6f 6e 73 20 0a 20 20 64 65 73 63 72 69 62  tions .  describ
7a90: 65 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  e the part of th
7aa0: 65 20 74 77 6f 20 71 75 65 72 79 20 73 79 6e 74  e two query synt
7ab0: 61 78 65 73 20 74 68 61 74 20 70 65 72 74 61 69  axes that pertai
7ac0: 6e 73 20 74 6f 20 73 65 74 20 6f 70 65 72 61 74  ns to set operat
7ad0: 69 6f 6e 73 2e 20 0a 20 20 52 65 66 65 72 20 74  ions. .  Refer t
7ae0: 6f 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  o the descriptio
7af0: 6e 20 6f 66 20 68 6f 77 20 74 6f 20 5b 63 6f 6d  n of how to [com
7b00: 70 69 6c 65 20 66 74 73 5d 20 66 6f 72 20 63 6f  pile fts] for co
7b10: 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65 73 2e  mpilation notes.
7b20: 0a 0a 3c 68 32 20 74 61 67 73 3d 22 65 6e 68 61  ..<h2 tags="enha
7b30: 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61  nced query synta
7b40: 78 22 3e 0a 20 20 53 65 74 20 4f 70 65 72 61 74  x">.  Set Operat
7b50: 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65 20 45  ions Using The E
7b60: 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79  nhanced Query Sy
7b70: 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  ntax</h2>..<p>. 
7b80: 20 54 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75   The enhanced qu
7b90: 65 72 79 20 73 79 6e 74 61 78 20 73 75 70 70 6f  ery syntax suppo
7ba0: 72 74 73 20 74 68 65 20 41 4e 44 2c 20 4f 52 20  rts the AND, OR 
7bb0: 61 6e 64 20 4e 4f 54 20 62 69 6e 61 72 79 20 73  and NOT binary s
7bc0: 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  et operators..  
7bd0: 45 61 63 68 20 6f 66 20 74 68 65 20 74 77 6f 20  Each of the two 
7be0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 61 6e 20 6f  operands to an o
7bf0: 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 61  perator may be a
7c00: 20 62 61 73 69 63 20 46 54 53 20 71 75 65 72 79   basic FTS query
7c10: 2c 20 6f 72 20 74 68 65 0a 20 20 72 65 73 75 6c  , or the.  resul
7c20: 74 20 6f 66 20 61 6e 6f 74 68 65 72 20 41 4e 44  t of another AND
7c30: 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73 65 74 20  , OR or NOT set 
7c40: 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70 65 72 61  operation. Opera
7c50: 74 6f 72 73 20 6d 75 73 74 20 62 65 20 65 6e 74  tors must be ent
7c60: 65 72 65 64 0a 20 20 75 73 69 6e 67 20 63 61 70  ered.  using cap
7c70: 69 74 61 6c 20 6c 65 74 74 65 72 73 2e 20 4f 74  ital letters. Ot
7c80: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
7c90: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
7ca0: 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65 72   basic term quer
7cb0: 69 65 73 0a 20 20 69 6e 73 74 65 61 64 20 6f 66  ies.  instead of
7cc0: 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a   set operators..
7cd0: 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e 44 20 6f  .<p>.  The AND o
7ce0: 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 69  perator may be i
7cf0: 6d 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  mplicitly specif
7d00: 69 65 64 2e 20 49 66 20 74 77 6f 20 62 61 73 69  ied. If two basi
7d10: 63 20 71 75 65 72 69 65 73 20 61 70 70 65 61 72  c queries appear
7d20: 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f 70 65 72   .  with no oper
7d30: 61 74 6f 72 20 73 65 70 61 72 61 74 69 6e 67 20  ator separating 
7d40: 74 68 65 6d 20 69 6e 20 61 6e 20 46 54 53 20 71  them in an FTS q
7d50: 75 65 72 79 20 73 74 72 69 6e 67 2c 20 74 68 65  uery string, the
7d60: 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20 20 74   results are.  t
7d70: 68 65 20 73 61 6d 65 20 61 73 20 69 66 20 74 68  he same as if th
7d80: 65 20 74 77 6f 20 62 61 73 69 63 20 71 75 65 72  e two basic quer
7d90: 69 65 73 20 77 65 72 65 20 73 65 70 61 72 61 74  ies were separat
7da0: 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
7db0: 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20 65 78 61  rator..  For exa
7dc0: 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 20  mple, the query 
7dd0: 65 78 70 72 65 73 73 69 6f 6e 20 22 69 6d 70 6c  expression "impl
7de0: 69 63 69 74 20 6f 70 65 72 61 74 6f 72 22 20 69  icit operator" i
7df0: 73 20 61 20 6d 6f 72 65 20 73 75 63 63 69 6e 63  s a more succinc
7e00: 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 22  t.  version of "
7e10: 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70 65  implicit AND ope
7e20: 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f 64 65 62 6c  rator"...<codebl
7e30: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56 69 72  ock>.  <i>-- Vir
7e40: 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61  tual table decla
7e50: 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45  ration</i>.  CRE
7e60: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
7e70: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
7e80: 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69  3();..  <i>-- Vi
7e90: 72 74 75 61 6c 20 74 61 62 6c 65 20 64 61 74 61  rtual table data
7ea0: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
7eb0: 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63  TO docs(docid, c
7ec0: 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 31  ontent) VALUES(1
7ed0: 2c 20 27 61 20 64 61 74 61 62 61 73 65 20 69 73  , 'a database is
7ee0: 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74   a software syst
7ef0: 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  em');.  INSERT I
7f00: 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20  NTO docs(docid, 
7f10: 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28  content) VALUES(
7f20: 32 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61 20  2, 'sqlite is a 
7f30: 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 27  software system'
7f40: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
7f50: 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e   docs(docid, con
7f60: 74 65 6e 74 29 20 56 41 4c 55 45 53 28 33 2c 20  tent) VALUES(3, 
7f70: 27 73 71 6c 69 74 65 20 69 73 20 61 20 64 61 74  'sqlite is a dat
7f80: 61 62 61 73 65 27 29 3b 0a 0a 20 20 3c 69 3e 2d  abase');..  <i>-
7f90: 2d 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 74  - Return the set
7fa0: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68   of documents th
7fb0: 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  at contain the t
7fc0: 65 72 6d 20 22 73 71 6c 69 74 65 22 2c 20 61 6e  erm "sqlite", an
7fd0: 64 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  d the</i>.  <i>-
7fe0: 2d 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65  - term "database
7ff0: 22 2e 20 54 68 69 73 20 71 75 65 72 79 20 77 69  ". This query wi
8000: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 64 6f  ll return the do
8010: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
8020: 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69 3e 0a 20 20  d 3 only.</i>.  
8030: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
8040: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
8050: 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20  TCH 'sqlite AND 
8060: 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69  database';..  <i
8070: 3e 2d 2d 20 41 67 61 69 6e 2c 20 72 65 74 75 72  >-- Again, retur
8080: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  n the set of doc
8090: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
80a0: 61 69 6e 20 62 6f 74 68 20 22 73 71 6c 69 74 65  ain both "sqlite
80b0: 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  " and</i>.  <i>-
80c0: 2d 20 22 64 61 74 61 62 61 73 65 22 2e 20 54 68  - "database". Th
80d0: 69 73 20 74 69 6d 65 2c 20 75 73 65 20 61 6e 20  is time, use an 
80e0: 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70 65  implicit AND ope
80f0: 72 61 74 6f 72 2e 20 41 67 61 69 6e 2c 20 64 6f  rator. Again, do
8100: 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e  cument</i>.  <i>
8110: 2d 2d 20 33 20 69 73 20 74 68 65 20 6f 6e 6c 79  -- 3 is the only
8120: 20 64 6f 63 75 6d 65 6e 74 20 6d 61 74 63 68 65   document matche
8130: 64 20 62 79 20 74 68 69 73 20 71 75 65 72 79 2e  d by this query.
8140: 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a   </i>.  SELECT *
8150: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
8160: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
8170: 61 62 61 73 65 20 73 71 6c 69 74 65 27 3b 0a 0a  abase sqlite';..
8180: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
8190: 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  r the set of doc
81a0: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
81b0: 61 69 6e 73 20 65 69 74 68 65 72 20 22 73 71 6c  ains either "sql
81c0: 69 74 65 22 20 6f 72 20 22 64 61 74 61 62 61 73  ite" or "databas
81d0: 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  e".</i>.  <i>-- 
81e0: 41 6c 6c 20 74 68 72 65 65 20 64 6f 63 75 6d 65  All three docume
81f0: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
8200: 61 73 65 20 61 72 65 20 6d 61 74 63 68 65 64 20  ase are matched 
8210: 62 79 20 74 68 69 73 20 71 75 65 72 79 2e 3c 2f  by this query.</
8220: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
8230: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
8240: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
8250: 20 4f 52 20 64 61 74 61 62 61 73 65 27 3b 0a 0a   OR database';..
8260: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
8270: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
8280: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
8290: 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22   term "database"
82a0: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 63 6f 6e  , but do not con
82b0: 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  tain</i>.  <i>--
82c0: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
82d0: 65 22 2e 20 44 6f 63 75 6d 65 6e 74 20 31 20 69  e". Document 1 i
82e0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
82f0: 65 6e 74 20 74 68 61 74 20 6d 61 74 63 68 65 73  ent that matches
8300: 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c   this criteria.<
8310: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
8320: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
8330: 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62  ocs MATCH 'datab
8340: 61 73 65 20 4e 4f 54 20 73 71 6c 69 74 65 27 3b  ase NOT sqlite';
8350: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
8360: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61  llowing query ma
8370: 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e  tches no documen
8380: 74 73 2e 20 42 65 63 61 75 73 65 20 22 61 6e 64  ts. Because "and
8390: 22 20 69 73 20 69 6e 20 6c 6f 77 65 72 63 61 73  " is in lowercas
83a0: 65 20 6c 65 74 74 65 72 73 2c 3c 2f 69 3e 0a 20  e letters,</i>. 
83b0: 20 3c 69 3e 2d 2d 20 69 74 20 69 73 20 69 6e 74   <i>-- it is int
83c0: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62 61  erpreted as a ba
83d0: 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 20 69  sic term query i
83e0: 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 6f 70 65  nstead of an ope
83f0: 72 61 74 6f 72 2e 20 4f 70 65 72 61 74 6f 72 73  rator. Operators
8400: 20 6d 75 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   must</i>.  <i>-
8410: 2d 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75  - be specified u
8420: 73 69 6e 67 20 63 61 70 69 74 61 6c 20 6c 65 74  sing capital let
8430: 74 65 72 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ters. In practic
8440: 65 2c 20 74 68 69 73 20 71 75 65 72 79 20 77 69  e, this query wi
8450: 6c 6c 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63  ll match any doc
8460: 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 3c 69 3e  uments</i>.  <i>
8470: 2d 2d 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  -- that contain 
8480: 65 61 63 68 20 6f 66 20 74 68 65 20 74 68 72 65  each of the thre
8490: 65 20 74 65 72 6d 73 20 22 64 61 74 61 62 61 73  e terms "databas
84a0: 65 22 2c 20 22 61 6e 64 22 20 61 6e 64 20 22 73  e", "and" and "s
84b0: 71 6c 69 74 65 22 20 61 74 20 6c 65 61 73 74 20  qlite" at least 
84c0: 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  once.</i>.  <i>-
84d0: 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e 74 73 20 69  - No documents i
84e0: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 64 61  n the example da
84f0: 74 61 20 61 62 6f 76 65 20 6d 61 74 63 68 20 74  ta above match t
8500: 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69  his criteria.</i
8510: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
8520: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
8530: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
8540: 65 20 61 6e 64 20 73 71 6c 69 74 65 27 3b 0a 3c  e and sqlite';.<
8550: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
8560: 0a 20 20 54 68 65 20 65 78 61 6d 70 6c 65 73 20  .  The examples 
8570: 61 62 6f 76 65 20 61 6c 6c 20 75 73 65 20 62 61  above all use ba
8580: 73 69 63 20 66 75 6c 6c 2d 74 65 78 74 20 74 65  sic full-text te
8590: 72 6d 20 71 75 65 72 69 65 73 20 61 73 20 62 6f  rm queries as bo
85a0: 74 68 20 6f 70 65 72 61 6e 64 73 20 6f 66 20 0a  th operands of .
85b0: 20 20 74 68 65 20 73 65 74 20 6f 70 65 72 61 74    the set operat
85c0: 69 6f 6e 73 20 64 65 6d 6f 6e 73 74 72 61 74 65  ions demonstrate
85d0: 64 2e 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45  d. Phrase and NE
85e0: 41 52 20 71 75 65 72 69 65 73 20 6d 61 79 20 61  AR queries may a
85f0: 6c 73 6f 20 62 65 20 75 73 65 64 2c 0a 20 20 61  lso be used,.  a
8600: 73 20 6d 61 79 20 74 68 65 20 72 65 73 75 6c 74  s may the result
8610: 73 20 6f 66 20 6f 74 68 65 72 20 73 65 74 20 6f  s of other set o
8620: 70 65 72 61 74 69 6f 6e 73 2e 20 57 68 65 6e 20  perations. When 
8630: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 65  more than one se
8640: 74 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 69 73  t operation.  is
8650: 20 70 72 65 73 65 6e 74 20 69 6e 20 61 6e 20 46   present in an F
8660: 54 53 20 71 75 65 72 79 2c 20 74 68 65 20 70 72  TS query, the pr
8670: 65 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72  ecedence of oper
8680: 61 74 6f 72 73 20 69 73 20 61 73 20 66 6f 6c 6c  ators is as foll
8690: 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ows:..<table str
86a0: 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
86b0: 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e 45 6e  h>Operator<th>En
86c0: 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79 6e  hanced Query Syn
86d0: 74 61 78 20 50 72 65 63 65 64 65 6e 63 65 0a 20  tax Precedence. 
86e0: 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54 20 3c 74 64   <tr><td>NOT <td
86f0: 3e 20 48 69 67 68 65 73 74 20 70 72 65 63 65 64  > Highest preced
8700: 65 6e 63 65 20 28 74 69 67 68 74 65 73 74 20 67  ence (tightest g
8710: 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c 74 72 3e  rouping)..  <tr>
8720: 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a 20 20 3c  <td>AND <td>.  <
8730: 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64 3e 20  tr><td>OR  <td> 
8740: 4c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e 63  Lowest precedenc
8750: 65 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f 75 70  e (loosest group
8760: 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a  ing)..</table>..
8770: 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69 6e 67  <p>.  When using
8780: 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75   the enhanced qu
8790: 65 72 79 20 73 79 6e 74 61 78 2c 20 70 61 72 65  ery syntax, pare
87a0: 6e 74 68 65 73 69 73 20 6d 61 79 20 62 65 20 75  nthesis may be u
87b0: 73 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65 0a  sed to override.
87c0: 20 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72    the default pr
87d0: 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65 20  ecedence of the 
87e0: 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74 6f 72  various operator
87f0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  s. For example:.
8800: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20  .<codeblock>..  
8810: 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65  <i>-- Return the
8820: 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 61 73   docid values as
8830: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6c  sociated with al
8840: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
8850: 20 63 6f 6e 74 61 69 6e 20 74 68 65 3c 2f 69 3e   contain the</i>
8860: 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f 20 74 65 72  .  <i>-- two ter
8870: 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20  ms "sqlite" and 
8880: 22 64 61 74 61 62 61 73 65 22 2c 20 61 6e 64 2f  "database", and/
8890: 6f 72 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  or contain the t
88a0: 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 3c 2f  erm "library".</
88b0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  i>.  SELECT doci
88c0: 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  d FROM docs WHER
88d0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
88e0: 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73  lite AND databas
88f0: 65 20 4f 52 20 6c 69 62 72 61 72 79 27 3b 0a 0a  e OR library';..
8900: 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65    <i>-- This que
8910: 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ry is equivalent
8920: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c 2f   to the above.</
8930: 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  i>.  SELECT doci
8940: 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  d FROM docs WHER
8950: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
8960: 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73  lite AND databas
8970: 65 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 53  e'.    UNION.  S
8980: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
8990: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
89a0: 20 4d 41 54 43 48 20 27 6c 69 62 72 61 72 79 27   MATCH 'library'
89b0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79  ;..  <i>-- Query
89c0: 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20   for the set of 
89d0: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
89e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
89f0: 20 22 6c 69 6e 75 78 22 2c 20 61 6e 64 20 61 74   "linux", and at
8a00: 20 6c 65 61 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e   least</i>.  <i>
8a10: 2d 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 68  -- one of the ph
8a20: 72 61 73 65 73 20 22 73 71 6c 69 74 65 20 64 61  rases "sqlite da
8a30: 74 61 62 61 73 65 22 20 61 6e 64 20 22 73 71 6c  tabase" and "sql
8a40: 69 74 65 20 6c 69 62 72 61 72 79 22 2e 3c 2f 69  ite library".</i
8a50: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
8a60: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
8a70: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 28 22 73   docs MATCH '("s
8a80: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20  qlite database" 
8a90: 4f 52 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61  OR "sqlite libra
8aa0: 72 79 22 29 20 41 4e 44 20 6c 69 6e 75 78 27 3b  ry") AND linux';
8ab0: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71  ..  <i>-- This q
8ac0: 75 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65  uery is equivale
8ad0: 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e  nt to the above.
8ae0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  </i>.  SELECT do
8af0: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
8b00: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
8b10: 6c 69 6e 75 78 27 0a 20 20 20 20 49 4e 54 45 52  linux'.    INTER
8b20: 53 45 43 54 0a 20 20 53 45 4c 45 43 54 20 64 6f  SECT.  SELECT do
8b30: 63 69 64 20 46 52 4f 4d 20 28 0a 20 20 20 20 53  cid FROM (.    S
8b40: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
8b50: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
8b60: 20 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20   MATCH '"sqlite 
8b70: 6c 69 62 72 61 72 79 22 27 0a 20 20 20 20 20 20  library"'.      
8b80: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
8b90: 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73   docid FROM docs
8ba0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
8bb0: 48 20 27 22 73 71 6c 69 74 65 20 64 61 74 61 62  H '"sqlite datab
8bc0: 61 73 65 22 27 0a 20 20 29 3b 0a 3c 2f 63 6f 64  ase"'.  );.</cod
8bd0: 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68 32 3e 53 65  eblock>...<h2>Se
8be0: 74 20 4f 70 65 72 61 74 69 6f 6e 73 20 55 73 69  t Operations Usi
8bf0: 6e 67 20 54 68 65 20 53 74 61 6e 64 61 72 64 20  ng The Standard 
8c00: 51 75 65 72 79 20 53 79 6e 74 61 78 3c 2f 68 32  Query Syntax</h2
8c10: 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 71 75 65  >..<p>.  FTS que
8c20: 72 79 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e  ry set operation
8c30: 73 20 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e  s using the stan
8c40: 64 61 72 64 20 71 75 65 72 79 20 73 79 6e 74 61  dard query synta
8c50: 78 20 61 72 65 20 73 69 6d 69 6c 61 72 2c 20 62  x are similar, b
8c60: 75 74 0a 20 20 6e 6f 74 20 69 64 65 6e 74 69 63  ut.  not identic
8c70: 61 6c 2c 20 74 6f 20 73 65 74 20 6f 70 65 72 61  al, to set opera
8c80: 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 65  tions with the e
8c90: 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79  nhanced query sy
8ca0: 6e 74 61 78 2e 20 54 68 65 72 65 0a 20 20 61 72  ntax. There.  ar
8cb0: 65 20 66 6f 75 72 20 64 69 66 66 65 72 65 6e 63  e four differenc
8cc0: 65 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  es, as follows:.
8cd0: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75  .<ol>.  <li valu
8ce0: 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79 20 74 68 65  e=1><p> Only the
8cf0: 20 69 6d 70 6c 69 63 69 74 20 76 65 72 73 69 6f   implicit versio
8d00: 6e 20 6f 66 20 74 68 65 20 41 4e 44 20 6f 70 65  n of the AND ope
8d10: 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f 72 74  rator is support
8d20: 65 64 2e 0a 20 20 20 20 53 70 65 63 69 66 79 69  ed..    Specifyi
8d30: 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20 22 41  ng the string "A
8d40: 4e 44 22 20 61 73 20 70 61 72 74 20 6f 66 20 61  ND" as part of a
8d50: 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20   standard query 
8d60: 73 79 6e 74 61 78 20 71 75 65 72 79 20 69 73 0a  syntax query is.
8d70: 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 64 20      interpreted 
8d80: 61 73 20 61 20 74 65 72 6d 20 71 75 65 72 79 20  as a term query 
8d90: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
8da0: 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e  ocuments contain
8db0: 69 6e 67 20 74 68 65 20 74 65 72 6d 20 0a 20 20  ing the term .  
8dc0: 20 20 22 61 6e 64 22 2e 0a 3c 2f 6f 6c 3e 0a 0a    "and"..</ol>..
8dd0: 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65  <ol>.  <li value
8de0: 3d 32 3e 3c 70 3e 20 50 61 72 65 6e 74 68 65 73  =2><p> Parenthes
8df0: 69 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  is are not suppo
8e00: 72 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f 6c  rted..</ol>..<ol
8e10: 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 33 3e  >.  <li value=3>
8e20: 3c 70 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72  <p> The NOT oper
8e30: 61 74 6f 72 20 69 73 20 6e 6f 74 20 73 75 70 70  ator is not supp
8e40: 6f 72 74 65 64 2e 20 49 6e 73 74 65 61 64 20 6f  orted. Instead o
8e50: 66 20 74 68 65 20 4e 4f 54 20 0a 20 20 20 20 6f  f the NOT .    o
8e60: 70 65 72 61 74 6f 72 2c 20 74 68 65 20 73 74 61  perator, the sta
8e70: 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e 74  ndard query synt
8e80: 61 78 20 73 75 70 70 6f 72 74 73 20 61 20 75 6e  ax supports a un
8e90: 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72  ary "-" operator
8ea0: 20 74 68 61 74 0a 20 20 20 20 6d 61 79 20 62 65   that.    may be
8eb0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 61 73 69   applied to basi
8ec0: 63 20 74 65 72 6d 20 61 6e 64 20 74 65 72 6d 2d  c term and term-
8ed0: 70 72 65 66 69 78 20 71 75 65 72 69 65 73 20 28  prefix queries (
8ee0: 62 75 74 20 6e 6f 74 20 74 6f 20 70 68 72 61 73  but not to phras
8ef0: 65 0a 20 20 20 20 6f 72 20 4e 45 41 52 20 71 75  e.    or NEAR qu
8f00: 65 72 69 65 73 29 2e 20 41 20 74 65 72 6d 20 6f  eries). A term o
8f10: 72 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68  r term-prefix th
8f20: 61 74 20 68 61 73 20 61 20 75 6e 61 72 79 20 22  at has a unary "
8f30: 2d 22 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  -" operator.    
8f40: 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 20 6d  attached to it m
8f50: 61 79 20 6e 6f 74 20 61 70 70 65 61 72 20 61 73  ay not appear as
8f60: 20 61 6e 20 6f 70 65 72 61 6e 64 20 74 6f 20 61   an operand to a
8f70: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 20 41  n OR operator. A
8f80: 6e 20 46 54 53 0a 20 20 20 20 71 75 65 72 79 20  n FTS.    query 
8f90: 6d 61 79 20 6e 6f 74 20 63 6f 6e 73 69 73 74 20  may not consist 
8fa0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 74 65 72 6d  entirely of term
8fb0: 73 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69 78  s or term-prefix
8fc0: 20 71 75 65 72 69 65 73 20 77 69 74 68 20 75 6e   queries with un
8fd0: 61 72 79 0a 20 20 20 20 22 2d 22 20 6f 70 65 72  ary.    "-" oper
8fe0: 61 74 6f 72 73 20 61 74 74 61 63 68 65 64 20 74  ators attached t
8ff0: 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c  o them..</ol>..<
9000: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
9010: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  -- Search for th
9020: 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
9030: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
9040: 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65  the term "sqlite
9050: 22 20 62 75 74 20 64 6f 3c 2f 69 3e 0a 20 20 3c  " but do</i>.  <
9060: 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  i>-- not contain
9070: 20 74 68 65 20 74 65 72 6d 20 22 64 61 74 61 62   the term "datab
9080: 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ase".</i>.  SELE
9090: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
90a0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
90b0: 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62 61 73  'sqlite -databas
90c0: 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  e';.</codeblock>
90d0: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
90e0: 75 65 3d 34 3e 3c 70 3e 20 54 68 65 20 72 65 6c  ue=4><p> The rel
90f0: 61 74 69 76 65 20 70 72 65 63 65 64 65 6e 63 65  ative precedence
9100: 20 6f 66 20 74 68 65 20 73 65 74 20 6f 70 65 72   of the set oper
9110: 61 74 69 6f 6e 73 20 69 73 20 64 69 66 66 65 72  ations is differ
9120: 65 6e 74 2e 20 0a 20 20 20 49 6e 20 70 61 72 74  ent. .   In part
9130: 69 63 75 6c 61 72 2c 20 75 73 69 6e 67 20 74 68  icular, using th
9140: 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79  e standard query
9150: 20 73 79 6e 74 61 78 20 74 68 65 20 22 4f 52 22   syntax the "OR"
9160: 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 61 0a   operator has a.
9170: 20 20 20 68 69 67 68 65 72 20 70 72 65 63 65 64     higher preced
9180: 65 6e 63 65 20 74 68 61 6e 20 22 41 4e 44 22 2e  ence than "AND".
9190: 20 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   The precedence 
91a0: 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 77 68 65  of operators whe
91b0: 6e 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 73  n using the.   s
91c0: 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79  tandard query sy
91d0: 6e 74 61 78 20 69 73 3a 20 0a 3c 2f 6f 6c 3e 0a  ntax is: .</ol>.
91e0: 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d  .<table striped=
91f0: 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 65  1>.  <tr><th>Ope
9200: 72 61 74 6f 72 3c 74 68 3e 53 74 61 6e 64 61 72  rator<th>Standar
9210: 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 20 50  d Query Syntax P
9220: 72 65 63 65 64 65 6e 63 65 0a 20 20 3c 74 72 3e  recedence.  <tr>
9230: 3c 74 64 3e 55 6e 61 72 79 20 22 2d 22 20 3c 74  <td>Unary "-" <t
9240: 64 3e 20 48 69 67 68 65 73 74 20 70 72 65 63 65  d> Highest prece
9250: 64 65 6e 63 65 20 28 74 69 67 68 74 65 73 74 20  dence (tightest 
9260: 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c 74 72  grouping)..  <tr
9270: 3e 3c 74 64 3e 4f 52 20 20 3c 74 64 3e 0a 20 20  ><td>OR  <td>.  
9280: 3c 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64 3e  <tr><td>AND <td>
9290: 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   Lowest preceden
92a0: 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f 75  ce (loosest grou
92b0: 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a  ping)..</table>.
92c0: 0a 3c 6f 6c 3e 3c 6c 69 20 73 74 79 6c 65 3d 22  .<ol><li style="
92d0: 6c 69 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22  list-style:none"
92e0: 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
92f0: 67 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74  g example illust
9300: 72 61 74 65 73 20 70 72 65 63 65 64 65 6e 63 65  rates precedence
9310: 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 75 73   of operators us
9320: 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72 64  ing the standard
9330: 20 0a 20 20 71 75 65 72 79 20 73 79 6e 74 61 78   .  query syntax
9340: 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f 64 65 62 6c  :.</ol>..<codebl
9350: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 53 65 61  ock>.  <i>-- Sea
9360: 72 63 68 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74  rch for document
9370: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  s that contain a
9380: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
9390: 68 65 20 74 65 72 6d 73 20 22 64 61 74 61 62 61  he terms "databa
93a0: 73 65 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  se"</i>.  <i>-- 
93b0: 61 6e 64 20 22 73 71 6c 69 74 65 22 2c 20 61 6e  and "sqlite", an
93c0: 64 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 74  d also contain t
93d0: 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61 72 79  he term "library
93e0: 22 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  ". Because of th
93f0: 65 20 64 69 66 66 65 72 65 6e 63 65 73 3c 2f 69  e differences</i
9400: 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 6f 70 65  >.  <i>-- in ope
9410: 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65  rator precedence
9420: 73 2c 20 74 68 69 73 20 71 75 65 72 79 20 77 6f  s, this query wo
9430: 75 6c 64 20 68 61 76 65 20 61 20 64 69 66 66 65  uld have a diffe
9440: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 61 74  rent interpretat
9450: 69 6f 6e 20 75 73 69 6e 67 3c 2f 69 3e 0a 20 20  ion using</i>.  
9460: 3c 69 3e 2d 2d 20 74 68 65 20 65 6e 68 61 6e 63  <i>-- the enhanc
9470: 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 2e  ed query syntax.
9480: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
9490: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
94a0: 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69  docs MATCH 'sqli
94b0: 74 65 20 4f 52 20 64 61 74 61 62 61 73 65 20 6c  te OR database l
94c0: 69 62 72 61 72 79 27 3b 0a 3c 2f 63 6f 64 65 62  ibrary';.</codeb
94d0: 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66  lock>..<tcl>hd_f
94e0: 72 61 67 6d 65 6e 74 20 73 6e 69 70 70 65 74 20  ragment snippet 
94f0: 7b 46 54 53 20 61 75 78 69 6c 69 61 72 79 20 66  {FTS auxiliary f
9500: 75 6e 63 74 69 6f 6e 73 7d 3c 2f 74 63 6c 3e 0a  unctions}</tcl>.
9510: 3c 68 31 3e 41 75 78 69 6c 69 61 72 79 20 46 75  <h1>Auxiliary Fu
9520: 6e 63 74 69 6f 6e 73 20 2d 20 53 6e 69 70 70 65  nctions - Snippe
9530: 74 2c 20 4f 66 66 73 65 74 73 20 61 6e 64 20 4d  t, Offsets and M
9540: 61 74 63 68 69 6e 66 6f 3c 2f 68 31 3e 0a 0a 3c  atchinfo</h1>..<
9550: 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20 61 6e  p>.  The FTS3 an
9560: 64 20 46 54 53 34 20 6d 6f 64 75 6c 65 73 20 70  d FTS4 modules p
9570: 72 6f 76 69 64 65 20 74 68 72 65 65 20 73 70 65  rovide three spe
9580: 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20  cial SQL scalar 
9590: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  functions that m
95a0: 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20 20 74  ay be useful.  t
95b0: 6f 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  o the developers
95c0: 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71 75   of full-text qu
95d0: 65 72 79 20 73 79 73 74 65 6d 73 3a 20 22 73 6e  ery systems: "sn
95e0: 69 70 70 65 74 22 2c 20 22 6f 66 66 73 65 74 73  ippet", "offsets
95f0: 22 20 61 6e 64 0a 20 20 22 6d 61 74 63 68 69 6e  " and.  "matchin
9600: 66 6f 22 2e 20 54 68 65 20 70 75 72 70 6f 73 65  fo". The purpose
9610: 20 6f 66 20 74 68 65 20 22 73 6e 69 70 70 65 74   of the "snippet
9620: 22 20 61 6e 64 20 22 6f 66 66 73 65 74 73 22 20  " and "offsets" 
9630: 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 6f 20  functions is to 
9640: 61 6c 6c 6f 77 0a 20 20 74 68 65 20 75 73 65 72  allow.  the user
9650: 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
9660: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 71 75 65   location of que
9670: 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20 74 68  ried terms in th
9680: 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 75 6d  e returned docum
9690: 65 6e 74 73 2e 0a 20 20 54 68 65 20 22 6d 61 74  ents..  The "mat
96a0: 63 68 69 6e 66 6f 22 20 66 75 6e 63 74 69 6f 6e  chinfo" function
96b0: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 75 73   provides the us
96c0: 65 72 20 77 69 74 68 20 6d 65 74 72 69 63 73 20  er with metrics 
96d0: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 66  that may be usef
96e0: 75 6c 0a 20 20 66 6f 72 20 66 69 6c 74 65 72 69  ul.  for filteri
96f0: 6e 67 20 6f 72 20 73 6f 72 74 69 6e 67 20 71 75  ng or sorting qu
9700: 65 72 79 20 72 65 73 75 6c 74 73 20 61 63 63 6f  ery results acco
9710: 72 64 69 6e 67 20 74 6f 20 72 65 6c 65 76 61 6e  rding to relevan
9720: 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  ce...<p>.  The f
9730: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
9740: 20 61 6c 6c 20 74 68 72 65 65 20 73 70 65 63 69   all three speci
9750: 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75  al SQL scalar fu
9760: 6e 63 74 69 6f 6e 73 0a 20 20 6d 75 73 74 20 62  nctions.  must b
9770: 65 20 74 68 65 20 5b 46 54 53 20 68 69 64 64 65  e the [FTS hidde
9780: 6e 20 63 6f 6c 75 6d 6e 5d 20 6f 66 20 74 68 65  n column] of the
9790: 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20   FTS table that 
97a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  the function is.
97b0: 20 20 61 70 70 6c 69 65 64 20 74 6f 2e 20 20 54    applied to.  T
97c0: 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63  he [FTS hidden c
97d0: 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61 75 74  olumn] is an aut
97e0: 6f 6d 61 74 69 63 61 6c 6c 79 2d 67 65 6e 65 72  omatically-gener
97f0: 61 74 65 64 20 63 6f 6c 75 6d 6e 20 66 6f 75 6e  ated column foun
9800: 64 20 6f 6e 0a 20 20 61 6c 6c 20 46 54 53 20 74  d on.  all FTS t
9810: 61 62 6c 65 73 20 74 68 61 74 20 68 61 73 20 74  ables that has t
9820: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
9830: 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 69 74  the FTS table it
9840: 73 65 6c 66 2e 0a 20 20 46 6f 72 20 65 78 61 6d  self..  For exam
9850: 70 6c 65 2c 20 67 69 76 65 6e 20 61 6e 20 46 54  ple, given an FT
9860: 53 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 6d  S table named "m
9870: 61 69 6c 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  ail":..<codebloc
9880: 6b 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73  k>.  SELECT offs
9890: 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  ets(mail) FROM m
98a0: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
98b0: 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65  ATCH &lt;full-te
98c0: 78 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73  xt query express
98d0: 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45 4c 45 43  ion&gt;;.  SELEC
98e0: 54 20 73 6e 69 70 70 65 74 28 6d 61 69 6c 29 20  T snippet(mail) 
98f0: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
9900: 6d 61 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66  mail MATCH &lt;f
9910: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 65  ull-text query e
9920: 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20  xpression&gt;;. 
9930: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e 66   SELECT matchinf
9940: 6f 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69  o(mail) FROM mai
9950: 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54  l WHERE mail MAT
9960: 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74  CH &lt;full-text
9970: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
9980: 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  n&gt;;.</codeblo
9990: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74  ck>..<p>.  The t
99a0: 68 72 65 65 20 61 75 78 69 6c 69 61 72 79 20 66  hree auxiliary f
99b0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c  unctions are onl
99c0: 79 20 75 73 65 66 75 6c 20 77 69 74 68 69 6e 20  y useful within 
99d0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
99e0: 6e 74 20 74 68 61 74 0a 20 20 75 73 65 73 20 74  nt that.  uses t
99f0: 68 65 20 46 54 53 20 74 61 62 6c 65 27 73 20 66  he FTS table's f
9a00: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
9a10: 5e 49 66 20 75 73 65 64 20 77 69 74 68 69 6e 20  ^If used within 
9a20: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 75 73  a SELECT that us
9a30: 65 73 0a 20 20 74 68 65 20 22 71 75 65 72 79 20  es.  the "query 
9a40: 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c 69  by rowid" or "li
9a50: 6e 65 61 72 20 73 63 61 6e 22 20 73 74 72 61 74  near scan" strat
9a60: 65 67 69 65 73 2c 20 74 68 65 6e 20 74 68 65 20  egies, then the 
9a70: 73 6e 69 70 70 65 74 20 61 6e 64 0a 20 20 6f 66  snippet and.  of
9a80: 66 73 65 74 73 20 62 6f 74 68 20 72 65 74 75 72  fsets both retur
9a90: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
9aa0: 67 2c 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68  g, and the match
9ab0: 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 72 65  info function re
9ac0: 74 75 72 6e 73 0a 20 20 61 20 62 6c 6f 62 20 76  turns.  a blob v
9ad0: 61 6c 75 65 20 7a 65 72 6f 20 62 79 74 65 73 20  alue zero bytes 
9ae0: 69 6e 20 73 69 7a 65 2e 0a 0a 3c 70 20 69 64 3d  in size...<p id=
9af0: 6d 61 74 63 68 61 62 6c 65 3e 0a 20 20 41 6c 6c  matchable>.  All
9b00: 20 74 68 72 65 65 20 61 75 78 69 6c 69 61 72 79   three auxiliary
9b10: 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 74 72 61   functions extra
9b20: 63 74 20 61 20 73 65 74 20 6f 66 20 22 6d 61 74  ct a set of "mat
9b30: 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 22 20  chable phrases" 
9b40: 66 72 6f 6d 0a 20 20 74 68 65 20 46 54 53 20 71  from.  the FTS q
9b50: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
9b60: 74 6f 20 77 6f 72 6b 20 77 69 74 68 2e 20 54 68  to work with. Th
9b70: 65 20 73 65 74 20 6f 66 20 6d 61 74 63 68 61 62  e set of matchab
9b80: 6c 65 20 70 68 72 61 73 65 73 20 66 6f 72 0a 20  le phrases for. 
9b90: 20 61 20 67 69 76 65 6e 20 71 75 65 72 79 20 63   a given query c
9ba0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c 20 70  onsists of all p
9bb0: 68 72 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  hrases (includin
9bc0: 67 20 75 6e 71 75 6f 74 65 64 20 74 6f 6b 65 6e  g unquoted token
9bd0: 73 20 61 6e 64 0a 20 20 74 6f 6b 65 6e 20 70 72  s and.  token pr
9be0: 65 66 69 78 65 73 29 20 69 6e 20 74 68 65 20 65  efixes) in the e
9bf0: 78 70 72 65 73 73 69 6f 6e 20 65 78 63 65 70 74  xpression except
9c00: 20 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20   those that are 
9c10: 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 20 20  prefixed with.  
9c20: 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72  a unary "-" oper
9c30: 61 74 6f 72 20 28 73 74 61 6e 64 61 72 64 20 73  ator (standard s
9c40: 79 6e 74 61 78 29 20 6f 72 20 61 72 65 20 70 61  yntax) or are pa
9c50: 72 74 20 6f 66 20 61 20 73 75 62 2d 65 78 70 72  rt of a sub-expr
9c60: 65 73 73 69 6f 6e 20 0a 20 20 74 68 61 74 20 69  ession .  that i
9c70: 73 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  s used as the ri
9c80: 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  ght-hand operand
9c90: 20 6f 66 20 61 20 4e 4f 54 20 6f 70 65 72 61 74   of a NOT operat
9ca0: 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 57 69 74 68 20  or...<p>.  With 
9cb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
9cc0: 6f 76 69 73 6f 73 2c 20 65 61 63 68 20 73 65 72  ovisos, each ser
9cd0: 69 65 73 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ies of tokens in
9ce0: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 74   the FTS table t
9cf0: 68 61 74 0a 20 20 6d 61 74 63 68 65 73 20 6f 6e  hat.  matches on
9d00: 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68 61 62  e of the matchab
9d10: 6c 65 20 70 68 72 61 73 65 73 20 69 6e 20 74 68  le phrases in th
9d20: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
9d30: 6f 6e 20 69 73 20 6b 6e 6f 77 6e 20 61 73 20 61  on is known as a
9d40: 0a 20 20 22 70 68 72 61 73 65 20 6d 61 74 63 68  .  "phrase match
9d50: 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20  ":..<ol>.  <li> 
9d60: 49 66 20 61 20 6d 61 74 63 68 61 62 6c 65 20 70  If a matchable p
9d70: 68 72 61 73 65 20 69 73 20 70 61 72 74 20 6f 66  hrase is part of
9d80: 20 61 20 73 65 72 69 65 73 20 6f 66 20 70 68 72   a series of phr
9d90: 61 73 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ases connected b
9da0: 79 0a 20 20 20 20 20 20 20 4e 45 41 52 20 6f 70  y.       NEAR op
9db0: 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 46  erators in the F
9dc0: 54 53 20 71 75 65 72 79 20 65 78 70 72 65 73 73  TS query express
9dd0: 69 6f 6e 2c 20 74 68 65 6e 20 65 61 63 68 20 70  ion, then each p
9de0: 68 72 61 73 65 20 6d 61 74 63 68 0a 20 20 20 20  hrase match.    
9df0: 20 20 20 6d 75 73 74 20 62 65 20 73 75 66 66 69     must be suffi
9e00: 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65 20 74 6f  ciently close to
9e10: 20 6f 74 68 65 72 20 70 68 72 61 73 65 20 6d 61   other phrase ma
9e20: 74 63 68 65 73 20 6f 66 20 74 68 65 20 72 65 6c  tches of the rel
9e30: 65 76 61 6e 74 0a 20 20 20 20 20 20 20 74 79 70  evant.       typ
9e40: 65 73 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  es to satisfy th
9e50: 65 20 4e 45 41 52 20 63 6f 6e 64 69 74 69 6f 6e  e NEAR condition
9e60: 2e 0a 0a 20 20 3c 6c 69 3e 20 49 66 20 74 68 65  ...  <li> If the
9e70: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
9e80: 65 20 69 6e 20 74 68 65 20 46 54 53 20 71 75 65  e in the FTS que
9e90: 72 79 20 69 73 20 72 65 73 74 72 69 63 74 65 64  ry is restricted
9ea0: 20 74 6f 20 6d 61 74 63 68 69 6e 67 0a 20 20 20   to matching.   
9eb0: 20 20 20 20 64 61 74 61 20 69 6e 20 61 20 73 70      data in a sp
9ec0: 65 63 69 66 69 65 64 20 46 54 53 20 74 61 62 6c  ecified FTS tabl
9ed0: 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 6f  e column, then o
9ee0: 6e 6c 79 20 70 68 72 61 73 65 20 6d 61 74 63 68  nly phrase match
9ef0: 65 73 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  es that .       
9f00: 6f 63 63 75 72 20 77 69 74 68 69 6e 20 74 68 61  occur within tha
9f10: 74 20 63 6f 6c 75 6d 6e 20 61 72 65 20 63 6f 6e  t column are con
9f20: 73 69 64 65 72 65 64 2e 0a 3c 2f 6f 6c 3e 0a 20  sidered..</ol>. 
9f30: 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
9f40: 74 20 6f 66 66 73 65 74 73 20 6f 66 66 73 65 74  t offsets offset
9f50: 73 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68 65 20  s</tcl>.<h2>The 
9f60: 4f 66 66 73 65 74 73 20 46 75 6e 63 74 69 6f 6e  Offsets Function
9f70: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72  </h2>..<p>.  For
9f80: 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79 20   a SELECT query 
9f90: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 66 75  that uses the fu
9fa0: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20 74  ll-text index, t
9fb0: 68 65 20 6f 66 66 73 65 74 73 28 29 20 66 75 6e  he offsets() fun
9fc0: 63 74 69 6f 6e 20 0a 20 20 72 65 74 75 72 6e 73  ction .  returns
9fd0: 20 61 20 74 65 78 74 20 76 61 6c 75 65 20 63 6f   a text value co
9fe0: 6e 74 61 69 6e 69 6e 67 20 61 20 73 65 72 69 65  ntaining a serie
9ff0: 73 20 6f 66 20 73 70 61 63 65 2d 73 65 70 61 72  s of space-separ
a000: 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20 46  ated integers. F
a010: 6f 72 0a 20 20 65 61 63 68 20 74 65 72 6d 20 69  or.  each term i
a020: 6e 20 65 61 63 68 20 3c 61 20 68 72 65 66 3d 23  n each <a href=#
a030: 6d 61 74 63 68 61 62 6c 65 3e 70 68 72 61 73 65  matchable>phrase
a040: 20 6d 61 74 63 68 3c 2f 61 3e 20 6f 66 20 74 68   match</a> of th
a050: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 0a  e current row, .
a060: 20 20 74 68 65 72 65 20 61 72 65 20 66 6f 75 72    there are four
a070: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65   integers in the
a080: 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 2e 20   returned list. 
a090: 45 61 63 68 20 73 65 74 20 6f 66 20 66 6f 75 72  Each set of four
a0a0: 20 69 6e 74 65 67 65 72 73 20 69 73 20 0a 20 20   integers is .  
a0b0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
a0c0: 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20  ollows:..<table 
a0d0: 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72  striped=1>.  <tr
a0e0: 3e 3c 74 68 3e 49 6e 74 65 67 65 72 20 3c 74 68  ><th>Integer <th
a0f0: 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 0a  >Interpretation.
a100: 20 20 3c 74 72 3e 3c 74 64 3e 30 20 0a 20 20 20    <tr><td>0 .   
a110: 20 20 20 3c 74 64 3e 54 68 65 20 63 6f 6c 75 6d     <td>The colum
a120: 6e 20 6e 75 6d 62 65 72 20 74 68 61 74 20 74 68  n number that th
a130: 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 20  e term instance 
a140: 6f 63 63 75 72 73 20 69 6e 20 28 30 20 66 6f 72  occurs in (0 for
a150: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 6c   the.          l
a160: 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  eftmost column o
a170: 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c  f the FTS table,
a180: 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20   1 for the next 
a190: 6c 65 66 74 6d 6f 73 74 2c 20 65 74 63 2e 29 2e  leftmost, etc.).
a1a0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 0a 20 20 20  .  <tr><td>1.   
a1b0: 20 20 20 3c 74 64 3e 54 68 65 20 74 65 72 6d 20     <td>The term 
a1c0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6d 61  number of the ma
a1d0: 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69 74 68  tching term with
a1e0: 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  in the full-text
a1f0: 20 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 20   query.         
a200: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 65 72   expression. Ter
a210: 6d 73 20 77 69 74 68 69 6e 20 61 20 71 75 65 72  ms within a quer
a220: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  y expression are
a230: 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
a240: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 66 72 6f  ng.          fro
a250: 6d 20 30 20 69 6e 20 74 68 65 20 6f 72 64 65 72  m 0 in the order
a260: 20 74 68 61 74 20 74 68 65 79 20 6f 63 63 75 72   that they occur
a270: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 0a 20 20  ..  <tr><td>2.  
a280: 20 20 20 20 3c 74 64 3e 54 68 65 20 62 79 74 65      <td>The byte
a290: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 6d   offset of the m
a2a0: 61 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69 74  atching term wit
a2b0: 68 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  hin the column..
a2c0: 20 20 3c 74 72 3e 3c 74 64 3e 33 0a 20 20 20 20    <tr><td>3.    
a2d0: 20 20 3c 74 64 3e 54 68 65 20 73 69 7a 65 20 6f    <td>The size o
a2e0: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 74  f the matching t
a2f0: 65 72 6d 20 69 6e 20 62 79 74 65 73 2e 0a 3c 2f  erm in bytes..</
a300: 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 54 68  table>..<p>.  Th
a310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a320: 6b 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70  k contains examp
a330: 6c 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  les that use the
a340: 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74 69 6f   offsets functio
a350: 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  n...<codeblock>.
a360: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
a370: 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e   TABLE mail USIN
a380: 47 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20  G fts3(subject, 
a390: 62 6f 64 79 29 3b 0a 20 20 49 4e 53 45 52 54 20  body);.  INSERT 
a3a0: 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55 45 53  INTO mail VALUES
a3b0: 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20  ('hello world', 
a3c0: 27 54 68 69 73 20 6d 65 73 73 61 67 65 20 69 73  'This message is
a3d0: 20 61 20 68 65 6c 6c 6f 20 77 6f 72 6c 64 20 6d   a hello world m
a3e0: 65 73 73 61 67 65 2e 27 29 3b 0a 20 20 49 4e 53  essage.');.  INS
a3f0: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41  ERT INTO mail VA
a400: 4c 55 45 53 28 27 75 72 67 65 6e 74 3a 20 73 65  LUES('urgent: se
a410: 72 69 6f 75 73 27 2c 20 27 54 68 69 73 20 6d 61  rious', 'This ma
a420: 69 6c 20 69 73 20 73 65 65 6e 20 61 73 20 61 20  il is seen as a 
a430: 6d 6f 72 65 20 73 65 72 69 6f 75 73 20 6d 61 69  more serious mai
a440: 6c 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  l');..  <i>-- Th
a450: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
a460: 79 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67  y returns a sing
a470: 6c 65 20 72 6f 77 20 28 61 73 20 69 74 20 6d 61  le row (as it ma
a480: 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65 20 66  tches only the f
a490: 69 72 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  irst</i>.  <i>--
a4a0: 20 65 6e 74 72 79 20 69 6e 20 74 61 62 6c 65 20   entry in table 
a4b0: 22 6d 61 69 6c 22 2e 20 54 68 65 20 74 65 78 74  "mail". The text
a4c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
a4d0: 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74 69 6f   offsets functio
a4e0: 6e 20 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  n is</i>.  <i>--
a4f0: 20 22 30 20 30 20 36 20 35 20 31 20 30 20 32 34   "0 0 6 5 1 0 24
a500: 20 35 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   5".</i>.  <i>--
a510: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  </i>.  <i>-- The
a520: 20 66 69 72 73 74 20 73 65 74 20 6f 66 20 66 6f   first set of fo
a530: 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74  ur integers in t
a540: 68 65 20 72 65 73 75 6c 74 20 69 6e 64 69 63 61  he result indica
a550: 74 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 30  te that column 0
a560: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 63 6f 6e  </i>.  <i>-- con
a570: 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61 6e 63  tains an instanc
a580: 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22 77 6f  e of term 0 ("wo
a590: 72 6c 64 22 29 20 61 74 20 62 79 74 65 20 6f 66  rld") at byte of
a5a0: 66 73 65 74 20 36 2e 20 54 68 65 20 74 65 72 6d  fset 6. The term
a5b0: 20 69 6e 73 74 61 6e 63 65 3c 2f 69 3e 0a 20 20   instance</i>.  
a5c0: 3c 69 3e 2d 2d 20 69 73 20 35 20 62 79 74 65 73  <i>-- is 5 bytes
a5d0: 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20 73 65   in size. The se
a5e0: 63 6f 6e 64 20 73 65 74 20 6f 66 20 66 6f 75 72  cond set of four
a5f0: 20 69 6e 74 65 67 65 72 73 20 73 68 6f 77 73 20   integers shows 
a600: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 31 3c 2f 69  that column 1</i
a610: 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65  >.  <i>-- of the
a620: 20 6d 61 74 63 68 65 64 20 72 6f 77 20 63 6f 6e   matched row con
a630: 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61 6e 63  tains an instanc
a640: 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22 77 6f  e of term 0 ("wo
a650: 72 6c 64 22 29 20 61 74 20 62 79 74 65 20 6f 66  rld") at byte of
a660: 66 73 65 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  fset</i>.  <i>--
a670: 20 32 34 2e 20 41 67 61 69 6e 2c 20 74 68 65 20   24. Again, the 
a680: 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 20 69 73  term instance is
a690: 20 35 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   5 bytes in size
a6a0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 6f  .</i>.  SELECT o
a6b0: 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f  ffsets(mail) FRO
a6c0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
a6d0: 6c 20 4d 41 54 43 48 20 27 77 6f 72 6c 64 27 3b  l MATCH 'world';
a6e0: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
a6f0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
a700: 74 75 72 6e 73 20 61 6c 73 6f 20 6d 61 74 63 68  turns also match
a710: 65 73 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  es only the firs
a720: 74 20 72 6f 77 20 69 6e 20 74 61 62 6c 65 20 22  t row in table "
a730: 6d 61 69 6c 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e  mail".</i>.  <i>
a740: 2d 2d 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  -- In this case 
a750: 74 68 65 20 72 65 74 75 72 6e 65 64 20 74 65 78  the returned tex
a760: 74 20 69 73 20 22 31 20 30 20 35 20 37 20 31 20  t is "1 0 5 7 1 
a770: 30 20 33 30 20 37 22 2e 3c 2f 69 3e 0a 20 20 53  0 30 7".</i>.  S
a780: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61  ELECT offsets(ma
a790: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
a7a0: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27  ERE mail MATCH '
a7b0: 6d 65 73 73 61 67 65 27 3b 0a 0a 20 20 3c 69 3e  message';..  <i>
a7c0: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
a7d0: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 74   query matches t
a7e0: 68 65 20 73 65 63 6f 6e 64 20 72 6f 77 20 69 6e  he second row in
a7f0: 20 74 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20 49   table "mail". I
a800: 74 20 72 65 74 75 72 6e 73 20 74 68 65 3c 2f 69  t returns the</i
a810: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65 78 74 20 22  >.  <i>-- text "
a820: 31 20 30 20 32 38 20 37 20 31 20 31 20 33 36 20  1 0 28 7 1 1 36 
a830: 34 22 2e 20 4f 6e 6c 79 20 74 68 6f 73 65 20 6f  4". Only those o
a840: 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74 65  ccurrences of te
a850: 72 6d 73 20 22 73 65 72 69 6f 75 73 22 20 61 6e  rms "serious" an
a860: 64 20 22 6d 61 69 6c 22 3c 2f 69 3e 0a 20 20 3c  d "mail"</i>.  <
a870: 69 3e 2d 2d 20 74 68 61 74 20 61 72 65 20 70 61  i>-- that are pa
a880: 72 74 20 6f 66 20 61 6e 20 69 6e 73 74 61 6e 63  rt of an instanc
a890: 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20  e of the phrase 
a8a0: 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 20 61  "serious mail" a
a8b0: 72 65 20 69 64 65 6e 74 69 66 69 65 64 3b 20 74  re identified; t
a8c0: 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f  he</i>.  <i>-- o
a8d0: 74 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65 73  ther occurrences
a8e0: 20 6f 66 20 22 73 65 72 69 6f 75 73 22 20 61 6e   of "serious" an
a8f0: 64 20 22 6d 61 69 6c 22 20 61 72 65 20 69 67 6e  d "mail" are ign
a900: 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ored.</i>.  SELE
a910: 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29  CT offsets(mail)
a920: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
a930: 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 22 73 65   mail MATCH '"se
a940: 72 69 6f 75 73 20 6d 61 69 6c 22 27 3b 0a 3c 2f  rious mail"';.</
a950: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c  codeblock>..<tcl
a960: 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 73 6e 69  >hd_fragment sni
a970: 70 70 65 74 20 73 6e 69 70 70 65 74 3c 2f 74 63  ppet snippet</tc
a980: 6c 3e 0a 3c 68 32 3e 54 68 65 20 53 6e 69 70 70  l>.<h2>The Snipp
a990: 65 74 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32 3e  et Function</h2>
a9a0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69 70  ..<p>.  The snip
a9b0: 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  pet function is 
a9c0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 66  used to create f
a9d0: 6f 72 6d 61 74 74 65 64 20 66 72 61 67 6d 65 6e  ormatted fragmen
a9e0: 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74  ts of document t
a9f0: 65 78 74 0a 20 20 66 6f 72 20 64 69 73 70 6c 61  ext.  for displa
aa00: 79 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  y as part of a f
aa10: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 72  ull-text query r
aa20: 65 73 75 6c 74 73 20 72 65 70 6f 72 74 2e 20 54  esults report. T
aa30: 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74  he snippet funct
aa40: 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65 20 70 61  ion .  may be pa
aa50: 73 73 65 64 20 62 65 74 77 65 65 6e 20 6f 6e 65  ssed between one
aa60: 20 61 6e 64 20 73 69 78 20 61 72 67 75 6d 65 6e   and six argumen
aa70: 74 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ts, as follows:.
aa80: 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d  .<table striped=
aa90: 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 41 72 67  1>.  <tr><th>Arg
aaa0: 75 6d 65 6e 74 20 3c 74 68 3e 44 65 66 61 75 6c  ument <th>Defaul
aab0: 74 20 56 61 6c 75 65 20 3c 74 68 3e 44 65 73 63  t Value <th>Desc
aac0: 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74  ription.  <tr><t
aad0: 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a 20 20 20 20  d>0 <td>N/A.    
aae0: 20 20 3c 74 64 3e 20 54 68 65 20 66 69 72 73 74    <td> The first
aaf0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
ab00: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
ab10: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
ab20: 20 74 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e   the [FTS hidden
ab30: 20 63 6f 6c 75 6d 6e 5d 0a 20 20 20 20 20 20 20   column].       
ab40: 20 20 20 20 6f 66 20 74 68 65 20 46 54 53 20 74      of the FTS t
ab50: 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
ab60: 65 64 20 61 6e 64 20 66 72 6f 6d 20 77 68 69 63  ed and from whic
ab70: 68 20 74 68 65 20 73 6e 69 70 70 65 74 20 69 73  h the snippet is
ab80: 20 74 6f 20 62 65 20 74 61 6b 65 6e 2e 20 20 54   to be taken.  T
ab90: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 5b 46  he.           [F
aba0: 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  TS hidden column
abb0: 5d 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  ] is an automati
abc0: 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20  cally generated 
abd0: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20  column with the 
abe0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
abf0: 0a 20 20 20 20 20 20 20 20 20 20 20 46 54 53 20  .           FTS 
ac00: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20  table itself..  
ac10: 3c 74 72 3e 3c 74 64 3e 31 20 3c 74 64 3e 22 26  <tr><td>1 <td>"&
ac20: 6c 74 3b 62 26 67 74 3b 22 0a 20 20 20 20 20 20  lt;b&gt;".      
ac30: 3c 74 64 3e 20 54 68 65 20 22 73 74 61 72 74 20  <td> The "start 
ac40: 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20 20 3c  match" text..  <
ac50: 74 72 3e 3c 74 64 3e 32 20 3c 74 64 3e 22 26 6c  tr><td>2 <td>"&l
ac60: 74 3b 2f 62 26 67 74 3b 22 0a 20 20 20 20 20 20  t;/b&gt;".      
ac70: 3c 74 64 3e 20 54 68 65 20 22 65 6e 64 20 6d 61  <td> The "end ma
ac80: 74 63 68 22 20 74 65 78 74 2e 0a 20 20 3c 74 72  tch" text..  <tr
ac90: 3e 3c 74 64 3e 33 20 3c 74 64 3e 22 26 6c 74 3b  ><td>3 <td>"&lt;
aca0: 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67  b&gt;...&lt;/b&g
acb0: 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20 54  t;".      <td> T
acc0: 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65  he "ellipses" te
acd0: 78 74 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 34 20  xt..  <tr><td>4 
ace0: 3c 74 64 3e 2d 31 0a 20 20 20 20 20 20 3c 74 64  <td>-1.      <td
acf0: 3e 20 54 68 65 20 46 54 53 20 74 61 62 6c 65 20  > The FTS table 
ad00: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f  column number to
ad10: 20 65 78 74 72 61 63 74 20 74 68 65 20 72 65 74   extract the ret
ad20: 75 72 6e 65 64 20 66 72 61 67 6d 65 6e 74 73 20  urned fragments 
ad30: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20 74 65  of.           te
ad40: 78 74 20 66 72 6f 6d 2e 20 43 6f 6c 75 6d 6e 73  xt from. Columns
ad50: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 66 72   are numbered fr
ad60: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
ad70: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 0a 20   starting with. 
ad80: 20 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2e 20            zero. 
ad90: 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  A negative value
ada0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
adb0: 74 68 65 20 74 65 78 74 20 6d 61 79 20 62 65 20  the text may be 
adc0: 65 78 74 72 61 63 74 65 64 0a 20 20 20 20 20 20  extracted.      
add0: 20 20 20 20 20 66 72 6f 6d 20 61 6e 79 20 63 6f       from any co
ade0: 6c 75 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  lumn..  <tr><td>
adf0: 35 20 3c 74 64 3e 2d 31 35 0a 20 20 20 20 20 20  5 <td>-15.      
ae00: 3c 74 64 3e 20 54 68 65 20 61 62 73 6f 6c 75 74  <td> The absolut
ae10: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  e value of this 
ae20: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
ae30: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 28 61 70 70  .           (app
ae50: 72 6f 78 69 6d 61 74 65 29 20 6e 75 6d 62 65 72  roximate) number
ae60: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 6f 20 69 6e   of tokens to in
ae70: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 74  clude in the ret
ae80: 75 72 6e 65 64 20 74 65 78 74 20 0a 20 20 20 20  urned text .    
ae90: 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20 54 68         value. Th
aea0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61  e maximum allowa
aeb0: 62 6c 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  ble absolute val
aec0: 75 65 20 69 73 20 36 34 2e 20 54 68 65 20 76 61  ue is 64. The va
aed0: 6c 75 65 20 6f 66 0a 20 20 20 20 20 20 20 20 20  lue of.         
aee0: 20 20 74 68 69 73 20 61 72 67 75 6d 65 6e 74 20    this argument 
aef0: 69 73 20 72 65 66 65 72 72 65 64 20 74 6f 20 61  is referred to a
af00: 73 20 3c 69 3e 4e 3c 2f 69 3e 20 69 6e 20 74 68  s <i>N</i> in th
af10: 65 20 64 69 73 63 75 73 73 69 6f 6e 20 62 65 6c  e discussion bel
af20: 6f 77 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70  ow..</table>..<p
af30: 3e 0a 20 20 54 68 65 20 73 6e 69 70 70 65 74 20  >.  The snippet 
af40: 66 75 6e 63 74 69 6f 6e 20 66 69 72 73 74 20 61  function first a
af50: 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
af60: 61 20 66 72 61 67 6d 65 6e 74 20 6f 66 20 74 65  a fragment of te
af70: 78 74 20 63 6f 6e 73 69 73 74 69 6e 67 0a 20 20  xt consisting.  
af80: 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f  of <i>|N|</i> to
af90: 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20  kens within the 
afa0: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 68 61 74  current row that
afb0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
afc0: 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20 0a 20  st one phrase . 
afd0: 20 6d 61 74 63 68 20 66 6f 72 20 65 61 63 68 20   match for each 
afe0: 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65  matchable phrase
aff0: 20 6d 61 74 63 68 65 64 20 73 6f 6d 65 77 68 65   matched somewhe
b000: 72 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  re in the curren
b010: 74 20 72 6f 77 2c 20 0a 20 20 77 68 65 72 65 20  t row, .  where 
b020: 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 69 73 20 74 68  <i>|N|</i> is th
b030: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
b040: 20 6f 66 20 74 68 65 20 73 69 78 74 68 20 61 72   of the sixth ar
b050: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
b060: 20 74 68 65 0a 20 20 73 6e 69 70 70 65 74 20 66   the.  snippet f
b070: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  unction. If the 
b080: 74 65 78 74 20 73 74 6f 72 65 64 20 69 6e 20 61  text stored in a
b090: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 63   single column c
b0a0: 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74 68 61  ontains less tha
b0b0: 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74  n.  <i>|N|</i> t
b0c0: 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  okens, then the 
b0d0: 65 6e 74 69 72 65 20 63 6f 6c 75 6d 6e 20 76 61  entire column va
b0e0: 6c 75 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  lue is considere
b0f0: 64 2e 20 54 65 78 74 20 66 72 61 67 6d 65 6e 74  d. Text fragment
b100: 73 20 0a 20 20 6d 61 79 20 6e 6f 74 20 73 70 61  s .  may not spa
b110: 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d  n multiple colum
b120: 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 73 75  ns...<p>.  If su
b130: 63 68 20 61 20 74 65 78 74 20 66 72 61 67 6d 65  ch a text fragme
b140: 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  nt can be found,
b150: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
b160: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
b170: 6e 67 0a 20 20 6d 6f 64 69 66 69 63 61 74 69 6f  ng.  modificatio
b180: 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  ns:..<ul>.  <li>
b190: 20 49 66 20 74 68 65 20 74 65 78 74 20 66 72 61   If the text fra
b1a0: 67 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  gment does not b
b1b0: 65 67 69 6e 20 61 74 20 74 68 65 20 73 74 61 72  egin at the star
b1c0: 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 76 61  t of a column va
b1d0: 6c 75 65 2c 0a 20 20 20 20 20 20 20 74 68 65 20  lue,.       the 
b1e0: 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74 20  "ellipses" text 
b1f0: 69 73 20 70 72 65 70 65 6e 64 65 64 20 74 6f 20  is prepended to 
b200: 69 74 2e 0a 20 20 3c 6c 69 3e 20 49 66 20 74 68  it..  <li> If th
b210: 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74 20  e text fragment 
b220: 64 6f 65 73 20 6e 6f 74 20 66 69 6e 69 73 68 20  does not finish 
b230: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
b240: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 0a 20 20  column value,.  
b250: 20 20 20 20 20 74 68 65 20 22 65 6c 6c 69 70 73       the "ellips
b260: 65 73 22 20 74 65 78 74 20 69 73 20 61 70 70 65  es" text is appe
b270: 6e 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 3c 6c  nded to it..  <l
b280: 69 3e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65  i> For each toke
b290: 6e 20 69 6e 20 74 68 65 20 74 65 78 74 20 66 72  n in the text fr
b2a0: 61 67 6d 65 6e 74 20 74 68 61 74 20 69 73 20 70  agment that is p
b2b0: 61 72 74 20 6f 66 20 61 20 70 68 72 61 73 65 20  art of a phrase 
b2c0: 6d 61 74 63 68 2c 0a 20 20 20 20 20 20 20 74 68  match,.       th
b2d0: 65 20 22 73 74 61 72 74 20 6d 61 74 63 68 22 20  e "start match" 
b2e0: 74 65 78 74 20 69 73 20 69 6e 73 65 72 74 65 64  text is inserted
b2f0: 20 69 6e 74 6f 20 74 68 65 20 66 72 61 67 6d 65   into the fragme
b300: 6e 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 6f  nt before the to
b310: 6b 65 6e 2c 0a 20 20 20 20 20 20 20 61 6e 64 20  ken,.       and 
b320: 74 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22 20  the "end match" 
b330: 74 65 78 74 20 69 73 20 69 6e 73 65 72 74 65 64  text is inserted
b340: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
b350: 65 72 20 69 74 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70  er it..</ul>..<p
b360: 3e 0a 20 20 49 66 20 6d 6f 72 65 20 74 68 61 6e  >.  If more than
b370: 20 6f 6e 65 20 73 75 63 68 20 66 72 61 67 6d 65   one such fragme
b380: 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  nt can be found,
b390: 20 74 68 65 6e 20 66 72 61 67 6d 65 6e 74 73 20   then fragments 
b3a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 61  that contain.  a
b3b0: 20 6c 61 72 67 65 72 20 6e 75 6d 62 65 72 20 6f   larger number o
b3c0: 66 20 22 65 78 74 72 61 22 20 70 68 72 61 73 65  f "extra" phrase
b3d0: 20 6d 61 74 63 68 65 73 20 61 72 65 20 66 61 76   matches are fav
b3e0: 6f 75 72 65 64 2e 20 54 68 65 20 73 74 61 72 74  oured. The start
b3f0: 20 6f 66 0a 20 20 74 68 65 20 73 65 6c 65 63 74   of.  the select
b400: 65 64 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74  ed text fragment
b410: 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 61 20   may be moved a 
b420: 66 65 77 20 74 6f 6b 65 6e 73 20 66 6f 72 77 61  few tokens forwa
b430: 72 64 20 6f 72 20 62 61 63 6b 77 61 72 64 0a 20  rd or backward. 
b440: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 63   to attempt to c
b450: 6f 6e 63 65 6e 74 72 61 74 65 20 74 68 65 20 70  oncentrate the p
b460: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74 6f  hrase matches to
b470: 77 61 72 64 20 74 68 65 20 63 65 6e 74 65 72 20  ward the center 
b480: 6f 66 20 74 68 65 0a 20 20 66 72 61 67 6d 65 6e  of the.  fragmen
b490: 74 2e 0a 0a 3c 70 3e 0a 20 20 41 73 73 75 6d 69  t...<p>.  Assumi
b4a0: 6e 67 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 61  ng <i>N</i> is a
b4b0: 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
b4c0: 20 69 66 20 6e 6f 20 66 72 61 67 6d 65 6e 74 73   if no fragments
b4d0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
b4e0: 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20 61 20 70  at.  contain a p
b4f0: 68 72 61 73 65 20 6d 61 74 63 68 20 63 6f 72 72  hrase match corr
b500: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 61 63  esponding to eac
b510: 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  h matchable phra
b520: 73 65 2c 20 74 68 65 20 73 6e 69 70 70 65 74 0a  se, the snippet.
b530: 20 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d    function attem
b540: 70 74 73 20 74 6f 20 66 69 6e 64 20 74 77 6f 20  pts to find two 
b550: 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 61 70 70  fragments of app
b560: 72 6f 78 69 6d 61 74 65 6c 79 20 3c 69 3e 4e 3c  roximately <i>N<
b570: 2f 69 3e 2f 32 20 74 6f 6b 65 6e 73 0a 20 20 74  /i>/2 tokens.  t
b580: 68 61 74 20 62 65 74 77 65 65 6e 20 74 68 65 6d  hat between them
b590: 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
b5a0: 74 20 6f 6e 65 20 70 68 72 61 73 65 20 6d 61 74  t one phrase mat
b5b0: 63 68 20 66 6f 72 20 65 61 63 68 20 6d 61 74 63  ch for each matc
b5c0: 68 61 62 6c 65 20 70 68 72 61 73 65 0a 20 20 6d  hable phrase.  m
b5d0: 61 74 63 68 65 64 20 62 79 20 74 68 65 20 63 75  atched by the cu
b5e0: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 74 68  rrent row. If th
b5f0: 69 73 20 66 61 69 6c 73 2c 20 61 74 74 65 6d 70  is fails, attemp
b600: 74 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 66  ts are made to f
b610: 69 6e 64 20 74 68 72 65 65 0a 20 20 66 72 61 67  ind three.  frag
b620: 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c 2f 69  ments of <i>N</i
b630: 3e 2f 33 20 74 6f 6b 65 6e 73 20 65 61 63 68 20  >/3 tokens each 
b640: 61 6e 64 20 66 69 6e 61 6c 6c 79 20 66 6f 75 72  and finally four
b650: 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f 6b 65   <i>N</i>/4 toke
b660: 6e 0a 20 20 66 72 61 67 6d 65 6e 74 73 2e 20 49  n.  fragments. I
b670: 66 20 61 20 73 65 74 20 6f 66 20 66 6f 75 72 20  f a set of four 
b680: 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 6e 6f 74  fragments cannot
b690: 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 65   be found that e
b6a0: 6e 63 6f 6d 70 61 73 73 65 73 20 74 68 65 0a 20  ncompasses the. 
b6b0: 20 72 65 71 75 69 72 65 64 20 70 68 72 61 73 65   required phrase
b6c0: 20 6d 61 74 63 68 65 73 2c 20 74 68 65 20 66 6f   matches, the fo
b6d0: 75 72 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20  ur fragments of 
b6e0: 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f 6b 65 6e  <i>N</i>/4 token
b6f0: 73 20 74 68 61 74 20 70 72 6f 76 69 64 65 0a 20  s that provide. 
b700: 20 74 68 65 20 62 65 73 74 20 63 6f 76 65 72 61   the best covera
b710: 67 65 20 61 72 65 20 73 65 6c 65 63 74 65 64 2e  ge are selected.
b720: 0a 0a 3c 70 3e 0a 20 20 49 66 20 3c 69 3e 4e 3c  ..<p>.  If <i>N<
b730: 2f 69 3e 20 69 73 20 61 20 6e 65 67 61 74 69 76  /i> is a negativ
b740: 65 20 76 61 6c 75 65 2c 20 61 6e 64 20 6e 6f 20  e value, and no 
b750: 73 69 6e 67 6c 65 20 66 72 61 67 6d 65 6e 74 20  single fragment 
b760: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 0a 20 20  can be found .  
b770: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
b780: 65 71 75 69 72 65 64 20 70 68 72 61 73 65 20 6d  equired phrase m
b790: 61 74 63 68 65 73 2c 20 74 68 65 20 73 6e 69 70  atches, the snip
b7a0: 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  pet function sea
b7b0: 72 63 68 65 73 0a 20 20 66 6f 72 20 74 77 6f 20  rches.  for two 
b7c0: 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e  fragments of <i>
b7d0: 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 20 65  |N|</i> tokens e
b7e0: 61 63 68 2c 20 74 68 65 6e 20 74 68 72 65 65 2c  ach, then three,
b7f0: 20 74 68 65 6e 20 66 6f 75 72 2e 20 49 6e 0a 20   then four. In. 
b800: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
b810: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
b820: 61 6c 75 65 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e  alue of <i>N</i>
b830: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
b840: 65 20 73 69 7a 65 73 0a 20 20 6f 66 20 74 68 65  e sizes.  of the
b850: 20 66 72 61 67 6d 65 6e 74 73 20 69 73 20 6e 6f   fragments is no
b860: 74 20 64 65 63 72 65 61 73 65 64 20 69 66 20 6d  t decreased if m
b870: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 72 61  ore than one fra
b880: 67 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65  gment is require
b890: 64 0a 20 20 74 6f 20 70 72 6f 76 69 64 65 20 74  d.  to provide t
b8a0: 68 65 20 64 65 73 69 72 65 64 20 70 68 72 61 73  he desired phras
b8b0: 65 20 6d 61 74 63 68 20 63 6f 76 65 72 61 67 65  e match coverage
b8c0: 2e 0a 0a 3c 70 3e 0a 20 20 41 66 74 65 72 20 74  ...<p>.  After t
b8d0: 68 65 20 3c 69 3e 4d 3c 2f 69 3e 20 66 72 61 67  he <i>M</i> frag
b8e0: 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20  ments have been 
b8f0: 6c 6f 63 61 74 65 64 2c 20 77 68 65 72 65 20 3c  located, where <
b900: 69 3e 4d 3c 2f 69 3e 20 69 73 20 62 65 74 77 65  i>M</i> is betwe
b910: 65 6e 0a 20 20 74 77 6f 20 61 6e 64 20 66 6f 75  en.  two and fou
b920: 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  r as described i
b930: 6e 20 74 68 65 20 70 61 72 61 67 72 61 70 68 73  n the paragraphs
b940: 20 61 62 6f 76 65 2c 20 74 68 65 79 20 61 72 65   above, they are
b950: 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74 68 65 72   joined together
b960: 0a 20 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  .  in sorted ord
b970: 65 72 20 77 69 74 68 20 74 68 65 20 22 65 6c 6c  er with the "ell
b980: 69 70 73 65 73 22 20 74 65 78 74 20 73 65 70 61  ipses" text sepa
b990: 72 61 74 69 6e 67 20 74 68 65 6d 2e 20 54 68 65  rating them. The
b9a0: 20 74 68 72 65 65 20 0a 20 20 6d 6f 64 69 66 69   three .  modifi
b9b0: 63 61 74 69 6f 6e 73 20 65 6e 75 6d 65 72 61 74  cations enumerat
b9c0: 65 64 20 65 61 72 6c 69 65 72 20 61 72 65 20 70  ed earlier are p
b9d0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
b9e0: 74 65 78 74 20 62 65 66 6f 72 65 20 69 74 20 69  text before it i
b9f0: 73 20 0a 20 20 72 65 74 75 72 6e 65 64 2e 0a 0a  s .  returned...
ba00: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 62  <codeblock>.  <b
ba10: 3e 4e 6f 74 65 3a 20 49 6e 20 74 68 69 73 20 62  >Note: In this b
ba20: 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c 65 73  lock of examples
ba30: 2c 20 6e 65 77 6c 69 6e 65 73 20 61 6e 64 20 77  , newlines and w
ba40: 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63  hitespace charac
ba50: 74 65 72 73 20 68 61 76 65 0a 20 20 62 65 65 6e  ters have.  been
ba60: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
ba70: 68 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e 73 65  he document inse
ba80: 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 46 54  rted into the FT
ba90: 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  S table, and the
baa0: 20 65 78 70 65 63 74 65 64 0a 20 20 72 65 73 75   expected.  resu
bab0: 6c 74 73 20 64 65 73 63 72 69 62 65 64 20 69 6e  lts described in
bac0: 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 73 2e 20 54   SQL comments. T
bad0: 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 65  his is done to e
bae0: 6e 68 61 6e 63 65 20 72 65 61 64 61 62 69 6c 69  nhance readabili
baf0: 74 79 20 6f 6e 6c 79 2c 0a 20 20 74 68 65 79 20  ty only,.  they 
bb00: 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 65  would not be pre
bb10: 73 65 6e 74 20 69 6e 20 61 63 74 75 61 6c 20 53  sent in actual S
bb20: 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64 73 20 6f  QLite commands o
bb30: 72 20 6f 75 74 70 75 74 2e 3c 2f 62 3e 0a 0a 20  r output.</b>.. 
bb40: 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e   <i>-- Create an
bb50: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46 54  d populate an FT
bb60: 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43  S table.</i>.  C
bb70: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
bb80: 42 4c 45 20 74 65 78 74 20 55 53 49 4e 47 20 66  BLE text USING f
bb90: 74 73 34 28 29 3b 0a 20 20 49 4e 53 45 52 54 20  ts4();.  INSERT 
bba0: 49 4e 54 4f 20 74 65 78 74 20 56 41 4c 55 45 53  INTO text VALUES
bbb0: 28 27 0a 20 20 20 20 44 75 72 69 6e 67 20 33 30  ('.    During 30
bbc0: 20 4e 6f 76 2d 31 20 44 65 63 2c 20 32 2d 33 6f   Nov-1 Dec, 2-3o
bbd0: 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c 20 69 6e  C drops. Cool in
bbe0: 20 74 68 65 20 75 70 70 65 72 20 70 6f 72 74 69   the upper porti
bbf0: 6f 6e 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70  on, minimum temp
bc00: 65 72 61 74 75 72 65 20 31 34 2d 31 36 6f 43 20  erature 14-16oC 
bc10: 0a 20 20 20 20 61 6e 64 20 63 6f 6f 6c 20 65 6c  .    and cool el
bc20: 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75 6d  sewhere, minimum
bc30: 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 37 2d   temperature 17-
bc40: 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f 20 76 65  20oC. Cold to ve
bc50: 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f 75 6e 74  ry cold on mount
bc60: 61 69 6e 74 6f 70 73 2c 20 0a 20 20 20 20 6d 69  aintops, .    mi
bc70: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
bc80: 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72 74 68 65  e 6-12oC. Northe
bc90: 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31 35  asterly winds 15
bca0: 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66 74 65 72  -30 km/hr. After
bcb0: 20 74 68 61 74 2c 20 74 65 6d 70 65 72 61 74 75   that, temperatu
bcc0: 72 65 20 0a 20 20 20 20 69 6e 63 72 65 61 73 65  re .    increase
bcd0: 73 2e 20 4e 6f 72 74 68 65 61 73 74 65 72 6c 79  s. Northeasterly
bce0: 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d 2f   winds 15-30 km/
bcf0: 68 72 2e 20 20 20 20 20 0a 20 20 27 29 3b 0a 0a  hr.     .  ');..
bd00: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
bd10: 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65 74 75  owing query retu
bd20: 72 6e 73 20 74 68 65 20 74 65 78 74 20 76 61 6c  rns the text val
bd30: 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ue:</i>.  <i>--<
bd40: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 22 26  /i>.  <i>--   "&
bd50: 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f  lt;b&gt;...&lt;/
bd60: 62 26 67 74 3b 63 6f 6f 6c 20 65 6c 73 65 77 68  b&gt;cool elsewh
bd70: 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d  ere, minimum tem
bd80: 70 65 72 61 74 75 72 65 20 31 37 2d 32 30 6f 43  perature 17-20oC
bd90: 2e 20 26 6c 74 3b 62 26 67 74 3b 43 6f 6c 64 26  . &lt;b&gt;Cold&
bda0: 6c 74 3b 2f 62 26 67 74 3b 20 74 6f 20 76 65 72  lt;/b&gt; to ver
bdb0: 79 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  y </i>.  <i>--  
bdc0: 20 20 26 6c 74 3b 62 26 67 74 3b 63 6f 6c 64 26    &lt;b&gt;cold&
bdd0: 6c 74 3b 2f 62 26 67 74 3b 20 6f 6e 20 6d 6f 75  lt;/b&gt; on mou
bde0: 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69 6e 69 6d  ntaintops, minim
bdf0: 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 36  um temperature 6
be00: 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b  &lt;b&gt;...&lt;
be10: 2f 62 26 67 74 3b 22 2e 3c 2f 69 3e 0a 20 20 3c  /b&gt;".</i>.  <
be20: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
be30: 54 20 73 6e 69 70 70 65 74 28 74 65 78 74 29 20  T snippet(text) 
be40: 46 52 4f 4d 20 74 65 78 74 20 57 48 45 52 45 20  FROM text WHERE 
be50: 74 65 78 74 20 4d 41 54 43 48 20 27 63 6f 6c 64  text MATCH 'cold
be60: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
be70: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20  following query 
be80: 72 65 74 75 72 6e 73 20 74 68 65 20 74 65 78 74  returns the text
be90: 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69   value:</i>.  <i
bea0: 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  >--</i>.  <i>-- 
beb0: 20 20 22 2e 2e 2e 74 68 65 20 75 70 70 65 72 20    "...the upper 
bec0: 70 6f 72 74 69 6f 6e 2c 20 26 23 39 31 3b 6d 69  portion, &#91;mi
bed0: 6e 69 6d 75 6d 26 23 39 33 3b 20 26 23 39 31 3b  nimum&#93; &#91;
bee0: 74 65 6d 70 65 72 61 74 75 72 65 26 23 39 33 3b  temperature&#93;
bef0: 20 31 34 2d 31 36 6f 43 20 61 6e 64 20 63 6f 6f   14-16oC and coo
bf00: 6c 20 65 6c 73 65 77 68 65 72 65 2c 3c 2f 69 3e  l elsewhere,</i>
bf10: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 26 23 39 31  .  <i>--    &#91
bf20: 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20 26 23  ;minimum&#93; &#
bf30: 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65 26 23  91;temperature&#
bf40: 39 33 3b 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c  93; 17-20oC. Col
bf50: 64 2e 2e 2e 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  d..."</i>.  <i>-
bf60: 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 73  -</i>.  SELECT s
bf70: 6e 69 70 70 65 74 28 74 65 78 74 2c 20 27 26 23  nippet(text, '&#
bf80: 39 31 3b 20 27 26 23 39 33 3b 27 2c 20 27 2e 2e  91; '&#93;', '..
bf90: 2e 27 29 20 46 52 4f 4d 20 74 65 78 74 20 57 48  .') FROM text WH
bfa0: 45 52 45 20 74 65 78 74 20 4d 41 54 43 48 20 27  ERE text MATCH '
bfb0: 22 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a 3c 2f 63  "min* tem*"'.</c
bfc0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 20 69  odeblock>..<h2 i
bfd0: 64 3d 6d 61 74 63 68 69 6e 66 6f 20 74 61 67 73  d=matchinfo tags
bfe0: 3d 6d 61 74 63 68 69 6e 66 6f 3e 54 68 65 20 4d  =matchinfo>The M
bff0: 61 74 63 68 69 6e 66 6f 20 46 75 6e 63 74 69 6f  atchinfo Functio
c000: 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68  n</h2>..<p>.  Th
c010: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63  e matchinfo func
c020: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 62  tion returns a b
c030: 6c 6f 62 20 76 61 6c 75 65 2e 20 49 66 20 69 74  lob value. If it
c040: 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
c050: 61 20 71 75 65 72 79 0a 20 20 74 68 61 74 20 64  a query.  that d
c060: 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65 20  oes not use the 
c070: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
c080: 28 61 20 22 71 75 65 72 79 20 62 79 20 72 6f 77  (a "query by row
c090: 69 64 22 20 6f 72 20 22 6c 69 6e 65 61 72 20 73  id" or "linear s
c0a0: 63 61 6e 22 29 2c 0a 20 20 74 68 65 6e 20 74 68  can"),.  then th
c0b0: 65 20 62 6c 6f 62 20 69 73 20 7a 65 72 6f 20 62  e blob is zero b
c0c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
c0d0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 62 6c 6f  herwise, the blo
c0e0: 62 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  b consists of ze
c0f0: 72 6f 0a 20 20 6f 72 20 6d 6f 72 65 20 33 32 2d  ro.  or more 32-
c100: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
c110: 65 67 65 72 73 20 69 6e 20 6d 61 63 68 69 6e 65  egers in machine
c120: 20 62 79 74 65 2d 6f 72 64 65 72 2e 20 54 68 65   byte-order. The
c130: 20 65 78 61 63 74 20 6e 75 6d 62 65 72 0a 20 20   exact number.  
c140: 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74  of integers in t
c150: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
c160: 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 6f 74  y depends on bot
c170: 68 20 74 68 65 20 71 75 65 72 79 20 61 6e 64 20  h the query and 
c180: 74 68 65 20 76 61 6c 75 65 0a 20 20 6f 66 20 74  the value.  of t
c190: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c1a0: 6e 74 20 28 69 66 20 61 6e 79 29 20 70 61 73 73  nt (if any) pass
c1b0: 65 64 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69  ed to the matchi
c1c0: 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a 3c  nfo function...<
c1d0: 70 3e 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e  p>.  The matchin
c1e0: 66 6f 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  fo function is c
c1f0: 61 6c 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  alled with eithe
c200: 72 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72 67  r one or two arg
c210: 75 6d 65 6e 74 73 2e 20 41 73 20 66 6f 72 0a 20  uments. As for. 
c220: 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 66   all auxiliary f
c230: 75 6e 63 74 69 6f 6e 73 2c 20 74 68 65 20 66 69  unctions, the fi
c240: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  rst argument mus
c250: 74 20 62 65 20 74 68 65 20 73 70 65 63 69 61 6c  t be the special
c260: 20 0a 20 20 5b 46 54 53 20 68 69 64 64 65 6e 20   .  [FTS hidden 
c270: 63 6f 6c 75 6d 6e 5d 2e 20 54 68 65 20 73 65 63  column]. The sec
c280: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  ond argument, if
c290: 20 69 74 20 69 73 20 73 70 65 63 69 66 69 65 64   it is specified
c2a0: 2c 20 6d 75 73 74 20 62 65 20 61 20 74 65 78 74  , must be a text
c2b0: 20 76 61 6c 75 65 0a 20 20 63 6f 6d 70 72 69 73   value.  compris
c2c0: 65 64 20 6f 6e 6c 79 20 6f 66 20 74 68 65 20 63  ed only of the c
c2d0: 68 61 72 61 63 74 65 72 73 20 27 70 27 2c 20 27  haracters 'p', '
c2e0: 63 27 2c 20 27 6e 27 2c 20 27 61 27 2c 20 27 6c  c', 'n', 'a', 'l
c2f0: 27 2c 20 27 73 27 20 61 6e 64 20 27 78 27 2e 0a  ', 's' and 'x'..
c300: 20 20 49 66 20 6e 6f 20 73 65 63 6f 6e 64 20 61    If no second a
c310: 72 67 75 6d 65 6e 74 20 69 73 20 65 78 70 6c 69  rgument is expli
c320: 63 69 74 6c 79 20 73 75 70 70 6c 69 65 64 2c 20  citly supplied, 
c330: 69 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20 22  it defaults to "
c340: 70 63 78 22 2e 20 54 68 65 0a 20 20 73 65 63 6f  pcx". The.  seco
c350: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  nd argument is r
c360: 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 74 68  eferred to as th
c370: 65 20 22 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  e "format string
c380: 22 20 62 65 6c 6f 77 2e 0a 0a 3c 70 3e 0a 20 20  " below...<p>.  
c390: 43 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  Characters in th
c3a0: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 6f 72 6d  e matchinfo form
c3b0: 61 74 20 73 74 72 69 6e 67 20 61 72 65 20 70 72  at string are pr
c3c0: 6f 63 65 73 73 65 64 20 66 72 6f 6d 20 6c 65 66  ocessed from lef
c3d0: 74 20 74 6f 20 72 69 67 68 74 2e 20 0a 20 20 45  t to right. .  E
c3e0: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
c3f0: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
c400: 6e 67 20 63 61 75 73 65 73 20 6f 6e 65 20 6f 72  ng causes one or
c410: 20 6d 6f 72 65 20 33 32 2d 62 69 74 20 75 6e 73   more 32-bit uns
c420: 69 67 6e 65 64 0a 20 20 69 6e 74 65 67 65 72 20  igned.  integer 
c430: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 61 64 64  values to be add
c440: 65 64 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e  ed to the return
c450: 65 64 20 61 72 72 61 79 2e 20 54 68 65 20 22 76  ed array. The "v
c460: 61 6c 75 65 73 22 20 63 6f 6c 75 6d 6e 20 69 6e  alues" column in
c470: 0a 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  the following
c480: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
c490: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
c4a0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 61 70 70  teger values app
c4b0: 65 6e 64 65 64 20 74 6f 20 74 68 65 0a 20 20 6f  ended to the.  o
c4c0: 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f 72  utput buffer for
c4d0: 20 65 61 63 68 20 73 75 70 70 6f 72 74 65 64 20   each supported 
c4e0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 63 68  format string ch
c4f0: 61 72 61 63 74 65 72 2e 20 49 6e 20 74 68 65 20  aracter. In the 
c500: 66 6f 72 6d 75 6c 61 0a 20 20 67 69 76 65 6e 2c  formula.  given,
c510: 20 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 69 73 20   <i>cols</i> is 
c520: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
c530: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53  lumns in the FTS
c540: 20 74 61 62 6c 65 2c 20 61 6e 64 20 0a 20 20 3c   table, and .  <
c550: 69 3e 70 68 72 61 73 65 73 3c 2f 69 3e 20 69 73  i>phrases</i> is
c560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3c   the number of <
c570: 61 20 68 72 65 66 3d 23 6d 61 74 63 68 61 62 6c  a href=#matchabl
c580: 65 3e 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  e>matchable phra
c590: 73 65 73 3c 2f 61 3e 20 69 6e 20 0a 20 20 74 68  ses</a> in .  th
c5a0: 65 20 71 75 65 72 79 2e 20 0a 0a 3c 74 61 62 6c  e query. ..<tabl
c5b0: 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c  e striped=1>.  <
c5c0: 74 72 3e 3c 74 68 3e 43 68 61 72 61 63 74 65 72  tr><th>Character
c5d0: 3c 74 68 3e 56 61 6c 75 65 73 3c 74 68 3e 44 65  <th>Values<th>De
c5e0: 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72 3e  scription.  <tr>
c5f0: 3c 74 64 3e 70 20 3c 74 64 3e 31 20 3c 74 64 3e  <td>p <td>1 <td>
c600: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  The number of ma
c610: 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20  tchable phrases 
c620: 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  in the query..  
c630: 3c 74 72 3e 3c 74 64 3e 63 20 3c 74 64 3e 31 20  <tr><td>c <td>1 
c640: 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f  <td>The number o
c650: 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  f user defined c
c660: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
c670: 53 0a 20 20 20 20 74 61 62 6c 65 20 28 69 2e 65  S.    table (i.e
c680: 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  . not including 
c690: 74 68 65 20 64 6f 63 69 64 20 6f 72 20 74 68 65  the docid or the
c6a0: 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c   [FTS hidden col
c6b0: 75 6d 6e 5d 29 2e 0a 20 20 3c 74 72 3e 3c 74 64  umn])..  <tr><td
c6c0: 3e 78 20 3c 74 64 20 73 74 79 6c 65 3d 22 77 68  >x <td style="wh
c6d0: 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61 70  ite-space:nowrap
c6e0: 22 3e 33 20 2a 20 3c 69 3e 63 6f 6c 73 3c 2f 69  ">3 * <i>cols</i
c6f0: 3e 20 2a 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f  > * <i>phrases</
c700: 69 3e 20 0a 20 20 20 20 3c 74 64 3e 0a 20 20 20  i> .    <td>.   
c710: 20 20 20 46 6f 72 20 65 61 63 68 20 64 69 73 74     For each dist
c720: 69 6e 63 74 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  inct combination
c730: 20 6f 66 20 61 20 70 68 72 61 73 65 20 61 6e 64   of a phrase and
c740: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
c750: 68 65 0a 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69  he.      followi
c760: 6e 67 20 74 68 72 65 65 20 76 61 6c 75 65 73 3a  ng three values:
c770: 0a 20 20 20 20 20 20 3c 75 6c 3e 0a 20 20 20 20  .      <ul>.    
c780: 20 20 20 20 3c 6c 69 3e 20 49 6e 20 74 68 65 20      <li> In the 
c790: 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 74 68 65  current row, the
c7a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
c7b0: 20 74 68 65 20 70 68 72 61 73 65 20 61 70 70 65   the phrase appe
c7c0: 61 72 73 20 69 6e 20 0a 20 20 20 20 20 20 20 20  ars in .        
c7d0: 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e 2e       the column.
c7e0: 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 54 68  .        <li> Th
c7f0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
c800: 66 20 74 69 6d 65 73 20 74 68 65 20 70 68 72 61  f times the phra
c810: 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  se appears in th
c820: 65 20 63 6f 6c 75 6d 6e 20 69 6e 0a 20 20 20 20  e column in.    
c830: 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 6f 77           all row
c840: 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
c850: 6c 65 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e  le..        <li>
c860: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
c870: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
c880: 20 46 54 53 20 74 61 62 6c 65 20 66 6f 72 20 77   FTS table for w
c890: 68 69 63 68 20 74 68 65 20 0a 20 20 20 20 20 20  hich the .      
c8a0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 63 6f         column co
c8b0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
c8c0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
c8d0: 74 68 65 20 70 68 72 61 73 65 2e 0a 20 20 20 20  the phrase..    
c8e0: 20 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 54 68    </ul>.      Th
c8f0: 65 20 66 69 72 73 74 20 73 65 74 20 6f 66 20 74  e first set of t
c900: 68 72 65 65 20 76 61 6c 75 65 73 20 63 6f 72 72  hree values corr
c910: 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c  esponds to the l
c920: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 0a  eft-most column.
c930: 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 61 62        of the tab
c940: 6c 65 20 28 63 6f 6c 75 6d 6e 20 30 29 20 61 6e  le (column 0) an
c950: 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  d the left-most 
c960: 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65  matchable phrase
c970: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 71 75   in the.      qu
c980: 65 72 79 20 28 70 68 72 61 73 65 20 30 29 2e 20  ery (phrase 0). 
c990: 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
c9a0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
c9b0: 6f 6c 75 6d 6e 2c 20 74 68 65 20 73 65 63 6f 6e  olumn, the secon
c9c0: 64 0a 20 20 20 20 20 20 73 65 74 20 6f 66 20 74  d.      set of t
c9d0: 68 72 65 65 20 76 61 6c 75 65 73 20 69 6e 20 74  hree values in t
c9e0: 68 65 20 6f 75 74 70 75 74 20 61 72 72 61 79 20  he output array 
c9f0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 70 68  correspond to ph
ca00: 72 61 73 65 20 30 20 61 6e 64 0a 20 20 20 20 20  rase 0 and.     
ca10: 20 63 6f 6c 75 6d 6e 20 31 2e 20 46 6f 6c 6c 6f   column 1. Follo
ca20: 77 65 64 20 62 79 20 70 68 72 61 73 65 20 30 2c  wed by phrase 0,
ca30: 20 63 6f 6c 75 6d 6e 20 32 20 61 6e 64 20 73 6f   column 2 and so
ca40: 20 6f 6e 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75   on for all colu
ca50: 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 74 68 65  mns of.      the
ca60: 20 74 61 62 6c 65 2e 20 41 6e 64 20 73 6f 20 6f   table. And so o
ca70: 6e 20 66 6f 72 20 70 68 72 61 73 65 20 31 2c 20  n for phrase 1, 
ca80: 63 6f 6c 75 6d 6e 20 30 2c 20 74 68 65 6e 20 70  column 0, then p
ca90: 68 72 61 73 65 20 31 2c 20 63 6f 6c 75 6d 6e 20  hrase 1, column 
caa0: 31 0a 20 20 20 20 20 20 65 74 63 2e 20 49 6e 20  1.      etc. In 
cab0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
cac0: 20 64 61 74 61 20 66 6f 72 20 6f 63 63 75 72 72   data for occurr
cad0: 65 6e 63 65 73 20 6f 66 20 70 68 72 61 73 65 20  ences of phrase 
cae0: 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a 20 20 20 20  <i>p</i> in.    
caf0: 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63 3c 2f 69    column <i>c</i
cb00: 3e 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20 75  > may be found u
cb10: 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
cb20: 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 3c 70 72 65  ng formula:.<pre
cb30: 3e 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73  >.          hits
cb40: 5f 74 68 69 73 5f 72 6f 77 20 20 3d 20 61 72 72  _this_row  = arr
cb50: 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20  ay&#91;3 * (c + 
cb60: 70 2a 63 6f 6c 73 29 20 2b 20 30 26 23 39 33 3b  p*cols) + 0&#93;
cb70: 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73 5f  .          hits_
cb80: 61 6c 6c 5f 72 6f 77 73 20 20 3d 20 61 72 72 61  all_rows  = arra
cb90: 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20 70  y&#91;3 * (c + p
cba0: 2a 63 6f 6c 73 29 20 2b 20 31 26 23 39 33 3b 0a  *cols) + 1&#93;.
cbb0: 20 20 20 20 20 20 20 20 20 20 64 6f 63 73 5f 77            docs_w
cbc0: 69 74 68 5f 68 69 74 73 20 3d 20 61 72 72 61 79  ith_hits = array
cbd0: 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20 70 2a  &#91;3 * (c + p*
cbe0: 63 6f 6c 73 29 20 2b 20 32 26 23 39 33 3b 0a 3c  cols) + 2&#93;.<
cbf0: 2f 70 72 65 3e 0a 0a 20 20 3c 74 72 3e 3c 74 64  /pre>..  <tr><td
cc00: 3e 6e 20 3c 74 64 3e 31 20 3c 74 64 3e 54 68 65  >n <td>1 <td>The
cc10: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
cc20: 69 6e 20 74 68 65 20 46 54 53 34 20 74 61 62 6c  in the FTS4 tabl
cc30: 65 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  e. This value is
cc40: 0a 20 20 20 20 6f 6e 6c 79 20 61 76 61 69 6c 61  .    only availa
cc50: 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e  ble when queryin
cc60: 67 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20 6e  g FTS4 tables, n
cc70: 6f 74 20 46 54 53 33 2e 0a 20 20 3c 74 72 3e 3c  ot FTS3..  <tr><
cc80: 74 64 3e 61 20 3c 74 64 3e 3c 69 3e 63 6f 6c 73  td>a <td><i>cols
cc90: 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20 65 61 63  </i> <td>For eac
cca0: 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 61 76  h column, the av
ccb0: 65 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 0a  erage number of.
ccc0: 20 20 20 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68      tokens in th
ccd0: 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 73 74  e text values st
cce0: 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ored in the colu
ccf0: 6d 6e 20 28 63 6f 6e 73 69 64 65 72 69 6e 67 20  mn (considering 
cd00: 61 6c 6c 20 72 6f 77 73 20 69 6e 0a 20 20 20 20  all rows in.    
cd10: 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 29 2e  the FTS4 table).
cd20: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 6f   This value is o
cd30: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68  nly available wh
cd40: 65 6e 20 71 75 65 72 79 69 6e 67 20 46 54 53 34  en querying FTS4
cd50: 20 74 61 62 6c 65 73 2c 0a 20 20 20 20 6e 6f 74   tables,.    not
cd60: 20 46 54 53 33 2e 20 20 0a 20 20 3c 74 72 3e 3c   FTS3.  .  <tr><
cd70: 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e 63 6f 6c 73  td>l <td><i>cols
cd80: 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20 20 20 46 6f  </i> <td>.    Fo
cd90: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74  r each column, t
cda0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
cdb0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
cdc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
cdd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 46 54 53 34   of the.    FTS4
cde0: 20 74 61 62 6c 65 2c 20 69 6e 20 74 6f 6b 65 6e   table, in token
cdf0: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  s.  This value i
ce00: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
ce10: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 0a 20   when querying. 
ce20: 20 20 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20     FTS4 tables, 
ce30: 6e 6f 74 20 46 54 53 33 2e 20 41 6e 64 20 6f 6e  not FTS3. And on
ce40: 6c 79 20 69 66 20 74 68 65 20 22 6d 61 74 63 68  ly if the "match
ce50: 69 6e 66 6f 3d 66 74 73 33 22 20 64 69 72 65 63  info=fts3" direc
ce60: 74 69 76 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  tive was not.   
ce70: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
ce80: 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41 54  rt of the "CREAT
ce90: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
cea0: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
ceb0: 74 6f 20 63 72 65 61 74 65 0a 20 20 20 20 74 68  to create.    th
cec0: 65 20 46 54 53 34 20 74 61 62 6c 65 2e 0a 20 20  e FTS4 table..  
ced0: 3c 74 72 3e 3c 74 64 3e 73 20 3c 74 64 3e 3c 69  <tr><td>s <td><i
cee0: 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f  >cols</i> <td>Fo
cef0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74  r each column, t
cf00: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
cf10: 20 6c 6f 6e 67 65 73 74 20 0a 20 20 20 20 73 75   longest .    su
cf20: 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68 72  bsequence of phr
cf30: 61 73 65 20 6d 61 74 63 68 65 73 20 74 68 61 74  ase matches that
cf40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
cf50: 65 20 68 61 73 20 69 6e 20 63 6f 6d 6d 6f 6e 0a  e has in common.
cf60: 20 20 20 20 77 69 74 68 20 74 68 65 20 71 75 65      with the que
cf70: 72 79 20 74 65 78 74 2e 20 46 6f 72 20 65 78 61  ry text. For exa
cf80: 6d 70 6c 65 2c 20 69 66 20 61 20 74 61 62 6c 65  mple, if a table
cf90: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
cfa0: 20 74 68 65 20 74 65 78 74 0a 20 20 20 20 27 61   the text.    'a
cfb0: 20 62 20 63 20 64 20 65 27 20 61 6e 64 20 74 68   b c d e' and th
cfc0: 65 20 71 75 65 72 79 20 69 73 20 27 61 20 63 20  e query is 'a c 
cfd0: 22 64 20 65 22 27 2c 20 74 68 65 6e 20 74 68 65  "d e"', then the
cfe0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6c   length of the l
cff0: 6f 6e 67 65 73 74 0a 20 20 20 20 63 6f 6d 6d 6f  ongest.    commo
d000: 6e 20 73 75 62 73 65 71 75 65 6e 63 65 20 69 73  n subsequence is
d010: 20 32 20 28 70 68 72 61 73 65 20 22 63 22 20 66   2 (phrase "c" f
d020: 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61 73  ollowed by phras
d030: 65 20 22 64 20 65 22 29 2e 0a 20 20 20 20 0a 20  e "d e")..    . 
d040: 20 20 20 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70     .</table>..<p
d050: 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  >.  For example:
d060: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
d070: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 64  <i>-- Create and
d080: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46 54 53   populate an FTS
d090: 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 77 6f  4 table with two
d0a0: 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e 0a 20 20   columns:</i>.  
d0b0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
d0c0: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74  ABLE t1 USING ft
d0d0: 73 34 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  s4(a, b);.  INSE
d0e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d0f0: 53 28 27 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  S('transaction d
d100: 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73 20 64 65  efault models de
d110: 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20 74 72 61  fault', 'Non tra
d120: 6e 73 61 63 74 69 6f 6e 20 72 65 61 64 73 27 29  nsaction reads')
d130: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d140: 74 31 20 56 41 4c 55 45 53 28 27 74 68 65 20 64  t1 VALUES('the d
d150: 65 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69  efault transacti
d160: 6f 6e 27 2c 20 27 74 68 65 73 65 20 73 65 6d 61  on', 'these sema
d170: 6e 74 69 63 73 20 70 72 65 73 65 6e 74 27 29 3b  ntics present');
d180: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
d190: 31 20 56 41 4c 55 45 53 28 27 73 69 6e 67 6c 65  1 VALUES('single
d1a0: 20 72 65 71 75 65 73 74 27 2c 20 27 64 65 66 61   request', 'defa
d1b0: 75 6c 74 20 64 61 74 61 27 29 3b 0a 0a 20 20 3c  ult data');..  <
d1c0: 69 3e 2d 2d 20 49 6e 20 74 68 65 20 66 6f 6c 6c  i>-- In the foll
d1d0: 6f 77 69 6e 67 20 71 75 65 72 79 2c 20 6e 6f 20  owing query, no 
d1e0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69 73  format string is
d1f0: 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 73   specified and s
d200: 6f 20 69 74 20 64 65 66 61 75 6c 74 73 3c 2f 69  o it defaults</i
d210: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20 22 70 63  >.  <i>-- to "pc
d220: 78 22 2e 20 49 74 20 74 68 65 72 65 66 6f 72 65  x". It therefore
d230: 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
d240: 65 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e 67  e row consisting
d250: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f   of a single blo
d260: 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 76 61  b</i>.  <i>-- va
d270: 6c 75 65 20 38 30 20 62 79 74 65 73 20 69 6e 20  lue 80 bytes in 
d280: 73 69 7a 65 20 28 32 30 20 33 32 2d 62 69 74 20  size (20 32-bit 
d290: 69 6e 74 65 67 65 72 73 20 2d 20 31 20 66 6f 72  integers - 1 for
d2a0: 20 22 70 22 2c 20 31 20 66 6f 72 20 22 63 22 20   "p", 1 for "c" 
d2b0: 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  and</i>.  <i>-- 
d2c0: 33 2a 32 2a 33 20 66 6f 72 20 22 78 22 29 2e 20  3*2*3 for "x"). 
d2d0: 49 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  If each block of
d2e0: 20 34 20 62 79 74 65 73 20 69 6e 3c 2f 69 3e 20   4 bytes in</i> 
d2f0: 74 68 65 20 62 6c 6f 62 20 69 73 20 69 6e 74 65  the blob is inte
d300: 72 70 72 65 74 65 64 3c 2f 69 3e 20 0a 20 20 3c  rpreted</i> .  <
d310: 69 3e 2d 2d 20 61 73 20 61 6e 20 75 6e 73 69 67  i>-- as an unsig
d320: 6e 65 64 20 69 6e 74 65 67 65 72 20 69 6e 20 6d  ned integer in m
d330: 61 63 68 69 6e 65 20 62 79 74 65 2d 6f 72 64 65  achine byte-orde
d340: 72 2c 20 74 68 65 20 76 61 6c 75 65 73 20 77 69  r, the values wi
d350: 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  ll be:</i>.  <i>
d360: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
d370: 20 20 20 33 20 32 20 20 31 20 33 20 32 20 20 30     3 2  1 3 2  0
d380: 20 31 20 31 20 20 31 20 32 20 32 20 20 30 20 31   1 1  1 2 2  0 1
d390: 20 31 20 20 30 20 30 20 30 20 20 31 20 31 20 31   1  0 0 0  1 1 1
d3a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
d3b0: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 72 6f 77  .  <i>-- The row
d3c0: 20 72 65 74 75 72 6e 65 64 20 63 6f 72 72 65 73   returned corres
d3d0: 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 65 63  ponds to the sec
d3e0: 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73 65 72 74  ond entry insert
d3f0: 65 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 74 31  ed into table t1
d400: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  .</i>.  <i>-- Th
d410: 65 20 66 69 72 73 74 20 74 77 6f 20 69 6e 74 65  e first two inte
d420: 67 65 72 73 20 69 6e 20 74 68 65 20 62 6c 6f 62  gers in the blob
d430: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 71   show that the q
d440: 75 65 72 79 20 63 6f 6e 74 61 69 6e 65 64 20 74  uery contained t
d450: 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  hree</i>.  <i>--
d460: 20 70 68 72 61 73 65 73 20 61 6e 64 20 74 68 65   phrases and the
d470: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
d480: 72 69 65 64 20 68 61 73 20 74 77 6f 20 63 6f 6c  ried has two col
d490: 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78 74 20 62  umns. The next b
d4a0: 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20 20 3c 69  lock of</i>.  <i
d4b0: 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74 65 67 65  >-- three intege
d4c0: 72 73 20 64 65 73 63 72 69 62 65 73 20 63 6f 6c  rs describes col
d4d0: 75 6d 6e 20 30 20 28 69 6e 20 74 68 69 73 20 63  umn 0 (in this c
d4e0: 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61 22 29 20  ase column "a") 
d4f0: 61 6e 64 20 70 68 72 61 73 65 3c 2f 69 3e 0a 20  and phrase</i>. 
d500: 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20 74 68 69   <i>-- 0 (in thi
d510: 73 20 63 61 73 65 20 22 64 65 66 61 75 6c 74 22  s case "default"
d520: 29 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 72  ). The current r
d530: 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31 20 68 69  ow contains 1 hi
d540: 74 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22 3c  t for "default"<
d550: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 63  /i>.  <i>-- in c
d560: 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61 20 74 6f  olumn 0, of a to
d570: 74 61 6c 20 6f 66 20 33 20 68 69 74 73 20 66 6f  tal of 3 hits fo
d580: 72 20 22 64 65 66 61 75 6c 74 22 20 74 68 61 74  r "default" that
d590: 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c 75 6d 6e   occur in column
d5a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 6f  </i>.  <i>-- 0 o
d5b0: 66 20 61 6e 79 20 74 61 62 6c 65 20 72 6f 77 2e  f any table row.
d5c0: 20 54 68 65 20 33 20 68 69 74 73 20 61 72 65 20   The 3 hits are 
d5d0: 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 32 20  spread across 2 
d5e0: 64 69 66 66 65 72 65 6e 74 20 72 6f 77 73 2e 3c  different rows.<
d5f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
d600: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e 65 78 74    <i>-- The next
d610: 20 73 65 74 20 6f 66 20 74 68 72 65 65 20 69 6e   set of three in
d620: 74 65 67 65 72 73 20 28 30 20 31 20 31 29 20 70  tegers (0 1 1) p
d630: 65 72 74 61 69 6e 20 74 6f 20 74 68 65 20 68 69  ertain to the hi
d640: 74 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22  ts for "default"
d650: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20  </i>.  <i>-- in 
d660: 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74 68 65 20  column 1 of the 
d670: 74 61 62 6c 65 20 28 30 20 69 6e 20 74 68 69 73  table (0 in this
d680: 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c 6c 20 72   row, 1 in all r
d690: 6f 77 73 2c 20 73 70 72 65 61 64 20 61 63 72 6f  ows, spread acro
d6a0: 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ss </i>.  <i>-- 
d6b0: 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a 20 20 3c  1 rows).</i>.  <
d6c0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
d6d0: 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 20  T matchinfo(t1) 
d6e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
d6f0: 20 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74 20   MATCH 'default 
d700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 74 68 65  transaction "the
d710: 73 65 20 73 65 6d 61 6e 74 69 63 73 22 27 3b 0a  se semantics"';.
d720: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 72  .  <i>-- The for
d730: 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20 74  mat string for t
d740: 68 69 73 20 71 75 65 72 79 20 69 73 20 22 6e 73  his query is "ns
d750: 22 2e 20 54 68 65 20 6f 75 74 70 75 74 20 61 72  ". The output ar
d760: 72 61 79 20 77 69 6c 6c 20 74 68 65 72 65 66 6f  ray will therefo
d770: 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 63  re</i>.  <i>-- c
d780: 6f 6e 74 61 69 6e 20 33 20 69 6e 74 65 67 65 72  ontain 3 integer
d790: 20 76 61 6c 75 65 73 20 2d 20 31 20 66 6f 72 20   values - 1 for 
d7a0: 22 6e 22 20 61 6e 64 20 32 20 66 6f 72 20 22 73  "n" and 2 for "s
d7b0: 22 2e 20 54 68 65 20 71 75 65 72 79 20 72 65 74  ". The query ret
d7c0: 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  urns</i>.  <i>--
d7d0: 20 74 77 6f 20 72 6f 77 73 20 28 74 68 65 20 66   two rows (the f
d7e0: 69 72 73 74 20 74 77 6f 20 72 6f 77 73 20 69 6e  irst two rows in
d7f0: 20 74 68 65 20 74 61 62 6c 65 20 6d 61 74 63 68   the table match
d800: 29 2e 20 54 68 65 20 76 61 6c 75 65 73 20 72 65  ). The values re
d810: 74 75 72 6e 65 64 20 61 72 65 3a 3c 2f 69 3e 0a  turned are:</i>.
d820: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
d830: 3e 2d 2d 20 20 20 20 20 33 20 20 31 20 31 3c 2f  >--     3  1 1</
d840: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 33  i>.  <i>--     3
d850: 20 20 32 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d    2 0</i>.  <i>-
d860: 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  -</i>.  <i>-- Th
d870: 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69 6e  e first value in
d880: 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 61   the matchinfo a
d890: 72 72 61 79 20 72 65 74 75 72 6e 65 64 20 66 6f  rray returned fo
d8a0: 72 20 62 6f 74 68 20 72 6f 77 73 20 69 73 20 33  r both rows is 3
d8b0: 20 28 74 68 65 20 3c 2f 69 3e 0a 20 20 3c 69 3e   (the </i>.  <i>
d8c0: 2d 2d 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  -- number of row
d8d0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 29 2e  s in the table).
d8e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
d8f0: 77 6f 20 76 61 6c 75 65 73 20 61 72 65 20 74 68  wo values are th
d900: 65 20 6c 65 6e 67 74 68 73 20 3c 2f 69 3e 0a 20  e lengths </i>. 
d910: 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65 20 6c 6f   <i>-- of the lo
d920: 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e 20 73 75 62  ngest common sub
d930: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68 72 61  sequence of phra
d940: 73 65 20 6d 61 74 63 68 65 73 20 69 6e 20 65 61  se matches in ea
d950: 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 20  ch column.</i>. 
d960: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e 66   SELECT matchinf
d970: 6f 28 74 31 2c 20 27 6e 73 27 29 20 46 52 4f 4d  o(t1, 'ns') FROM
d980: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
d990: 43 48 20 27 64 65 66 61 75 6c 74 20 74 72 61 6e  CH 'default tran
d9a0: 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64 65  saction';.</code
d9b0: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
d9c0: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63  e matchinfo func
d9d0: 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 66 61 73  tion is much fas
d9e0: 74 65 72 20 74 68 61 6e 20 65 69 74 68 65 72 20  ter than either 
d9f0: 74 68 65 20 73 6e 69 70 70 65 74 20 6f 72 20 6f  the snippet or o
da00: 66 66 73 65 74 73 0a 20 20 66 75 6e 63 74 69 6f  ffsets.  functio
da10: 6e 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ns. This is beca
da20: 75 73 65 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  use the implemen
da30: 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 73  tation of both s
da40: 6e 69 70 70 65 74 20 61 6e 64 20 6f 66 66 73 65  nippet and offse
da50: 74 73 0a 20 20 69 73 20 72 65 71 75 69 72 65 64  ts.  is required
da60: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
da70: 20 64 6f 63 75 6d 65 6e 74 73 20 62 65 69 6e 67   documents being
da80: 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f 6d 20 64   analyzed from d
da90: 69 73 6b 2c 20 77 68 65 72 65 61 73 0a 20 20 61  isk, whereas.  a
daa0: 6c 6c 20 64 61 74 61 20 72 65 71 75 69 72 65 64  ll data required
dab0: 20 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 69 73   by matchinfo is
dac0: 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 70 61   available as pa
dad0: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  rt of the same p
dae0: 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65  ortions.  of the
daf0: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
db00: 20 74 68 61 74 20 61 72 65 20 72 65 71 75 69 72   that are requir
db10: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
db20: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  the full-text qu
db30: 65 72 79 0a 20 20 69 74 73 65 6c 66 2e 20 54 68  ery.  itself. Th
db40: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 66  is means that of
db50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
db60: 77 6f 20 71 75 65 72 69 65 73 2c 20 74 68 65 20  wo queries, the 
db70: 66 69 72 73 74 20 6d 61 79 20 62 65 0a 20 20 61  first may be.  a
db80: 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61 67 6e 69  n order of magni
db90: 74 75 64 65 20 66 61 73 74 65 72 20 74 68 61 6e  tude faster than
dba0: 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a 0a 3c 63   the second:..<c
dbb0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45  odeblock>.  SELE
dbc0: 43 54 20 64 6f 63 69 64 2c 20 6d 61 74 63 68 69  CT docid, matchi
dbd0: 6e 66 6f 28 74 62 6c 29 20 46 52 4f 4d 20 74 62  nfo(tbl) FROM tb
dbe0: 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54 43  l WHERE tbl MATC
dbf0: 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70 72  H &lt;query expr
dc00: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45  ession&gt;;.  SE
dc10: 4c 45 43 54 20 64 6f 63 69 64 2c 20 6f 66 66 73  LECT docid, offs
dc20: 65 74 73 28 74 62 6c 29 20 46 52 4f 4d 20 74 62  ets(tbl) FROM tb
dc30: 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54 43  l WHERE tbl MATC
dc40: 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70 72  H &lt;query expr
dc50: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f  ession&gt;;.</co
dc60: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
dc70: 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75  The matchinfo fu
dc80: 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  nction provides 
dc90: 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  all the informat
dca0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 74 6f 20  ion required to 
dcb0: 63 61 6c 63 75 6c 61 74 65 0a 20 20 70 72 6f 62  calculate.  prob
dcc0: 61 62 69 6c 69 73 74 69 63 20 22 62 61 67 2d 6f  abilistic "bag-o
dcd0: 66 2d 77 6f 72 64 73 22 20 72 65 6c 65 76 61 6e  f-words" relevan
dce0: 63 79 20 73 63 6f 72 65 73 20 73 75 63 68 20 61  cy scores such a
dcf0: 73 20 0a 20 20 3c 61 20 68 72 65 66 3d 68 74 74  s .  <a href=htt
dd00: 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61  p://en.wikipedia
dd10: 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61 70 69 5f  .org/wiki/Okapi_
dd20: 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d 32 35 2f  BM25>Okapi BM25/
dd30: 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61 74 20 6d  BM25F</a> that m
dd40: 61 79 0a 20 20 62 65 20 75 73 65 64 20 74 6f 20  ay.  be used to 
dd50: 6f 72 64 65 72 20 72 65 73 75 6c 74 73 20 69 6e  order results in
dd60: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61   a full-text sea
dd70: 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  rch application.
dd80: 20 41 70 70 65 6e 64 69 78 20 41 20 6f 66 20 74   Appendix A of t
dd90: 68 69 73 20 0a 20 20 64 6f 63 75 6d 65 6e 74 2c  his .  document,
dda0: 20 22 5b 73 65 61 72 63 68 20 61 70 70 6c 69 63   "[search applic
ddb0: 61 74 69 6f 6e 20 74 69 70 73 5d 22 2c 20 63 6f  ation tips]", co
ddc0: 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c  ntains an exampl
ddd0: 65 20 6f 66 20 75 73 69 6e 67 20 74 68 65 0a 20  e of using the. 
dde0: 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
ddf0: 63 74 69 6f 6e 20 65 66 66 69 63 69 65 6e 74 6c  ction efficientl
de00: 79 2e 0a 0a 3c 68 31 20 69 64 3d 66 74 73 34 61  y...<h1 id=fts4a
de10: 75 78 20 74 61 67 73 3d 22 66 74 73 34 61 75 78  ux tags="fts4aux
de20: 22 3e 46 74 73 34 61 75 78 20 2d 20 44 69 72 65  ">Fts4aux - Dire
de30: 63 74 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  ct Access to the
de40: 20 46 75 6c 6c 2d 54 65 78 74 20 49 6e 64 65 78   Full-Text Index
de50: 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 73 20  </h1>..<p>.  As 
de60: 6f 66 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 36  of version 3.7.6
de70: 2c 20 53 51 4c 69 74 65 20 69 6e 63 6c 75 64 65  , SQLite include
de80: 73 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  s a new virtual 
de90: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 63 61 6c  table module cal
dea0: 6c 65 64 20 0a 20 20 22 66 74 73 34 61 75 78 22  led .  "fts4aux"
deb0: 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  , which can be u
dec0: 73 65 64 20 74 6f 20 69 6e 73 70 65 63 74 20 74  sed to inspect t
ded0: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
dee0: 65 78 20 6f 66 20 61 6e 20 65 78 69 74 69 6e 67  ex of an exiting
def0: 0a 20 20 46 54 53 20 74 61 62 6c 65 20 64 69 72  .  FTS table dir
df00: 65 63 74 6c 79 2e 20 44 65 73 70 69 74 65 20 69  ectly. Despite i
df10: 74 73 20 6e 61 6d 65 2c 20 66 74 73 34 61 75 78  ts name, fts4aux
df20: 20 77 6f 72 6b 73 20 6a 75 73 74 20 61 73 20 77   works just as w
df30: 65 6c 6c 20 77 69 74 68 20 46 54 53 33 0a 20 20  ell with FTS3.  
df40: 74 61 62 6c 65 73 20 61 73 20 69 74 20 64 6f 65  tables as it doe
df50: 73 20 77 69 74 68 20 46 54 53 34 20 74 61 62 6c  s with FTS4 tabl
df60: 65 73 2e 20 46 74 73 34 61 75 78 20 74 61 62 6c  es. Fts4aux tabl
df70: 65 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  es are read-only
df80: 2e 20 54 68 65 20 6f 6e 6c 79 0a 20 20 77 61 79  . The only.  way
df90: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 63   to modify the c
dfa0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e 20 66 74  ontents of an ft
dfb0: 73 34 61 75 78 20 74 61 62 6c 65 20 69 73 20 62  s4aux table is b
dfc0: 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 0a  y modifying the.
dfd0: 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68    contents of th
dfe0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 46 54 53  e associated FTS
dff0: 20 74 61 62 6c 65 2e 20 54 68 65 20 66 74 73 34   table. The fts4
e000: 61 75 78 20 6d 6f 64 75 6c 65 20 69 73 20 61 75  aux module is au
e010: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 69 6e  tomatically.  in
e020: 63 6c 75 64 65 64 20 69 6e 20 61 6c 6c 20 5b 63  cluded in all [c
e030: 6f 6d 70 69 6c 65 20 66 74 73 7c 62 75 69 6c 64  ompile fts|build
e040: 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20 46  s that include F
e050: 54 53 5d 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 66  TS]...<p>.  An f
e060: 74 73 34 61 75 78 20 76 69 72 74 75 61 6c 20 74  ts4aux virtual t
e070: 61 62 6c 65 20 69 73 20 63 6f 6e 73 74 72 75 63  able is construc
e080: 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ted with a singl
e090: 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65  e argument - the
e0a0: 20 0a 20 20 75 6e 71 75 61 6c 69 66 69 65 64 20   .  unqualified 
e0b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 46 54 53 20  name of the FTS 
e0c0: 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 77 69  table that it wi
e0d0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  ll be used to ac
e0e0: 63 65 73 73 2e 0a 20 20 46 6f 72 20 65 78 61 6d  cess..  For exam
e0f0: 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
e100: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
e110: 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 3c 2f   an FTS4 table</
e120: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
e130: 55 41 4c 20 54 41 42 4c 45 20 66 74 20 55 53 49  UAL TABLE ft USI
e140: 4e 47 20 66 74 73 34 28 78 2c 20 79 29 3b 0a 0a  NG fts4(x, y);..
e150: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
e160: 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20  n fts4aux table 
e170: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 75  to access the fu
e180: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f  ll-text index fo
e190: 72 20 74 61 62 6c 65 20 22 66 74 22 3c 2f 69 3e  r table "ft"</i>
e1a0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
e1b0: 4c 20 54 41 42 4c 45 20 66 74 5f 74 65 72 6d 73  L TABLE ft_terms
e1c0: 20 55 53 49 4e 47 20 66 74 73 34 61 75 78 28 66   USING fts4aux(f
e1d0: 74 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  t);.</codeblock>
e1e0: 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68  ..<p>.  For each
e1f0: 20 74 65 72 6d 20 70 72 65 73 65 6e 74 20 69 6e   term present in
e200: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c 20   the FTS table, 
e210: 74 68 65 72 65 20 61 72 65 20 62 65 74 77 65 65  there are betwee
e220: 6e 20 32 20 61 6e 64 20 4e 2b 31 20 72 6f 77 73  n 2 and N+1 rows
e230: 0a 20 20 69 6e 20 74 68 65 20 66 74 73 34 61 75  .  in the fts4au
e240: 78 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20 4e  x table, where N
e250: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e260: 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63  f user-defined c
e270: 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 74 68 65 20  olumns in.  the 
e280: 61 73 73 6f 63 69 61 74 65 64 20 46 54 53 20 74  associated FTS t
e290: 61 62 6c 65 2e 20 41 6e 20 66 74 73 34 61 75 78  able. An fts4aux
e2a0: 20 74 61 62 6c 65 20 61 6c 77 61 79 73 20 68 61   table always ha
e2b0: 73 20 74 68 65 20 73 61 6d 65 20 66 6f 75 72 20  s the same four 
e2c0: 63 6f 6c 75 6d 6e 73 2c 20 0a 20 20 61 73 20 66  columns, .  as f
e2d0: 6f 6c 6c 6f 77 73 2c 20 66 72 6f 6d 20 6c 65 66  ollows, from lef
e2e0: 74 20 74 6f 20 72 69 67 68 74 3a 0a 0a 3c 74 61  t to right:..<ta
e2f0: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
e300: 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20   <tr><th>Column 
e310: 4e 61 6d 65 3c 74 68 3e 43 6f 6c 75 6d 6e 20 43  Name<th>Column C
e320: 6f 6e 74 65 6e 74 73 0a 20 20 3c 74 72 3e 3c 74  ontents.  <tr><t
e330: 64 3e 74 65 72 6d 3c 74 64 3e 20 0a 20 20 20 20  d>term<td> .    
e340: 43 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  Contains the tex
e350: 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 66 6f  t of the term fo
e360: 72 20 74 68 69 73 20 72 6f 77 2e 0a 20 20 3c 74  r this row..  <t
e370: 72 3e 3c 74 64 3e 63 6f 6c 3c 74 64 3e 20 0a 20  r><td>col<td> . 
e380: 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20 6d     This column m
e390: 61 79 20 63 6f 6e 74 61 69 6e 20 65 69 74 68 65  ay contain eithe
e3a0: 72 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65  r the text value
e3b0: 20 27 2a 27 20 28 69 2e 65 2e 20 61 20 73 69 6e   '*' (i.e. a sin
e3c0: 67 6c 65 20 0a 20 20 20 20 63 68 61 72 61 63 74  gle .    charact
e3d0: 65 72 2c 20 55 54 46 20 63 6f 64 65 70 6f 69 6e  er, UTF codepoin
e3e0: 74 20 34 32 29 20 6f 72 20 61 6e 20 69 6e 74 65  t 42) or an inte
e3f0: 67 65 72 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ger between 0 an
e400: 64 20 4e 2d 31 2c 20 77 68 65 72 65 20 4e 20 69  d N-1, where N i
e410: 73 0a 20 20 20 20 61 67 61 69 6e 20 74 68 65 20  s.    again the 
e420: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64  number of user-d
e430: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
e440: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
e450: 69 6e 67 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a  ing FTS table...
e460: 20 20 3c 74 72 3e 3c 74 64 3e 64 6f 63 75 6d 65    <tr><td>docume
e470: 6e 74 73 3c 74 64 3e 0a 20 20 20 20 54 68 69 73  nts<td>.    This
e480: 20 63 6f 6c 75 6d 6e 20 61 6c 77 61 79 73 20 63   column always c
e490: 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67  ontains an integ
e4a0: 65 72 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  er value greater
e4b0: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20   than zero..    
e4c0: 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20  <br><br>.    If 
e4d0: 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e  the "col" column
e4e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
e4f0: 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68  lue '*', then th
e500: 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f  is column.    co
e510: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
e520: 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 74 68 65  r of rows of the
e530: 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20   FTS table that 
e540: 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
e550: 20 6f 6e 65 0a 20 20 20 20 69 6e 73 74 61 6e 63   one.    instanc
e560: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 28 69  e of the term (i
e570: 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20 49  n any column). I
e580: 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61  f col contains a
e590: 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61  n integer.    va
e5a0: 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  lue, then this c
e5b0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
e5c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
e5d0: 73 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62  s of the FTS tab
e5e0: 6c 65 20 74 68 61 74 0a 20 20 20 20 63 6f 6e 74  le that.    cont
e5f0: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
e600: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
e610: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 63 6f 6c   term in the col
e620: 75 6d 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  umn identified b
e630: 79 0a 20 20 20 20 74 68 65 20 63 6f 6c 20 76 61  y.    the col va
e640: 6c 75 65 2e 20 41 73 20 75 73 75 61 6c 2c 20 74  lue. As usual, t
e650: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
e660: 65 20 46 54 53 20 74 61 62 6c 65 20 61 72 65 20  e FTS table are 
e670: 6e 75 6d 62 65 72 65 64 0a 20 20 20 20 66 72 6f  numbered.    fro
e680: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c  m left to right,
e690: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 7a   starting with z
e6a0: 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e  ero...  <tr><td>
e6b0: 6f 63 63 75 72 72 65 6e 63 65 73 3c 74 64 3e 0a  occurrences<td>.
e6c0: 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20      This column 
e6d0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 63 6f 6e 74  also always cont
e6e0: 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20  ains an integer 
e6f0: 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68  value greater th
e700: 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c 62 72  an zero..    <br
e710: 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20 74 68 65  ><br>.    If the
e720: 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20 63 6f   "col" column co
e730: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
e740: 20 27 2a 27 2c 20 74 68 65 6e 20 74 68 69 73 20   '*', then this 
e750: 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e 74 61  column.    conta
e760: 69 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ins the total nu
e770: 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65  mber of instance
e780: 73 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e  s of the term in
e790: 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
e7a0: 20 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65 20   .    FTS table 
e7b0: 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e  (in any column).
e7c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 63   Otherwise, if c
e7d0: 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ol contains an i
e7e0: 6e 74 65 67 65 72 0a 20 20 20 20 76 61 6c 75 65  nteger.    value
e7f0: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6c 75  , then this colu
e800: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  mn contains the 
e810: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
e820: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
e830: 0a 20 20 20 20 74 65 72 6d 20 74 68 61 74 20 61  .    term that a
e840: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 54 53  ppear in the FTS
e850: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 64   table column id
e860: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
e870: 63 6f 6c 0a 20 20 20 20 76 61 6c 75 65 2e 0a 3c  col.    value..<
e880: 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 46  /table>..<p>.  F
e890: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73 69 6e  or example, usin
e8a0: 67 20 74 68 65 20 74 61 62 6c 65 73 20 63 72 65  g the tables cre
e8b0: 61 74 65 64 20 61 62 6f 76 65 3a 0a 0a 3c 63 6f  ated above:..<co
e8c0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e 53 45 52  deblock>.  INSER
e8d0: 54 20 49 4e 54 4f 20 66 74 28 78 2c 20 79 29 20  T INTO ft(x, y) 
e8e0: 56 41 4c 55 45 53 28 27 41 70 70 6c 65 20 62 61  VALUES('Apple ba
e8f0: 6e 61 6e 61 27 2c 20 27 43 68 65 72 72 79 27 29  nana', 'Cherry')
e900: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
e910: 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28  ft(x, y) VALUES(
e920: 27 42 61 6e 61 6e 61 20 44 61 74 65 20 44 61 74  'Banana Date Dat
e930: 65 27 2c 20 27 63 68 65 72 72 79 27 29 3b 0a 20  e', 'cherry');. 
e940: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 28   INSERT INTO ft(
e950: 78 2c 20 79 29 20 56 41 4c 55 45 53 28 27 43 68  x, y) VALUES('Ch
e960: 65 72 72 79 20 45 6c 64 65 72 62 65 72 72 79 27  erry Elderberry'
e970: 2c 20 27 45 6c 64 65 72 62 65 72 72 79 27 29 3b  , 'Elderberry');
e980: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
e990: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
e9a0: 74 75 72 6e 73 20 74 68 69 73 20 64 61 74 61 3a  turns this data:
e9b0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
e9c0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70  .  <i>--     app
e9d0: 6c 65 20 20 20 20 20 20 20 7c 20 20 2a 20 20 7c  le       |  *  |
e9e0: 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20    1  |  1</i>.  
e9f0: 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c 65 20  <i>--     apple 
ea00: 20 20 20 20 20 20 7c 20 20 30 20 20 7c 20 20 31        |  0  |  1
ea10: 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e    |  1</i>.  <i>
ea20: 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20  --     banana   
ea30: 20 20 20 7c 20 20 2a 20 20 7c 20 20 32 20 20 7c     |  *  |  2  |
ea40: 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20    2</i>.  <i>-- 
ea50: 20 20 20 20 62 61 6e 61 6e 61 20 20 20 20 20 20      banana      
ea60: 7c 20 20 30 20 20 7c 20 20 32 20 20 7c 20 20 32  |  0  |  2  |  2
ea70: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
ea80: 20 63 68 65 72 72 79 20 20 20 20 20 20 7c 20 20   cherry      |  
ea90: 2a 20 20 7c 20 20 33 20 20 7c 20 20 33 3c 2f 69  *  |  3  |  3</i
eaa0: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68  >.  <i>--     ch
eab0: 65 72 72 79 20 20 20 20 20 20 7c 20 20 30 20 20  erry      |  0  
eac0: 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
ead0: 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65 72 72   <i>--     cherr
eae0: 79 20 20 20 20 20 20 7c 20 20 31 20 20 7c 20 20  y      |  1  |  
eaf0: 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69  2  |  2</i>.  <i
eb00: 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20 20  >--     date    
eb10: 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 31 20 20      |  *  |  1  
eb20: 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  |  2</i>.  <i>--
eb30: 20 20 20 20 20 64 61 74 65 20 20 20 20 20 20 20       date       
eb40: 20 7c 20 20 30 20 20 7c 20 20 31 20 20 7c 20 20   |  0  |  1  |  
eb50: 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  2</i>.  <i>--   
eb60: 20 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20    elderberry  | 
eb70: 20 2a 20 20 7c 20 20 31 20 20 7c 20 20 32 3c 2f   *  |  1  |  2</
eb80: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65  i>.  <i>--     e
eb90: 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20 31 20  lderberry  |  1 
eba0: 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a   |  1  |  1</i>.
ebb0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c 64 65    <i>--     elde
ebc0: 72 62 65 72 72 79 20 20 7c 20 20 31 20 20 7c 20  rberry  |  1  | 
ebd0: 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c   1  |  1</i>.  <
ebe0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
ebf0: 54 20 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63  T term, col, doc
ec00: 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e  uments, occurren
ec10: 63 65 73 20 46 52 4f 4d 20 66 74 5f 74 65 72 6d  ces FROM ft_term
ec20: 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  s;.</codeblock>.
ec30: 0a 3c 70 3e 0a 20 20 49 6e 20 74 68 65 20 65 78  .<p>.  In the ex
ec40: 61 6d 70 6c 65 2c 20 74 68 65 20 76 61 6c 75 65  ample, the value
ec50: 73 20 69 6e 20 74 68 65 20 22 74 65 72 6d 22 20  s in the "term" 
ec60: 63 6f 6c 75 6d 6e 20 61 72 65 20 61 6c 6c 20 6c  column are all l
ec70: 6f 77 65 72 20 63 61 73 65 2c 20 0a 20 20 65 76  ower case, .  ev
ec80: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
ec90: 65 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  ere inserted int
eca0: 6f 20 74 61 62 6c 65 20 22 66 74 22 20 69 6e 20  o table "ft" in 
ecb0: 6d 69 78 65 64 20 63 61 73 65 2e 20 54 68 69 73  mixed case. This
ecc0: 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 61 6e   is because.  an
ecd0: 20 66 74 73 33 61 75 78 20 74 61 62 6c 65 20 63   fts3aux table c
ece0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
ecf0: 73 20 61 73 20 65 78 74 72 61 63 74 65 64 20 66  s as extracted f
ed00: 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  rom the document
ed10: 20 74 65 78 74 0a 20 20 62 79 20 74 68 65 20 5b   text.  by the [
ed20: 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49 6e 20 74  tokenizer]. In t
ed30: 68 69 73 20 63 61 73 65 2c 20 73 69 6e 63 65 20  his case, since 
ed40: 74 61 62 6c 65 20 22 66 74 22 20 75 73 65 73 20  table "ft" uses 
ed50: 74 68 65 20 0a 20 20 5b 74 6f 6b 65 6e 69 7a 65  the .  [tokenize
ed60: 72 7c 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a  r|simple tokeniz
ed70: 65 72 5d 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  er], this means 
ed80: 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
ed90: 65 65 6e 20 66 6f 6c 64 65 64 20 74 6f 0a 20 20  een folded to.  
eda0: 6c 6f 77 65 72 20 63 61 73 65 2e 20 41 6c 73 6f  lower case. Also
edb0: 2c 20 74 68 65 72 65 20 69 73 20 28 66 6f 72 20  , there is (for 
edc0: 65 78 61 6d 70 6c 65 29 20 6e 6f 20 72 6f 77 20  example) no row 
edd0: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 22 74 65 72  with column "ter
ede0: 6d 22 0a 20 20 73 65 74 20 74 6f 20 22 61 70 70  m".  set to "app
edf0: 6c 65 22 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 22  le" and column "
ee00: 63 6f 6c 22 20 73 65 74 20 74 6f 20 31 2e 20 53  col" set to 1. S
ee10: 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e  ince there are n
ee20: 6f 20 69 6e 73 74 61 6e 63 65 73 0a 20 20 6f 66  o instances.  of
ee30: 20 74 68 65 20 74 65 72 6d 20 22 61 70 70 6c 65   the term "apple
ee40: 22 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 2c 20 6e  " in column 1, n
ee50: 6f 20 72 6f 77 20 69 73 20 70 72 65 73 65 6e 74  o row is present
ee60: 20 69 6e 20 74 68 65 20 66 74 73 34 61 75 78 20   in the fts4aux 
ee70: 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 44 75  table...<p>.  Du
ee80: 72 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ring a transacti
ee90: 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  on, some of the 
eea0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 74 6f 20  data written to 
eeb0: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d 61 79  an FTS table may
eec0: 20 62 65 20 0a 20 20 63 61 63 68 65 64 20 69 6e   be .  cached in
eed0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72 69 74   memory and writ
eee0: 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
eef0: 61 73 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ase only when th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
ef10: 20 0a 20 20 63 6f 6d 6d 69 74 74 65 64 2e 20 48   .  committed. H
ef20: 6f 77 65 76 65 72 20 74 68 65 20 69 6d 70 6c 65  owever the imple
ef30: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
ef40: 20 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 20   fts4aux module 
ef50: 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 0a 20 20  is only able .  
ef60: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
ef70: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
ef80: 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 69 73  In practice this
ef90: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 61   means that if a
efa0: 6e 20 66 74 73 34 61 75 78 20 0a 20 20 74 61 62  n fts4aux .  tab
efb0: 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66 72  le is queried fr
efc0: 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  om within a tran
efd0: 73 61 63 74 69 6f 6e 20 69 6e 20 77 68 69 63 68  saction in which
efe0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
eff0: 0a 20 20 46 54 53 20 74 61 62 6c 65 20 68 61 73  .  FTS table has
f000: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
f010: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
f020: 68 65 20 71 75 65 72 79 20 61 72 65 20 6c 69 6b  he query are lik
f030: 65 6c 79 20 74 6f 20 72 65 66 6c 65 63 74 20 0a  ely to reflect .
f040: 20 20 6f 6e 6c 79 20 61 20 28 70 6f 73 73 69 62    only a (possib
f050: 6c 79 20 65 6d 70 74 79 29 20 73 75 62 73 65 74  ly empty) subset
f060: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 20   of the changes 
f070: 6d 61 64 65 2e 0a 0a 3c 68 31 20 69 64 3d 66 74  made...<h1 id=ft
f080: 73 34 5f 6f 70 74 69 6f 6e 73 20 74 61 67 73 3d  s4_options tags=
f090: 22 46 54 53 34 20 6f 70 74 69 6f 6e 73 22 3e 46  "FTS4 options">F
f0a0: 54 53 34 20 4f 70 74 69 6f 6e 73 3c 2f 68 31 3e  TS4 Options</h1>
f0b0: 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 22  ..<p>.  If the "
f0c0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
f0d0: 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20  ABLE" statement 
f0e0: 73 70 65 63 69 66 69 65 73 20 6d 6f 64 75 6c 65  specifies module
f0f0: 20 46 54 53 34 20 28 6e 6f 74 20 46 54 53 33 29   FTS4 (not FTS3)
f100: 2c 20 0a 20 20 74 68 65 6e 20 73 70 65 63 69 61  , .  then specia
f110: 6c 20 64 69 72 65 63 74 69 76 65 73 20 2d 20 46  l directives - F
f120: 54 53 34 20 6f 70 74 69 6f 6e 73 20 2d 20 73 69  TS4 options - si
f130: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22 74 6f  milar to the "to
f140: 6b 65 6e 69 7a 65 3d 2a 22 20 6f 70 74 69 6f 6e  kenize=*" option
f150: 0a 20 20 6d 61 79 20 61 6c 73 6f 20 61 70 70 65  .  may also appe
f160: 61 72 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 63  ar in place of c
f170: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e 20  olumn names. An 
f180: 46 54 53 34 20 6f 70 74 69 6f 6e 20 63 6f 6e 73  FTS4 option cons
f190: 69 73 74 73 20 6f 66 20 74 68 65 0a 20 20 6f 70  ists of the.  op
f1a0: 74 69 6f 6e 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f  tion name, follo
f1b0: 77 65 64 20 62 79 20 61 6e 20 22 3d 22 20 63 68  wed by an "=" ch
f1c0: 61 72 61 63 74 65 72 2c 20 66 6f 6c 6c 6f 77 65  aracter, followe
f1d0: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6f 6e 20  d by the option 
f1e0: 76 61 6c 75 65 2e 0a 20 20 54 68 65 20 6f 70 74  value..  The opt
f1f0: 69 6f 6e 20 76 61 6c 75 65 20 6d 61 79 20 6f 70  ion value may op
f200: 74 69 6f 6e 61 6c 6c 79 20 62 65 20 65 6e 63 6c  tionally be encl
f210: 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 6f  osed in single o
f220: 72 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 2c  r double quotes,
f230: 20 77 69 74 68 0a 20 20 65 6d 62 65 64 64 65 64   with.  embedded
f240: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
f250: 73 20 65 73 63 61 70 65 64 20 69 6e 20 74 68 65  s escaped in the
f260: 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
f270: 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 2e 20 54   SQL literals. T
f280: 68 65 72 65 0a 20 20 6d 61 79 20 6e 6f 74 20 62  here.  may not b
f290: 65 20 77 68 69 74 65 73 70 61 63 65 20 6f 6e 20  e whitespace on 
f2a0: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
f2b0: 68 65 20 22 3d 22 20 63 68 61 72 61 63 74 65 72  he "=" character
f2c0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 20  . For example,. 
f2d0: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54   to create an FT
f2e0: 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  S4 table with th
f2f0: 65 20 76 61 6c 75 65 20 6f 66 20 6f 70 74 69 6f  e value of optio
f300: 6e 20 22 6d 61 74 63 68 69 6e 66 6f 22 20 73 65  n "matchinfo" se
f310: 74 20 74 6f 20 22 66 74 73 33 22 3a 0a 0a 3c 63  t to "fts3":..<c
f320: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
f330: 2d 20 43 72 65 61 74 65 20 61 20 72 65 64 75 63  - Create a reduc
f340: 65 64 2d 66 6f 6f 74 70 72 69 6e 74 20 46 54 53  ed-footprint FTS
f350: 34 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43  4 table.</i>.  C
f360: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
f370: 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
f380: 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20 64 6f   fts4(author, do
f390: 63 75 6d 65 6e 74 2c 20 6d 61 74 63 68 69 6e 66  cument, matchinf
f3a0: 6f 3d 66 74 73 33 29 3b 0a 3c 2f 63 6f 64 65 62  o=fts3);.</codeb
f3b0: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53  lock>..<p>.  FTS
f3c0: 34 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  4 currently supp
f3d0: 6f 72 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  orts the followi
f3e0: 6e 67 20 6f 70 74 69 6f 6e 73 3a 0a 0a 3c 74 61  ng options:..<ta
f3f0: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
f400: 20 3c 74 72 3e 3c 74 68 3e 4f 70 74 69 6f 6e 3c   <tr><th>Option<
f410: 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f  th>Interpretatio
f420: 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6d 70  n.  <tr><td>comp
f430: 72 65 73 73 3c 74 64 3e 0a 20 20 20 20 5e 54 68  ress<td>.    ^Th
f440: 65 20 63 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f  e compress optio
f450: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  n is used to spe
f460: 63 69 66 79 20 74 68 65 20 63 6f 6d 70 72 65 73  cify the compres
f470: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 5e 49 74 20  s function. ^It 
f480: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20  is an error to. 
f490: 20 20 20 73 70 65 63 69 66 79 20 61 20 63 6f 6d     specify a com
f4a0: 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77  press function w
f4b0: 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63  ithout also spec
f4c0: 69 66 79 69 6e 67 20 61 6e 20 75 6e 63 6f 6d 70  ifying an uncomp
f4d0: 72 65 73 73 0a 20 20 20 20 66 75 6e 63 74 69 6f  ress.    functio
f4e0: 6e 2e 20 5b 66 74 73 34 20 63 6f 6d 70 72 65 73  n. [fts4 compres
f4f0: 73 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c  s option|See bel
f500: 6f 77 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ow] for details.
f510: 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6e 74  ..  <tr><td>cont
f520: 65 6e 74 3c 74 64 3e 0a 20 20 20 20 5e 54 68 65  ent<td>.    ^The
f530: 20 63 6f 6e 74 65 6e 74 20 61 6c 6c 6f 77 73 20   content allows 
f540: 74 68 65 20 74 65 78 74 20 62 65 69 6e 67 20 69  the text being i
f550: 6e 64 65 78 65 64 20 74 6f 0a 20 20 20 20 73 74  ndexed to.    st
f560: 6f 72 65 64 20 69 6e 20 61 20 73 65 70 61 72 61  ored in a separa
f570: 74 65 20 74 61 62 6c 65 20 64 69 73 74 69 6e 63  te table distinc
f580: 74 20 66 72 6f 6d 20 74 68 65 20 46 54 53 34 20  t from the FTS4 
f590: 74 61 62 6c 65 2c 20 6f 72 20 0a 20 20 20 20 6f  table, or .    o
f5a0: 72 20 65 76 65 6e 20 6f 75 74 73 69 64 65 20 6f  r even outside o
f5b0: 66 20 53 51 4c 69 74 65 2e 0a 0a 20 20 3c 74 72  f SQLite...  <tr
f5c0: 3e 3c 74 64 3e 6c 61 6e 67 75 61 67 65 69 64 3c  ><td>languageid<
f5d0: 74 64 3e 0a 20 20 20 20 5e 54 68 65 20 6c 61 6e  td>.    ^The lan
f5e0: 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20 63  guageid option c
f5f0: 61 75 73 65 73 20 74 68 65 20 46 54 53 34 20 74  auses the FTS4 t
f600: 61 62 6c 65 20 74 6f 20 68 61 76 65 20 61 6e 20  able to have an 
f610: 61 64 64 69 74 69 6f 6e 61 6c 20 68 69 64 64 65  additional hidde
f620: 6e 0a 20 20 20 20 69 6e 74 65 67 65 72 20 63 6f  n.    integer co
f630: 6c 75 6d 6e 20 74 68 61 74 20 69 64 65 6e 74 69  lumn that identi
f640: 66 69 65 73 20 74 68 65 20 6c 61 6e 67 75 61 67  fies the languag
f650: 65 20 6f 66 20 74 68 65 20 74 65 78 74 20 63 6f  e of the text co
f660: 6e 74 61 69 6e 65 64 20 69 6e 0a 20 20 20 20 65  ntained in.    e
f670: 61 63 68 20 72 6f 77 2e 20 20 54 68 65 20 75 73  ach row.  The us
f680: 65 20 6f 66 20 74 68 65 20 6c 61 6e 67 75 61 67  e of the languag
f690: 65 69 64 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f 77  eid option allow
f6a0: 73 20 74 68 65 20 73 61 6d 65 20 46 54 53 34 20  s the same FTS4 
f6b0: 74 61 62 6c 65 0a 20 20 20 20 74 6f 20 68 6f 6c  table.    to hol
f6c0: 64 20 74 65 78 74 20 69 6e 20 6d 75 6c 74 69 70  d text in multip
f6d0: 6c 65 20 6c 61 6e 67 75 61 67 65 73 20 6f 72 20  le languages or 
f6e0: 73 63 72 69 70 74 73 2c 20 65 61 63 68 20 77 69  scripts, each wi
f6f0: 74 68 20 64 69 66 66 65 72 65 6e 74 20 74 6f 6b  th different tok
f700: 65 6e 69 7a 65 72 0a 20 20 20 20 72 75 6c 65 73  enizer.    rules
f710: 2c 20 61 6e 64 20 74 6f 20 71 75 65 72 79 20 65  , and to query e
f720: 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 6e 64  ach language ind
f730: 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
f740: 65 20 6f 74 68 65 72 73 2e 0a 20 20 20 20 0a 20  e others..    . 
f750: 20 3c 74 72 3e 3c 74 64 3e 6d 61 74 63 68 69 6e   <tr><td>matchin
f760: 66 6f 3c 74 64 3e 20 0a 20 20 20 20 57 68 65 6e  fo<td> .    When
f770: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
f780: 65 20 22 66 74 73 33 22 2c 20 74 68 65 20 6d 61  e "fts3", the ma
f790: 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 20 72  tchinfo option r
f7a0: 65 64 75 63 65 73 20 74 68 65 20 61 6d 6f 75 6e  educes the amoun
f7b0: 74 20 6f 66 0a 20 20 20 20 69 6e 66 6f 72 6d 61  t of.    informa
f7c0: 74 69 6f 6e 20 73 74 6f 72 65 64 20 62 79 20 46  tion stored by F
f7d0: 54 53 34 20 77 69 74 68 20 74 68 65 20 63 6f 6e  TS4 with the con
f7e0: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 74 68  sequence that th
f7f0: 65 20 22 6c 22 20 6f 70 74 69 6f 6e 20 6f 66 0a  e "l" option of.
f800: 20 20 20 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29      [matchinfo()
f810: 5d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  ] is no longer a
f820: 76 61 69 6c 61 62 6c 65 2e 0a 0a 20 20 3c 74 72  vailable...  <tr
f830: 3e 3c 74 64 3e 6f 72 64 65 72 3c 74 64 3e 0a 20  ><td>order<td>. 
f840: 20 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d     <tcl>hd_fragm
f850: 65 6e 74 20 66 74 73 34 6f 72 64 65 72 20 7b 46  ent fts4order {F
f860: 54 53 34 20 6f 72 64 65 72 20 6f 70 74 69 6f 6e  TS4 order option
f870: 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 5e 54 68 65  }</tcl>.    ^The
f880: 20 22 6f 72 64 65 72 22 20 6f 70 74 69 6f 6e 20   "order" option 
f890: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 65 69  may be set to ei
f8a0: 74 68 65 72 20 22 44 45 53 43 22 20 6f 72 20 22  ther "DESC" or "
f8b0: 41 53 43 22 20 28 69 6e 20 75 70 70 65 72 20 6f  ASC" (in upper o
f8c0: 72 0a 20 20 20 20 6c 6f 77 65 72 20 63 61 73 65  r.    lower case
f8d0: 29 2e 20 5e 49 66 20 69 74 20 69 73 20 73 65 74  ). ^If it is set
f8e0: 20 74 6f 20 22 44 45 53 43 22 2c 20 74 68 65 6e   to "DESC", then
f8f0: 20 46 54 53 34 20 73 74 6f 72 65 73 20 69 74 73   FTS4 stores its
f900: 20 64 61 74 61 20 69 6e 20 73 75 63 68 0a 20 20   data in such.  
f910: 20 20 61 20 77 61 79 20 61 73 20 74 6f 20 6f 70    a way as to op
f920: 74 69 6d 69 7a 65 20 72 65 74 75 72 6e 69 6e 67  timize returning
f930: 20 72 65 73 75 6c 74 73 20 69 6e 20 64 65 73 63   results in desc
f940: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
f950: 64 6f 63 69 64 2e 0a 20 20 20 20 5e 49 66 20 69  docid..    ^If i
f960: 74 20 69 73 20 73 65 74 20 74 6f 20 22 41 53 43  t is set to "ASC
f970: 22 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  " (the default),
f980: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 73   then the data s
f990: 74 72 75 63 74 75 72 65 73 20 61 72 65 20 0a 20  tructures are . 
f9a0: 20 20 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72     optimized for
f9b0: 20 72 65 74 75 72 6e 69 6e 67 20 72 65 73 75 6c   returning resul
f9c0: 74 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ts in ascending 
f9d0: 6f 72 64 65 72 20 62 79 20 64 6f 63 69 64 2e 20  order by docid. 
f9e0: 20 5e 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 77   ^In other.    w
f9f0: 6f 72 64 73 2c 20 69 66 20 6d 61 6e 79 20 6f 66  ords, if many of
fa00: 20 74 68 65 20 71 75 65 72 69 65 73 20 72 75 6e   the queries run
fa10: 20 61 67 61 69 6e 73 74 20 74 68 65 20 46 54 53   against the FTS
fa20: 34 20 74 61 62 6c 65 20 75 73 65 20 22 4f 52 44  4 table use "ORD
fa30: 45 52 20 42 59 0a 20 20 20 20 64 6f 63 69 64 20  ER BY.    docid 
fa40: 44 45 53 43 22 2c 20 74 68 65 6e 20 69 74 20 6d  DESC", then it m
fa50: 61 79 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  ay improve perfo
fa60: 72 6d 61 6e 63 65 20 74 6f 20 61 64 64 20 74 68  rmance to add th
fa70: 65 20 22 6f 72 64 65 72 3d 64 65 73 63 22 20 0a  e "order=desc" .
fa80: 20 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68      option to th
fa90: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
faa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
fab0: 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 70 72 65  ...  <tr><td>pre
fac0: 66 69 78 3c 74 64 3e 0a 20 20 20 20 54 68 69 73  fix<td>.    This
fad0: 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65 20 73   option may be s
fae0: 65 74 20 74 6f 20 61 20 63 6f 6d 6d 61 2d 73 65  et to a comma-se
faf0: 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20  parated list of 
fb00: 70 6f 73 69 74 69 76 65 20 6e 6f 6e 2d 7a 65 72  positive non-zer
fb10: 6f 20 0a 20 20 20 20 69 6e 74 65 67 65 72 73 2e  o .    integers.
fb20: 20 46 6f 72 20 65 61 63 68 20 69 6e 74 65 67 65   For each intege
fb30: 72 20 4e 20 69 6e 20 74 68 65 20 6c 69 73 74 2c  r N in the list,
fb40: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
fb50: 78 20 69 73 20 63 72 65 61 74 65 64 0a 20 20 20  x is created.   
fb60: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
fb70: 20 66 69 6c 65 20 74 6f 20 6f 70 74 69 6d 69 7a   file to optimiz
fb80: 65 20 5b 70 72 65 66 69 78 20 71 75 65 72 69 65  e [prefix querie
fb90: 73 5d 20 77 68 65 72 65 0a 20 20 20 20 74 68 65  s] where.    the
fba0: 20 71 75 65 72 79 20 74 65 72 6d 20 69 73 20 4e   query term is N
fbb0: 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
fbc0: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
fbd0: 74 68 65 20 27 2a 27 20 63 68 61 72 61 63 74 65  the '*' characte
fbe0: 72 2c 0a 20 20 20 20 77 68 65 6e 20 65 6e 63 6f  r,.    when enco
fbf0: 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d 38 2e  ded using UTF-8.
fc00: 20 5b 66 74 73 34 20 70 72 65 66 69 78 20 6f 70   [fts4 prefix op
fc10: 74 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d 20  tion|See below] 
fc20: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 20 20  for details...  
fc30: 3c 74 72 3e 3c 74 64 3e 75 6e 63 6f 6d 70 72 65  <tr><td>uncompre
fc40: 73 73 3c 74 64 3e 0a 20 20 20 20 54 68 69 73 20  ss<td>.    This 
fc50: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  option is used t
fc60: 6f 20 73 70 65 63 69 66 79 20 74 68 65 20 75 6e  o specify the un
fc70: 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f  compress functio
fc80: 6e 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  n. It is an erro
fc90: 72 20 74 6f 0a 20 20 20 20 73 70 65 63 69 66 79  r to.    specify
fca0: 20 61 6e 20 75 6e 63 6f 6d 70 72 65 73 73 20 66   an uncompress f
fcb0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
fcc0: 61 6c 73 6f 20 73 70 65 63 69 66 79 69 6e 67 20  also specifying 
fcd0: 61 20 63 6f 6d 70 72 65 73 73 0a 20 20 20 20 66  a compress.    f
fce0: 75 6e 63 74 69 6f 6e 2e 20 5b 66 74 73 34 20 63  unction. [fts4 c
fcf0: 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 7c 53  ompress option|S
fd00: 65 65 20 62 65 6c 6f 77 5d 20 66 6f 72 20 64 65  ee below] for de
fd10: 74 61 69 6c 73 2e 0a 3c 2f 74 61 62 6c 65 3e 0a  tails..</table>.
fd20: 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69 6e  .<p>.  When usin
fd30: 67 20 46 54 53 34 2c 20 73 70 65 63 69 66 79 69  g FTS4, specifyi
fd40: 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ng a column name
fd50: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
fd60: 6e 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 0a  n "=" character.
fd70: 20 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 69 74    and is not eit
fd80: 68 65 72 20 61 20 22 74 6f 6b 65 6e 69 7a 65 3d  her a "tokenize=
fd90: 2a 22 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  *" specification
fda0: 20 6f 72 20 61 20 72 65 63 6f 67 6e 69 7a 65 64   or a recognized
fdb0: 20 46 54 53 34 20 6f 70 74 69 6f 6e 0a 20 20 69   FTS4 option.  i
fdc0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 57 69 74 68  s an error. With
fdd0: 20 46 54 53 33 2c 20 74 68 65 20 66 69 72 73 74   FTS3, the first
fde0: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 75 6e   token in the un
fdf0: 72 65 63 6f 67 6e 69 7a 65 64 20 64 69 72 65 63  recognized direc
fe00: 74 69 76 65 20 69 73 20 0a 20 20 69 6e 74 65 72  tive is .  inter
fe10: 70 72 65 74 65 64 20 61 73 20 61 20 63 6f 6c 75  preted as a colu
fe20: 6d 6e 20 6e 61 6d 65 2e 20 53 69 6d 69 6c 61 72  mn name. Similar
fe30: 6c 79 2c 20 73 70 65 63 69 66 79 69 6e 67 20 6d  ly, specifying m
fe40: 75 6c 74 69 70 6c 65 20 22 74 6f 6b 65 6e 69 7a  ultiple "tokeniz
fe50: 65 3d 2a 22 0a 20 20 64 69 72 65 63 74 69 76 65  e=*".  directive
fe60: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 61  s in a single ta
fe70: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ble declaration 
fe80: 69 73 20 61 6e 20 65 72 72 6f 72 20 77 68 65 6e  is an error when
fe90: 20 75 73 69 6e 67 20 46 54 53 34 2c 20 77 68 65   using FTS4, whe
fea0: 72 65 61 73 0a 20 20 74 68 65 20 73 65 63 6f 6e  reas.  the secon
feb0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
fec0: 20 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22 20 64 69   "tokenize=*" di
fed0: 72 65 63 74 69 76 65 73 20 61 72 65 20 69 6e 74  rectives are int
fee0: 65 72 70 72 65 74 65 64 20 61 73 20 63 6f 6c 75  erpreted as colu
fef0: 6d 6e 0a 20 20 6e 61 6d 65 73 20 62 79 20 46 54  mn.  names by FT
ff00: 53 33 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  S3. For example:
ff10: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
ff20: 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f 72 2e 20  <i>-- An error. 
ff30: 46 54 53 34 20 64 6f 65 73 20 6e 6f 74 20 72 65  FTS4 does not re
ff40: 63 6f 67 6e 69 7a 65 20 74 68 65 20 64 69 72 65  cognize the dire
ff50: 63 74 69 76 65 20 22 78 79 7a 3d 61 62 63 22 2e  ctive "xyz=abc".
ff60: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
ff70: 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65  RTUAL TABLE pape
ff80: 72 73 20 55 53 49 4e 47 20 66 74 73 34 28 61 75  rs USING fts4(au
ff90: 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20  thor, document, 
ffa0: 78 79 7a 3d 61 62 63 29 3b 0a 0a 20 20 3c 69 3e  xyz=abc);..  <i>
ffb0: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
ffc0: 33 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 72  3 table with thr
ffd0: 65 65 20 63 6f 6c 75 6d 6e 73 20 2d 20 22 61 75  ee columns - "au
ffe0: 74 68 6f 72 22 2c 20 22 64 6f 63 75 6d 65 6e 74  thor", "document
fff0: 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6e  "</i>.  <i>-- an
10000 64 20 22 78 79 7a 22 2e 3c 2f 69 3e 0a 20 20 43  d "xyz".</i>.  C
10010 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
10020 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
10030 20 66 74 73 33 28 61 75 74 68 6f 72 2c 20 64 6f   fts3(author, do
10040 63 75 6d 65 6e 74 2c 20 78 79 7a 3d 61 62 63 29  cument, xyz=abc)
10050 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72  ;..  <i>-- An er
10060 72 6f 72 2e 20 46 54 53 34 20 64 6f 65 73 20 6e  ror. FTS4 does n
10070 6f 74 20 61 6c 6c 6f 77 20 6d 75 6c 74 69 70 6c  ot allow multipl
10080 65 20 74 6f 6b 65 6e 69 7a 65 3d 2a 20 64 69 72  e tokenize=* dir
10090 65 63 74 69 76 65 73 3c 2f 69 3e 0a 20 20 43 52  ectives</i>.  CR
100a0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
100b0 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47 20  LE papers USING 
100c0 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f  fts4(tokenize=po
100d0 72 74 65 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d 73  rter, tokenize=s
100e0 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  imple);..  <i>--
100f0 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33 20   Create an FTS3 
10100 74 61 62 6c 65 20 77 69 74 68 20 61 20 73 69 6e  table with a sin
10110 67 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  gle column named
10120 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 20 54 68 65   "tokenize". The
10130 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
10140 6c 65 20 75 73 65 73 20 74 68 65 20 22 70 6f 72  le uses the "por
10150 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c  ter" tokenizer.<
10160 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
10170 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72  TUAL TABLE paper
10180 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b  s USING fts3(tok
10190 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f  enize=porter, to
101a0 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a  kenize=simple);.
101b0 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f  .  <i>-- An erro
101c0 72 2e 20 43 61 6e 6e 6f 74 20 63 72 65 61 74 65  r. Cannot create
101d0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 77   a table with tw
101e0 6f 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20  o columns named 
101f0 22 74 6f 6b 65 6e 69 7a 65 22 2e 3c 2f 69 3e 0a  "tokenize".</i>.
10200 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
10210 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53   TABLE papers US
10220 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a  ING fts3(tokeniz
10230 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e 69  e=porter, tokeni
10240 7a 65 3d 73 69 6d 70 6c 65 2c 20 74 6f 6b 65 6e  ze=simple, token
10250 69 7a 65 3d 69 63 75 29 3b 0a 3c 2f 63 6f 64 65  ize=icu);.</code
10260 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  block>..<tcl>hd_
10270 66 72 61 67 6d 65 6e 74 20 2a 66 74 73 34 63 6f  fragment *fts4co
10280 6d 70 72 65 73 73 69 6f 6e 20 7b 63 6f 6d 70 72  mpression {compr
10290 65 73 73 65 64 20 46 54 53 34 20 63 6f 6e 74 65  essed FTS4 conte
102a0 6e 74 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74 61  nt}</tcl>.<h2 ta
102b0 67 73 3d 22 66 74 73 34 20 63 6f 6d 70 72 65 73  gs="fts4 compres
102c0 73 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 63 6f  s option">The co
102d0 6d 70 72 65 73 73 3d 20 61 6e 64 20 75 6e 63 6f  mpress= and unco
102e0 6d 70 72 65 73 73 3d 20 6f 70 74 69 6f 6e 73 3c  mpress= options<
102f0 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  /h2>..<p>.  The 
10300 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75 6e 63  compress and unc
10310 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 73 20  ompress options 
10320 61 6c 6c 6f 77 20 46 54 53 34 20 63 6f 6e 74 65  allow FTS4 conte
10330 6e 74 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  nt to be stored 
10340 69 6e 0a 20 20 74 68 65 20 64 61 74 61 62 61 73  in.  the databas
10350 65 20 69 6e 20 61 20 63 6f 6d 70 72 65 73 73 65  e in a compresse
10360 64 20 66 6f 72 6d 2e 20 42 6f 74 68 20 6f 70 74  d form. Both opt
10370 69 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 73  ions should be s
10380 65 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 20  et to the name. 
10390 20 6f 66 20 61 6e 20 53 51 4c 20 73 63 61 6c 61   of an SQL scala
103a0 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73  r function regis
103b0 74 65 72 65 64 20 75 73 69 6e 67 20 5b 73 71 6c  tered using [sql
103c0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
103d0 74 69 6f 6e 28 29 5d 0a 20 20 74 68 61 74 20 61  tion()].  that a
103e0 63 63 65 70 74 73 20 61 20 73 69 6e 67 6c 65 20  ccepts a single 
103f0 61 72 67 75 6d 65 6e 74 2e 20 0a 0a 3c 70 3e 0a  argument. ..<p>.
10400 20 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20 66    The compress f
10410 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 72  unction should r
10420 65 74 75 72 6e 20 61 20 63 6f 6d 70 72 65 73 73  eturn a compress
10430 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
10440 65 20 76 61 6c 75 65 20 0a 20 20 70 61 73 73 65  e value .  passe
10450 64 20 74 6f 20 69 74 20 61 73 20 61 6e 20 61 72  d to it as an ar
10460 67 75 6d 65 6e 74 2e 20 45 61 63 68 20 74 69 6d  gument. Each tim
10470 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  e data is writte
10480 6e 20 74 6f 20 74 68 65 20 46 54 53 34 20 74 61  n to the FTS4 ta
10490 62 6c 65 2c 20 0a 20 20 65 61 63 68 20 63 6f 6c  ble, .  each col
104a0 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 70 61 73  umn value is pas
104b0 73 65 64 20 74 6f 20 74 68 65 20 63 6f 6d 70 72  sed to the compr
104c0 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ess function and
104d0 20 74 68 65 20 72 65 73 75 6c 74 20 76 61 6c 75   the result valu
104e0 65 20 0a 20 20 73 74 6f 72 65 64 20 69 6e 20 74  e .  stored in t
104f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  he database. The
10500 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69   compress functi
10510 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 61 6e  on may return an
10520 79 20 74 79 70 65 20 6f 66 20 53 51 4c 69 74 65  y type of SQLite
10530 20 0a 20 20 76 61 6c 75 65 20 28 62 6c 6f 62 2c   .  value (blob,
10540 20 74 65 78 74 2c 20 72 65 61 6c 2c 20 69 6e 74   text, real, int
10550 65 67 65 72 20 6f 72 20 6e 75 6c 6c 29 2e 0a 0a  eger or null)...
10560 3c 70 3e 0a 20 20 54 68 65 20 75 6e 63 6f 6d 70  <p>.  The uncomp
10570 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  ress function sh
10580 6f 75 6c 64 20 75 6e 63 6f 6d 70 72 65 73 73 20  ould uncompress 
10590 64 61 74 61 20 70 72 65 76 69 6f 75 73 6c 79 20  data previously 
105a0 63 6f 6d 70 72 65 73 73 65 64 20 62 79 0a 20 20  compressed by.  
105b0 74 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e  the compress fun
105c0 63 74 69 6f 6e 2e 20 49 6e 20 6f 74 68 65 72 20  ction. In other 
105d0 77 6f 72 64 73 2c 20 66 6f 72 20 61 6c 6c 20 53  words, for all S
105e0 51 4c 69 74 65 20 76 61 6c 75 65 73 20 58 2c 20  QLite values X, 
105f0 69 74 20 73 68 6f 75 6c 64 0a 20 20 62 65 20 74  it should.  be t
10600 72 75 65 20 74 68 61 74 20 75 6e 63 6f 6d 70 72  rue that uncompr
10610 65 73 73 28 63 6f 6d 70 72 65 73 73 28 58 29 29  ess(compress(X))
10620 20 65 71 75 61 6c 73 20 58 2e 20 57 68 65 6e 20   equals X. When 
10630 64 61 74 61 20 74 68 61 74 20 68 61 73 20 62 65  data that has be
10640 65 6e 0a 20 20 63 6f 6d 70 72 65 73 73 65 64 20  en.  compressed 
10650 62 79 20 74 68 65 20 63 6f 6d 70 72 65 73 73 20  by the compress 
10660 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 64  function is read
10670 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
10680 73 65 20 62 79 20 46 54 53 34 2c 20 69 74 0a 20  se by FTS4, it. 
10690 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
106a0 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e  e uncompress fun
106b0 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20  ction before it 
106c0 69 73 20 75 73 65 64 2e 0a 0a 3c 70 3e 0a 20 20  is used...<p>.  
106d0 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  If the specified
106e0 20 63 6f 6d 70 72 65 73 73 20 6f 72 20 75 6e 63   compress or unc
106f0 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e  ompress function
10700 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20  s do not exist, 
10710 74 68 65 20 74 61 62 6c 65 0a 20 20 6d 61 79 20  the table.  may 
10720 73 74 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64  still be created
10730 2e 20 41 6e 20 65 72 72 6f 72 20 69 73 20 6e 6f  . An error is no
10740 74 20 72 65 74 75 72 6e 65 64 20 75 6e 74 69 6c  t returned until
10750 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 20   the FTS4 table 
10760 69 73 0a 20 20 72 65 61 64 20 28 69 66 20 74 68  is.  read (if th
10770 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e  e uncompress fun
10780 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
10790 78 69 73 74 29 20 6f 72 20 77 72 69 74 74 65 6e  xist) or written
107a0 20 28 69 66 20 69 74 20 69 73 20 74 68 65 20 0a   (if it is the .
107b0 20 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74    compress funct
107c0 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ion that does no
107d0 74 20 65 78 69 73 74 29 2e 0a 0a 3c 63 6f 64 65  t exist)...<code
107e0 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
107f0 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74 61  reate an FTS4 ta
10800 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
10810 64 61 74 61 20 69 6e 20 63 6f 6d 70 72 65 73 73  data in compress
10820 65 64 20 66 6f 72 6d 2e 20 54 68 69 73 3c 2f 69  ed form. This</i
10830 3e 0a 20 20 3c 69 3e 2d 2d 20 61 73 73 75 6d 65  >.  <i>-- assume
10840 73 20 74 68 61 74 20 74 68 65 20 73 63 61 6c 61  s that the scala
10850 72 20 66 75 6e 63 74 69 6f 6e 73 20 7a 69 70 28  r functions zip(
10860 29 20 61 6e 64 20 75 6e 7a 69 70 28 29 20 68 61  ) and unzip() ha
10870 76 65 20 62 65 65 6e 20 28 6f 72 3c 2f 69 3e 0a  ve been (or</i>.
10880 20 20 3c 69 3e 2d 2d 20 77 69 6c 6c 20 62 65 29    <i>-- will be)
10890 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
108a0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 3c 2f  tabase handle.</
108b0 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
108c0 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73  UAL TABLE papers
108d0 20 55 53 49 4e 47 20 66 74 73 34 28 61 75 74 68   USING fts4(auth
108e0 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20 63 6f  or, document, co
108f0 6d 70 72 65 73 73 3d 7a 69 70 2c 20 75 6e 63 6f  mpress=zip, unco
10900 6d 70 72 65 73 73 3d 75 6e 7a 69 70 29 3b 0a 3c  mpress=unzip);.<
10910 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
10920 0a 20 20 57 68 65 6e 20 69 6d 70 6c 65 6d 65 6e  .  When implemen
10930 74 69 6e 67 20 74 68 65 20 63 6f 6d 70 72 65 73  ting the compres
10940 73 20 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73  s and uncompress
10950 20 66 75 6e 63 74 69 6f 6e 73 20 69 74 20 69 73   functions it is
10960 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 20 20   important to.  
10970 70 61 79 20 61 74 74 65 6e 74 69 6f 6e 20 74 6f  pay attention to
10980 20 64 61 74 61 20 74 79 70 65 73 2e 20 53 70 65   data types. Spe
10990 63 69 66 69 63 61 6c 6c 79 2c 20 77 68 65 6e 20  cifically, when 
109a0 61 20 75 73 65 72 20 72 65 61 64 73 20 61 20 76  a user reads a v
109b0 61 6c 75 65 20 66 72 6f 6d 0a 20 20 61 20 63 6f  alue from.  a co
109c0 6d 70 72 65 73 73 65 64 20 46 54 53 20 74 61 62  mpressed FTS tab
109d0 6c 65 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65  le, the value re
109e0 74 75 72 6e 65 64 20 62 79 20 46 54 53 20 69 73  turned by FTS is
109f0 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
10a00 65 0a 20 20 61 73 20 74 68 65 20 76 61 6c 75 65  e.  as the value
10a10 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
10a20 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63   uncompress func
10a30 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67 20  tion, including 
10a40 74 68 65 20 64 61 74 61 20 74 79 70 65 2e 0a 20  the data type.. 
10a50 20 49 66 20 74 68 61 74 20 64 61 74 61 20 74 79   If that data ty
10a60 70 65 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  pe is not the sa
10a70 6d 65 20 61 73 20 74 68 65 20 64 61 74 61 20 74  me as the data t
10a80 79 70 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ype of the origi
10a90 6e 61 6c 20 76 61 6c 75 65 20 61 73 0a 20 20 70  nal value as.  p
10aa0 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 6f 6d  assed to the com
10ab0 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 28  press function (
10ac0 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 20 74  for example if t
10ad0 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
10ae0 6e 63 74 69 6f 6e 20 69 73 0a 20 20 72 65 74 75  nction is.  retu
10af0 72 6e 69 6e 67 20 42 4c 4f 42 20 77 68 65 6e 20  rning BLOB when 
10b00 63 6f 6d 70 72 65 73 73 20 77 61 73 20 6f 72 69  compress was ori
10b10 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 54  ginally passed T
10b20 45 58 54 29 2c 20 74 68 65 6e 20 74 68 65 20 75  EXT), then the u
10b30 73 65 72 73 0a 20 20 71 75 65 72 79 20 6d 61 79  sers.  query may
10b40 20 6e 6f 74 20 66 75 6e 63 74 69 6f 6e 20 61 73   not function as
10b50 20 65 78 70 65 63 74 65 64 2e 0a 0a 3c 74 63 6c   expected...<tcl
10b60 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66 74  >hd_fragment *ft
10b70 73 34 63 6f 6e 74 65 6e 74 20 7b 46 54 53 34 20  s4content {FTS4 
10b80 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 7d 3c  content option}<
10b90 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22  /tcl>.<h2 tags="
10ba0 66 74 73 34 20 63 6f 6e 74 65 6e 74 20 6f 70 74  fts4 content opt
10bb0 69 6f 6e 22 3e 54 68 65 20 63 6f 6e 74 65 6e 74  ion">The content
10bc0 3d 20 6f 70 74 69 6f 6e 20 3c 2f 68 32 3e 0a 0a  = option </h2>..
10bd0 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65 6e  <p>.  The conten
10be0 74 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f 77 73 20  t option allows 
10bf0 46 54 53 34 20 74 6f 20 66 6f 72 65 67 6f 20 73  FTS4 to forego s
10c00 74 6f 72 69 6e 67 20 74 68 65 20 74 65 78 74 20  toring the text 
10c10 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 0a 20  being indexed.. 
10c20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70 74   The content opt
10c30 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
10c40 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 0a 3c 75  in two ways:..<u
10c50 6c 3e 0a 3c 6c 69 3e 3c 70 3e 20 54 68 65 20 69  l>.<li><p> The i
10c60 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74 73  ndexed documents
10c70 20 61 72 65 20 6e 6f 74 20 73 74 6f 72 65 64 20   are not stored 
10c80 77 69 74 68 69 6e 20 74 68 65 20 53 51 4c 69 74  within the SQLit
10c90 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
10ca0 20 20 20 20 61 74 20 61 6c 6c 20 28 61 20 22 63      at all (a "c
10cb0 6f 6e 74 65 6e 74 6c 65 73 73 22 20 46 54 53 34  ontentless" FTS4
10cc0 20 74 61 62 6c 65 29 2c 20 6f 72 0a 0a 3c 6c 69   table), or..<li
10cd0 3e 3c 70 3e 20 54 68 65 20 69 6e 64 65 78 65 64  ><p> The indexed
10ce0 20 64 6f 63 75 6d 65 6e 74 73 20 61 72 65 20 73   documents are s
10cf0 74 6f 72 65 64 20 69 6e 20 61 20 64 61 74 61 62  tored in a datab
10d00 61 73 65 20 74 61 62 6c 65 20 63 72 65 61 74 65  ase table create
10d10 64 20 61 6e 64 0a 20 20 20 20 20 20 20 20 6d 61  d and.        ma
10d20 6e 61 67 65 64 20 62 79 20 74 68 65 20 75 73 65  naged by the use
10d30 72 20 28 61 6e 20 22 65 78 74 65 72 6e 61 6c 20  r (an "external 
10d40 63 6f 6e 74 65 6e 74 22 20 46 54 53 34 20 74 61  content" FTS4 ta
10d50 62 6c 65 29 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e  ble)..</ul>..<p>
10d60 0a 20 20 42 65 63 61 75 73 65 20 74 68 65 20 69  .  Because the i
10d70 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74 73  ndexed documents
10d80 20 74 68 65 6d 73 65 6c 76 65 73 20 61 72 65 20   themselves are 
10d90 75 73 75 61 6c 6c 79 20 6d 75 63 68 20 6c 61 72  usually much lar
10da0 67 65 72 20 74 68 61 6e 20 0a 20 20 74 68 65 20  ger than .  the 
10db0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c  full-text index,
10dc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70 74   the content opt
10dd0 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
10de0 74 6f 20 61 63 68 69 65 76 65 20 0a 20 20 73 69  to achieve .  si
10df0 67 6e 69 66 69 63 61 6e 74 20 73 70 61 63 65 20  gnificant space 
10e00 73 61 76 69 6e 67 73 2e 0a 0a 3c 68 33 3e 20 43  savings...<h3> C
10e10 6f 6e 74 65 6e 74 6c 65 73 73 20 46 54 53 34 20  ontentless FTS4 
10e20 54 61 62 6c 65 73 20 3c 2f 68 33 3e 0a 0a 3c 70  Tables </h3>..<p
10e30 3e 0a 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  >.  In order to 
10e40 63 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74  create an FTS4 t
10e50 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  able that does n
10e60 6f 74 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  ot store a copy 
10e70 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  of the indexed. 
10e80 20 64 6f 63 75 6d 65 6e 74 73 20 61 74 20 61 6c   documents at al
10e90 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  l, the content o
10ea0 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ption should be 
10eb0 73 65 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  set to an empty 
10ec0 73 74 72 69 6e 67 2e 0a 20 20 46 6f 72 20 65 78  string..  For ex
10ed0 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  ample, the follo
10ee0 77 69 6e 67 20 53 51 4c 20 63 72 65 61 74 65 73  wing SQL creates
10ef0 20 73 75 63 68 20 61 6e 20 46 54 53 34 20 74 61   such an FTS4 ta
10f00 62 6c 65 20 77 69 74 68 20 74 68 72 65 65 0a 20  ble with three. 
10f10 20 63 6f 6c 75 6d 6e 73 20 2d 20 22 61 22 2c 20   columns - "a", 
10f20 22 62 22 2c 20 61 6e 64 20 22 63 22 3a 0a 0a 3c  "b", and "c":..<
10f30 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45  codeblock>.  CRE
10f40 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
10f50 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 28  E t1 USING fts4(
10f60 63 6f 6e 74 65 6e 74 3d 22 22 2c 20 61 2c 20 62  content="", a, b
10f70 2c 20 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  , c);.</codebloc
10f80 6b 3e 0a 0a 3c 70 3e 0a 20 20 44 61 74 61 20 63  k>..<p>.  Data c
10f90 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  an be inserted i
10fa0 6e 74 6f 20 73 75 63 68 20 61 6e 20 46 54 53 34  nto such an FTS4
10fb0 20 74 61 62 6c 65 20 75 73 69 6e 67 20 61 6e 20   table using an 
10fc0 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
10fd0 73 2e 0a 20 20 48 6f 77 65 76 65 72 2c 20 75 6e  s..  However, un
10fe0 6c 69 6b 65 20 6f 72 64 69 6e 61 72 79 20 46 54  like ordinary FT
10ff0 53 34 20 74 61 62 6c 65 73 2c 20 74 68 65 20 75  S4 tables, the u
11000 73 65 72 20 6d 75 73 74 20 73 75 70 70 6c 79 20  ser must supply 
11010 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20 69 6e  an explicit.  in
11020 74 65 67 65 72 20 64 6f 63 69 64 20 76 61 6c 75  teger docid valu
11030 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
11040 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
11050 69 3e 2d 2d 20 54 68 69 73 20 73 74 61 74 65 6d  i>-- This statem
11060 65 6e 74 20 69 73 20 4f 6b 3a 3c 2f 69 3e 0a 20  ent is Ok:</i>. 
11070 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
11080 64 6f 63 69 64 2c 20 61 2c 20 62 2c 20 63 29 20  docid, a, b, c) 
11090 56 41 4c 55 45 53 28 31 2c 20 27 61 20 62 20 63  VALUES(1, 'a b c
110a0 27 2c 20 27 64 20 65 20 66 27 2c 20 27 67 20 68  ', 'd e f', 'g h
110b0 20 69 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54   i');..  <i>-- T
110c0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 63 61  his statement ca
110d0 75 73 65 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  uses an error, a
110e0 73 20 6e 6f 20 64 6f 63 69 64 20 76 61 6c 75 65  s no docid value
110f0 20 68 61 73 20 62 65 65 6e 20 70 72 6f 76 69 64   has been provid
11100 65 64 3a 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54  ed:</i>.  INSERT
11110 20 49 4e 54 4f 20 74 31 28 61 2c 20 62 2c 20 63   INTO t1(a, b, c
11120 29 20 56 41 4c 55 45 53 28 27 6a 20 6b 20 6c 27  ) VALUES('j k l'
11130 2c 20 27 6d 20 6e 20 6f 27 2c 20 27 70 20 71 20  , 'm n o', 'p q 
11140 72 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  r');.</codeblock
11150 3e 0a 0a 3c 70 3e 0a 20 20 49 74 20 69 73 20 6e  >..<p>.  It is n
11160 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 55  ot possible to U
11170 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
11180 61 20 72 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  a row stored in 
11190 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 46 54  a contentless FT
111a0 53 34 0a 20 20 74 61 62 6c 65 2e 20 41 74 74 65  S4.  table. Atte
111b0 6d 70 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f 20  mpting to do so 
111c0 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 0a 3c 70  is an error...<p
111d0 3e 0a 20 20 43 6f 6e 74 65 6e 74 6c 65 73 73 20  >.  Contentless 
111e0 46 54 53 34 20 74 61 62 6c 65 73 20 61 6c 73 6f  FTS4 tables also
111f0 20 73 75 70 70 6f 72 74 20 53 45 4c 45 43 54 20   support SELECT 
11200 73 74 61 74 65 6d 65 6e 74 73 2e 20 48 6f 77 65  statements. Howe
11210 76 65 72 2c 20 69 74 20 69 73 0a 20 20 61 6e 20  ver, it is.  an 
11220 65 72 72 6f 72 20 74 6f 20 61 74 74 65 6d 70 74  error to attempt
11230 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
11240 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 74 61   value of any ta
11250 62 6c 65 20 63 6f 6c 75 6d 6e 20 6f 74 68 65 72  ble column other
11260 20 74 68 61 6e 0a 20 20 74 68 65 20 64 6f 63 69   than.  the doci
11270 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 61 75  d column. The au
11280 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
11290 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6d 61 79   matchinfo() may
112a0 20 62 65 20 75 73 65 64 2c 20 62 75 74 0a 20 20   be used, but.  
112b0 73 6e 69 70 70 65 74 28 29 20 61 6e 64 20 6f 66  snippet() and of
112c0 66 73 65 74 73 28 29 20 6d 61 79 20 6e 6f 74 2e  fsets() may not.
112d0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
112e0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
112f0 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
11300 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
11310 4f 6b 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  Ok:</i>.  SELECT
11320 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57   docid FROM t1 W
11330 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 78  HERE t1 MATCH 'x
11340 78 78 27 3b 0a 20 20 53 45 4c 45 43 54 20 64 6f  xx';.  SELECT do
11350 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52  cid FROM t1 WHER
11360 45 20 61 20 4d 41 54 43 48 20 27 78 78 78 27 3b  E a MATCH 'xxx';
11370 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69  .  SELECT matchi
11380 6e 66 6f 28 74 31 29 20 46 52 4f 4d 20 74 31 20  nfo(t1) FROM t1 
11390 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
113a0 78 78 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  xxx';..  <i>-- T
113b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
113c0 74 65 6d 65 6e 74 73 20 61 6c 6c 20 63 61 75 73  tements all caus
113d0 65 20 65 72 72 6f 72 73 2c 20 61 73 20 74 68 65  e errors, as the
113e0 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
113f0 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 74  s</i>.  <i>-- ot
11400 68 65 72 20 74 68 61 6e 20 64 6f 63 69 64 20 61  her than docid a
11410 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  re required to e
11420 76 61 6c 75 61 74 65 20 74 68 65 6d 2e 3c 2f 69  valuate them.</i
11430 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
11440 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 61  M t1;.  SELECT a
11450 2c 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , b FROM t1 WHER
11460 45 20 74 31 20 4d 41 54 43 48 20 27 78 78 78 27  E t1 MATCH 'xxx'
11470 3b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  ;.  SELECT docid
11480 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
11490 20 4c 49 4b 45 20 27 78 78 78 25 27 3b 0a 20 20   LIKE 'xxx%';.  
114a0 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
114b0 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  1) FROM t1 WHERE
114c0 20 74 31 20 4d 41 54 43 48 20 27 78 78 78 27 3b   t1 MATCH 'xxx';
114d0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
114e0 70 3e 0a 20 20 45 72 72 6f 72 73 20 72 65 6c 61  p>.  Errors rela
114f0 74 65 64 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ted to attemptin
11500 67 20 74 6f 20 72 65 74 72 69 65 76 65 20 63 6f  g to retrieve co
11510 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 74 68 65  lumn values othe
11520 72 20 74 68 61 6e 20 64 6f 63 69 64 0a 20 20 61  r than docid.  a
11530 72 65 20 72 75 6e 74 69 6d 65 20 65 72 72 6f 72  re runtime error
11540 73 20 74 68 61 74 20 6f 63 63 75 72 20 77 69 74  s that occur wit
11550 68 69 6e 20 73 71 6c 69 74 65 33 5f 73 74 65 70  hin sqlite3_step
11560 28 29 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  (). In some case
11570 73 2c 20 66 6f 72 0a 20 20 65 78 61 6d 70 6c 65  s, for.  example
11580 20 69 66 20 74 68 65 20 4d 41 54 43 48 20 65 78   if the MATCH ex
11590 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 53 45  pression in a SE
115a0 4c 45 43 54 20 71 75 65 72 79 20 6d 61 74 63 68  LECT query match
115b0 65 73 20 7a 65 72 6f 20 72 6f 77 73 2c 20 74 68  es zero rows, th
115c0 65 72 65 0a 20 20 6d 61 79 20 62 65 20 6e 6f 20  ere.  may be no 
115d0 65 72 72 6f 72 20 61 74 20 61 6c 6c 20 65 76 65  error at all eve
115e0 6e 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  n if a statement
115f0 20 64 6f 65 73 20 72 65 66 65 72 20 74 6f 20 63   does refer to c
11600 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 0a 20 20  olumn values .  
11610 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63 69 64  other than docid
11620 2e 0a 0a 3c 68 33 3e 20 45 78 74 65 72 6e 61 6c  ...<h3> External
11630 20 43 6f 6e 74 65 6e 74 20 46 54 53 34 20 54 61   Content FTS4 Ta
11640 62 6c 65 73 20 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a  bles </h3>..<p>.
11650 20 20 41 6e 20 22 65 78 74 65 72 6e 61 6c 20 63    An "external c
11660 6f 6e 74 65 6e 74 22 20 46 54 53 34 20 74 61 62  ontent" FTS4 tab
11670 6c 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  le is similar to
11680 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 74   a contentless t
11690 61 62 6c 65 2c 20 65 78 63 65 70 74 0a 20 20 74  able, except.  t
116a0 68 61 74 20 69 66 20 65 76 61 6c 75 61 74 69 6f  hat if evaluatio
116b0 6e 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 71  n of a query req
116c0 75 69 72 65 73 20 74 68 65 20 76 61 6c 75 65 20  uires the value 
116d0 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 74 68 65  of a column othe
116e0 72 20 74 68 61 6e 20 0a 20 20 64 6f 63 69 64 2c  r than .  docid,
116f0 20 46 54 53 34 20 61 74 74 65 6d 70 74 73 20 74   FTS4 attempts t
11700 6f 20 72 65 74 72 69 65 76 65 20 74 68 61 74 20  o retrieve that 
11710 76 61 6c 75 65 20 66 72 6f 6d 20 61 20 74 61 62  value from a tab
11720 6c 65 20 28 6f 72 20 76 69 65 77 2c 20 6f 72 20  le (or view, or 
11730 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  .  virtual table
11740 29 20 6e 6f 6d 69 6e 61 74 65 64 20 62 79 20 74  ) nominated by t
11750 68 65 20 75 73 65 72 20 28 68 65 72 65 61 66 74  he user (hereaft
11760 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 61  er referred to a
11770 73 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 0a 20  s the "content. 
11780 20 74 61 62 6c 65 22 29 2e 20 54 68 65 20 46 54   table"). The FT
11790 53 34 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  S4 module never 
117a0 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 63 6f  writes to the co
117b0 6e 74 65 6e 74 20 74 61 62 6c 65 2c 20 61 6e 64  ntent table, and
117c0 20 77 72 69 74 69 6e 67 0a 20 20 74 6f 20 74 68   writing.  to th
117d0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  e content table 
117e0 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
117f0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
11800 64 65 78 2e 20 49 74 20 69 73 20 74 68 65 0a 20  dex. It is the. 
11810 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
11820 6f 66 20 74 68 65 20 75 73 65 72 20 74 6f 20 65  of the user to e
11830 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
11840 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 61 6e 64  ontent table and
11850 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78   the .  full-tex
11860 74 20 69 6e 64 65 78 20 61 72 65 20 63 6f 6e 73  t index are cons
11870 69 73 74 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41  istent...<p>.  A
11880 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65  n external conte
11890 6e 74 20 46 54 53 34 20 74 61 62 6c 65 20 69 73  nt FTS4 table is
118a0 20 63 72 65 61 74 65 64 20 62 79 20 73 65 74 74   created by sett
118b0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
118c0 6f 70 74 69 6f 6e 0a 20 20 74 6f 20 74 68 65 20  option.  to the 
118d0 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
118e0 28 6f 72 20 76 69 65 77 2c 20 6f 72 20 76 69 72  (or view, or vir
118f0 74 75 61 6c 20 74 61 62 6c 65 29 20 74 68 61 74  tual table) that
11900 20 6d 61 79 20 62 65 20 71 75 65 72 69 65 64 20   may be queried 
11910 62 79 0a 20 20 46 54 53 34 20 74 6f 20 72 65 74  by.  FTS4 to ret
11920 72 69 65 76 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  rieve column val
11930 75 65 73 20 77 68 65 6e 20 72 65 71 75 69 72 65  ues when require
11940 64 2e 20 49 66 20 74 68 65 20 6e 6f 6d 69 6e 61  d. If the nomina
11950 74 65 64 20 74 61 62 6c 65 20 64 6f 65 73 0a 20  ted table does. 
11960 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
11970 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e   an external con
11980 74 65 6e 74 20 74 61 62 6c 65 20 62 65 68 61 76  tent table behav
11990 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  es in the same w
119a0 61 79 20 61 73 0a 20 20 61 20 63 6f 6e 74 65 6e  ay as.  a conten
119b0 74 6c 65 73 73 20 74 61 62 6c 65 2e 20 46 6f 72  tless table. For
119c0 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65   example:..<code
119d0 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20  block>.  CREATE 
119e0 54 41 42 4c 45 20 74 32 28 69 64 20 49 4e 54 45  TABLE t2(id INTE
119f0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
11a00 20 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45   a, b, c);.  CRE
11a10 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
11a20 45 20 74 33 20 55 53 49 4e 47 20 66 74 73 34 28  E t3 USING fts4(
11a30 63 6f 6e 74 65 6e 74 3d 22 74 32 22 2c 20 61 2c  content="t2", a,
11a40 20 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b   c);.</codeblock
11a50 3e 0a 0a 3c 70 3e 0a 20 20 41 73 73 75 6d 69 6e  >..<p>.  Assumin
11a60 67 20 74 68 65 20 6e 6f 6d 69 6e 61 74 65 64 20  g the nominated 
11a70 74 61 62 6c 65 20 64 6f 65 73 20 65 78 69 73 74  table does exist
11a80 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6c 75 6d  , then its colum
11a90 6e 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ns must be the s
11aa0 61 6d 65 20 0a 20 20 61 73 20 6f 72 20 61 20 73  ame .  as or a s
11ab0 75 70 65 72 73 65 74 20 6f 66 20 74 68 6f 73 65  uperset of those
11ac0 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68 65   defined for the
11ad0 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e   FTS table...<p>
11ae0 0a 20 20 57 68 65 6e 20 61 20 75 73 65 72 73 20  .  When a users 
11af0 71 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53  query on the FTS
11b00 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 73 20   table requires 
11b10 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f  a column value o
11b20 74 68 65 72 20 74 68 61 6e 0a 20 20 64 6f 63 69  ther than.  doci
11b30 64 2c 20 46 54 53 20 61 74 74 65 6d 70 74 73 20  d, FTS attempts 
11b40 74 6f 20 72 65 61 64 20 74 68 69 73 20 76 61 6c  to read this val
11b50 75 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 72  ue from the corr
11b60 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
11b70 20 6f 66 0a 20 20 74 68 65 20 72 6f 77 20 69 6e   of.  the row in
11b80 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
11b90 6c 65 20 77 69 74 68 20 61 20 72 6f 77 69 64 20  le with a rowid 
11ba0 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 74  value equal to t
11bb0 68 65 20 63 75 72 72 65 6e 74 20 46 54 53 0a 20  he current FTS. 
11bc0 20 64 6f 63 69 64 2e 20 4f 72 2c 20 69 66 20 73   docid. Or, if s
11bd0 75 63 68 20 61 20 72 6f 77 20 63 61 6e 6e 6f 74  uch a row cannot
11be0 20 62 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   be found in the
11bf0 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2c 20   content table, 
11c00 61 20 4e 55 4c 4c 0a 20 20 76 61 6c 75 65 20 69  a NULL.  value i
11c10 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 20  s used instead. 
11c20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63  For example:..<c
11c30 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41  odeblock>.  CREA
11c40 54 45 20 54 41 42 4c 45 20 74 32 28 69 64 20 49  TE TABLE t2(id I
11c50 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
11c60 45 59 2c 20 61 2c 20 62 2c 20 63 2c 20 64 29 3b  EY, a, b, c, d);
11c70 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
11c80 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47  L TABLE t3 USING
11c90 20 66 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22 74   fts4(content="t
11ca0 32 22 2c 20 62 2c 20 63 29 3b 0a 20 20 0a 20 20  2", b, c);.  .  
11cb0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
11cc0 41 4c 55 45 53 28 32 2c 20 27 61 20 62 27 2c 20  ALUES(2, 'a b', 
11cd0 27 63 20 64 27 2c 20 27 65 20 66 27 29 3b 0a 20  'c d', 'e f');. 
11ce0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
11cf0 56 41 4c 55 45 53 28 33 2c 20 27 67 20 68 27 2c  VALUES(3, 'g h',
11d00 20 27 69 20 6a 27 2c 20 27 6b 20 6c 27 29 3b 0a   'i j', 'k l');.
11d10 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
11d20 28 64 6f 63 69 64 2c 20 62 2c 20 63 29 20 53 45  (docid, b, c) SE
11d30 4c 45 43 54 20 69 64 2c 20 62 2c 20 63 20 46 52  LECT id, b, c FR
11d40 4f 4d 20 74 32 3b 0a 20 20 3c 69 3e 2d 2d 20 54  OM t2;.  <i>-- T
11d50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
11d60 72 79 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e  ry returns a sin
11d70 67 6c 65 20 72 6f 77 20 77 69 74 68 20 74 77 6f  gle row with two
11d80 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74 61 69 6e   columns contain
11d90 69 6e 67 0a 20 20 2d 2d 20 74 68 65 20 74 65 78  ing.  -- the tex
11da0 74 20 76 61 6c 75 65 73 20 22 69 20 6a 22 20 61  t values "i j" a
11db0 6e 64 20 22 6b 20 6c 22 2e 0a 20 20 2d 2d 0a 20  nd "k l"..  --. 
11dc0 20 2d 2d 20 54 68 65 20 71 75 65 72 79 20 75 73   -- The query us
11dd0 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  es the full-text
11de0 20 69 6e 64 65 78 20 74 6f 20 64 69 73 63 6f 76   index to discov
11df0 65 72 20 74 68 61 74 20 74 68 65 20 4d 41 54 43  er that the MATC
11e00 48 20 0a 20 20 2d 2d 20 74 65 72 6d 20 6d 61 74  H .  -- term mat
11e10 63 68 65 73 20 74 68 65 20 72 6f 77 20 77 69 74  ches the row wit
11e20 68 20 64 6f 63 69 64 3d 33 2e 20 49 74 20 74 68  h docid=3. It th
11e30 65 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  en retrieves the
11e40 20 76 61 6c 75 65 73 0a 20 20 2d 2d 20 6f 66 20   values.  -- of 
11e50 63 6f 6c 75 6d 6e 73 20 62 20 61 6e 64 20 63 20  columns b and c 
11e60 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 77 69 74  from the row wit
11e70 68 20 72 6f 77 69 64 3d 33 20 69 6e 20 74 68 65  h rowid=3 in the
11e80 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 0a 20   content table. 
11e90 20 2d 2d 20 74 6f 20 72 65 74 75 72 6e 2e 0a 20   -- to return.. 
11ea0 20 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54   --</i>.  SELECT
11eb0 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   * FROM t3 WHERE
11ec0 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b 0a 0a   t3 MATCH 'k';..
11ed0 20 20 3c 69 3e 2d 2d 20 46 6f 6c 6c 6f 77 69 6e    <i>-- Followin
11ee0 67 20 74 68 65 20 55 50 44 41 54 45 2c 20 74 68  g the UPDATE, th
11ef0 65 20 71 75 65 72 79 20 73 74 69 6c 6c 20 72 65  e query still re
11f00 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  turns a single r
11f10 6f 77 2c 20 74 68 69 73 0a 20 20 2d 2d 20 74 69  ow, this.  -- ti
11f20 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  me containing th
11f30 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 22 78  e text values "x
11f40 78 78 22 20 61 6e 64 20 22 79 79 79 22 2e 20 54  xx" and "yyy". T
11f50 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
11f60 68 65 0a 20 20 2d 2d 20 66 75 6c 6c 2d 74 65 78  he.  -- full-tex
11f70 74 20 69 6e 64 65 78 20 73 74 69 6c 6c 20 69 6e  t index still in
11f80 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
11f90 20 72 6f 77 20 77 69 74 68 20 64 6f 63 69 64 3d   row with docid=
11fa0 33 20 6d 61 74 63 68 65 73 0a 20 20 2d 2d 20 74  3 matches.  -- t
11fb0 68 65 20 46 54 53 34 20 71 75 65 72 79 20 27 6b  he FTS4 query 'k
11fc0 27 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ', even though t
11fd0 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 73 74 6f  he documents sto
11fe0 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  red in the conte
11ff0 6e 74 0a 20 20 2d 2d 20 74 61 62 6c 65 20 68 61  nt.  -- table ha
12000 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
12010 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 55 50 44  ..  --</i>.  UPD
12020 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
12030 78 78 78 27 2c 20 63 20 3d 20 27 79 79 79 27 20  xxx', c = 'yyy' 
12040 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 33 3b  WHERE rowid = 3;
12050 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
12060 20 74 33 20 57 48 45 52 45 20 74 33 20 4d 41 54   t3 WHERE t3 MAT
12070 43 48 20 27 6b 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  CH 'k';..  <i>--
12080 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 44   Following the D
12090 45 4c 45 54 45 20 62 65 6c 6f 77 2c 20 74 68 65  ELETE below, the
120a0 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 6f   query returns o
120b0 6e 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  ne row containin
120c0 67 20 74 77 6f 0a 20 20 2d 2d 20 4e 55 4c 4c 20  g two.  -- NULL 
120d0 76 61 6c 75 65 73 2e 20 4e 55 4c 4c 20 76 61 6c  values. NULL val
120e0 75 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  ues are returned
120f0 20 62 65 63 61 75 73 65 20 46 54 53 20 69 73 20   because FTS is 
12100 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 0a 20  unable to find. 
12110 20 2d 2d 20 61 20 72 6f 77 20 77 69 74 68 20 72   -- a row with r
12120 6f 77 69 64 3d 33 20 77 69 74 68 69 6e 20 74 68  owid=3 within th
12130 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  e content table.
12140 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 44 45 4c 45  .  --</i>.  DELE
12150 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 53 45  TE FROM t2;.  SE
12160 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 57  LECT * FROM t3 W
12170 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27 6b  HERE t3 MATCH 'k
12180 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ';.</codeblock>.
12190 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 61 20 72 6f  .<p>.  When a ro
121a0 77 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  w is deleted fro
121b0 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f  m an external co
121c0 6e 74 65 6e 74 20 46 54 53 34 20 74 61 62 6c 65  ntent FTS4 table
121d0 2c 20 46 54 53 34 20 6e 65 65 64 73 20 74 6f 0a  , FTS4 needs to.
121e0 20 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63    retrieve the c
121f0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66 20  olumn values of 
12200 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  the row being de
12210 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63  leted from the c
12220 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  ontent table..  
12230 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
12240 46 54 53 34 20 63 61 6e 20 75 70 64 61 74 65 20  FTS4 can update 
12250 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
12260 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dex entries for 
12270 65 61 63 68 20 74 6f 6b 65 6e 0a 20 20 74 68 61  each token.  tha
12280 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
12290 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 77 20  the deleted row 
122a0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
122b0 20 74 68 61 74 20 72 6f 77 20 68 61 73 20 62 65   that row has be
122c0 65 6e 20 0a 20 20 64 65 6c 65 74 65 64 2e 20 49  en .  deleted. I
122d0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  f the content ta
122e0 62 6c 65 20 72 6f 77 20 63 61 6e 6e 6f 74 20 62  ble row cannot b
122f0 65 20 66 6f 75 6e 64 2c 20 6f 72 20 69 66 20 69  e found, or if i
12300 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65  t contains value
12310 73 0a 20 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  s.  inconsistent
12320 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
12330 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
12340 64 65 78 2c 20 74 68 65 20 72 65 73 75 6c 74 73  dex, the results
12350 20 63 61 6e 20 62 65 20 64 69 66 66 69 63 75 6c   can be difficul
12360 74 0a 20 20 74 6f 20 70 72 65 64 69 63 74 2e 20  t.  to predict. 
12370 54 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d 61  The FTS index ma
12380 79 20 62 65 20 6c 65 66 74 20 63 6f 6e 74 61 69  y be left contai
12390 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 63 6f 72  ning entries cor
123a0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
123b0 65 0a 20 20 64 65 6c 65 74 65 64 20 72 6f 77 2c  e.  deleted row,
123c0 20 77 68 69 63 68 20 63 61 6e 20 6c 65 61 64 20   which can lead 
123d0 74 6f 20 73 65 65 6d 69 6e 67 6c 79 20 6e 6f 6e  to seemingly non
123e0 73 65 6e 73 69 63 61 6c 20 72 65 73 75 6c 74 73  sensical results
123f0 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 0a   being returned.
12400 20 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20    by subsequent 
12410 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 2e 20  SELECT queries. 
12420 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
12430 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 75   when a row is u
12440 70 64 61 74 65 64 2c 20 61 73 0a 20 20 69 6e 74  pdated, as.  int
12450 65 72 6e 61 6c 6c 79 20 61 6e 20 55 50 44 41 54  ernally an UPDAT
12460 45 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  E is the same as
12470 20 61 20 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77   a DELETE follow
12480 65 64 20 62 79 20 61 6e 20 49 4e 53 45 52 54 2e  ed by an INSERT.
12490 0a 0a 3c 70 3e 20 20 0a 20 20 49 6e 73 74 65 61  ..<p>  .  Instea
124a0 64 20 6f 66 20 77 72 69 74 69 6e 67 20 73 65 70  d of writing sep
124b0 61 72 61 74 65 6c 79 20 74 6f 20 74 68 65 20 66  arately to the f
124c0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61  ull-text index a
124d0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  nd the content t
124e0 61 62 6c 65 2c 0a 20 20 73 6f 6d 65 20 75 73 65  able,.  some use
124f0 72 73 20 6d 61 79 20 77 69 73 68 20 74 6f 20 75  rs may wish to u
12500 73 65 20 64 61 74 61 62 61 73 65 20 74 72 69 67  se database trig
12510 67 65 72 73 20 74 6f 20 6b 65 65 70 20 74 68 65  gers to keep the
12520 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
12530 0a 20 20 75 70 20 74 6f 20 64 61 74 65 20 77 69  .  up to date wi
12540 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  th respect to th
12550 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
12560 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
12570 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a   content table..
12580 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75    For example, u
12590 73 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  sing the tables 
125a0 66 72 6f 6d 20 65 61 72 6c 69 65 72 20 65 78 61  from earlier exa
125b0 6d 70 6c 65 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  mples:..<codeblo
125c0 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 52 49  ck>.  CREATE TRI
125d0 47 47 45 52 20 74 32 5f 62 75 20 42 45 46 4f 52  GGER t2_bu BEFOR
125e0 45 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42  E UPDATE ON t2 B
125f0 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45 20  EGIN.    DELETE 
12600 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 64 6f  FROM t3 WHERE do
12610 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20  cid=old.rowid;. 
12620 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
12630 52 49 47 47 45 52 20 74 32 5f 62 64 20 42 45 46  RIGGER t2_bd BEF
12640 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 32  ORE DELETE ON t2
12650 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54   BEGIN.    DELET
12660 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  E FROM t3 WHERE 
12670 64 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b  docid=old.rowid;
12680 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54  .  END;..  CREAT
12690 45 20 54 52 49 47 47 45 52 20 74 32 5f 62 75 20  E TRIGGER t2_bu 
126a0 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
126b0 74 32 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  t2 BEGIN.    INS
126c0 45 52 54 20 49 4e 54 4f 20 74 33 28 64 6f 63 69  ERT INTO t3(doci
126d0 64 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28  d, b, c) VALUES(
126e0 6e 65 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 62  new.rowid, new.b
126f0 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 45 4e 44 3b  , new.c);.  END;
12700 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
12710 52 20 74 32 5f 62 64 20 41 46 54 45 52 20 49 4e  R t2_bd AFTER IN
12720 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e  SERT ON t2 BEGIN
12730 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12740 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20 63 29   t3(docid, b, c)
12750 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
12760 64 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29  d, new.b, new.c)
12770 3b 0a 20 20 45 4e 44 3b 0a 3c 2f 63 6f 64 65 62  ;.  END;.</codeb
12780 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
12790 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 20   DELETE trigger 
127a0 6d 75 73 74 20 62 65 20 66 69 72 65 64 20 62 65  must be fired be
127b0 66 6f 72 65 20 74 68 65 20 61 63 74 75 61 6c 20  fore the actual 
127c0 64 65 6c 65 74 65 20 74 61 6b 65 73 20 70 6c 61  delete takes pla
127d0 63 65 0a 20 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ce.  on the cont
127e0 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ent table. This 
127f0 69 73 20 73 6f 20 74 68 61 74 20 46 54 53 34 20  is so that FTS4 
12800 63 61 6e 20 73 74 69 6c 6c 20 72 65 74 72 69 65  can still retrie
12810 76 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  ve the original.
12820 20 20 76 61 6c 75 65 73 20 69 6e 20 6f 72 64 65    values in orde
12830 72 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  r to update the 
12840 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
12850 20 41 6e 64 20 74 68 65 20 49 4e 53 45 52 54 20   And the INSERT 
12860 74 72 69 67 67 65 72 20 6d 75 73 74 0a 20 20 62  trigger must.  b
12870 65 20 66 69 72 65 64 20 61 66 74 65 72 20 74 68  e fired after th
12880 65 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e 73  e new row is ins
12890 65 72 74 65 64 2c 20 73 6f 20 61 73 20 74 6f 20  erted, so as to 
128a0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
128b0 77 68 65 72 65 20 74 68 65 0a 20 20 72 6f 77 69  where the.  rowi
128c0 64 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 75  d is assigned au
128d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 69 74 68  tomatically with
128e0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 54  in the system. T
128f0 68 65 20 55 50 44 41 54 45 20 74 72 69 67 67 65  he UPDATE trigge
12900 72 20 6d 75 73 74 0a 20 20 62 65 20 73 70 6c 69  r must.  be spli
12910 74 20 69 6e 74 6f 20 74 77 6f 20 70 61 72 74 73  t into two parts
12920 2c 20 6f 6e 65 20 66 69 72 65 64 20 62 65 66 6f  , one fired befo
12930 72 65 20 61 6e 64 20 6f 6e 65 20 61 66 74 65 72  re and one after
12940 20 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 74   the update of t
12950 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20 74 61 62  he.  content tab
12960 6c 65 2c 20 66 6f 72 20 74 68 65 20 73 61 6d 65  le, for the same
12970 20 72 65 61 73 6f 6e 73 2e 0a 0a 3c 70 3e 0a 20   reasons...<p>. 
12980 20 46 54 53 34 20 66 65 61 74 75 72 65 73 20 61   FTS4 features a
12990 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d 61 6e 64   special command
129a0 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
129b0 27 6f 70 74 69 6d 69 7a 65 27 20 63 6f 6d 6d 61  'optimize' comma
129c0 6e 64 20 74 68 61 74 0a 20 20 64 65 6c 65 74 65  nd that.  delete
129d0 73 20 74 68 65 20 65 6e 74 69 72 65 20 66 75 6c  s the entire ful
129e0 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 6e 64  l-text index and
129f0 20 72 65 62 75 69 6c 64 73 20 69 74 20 62 61 73   rebuilds it bas
12a00 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
12a10 74 0a 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  t.  set of docum
12a20 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 74  ents in the cont
12a30 65 6e 74 20 74 61 62 6c 65 2e 20 41 73 73 75 6d  ent table. Assum
12a40 69 6e 67 20 61 67 61 69 6e 20 74 68 61 74 20 22  ing again that "
12a50 74 33 22 20 69 73 20 74 68 65 0a 20 20 6e 61 6d  t3" is the.  nam
12a60 65 20 6f 66 20 74 68 65 20 65 78 74 65 72 6e 61  e of the externa
12a70 6c 20 63 6f 6e 74 65 6e 74 20 46 54 53 34 20 74  l content FTS4 t
12a80 61 62 6c 65 2c 20 74 68 65 20 63 6f 6d 6d 61 6e  able, the comman
12a90 64 20 69 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  d is:..<codebloc
12aa0 6b 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  k>.  INSERT INTO
12ab0 20 74 33 28 74 33 29 20 56 41 4c 55 45 53 28 27   t3(t3) VALUES('
12ac0 72 65 62 75 69 6c 64 27 29 3b 0a 3c 2f 63 6f 64  rebuild');.</cod
12ad0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
12ae0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20  his command may 
12af0 61 6c 73 6f 20 62 65 20 75 73 65 64 20 77 69 74  also be used wit
12b00 68 20 6f 72 64 69 6e 61 72 79 20 46 54 53 34 20  h ordinary FTS4 
12b10 74 61 62 6c 65 73 2c 20 61 6c 74 68 6f 75 67 68  tables, although
12b20 20 69 74 20 6d 61 79 0a 20 20 6f 6e 6c 79 20 62   it may.  only b
12b30 65 20 75 73 65 66 75 6c 20 69 66 20 74 68 65 20  e useful if the 
12b40 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
12b50 68 61 73 20 73 6f 6d 65 68 6f 77 20 62 65 63 6f  has somehow beco
12b60 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
12b70 73 20 61 6e 0a 20 20 65 72 72 6f 72 20 74 6f 20  s an.  error to 
12b80 61 74 74 65 6d 70 74 20 74 6f 20 72 65 62 75 69  attempt to rebui
12b90 6c 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ld the full-text
12ba0 20 69 6e 64 65 78 20 6d 61 69 6e 74 61 69 6e 65   index maintaine
12bb0 64 20 62 79 20 61 20 63 6f 6e 74 65 6e 74 6c 65  d by a contentle
12bc0 73 73 0a 20 20 46 54 53 34 20 74 61 62 6c 65 2e  ss.  FTS4 table.
12bd0 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
12be0 65 6e 74 20 2a 66 74 73 34 6c 61 6e 67 61 75 67  ent *fts4langaug
12bf0 65 69 64 20 7b 46 54 53 34 20 6c 61 6e 67 61 75  eid {FTS4 langau
12c00 67 65 69 64 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63  geid option}</tc
12c10 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22 66 74 73  l>.<h2 tags="fts
12c20 34 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74  4 languageid opt
12c30 69 6f 6e 22 3e 54 68 65 20 6c 61 6e 67 75 61 67  ion">The languag
12c40 65 69 64 3d 20 6f 70 74 69 6f 6e 3c 2f 68 32 3e  eid= option</h2>
12c50 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68 65  ..<p>.  When the
12c60 20 6c 61 6e 67 61 75 67 65 69 64 20 6f 70 74 69   langaugeid opti
12c70 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  on is present, i
12c80 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
12c90 6e 61 6d 65 20 6f 66 0a 20 20 61 6e 6f 74 68 65  name of.  anothe
12ca0 72 20 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  r [hidden column
12cb0 5d 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  ] that is added 
12cc0 74 6f 20 74 68 65 20 46 54 53 34 0a 20 20 74 61  to the FTS4.  ta
12cd0 62 6c 65 20 61 6e 64 20 77 68 69 63 68 20 69 73  ble and which is
12ce0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
12cf0 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 73 74   the language st
12d00 6f 72 65 64 20 69 6e 20 65 61 63 68 20 72 6f 77  ored in each row
12d10 0a 20 20 6f 66 20 74 68 65 20 46 54 53 34 20 74  .  of the FTS4 t
12d20 61 62 6c 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  able.  The name 
12d30 6f 66 20 74 68 65 20 6c 61 6e 67 75 61 67 65 69  of the languagei
12d40 64 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20  d hidden column 
12d50 6d 75 73 74 0a 20 20 62 65 20 64 69 73 74 69 6e  must.  be distin
12d60 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65  ct from all othe
12d70 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  r column names i
12d80 6e 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65  n the FTS4 table
12d90 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  .  Example:..<co
12da0 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54  deblock>.  CREAT
12db0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
12dc0 74 31 20 55 53 49 4e 47 20 66 74 73 34 28 78 2c  t1 USING fts4(x,
12dd0 20 79 2c 20 6c 61 6e 67 75 61 67 65 69 64 3d 22   y, languageid="
12de0 6c 69 64 22 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63  lid").</codebloc
12df0 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 64 65  k>..<p>.  The de
12e00 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 61  fault value of a
12e10 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75   languageid colu
12e20 6d 6e 20 69 73 20 30 2e 20 41 6e 79 20 76 61 6c  mn is 0. Any val
12e30 75 65 20 69 6e 73 65 72 74 65 64 0a 20 20 69 6e  ue inserted.  in
12e40 74 6f 20 61 20 6c 61 6e 67 75 61 67 65 69 64 20  to a languageid 
12e50 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6e 76 65 72  column is conver
12e60 74 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  ted to a 32-bit 
12e70 28 6e 6f 74 20 36 34 29 20 73 69 67 6e 65 64 0a  (not 64) signed.
12e80 20 20 69 6e 74 65 67 65 72 2e 0a 0a 3c 70 3e 0a    integer...<p>.
12e90 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 46 54    By default, FT
12ea0 53 20 71 75 65 72 69 65 73 20 28 74 68 6f 73 65  S queries (those
12eb0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4d 41   that use the MA
12ec0 54 43 48 20 6f 70 65 72 61 74 6f 72 29 0a 20 20  TCH operator).  
12ed0 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 74 68  consider only th
12ee0 6f 73 65 20 72 6f 77 73 20 77 69 74 68 20 74 68  ose rows with th
12ef0 65 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  e languageid col
12f00 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e 20 54 6f  umn set to 0. To
12f10 0a 20 20 71 75 65 72 79 20 66 6f 72 20 72 6f 77  .  query for row
12f20 73 20 77 69 74 68 20 6f 74 68 65 72 20 6c 61 6e  s with other lan
12f30 67 75 61 67 65 69 64 20 76 61 6c 75 65 73 2c 20  guageid values, 
12f40 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
12f50 74 68 65 0a 20 20 66 6f 72 6d 20 22 3c 6c 61 6e  the.  form "<lan
12f60 67 75 61 67 65 2d 69 64 3e 20 3d 20 3c 69 6e 74  guage-id> = <int
12f70 65 67 65 72 3e 22 20 6d 75 73 74 20 62 65 20 61  eger>" must be a
12f80 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 72  dded to the quer
12f90 69 65 73 0a 20 20 57 48 45 52 45 20 63 6c 61 75  ies.  WHERE clau
12fa0 73 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  se. For example:
12fb0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
12fc0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
12fd0 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
12fe0 27 61 62 63 27 20 41 4e 44 20 6c 69 64 3d 35 3b  'abc' AND lid=5;
12ff0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
13000 70 3e 0a 20 20 49 74 20 69 73 20 6e 6f 74 20 70  p>.  It is not p
13010 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 73 69  ossible for a si
13020 6e 67 6c 65 20 46 54 53 20 71 75 65 72 79 20 74  ngle FTS query t
13030 6f 20 72 65 74 75 72 6e 20 72 6f 77 73 20 77 69  o return rows wi
13040 74 68 0a 20 20 64 69 66 66 65 72 65 6e 74 20 6c  th.  different l
13050 61 6e 67 75 61 67 65 69 64 20 76 61 6c 75 65 73  anguageid values
13060 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  . The results of
13070 20 61 64 64 69 6e 67 20 57 48 45 52 45 20 63 6c   adding WHERE cl
13080 61 75 73 65 73 0a 20 20 74 68 61 74 20 75 73 65  auses.  that use
13090 20 6f 74 68 65 72 20 6f 70 65 72 61 74 6f 72 73   other operators
130a0 20 28 65 2e 67 2e 20 20 6c 69 64 21 3d 35 2c 20   (e.g.  lid!=5, 
130b0 6f 72 20 6c 69 64 3c 3d 35 29 20 61 72 65 20 75  or lid<=5) are u
130c0 6e 64 65 66 69 6e 65 64 2e 0a 0a 3c 70 3e 0a 20  ndefined...<p>. 
130d0 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   If the content 
130e0 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  option is used a
130f0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 6c 61  long with the la
13100 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 2c  nguageid option,
13110 0a 20 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  .  then the name
13120 64 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  d languageid col
13130 75 6d 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  umn must exist i
13140 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 20 74  n the content= t
13150 61 62 6c 65 0a 20 20 28 73 75 62 6a 65 63 74 20  able.  (subject 
13160 74 6f 20 74 68 65 20 75 73 75 61 6c 20 72 75 6c  to the usual rul
13170 65 73 20 2d 20 69 66 20 61 20 71 75 65 72 79 20  es - if a query 
13180 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 72  never needs to r
13190 65 61 64 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e  ead the.  conten
131a0 74 20 74 61 62 6c 65 20 74 68 65 6e 20 74 68 69  t table then thi
131b0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 6f  s restriction do
131c0 65 73 20 6e 6f 74 20 61 70 70 6c 79 29 2e 0a 0a  es not apply)...
131d0 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68 65 20 6c  <p>.  When the l
131e0 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e  anguageid option
131f0 20 69 73 20 75 73 65 64 2c 20 53 51 4c 69 74 65   is used, SQLite
13200 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 4c 61   invokes the xLa
13210 6e 67 75 61 67 65 69 64 28 29 0a 20 20 6f 6e 20  nguageid().  on 
13220 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  the sqlite3_toke
13230 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 6f 62 6a  nizer_module obj
13240 65 63 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ect immediately 
13250 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
13260 0a 20 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  .  is created in
13270 20 6f 72 64 65 72 20 74 6f 20 70 61 73 73 20 69   order to pass i
13280 6e 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 69  n the language i
13290 64 20 74 68 61 74 20 70 61 72 74 69 63 75 6c 61  d that particula
132a0 72 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 20 73 68  r.  tokenizer sh
132b0 6f 75 6c 64 20 75 73 65 2e 20 20 54 68 65 20 78  ould use.  The x
132c0 4c 61 6e 67 75 61 67 65 69 64 28 29 20 6d 65 74  Languageid() met
132d0 68 6f 64 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hod will never b
132e0 65 20 63 61 6c 6c 65 64 0a 20 20 6d 6f 72 65 20  e called.  more 
132f0 74 68 61 6e 20 6f 6e 63 65 20 66 6f 72 20 61 6e  than once for an
13300 79 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 69 7a  y single tokeniz
13310 65 72 20 6f 62 6a 65 63 74 2e 0a 20 20 0a 0a 0a  er object..  ...
13320 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
13330 20 66 74 73 34 6d 61 74 63 68 69 6e 66 6f 20 7b   fts4matchinfo {
13340 46 54 53 34 20 6d 61 74 63 68 69 6e 66 6f 20 6f  FTS4 matchinfo o
13350 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32  ption}</tcl>.<h2
13360 20 74 61 67 73 3d 22 66 74 73 34 20 6d 61 74 63   tags="fts4 matc
13370 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 22 3e 54 68  hinfo option">Th
13380 65 20 6d 61 74 63 68 69 6e 66 6f 3d 20 6f 70 74  e matchinfo= opt
13390 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ion</h2>..<p>.  
133a0 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 6f 70  The matchinfo op
133b0 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
133c0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
133d0 65 20 22 66 74 73 33 22 2e 20 0a 20 20 41 74 74  e "fts3". .  Att
133e0 65 6d 70 74 69 6e 67 20 74 6f 20 73 65 74 20 6d  empting to set m
133f0 61 74 63 68 69 6e 66 6f 20 74 6f 20 61 6e 79 74  atchinfo to anyt
13400 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
13410 22 66 74 73 33 22 20 69 73 20 61 6e 20 65 72 72  "fts3" is an err
13420 6f 72 2e 0a 20 20 49 66 20 74 68 69 73 20 6f 70  or..  If this op
13430 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65  tion is specifie
13440 64 2c 20 74 68 65 6e 20 73 6f 6d 65 20 6f 66 20  d, then some of 
13450 74 68 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  the extra inform
13460 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 62 79 0a  ation stored by.
13470 20 20 46 54 53 34 20 69 73 20 6f 6d 69 74 74 65    FTS4 is omitte
13480 64 2e 20 54 68 69 73 20 72 65 64 75 63 65 73 20  d. This reduces 
13490 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69  the amount of di
134a0 73 6b 20 73 70 61 63 65 20 63 6f 6e 73 75 6d 65  sk space consume
134b0 64 20 62 79 0a 20 20 61 6e 20 46 54 53 34 20 74  d by.  an FTS4 t
134c0 61 62 6c 65 20 75 6e 74 69 6c 20 69 74 20 69 73  able until it is
134d0 20 61 6c 6d 6f 73 74 20 74 68 65 20 73 61 6d 65   almost the same
134e0 20 61 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 74   as the amount t
134f0 68 61 74 20 77 6f 75 6c 64 0a 20 20 62 65 20 75  hat would.  be u
13500 73 65 64 20 62 79 20 74 68 65 20 65 71 75 69 76  sed by the equiv
13510 61 6c 65 6e 74 20 46 54 53 33 20 74 61 62 6c 65  alent FTS3 table
13520 2c 20 62 75 74 20 61 6c 73 6f 20 6d 65 61 6e 73  , but also means
13530 20 74 68 61 74 20 74 68 65 20 64 61 74 61 0a 20   that the data. 
13540 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
13550 73 69 6e 67 20 74 68 65 20 27 6c 27 20 66 6c 61  sing the 'l' fla
13560 67 20 74 6f 20 74 68 65 20 5b 6d 61 74 63 68 69  g to the [matchi
13570 6e 66 6f 28 29 5d 20 66 75 6e 63 74 69 6f 6e 20  nfo()] function 
13580 69 73 0a 20 20 6e 6f 74 20 61 76 61 69 6c 61 62  is.  not availab
13590 6c 65 2e 20 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72  le. ..<tcl>hd_fr
135a0 61 67 6d 65 6e 74 20 66 74 73 34 70 72 65 66 69  agment fts4prefi
135b0 78 20 7b 46 54 53 34 20 70 72 65 66 69 78 20 6f  x {FTS4 prefix o
135c0 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32  ption}</tcl>.<h2
135d0 20 74 61 67 73 3d 22 66 74 73 34 20 70 72 65 66   tags="fts4 pref
135e0 69 78 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 70  ix option">The p
135f0 72 65 66 69 78 3d 20 6f 70 74 69 6f 6e 3c 2f 68  refix= option</h
13600 32 3e 0a 0a 3c 70 3e 0a 20 20 5e 54 68 65 20 46  2>..<p>.  ^The F
13610 54 53 34 20 70 72 65 66 69 78 20 6f 70 74 69 6f  TS4 prefix optio
13620 6e 20 63 61 75 73 65 73 20 46 54 53 20 74 6f 20  n causes FTS to 
13630 69 6e 64 65 78 20 74 65 72 6d 20 70 72 65 66 69  index term prefi
13640 78 65 73 20 6f 66 20 73 70 65 63 69 66 69 65 64  xes of specified
13650 20 6c 65 6e 67 74 68 73 0a 20 20 69 6e 20 74 68   lengths.  in th
13660 65 20 73 61 6d 65 20 77 61 79 20 74 68 61 74 20  e same way that 
13670 69 74 20 61 6c 77 61 79 73 20 69 6e 64 65 78 65  it always indexe
13680 73 20 63 6f 6d 70 6c 65 74 65 20 74 65 72 6d 73  s complete terms
13690 2e 20 20 5e 54 68 65 20 70 72 65 66 69 78 20 6f  .  ^The prefix o
136a0 70 74 69 6f 6e 0a 20 20 6d 75 73 74 20 62 65 20  ption.  must be 
136b0 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d 61 20 73  set to a comma s
136c0 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66  eparated list of
136d0 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e 2d 7a 65   positive non-ze
136e0 72 6f 20 69 6e 74 65 67 65 72 73 2e 20 0a 20 20  ro integers. .  
136f0 5e 46 6f 72 20 65 61 63 68 20 76 61 6c 75 65 20  ^For each value 
13700 4e 20 69 6e 20 74 68 65 20 6c 69 73 74 2c 20 70  N in the list, p
13710 72 65 66 69 78 65 73 20 6f 66 20 6c 65 6e 67 74  refixes of lengt
13720 68 20 4e 20 62 79 74 65 73 20 28 77 68 65 6e 20  h N bytes (when 
13730 65 6e 63 6f 64 65 64 20 0a 20 20 75 73 69 6e 67  encoded .  using
13740 20 55 54 46 2d 38 29 20 61 72 65 20 69 6e 64 65   UTF-8) are inde
13750 78 65 64 2e 20 20 5e 46 54 53 34 20 75 73 65 73  xed.  ^FTS4 uses
13760 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 64   term prefix ind
13770 65 78 65 73 20 74 6f 20 73 70 65 65 64 20 75 70  exes to speed up
13780 0a 20 20 5b 70 72 65 66 69 78 20 71 75 65 72 69  .  [prefix queri
13790 65 73 5d 2e 20 54 68 65 20 63 6f 73 74 2c 20 6f  es]. The cost, o
137a0 66 20 63 6f 75 72 73 65 2c 20 69 73 20 74 68 61  f course, is tha
137b0 74 20 69 6e 64 65 78 69 6e 67 20 74 65 72 6d 20  t indexing term 
137c0 70 72 65 66 69 78 65 73 20 61 73 0a 20 20 77 65  prefixes as.  we
137d0 6c 6c 20 61 73 20 63 6f 6d 70 6c 65 74 65 20 74  ll as complete t
137e0 65 72 6d 73 20 69 6e 63 72 65 61 73 65 73 20 74  erms increases t
137f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
13800 20 61 6e 64 20 73 6c 6f 77 73 20 64 6f 77 6e 20   and slows down 
13810 77 72 69 74 65 20 0a 20 20 6f 70 65 72 61 74 69  write .  operati
13820 6f 6e 73 20 6f 6e 20 74 68 65 20 46 54 53 34 20  ons on the FTS4 
13830 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 50 72  table...<p>.  Pr
13840 65 66 69 78 20 69 6e 64 65 78 65 73 20 6d 61 79  efix indexes may
13850 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69   be used to opti
13860 6d 69 7a 65 20 5b 70 72 65 66 69 78 20 71 75 65  mize [prefix que
13870 72 69 65 73 5d 20 69 6e 20 74 77 6f 20 63 61 73  ries] in two cas
13880 65 73 2e 0a 20 20 49 66 20 74 68 65 20 71 75 65  es..  If the que
13890 72 79 20 69 73 20 66 6f 72 20 61 20 70 72 65 66  ry is for a pref
138a0 69 78 20 6f 66 20 4e 20 62 79 74 65 73 2c 20 74  ix of N bytes, t
138b0 68 65 6e 20 61 20 70 72 65 66 69 78 20 69 6e 64  hen a prefix ind
138c0 65 78 20 63 72 65 61 74 65 64 0a 20 20 77 69 74  ex created.  wit
138d0 68 20 22 70 72 65 66 69 78 3d 4e 22 20 70 72 6f  h "prefix=N" pro
138e0 76 69 64 65 73 20 74 68 65 20 62 65 73 74 20 6f  vides the best o
138f0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 4f 72 2c  ptimization. Or,
13900 20 69 66 20 6e 6f 20 22 70 72 65 66 69 78 3d 4e   if no "prefix=N
13910 22 0a 20 20 69 6e 64 65 78 20 69 73 20 61 76 61  ".  index is ava
13920 69 6c 61 62 6c 65 2c 20 61 20 22 70 72 65 66 69  ilable, a "prefi
13930 78 3d 4e 2b 31 22 20 69 6e 64 65 78 20 69 6d 61  x=N+1" index ima
13940 79 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  y be used instea
13950 64 2e 20 0a 20 20 55 73 69 6e 67 20 61 20 22 70  d. .  Using a "p
13960 72 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64 65 78  refix=N+1" index
13970 20 69 73 20 6c 65 73 73 0a 20 20 65 66 66 69 63   is less.  effic
13980 69 65 6e 74 20 74 68 61 6e 20 61 20 22 70 72 65  ient than a "pre
13990 66 69 78 3d 4e 22 20 69 6e 64 65 78 2c 20 62 75  fix=N" index, bu
139a0 74 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  t is better than
139b0 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
139c0 20 61 74 20 61 6c 6c 2e 0a 0a 3c 63 6f 64 65 62   at all...<codeb
139d0 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72  lock>.  <i>-- Cr
139e0 65 61 74 65 20 61 6e 20 46 54 53 34 20 74 61 62  eate an FTS4 tab
139f0 6c 65 20 77 69 74 68 20 69 6e 64 65 78 65 73 20  le with indexes 
13a00 74 6f 20 6f 70 74 69 6d 69 7a 65 20 32 20 61 6e  to optimize 2 an
13a10 64 20 34 20 62 79 74 65 20 70 72 65 66 69 78 20  d 4 byte prefix 
13a20 71 75 65 72 69 65 73 2e 3c 2f 69 3e 0a 20 20 43  queries.</i>.  C
13a30 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
13a40 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
13a50 34 28 63 31 2c 20 63 32 2c 20 70 72 65 66 69 78  4(c1, c2, prefix
13a60 3d 22 32 2c 34 22 29 3b 0a 0a 20 20 3c 69 3e 2d  ="2,4");..  <i>-
13a70 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
13a80 74 77 6f 20 71 75 65 72 69 65 73 20 61 72 65 20  two queries are 
13a90 62 6f 74 68 20 6f 70 74 69 6d 69 7a 65 64 20 75  both optimized u
13aa0 73 69 6e 67 20 74 68 65 20 70 72 65 66 69 78 20  sing the prefix 
13ab0 69 6e 64 65 78 65 73 2e 3c 2f 69 3e 0a 20 20 53  indexes.</i>.  S
13ac0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
13ad0 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
13ae0 61 62 2a 27 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ab*';.  SELECT *
13af0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
13b00 31 20 4d 41 54 43 48 20 27 61 62 63 64 2a 27 3b  1 MATCH 'abcd*';
13b10 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
13b20 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72  llowing two quer
13b30 69 65 73 20 61 72 65 20 62 6f 74 68 20 70 61 72  ies are both par
13b40 74 69 61 6c 6c 79 20 6f 70 74 69 6d 69 7a 65 64  tially optimized
13b50 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 66 69   using the prefi
13b60 78 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e  x</i>.  <i>-- in
13b70 64 65 78 65 73 2e 20 54 68 65 20 6f 70 74 69 6d  dexes. The optim
13b80 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ization is not a
13b90 73 20 70 72 6f 6e 6f 75 6e 63 65 64 20 61 73 20  s pronounced as 
13ba0 69 74 20 69 73 20 66 6f 72 20 74 68 65 20 71 75  it is for the qu
13bb0 65 72 69 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  eries</i>.  <i>-
13bc0 2d 20 61 62 6f 76 65 2c 20 62 75 74 20 73 74 69  - above, but sti
13bd0 6c 6c 20 61 6e 20 69 6d 70 72 6f 76 65 6d 65 6e  ll an improvemen
13be0 74 20 6f 76 65 72 20 6e 6f 20 70 72 65 66 69 78  t over no prefix
13bf0 20 69 6e 64 65 78 65 73 20 61 74 20 61 6c 6c 2e   indexes at all.
13c00 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
13c10 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
13c20 20 4d 41 54 43 48 20 27 61 2a 27 3b 0a 20 20 53   MATCH 'a*';.  S
13c30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
13c40 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
13c50 61 62 63 2a 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  abc*';.</codeblo
13c60 63 6b 3e 0a 0a 3c 68 31 20 69 64 3d 74 6f 6b 65  ck>..<h1 id=toke
13c70 6e 69 7a 65 72 20 74 61 67 73 3d 22 74 6f 6b 65  nizer tags="toke
13c80 6e 69 7a 65 72 22 3e 54 6f 6b 65 6e 69 7a 65 72  nizer">Tokenizer
13c90 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6e  s</h1>..<p>.  An
13ca0 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72 20 69   FTS tokenizer i
13cb0 73 20 61 20 73 65 74 20 6f 66 20 72 75 6c 65 73  s a set of rules
13cc0 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e 67 20   for extracting 
13cd0 74 65 72 6d 73 20 66 72 6f 6d 20 61 20 64 6f 63  terms from a doc
13ce0 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62 61 73 69  ument .  or basi
13cf0 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78 74 20  c FTS full-text 
13d00 71 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55  query. ..<p>.  U
13d10 6e 6c 65 73 73 20 61 20 73 70 65 63 69 66 69 63  nless a specific
13d20 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 70   tokenizer is sp
13d30 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
13d40 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 0a 20  of the CREATE . 
13d50 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
13d60 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
13d70 20 63 72 65 61 74 65 20 74 68 65 20 46 54 53 20   create the FTS 
13d80 74 61 62 6c 65 2c 20 74 68 65 20 64 65 66 61 75  table, the defau
13d90 6c 74 20 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 2c  lt .  tokenizer,
13da0 20 22 73 69 6d 70 6c 65 22 2c 20 69 73 20 75 73   "simple", is us
13db0 65 64 2e 20 54 68 65 20 73 69 6d 70 6c 65 20 74  ed. The simple t
13dc0 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74  okenizer extract
13dd0 73 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20 20  s tokens from.  
13de0 61 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20 62 61  a document or ba
13df0 73 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78  sic FTS full-tex
13e00 74 20 71 75 65 72 79 20 61 63 63 6f 72 64 69 6e  t query accordin
13e10 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
13e20 6e 67 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c 75  ng .  rules:..<u
13e30 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74  l>.  <li><p> A t
13e40 65 72 6d 20 69 73 20 61 20 63 6f 6e 74 69 67 75  erm is a contigu
13e50 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ous sequence of 
13e60 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74  eligible charact
13e70 65 72 73 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ers, where .    
13e80 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63 74  eligible charact
13e90 65 72 73 20 61 72 65 20 61 6c 6c 20 61 6c 70 68  ers are all alph
13ea0 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74  anumeric charact
13eb0 65 72 73 20 61 6e 64 20 61 6c 6c 20 63 68 61 72  ers and all char
13ec0 61 63 74 65 72 73 20 77 69 74 68 0a 20 20 20 20  acters with.    
13ed0 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73 20 67  UTF codepoints g
13ee0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
13ef0 71 75 61 6c 20 74 6f 20 31 32 38 2e 20 41 6c 6c  qual to 128. All
13f00 20 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72   other character
13f10 73 20 61 72 65 0a 20 20 20 20 64 69 73 63 61 72  s are.    discar
13f20 64 65 64 20 77 68 65 6e 20 73 70 6c 69 74 74 69  ded when splitti
13f30 6e 67 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e  ng a document in
13f40 74 6f 20 74 65 72 6d 73 2e 20 54 68 65 69 72 20  to terms. Their 
13f50 6f 6e 6c 79 20 63 6f 6e 74 72 69 62 75 74 69 6f  only contributio
13f60 6e 20 69 73 0a 20 20 20 20 74 6f 20 73 65 70 61  n is.    to sepa
13f70 72 61 74 65 20 61 64 6a 61 63 65 6e 74 20 74 65  rate adjacent te
13f80 72 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20  rms...  <li><p> 
13f90 41 6c 6c 20 75 70 70 65 72 63 61 73 65 20 63 68  All uppercase ch
13fa0 61 72 61 63 74 65 72 73 20 77 69 74 68 69 6e 20  aracters within 
13fb0 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65 20  the ASCII range 
13fc0 28 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73 20  (UTF codepoints 
13fd0 6c 65 73 73 20 0a 20 20 20 20 74 68 61 6e 20 31  less .    than 1
13fe0 32 38 29 2c 20 61 72 65 20 74 72 61 6e 73 66 6f  28), are transfo
13ff0 72 6d 65 64 20 74 6f 20 74 68 65 69 72 20 6c 6f  rmed to their lo
14000 77 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65  wercase equivale
14010 6e 74 73 20 61 73 20 70 61 72 74 20 6f 66 20 74  nts as part of t
14020 68 65 0a 20 20 20 20 74 6f 6b 65 6e 69 7a 61 74  he.    tokenizat
14030 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 54 68 75  ion process. Thu
14040 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  s, full-text que
14050 72 69 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e  ries are case-in
14060 73 65 6e 73 69 74 69 76 65 20 77 68 65 6e 0a 20  sensitive when. 
14070 20 20 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d     using the sim
14080 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 3c  ple tokenizer..<
14090 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  /ul>..<p>.  For 
140a0 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
140b0 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  document contain
140c0 69 6e 67 20 74 68 65 20 74 65 78 74 20 22 52 69  ing the text "Ri
140d0 67 68 74 20 6e 6f 77 2c 20 74 68 65 79 27 72 65  ght now, they're
140e0 20 76 65 72 79 0a 20 20 66 72 75 73 74 72 61 74   very.  frustrat
140f0 65 64 2e 22 2c 20 74 68 65 20 74 65 72 6d 73 20  ed.", the terms 
14100 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
14110 68 65 20 64 6f 63 75 6d 65 6e 74 20 61 6e 64 20  he document and 
14120 61 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20  added to the .  
14130 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
14140 61 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 22  are, in order, "
14150 72 69 67 68 74 20 6e 6f 77 20 74 68 65 79 20 72  right now they r
14160 65 20 76 65 72 79 20 66 72 75 73 74 72 61 74 65  e very frustrate
14170 64 22 2e 20 53 75 63 68 0a 20 20 61 20 64 6f 63  d". Such.  a doc
14180 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d 61 74 63  ument would matc
14190 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  h a full-text qu
141a0 65 72 79 20 73 75 63 68 20 61 73 20 22 4d 41 54  ery such as "MAT
141b0 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27 22  CH 'Frustrated'"
141c0 2c 20 0a 20 20 61 73 20 74 68 65 20 73 69 6d 70  , .  as the simp
141d0 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 74 72 61  le tokenizer tra
141e0 6e 73 66 6f 72 6d 73 20 74 68 65 20 74 65 72 6d  nsforms the term
141f0 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 74 6f   in the query to
14200 20 6c 6f 77 65 72 63 61 73 65 0a 20 20 62 65 66   lowercase.  bef
14210 6f 72 65 20 73 65 61 72 63 68 69 6e 67 20 74 68  ore searching th
14220 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
14230 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c  x...<p>.  As wel
14240 6c 20 61 73 20 74 68 65 20 22 73 69 6d 70 6c 65  l as the "simple
14250 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65  " tokenizer, the
14260 20 46 54 53 20 73 6f 75 72 63 65 20 63 6f 64 65   FTS source code
14270 20 66 65 61 74 75 72 65 73 20 61 20 74 6f 6b 65   features a toke
14280 6e 69 7a 65 72 20 0a 20 20 74 68 61 74 20 75 73  nizer .  that us
14290 65 73 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22  es the <a href="
142a0 68 74 74 70 3a 2f 2f 74 61 72 74 61 72 75 73 2e  http://tartarus.
142b0 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f 72 74  org/~martin/Port
142c0 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f 72 74  erStemmer/">Port
142d0 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67 20 61  er .  Stemming a
142e0 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20 54 68  lgorithm</a>. Th
142f0 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65  is tokenizer use
14300 73 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65 73  s the same rules
14310 20 74 6f 20 73 65 70 61 72 61 74 65 0a 20 20 74   to separate.  t
14320 68 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e  he input documen
14330 74 20 69 6e 74 6f 20 74 65 72 6d 73 2c 20 62 75  t into terms, bu
14340 74 20 61 73 20 77 65 6c 6c 20 61 73 20 66 6f 6c  t as well as fol
14350 64 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 20 74  ding all terms t
14360 6f 20 6c 6f 77 65 72 0a 20 20 63 61 73 65 20 69  o lower.  case i
14370 74 20 75 73 65 73 20 74 68 65 20 50 6f 72 74 65  t uses the Porte
14380 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72  r Stemming algor
14390 69 74 68 6d 20 74 6f 20 72 65 64 75 63 65 20 72  ithm to reduce r
143a0 65 6c 61 74 65 64 20 45 6e 67 6c 69 73 68 20 6c  elated English l
143b0 61 6e 67 75 61 67 65 0a 20 20 77 6f 72 64 73 20  anguage.  words 
143c0 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f 6f 74  to a common root
143d0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75  . For example, u
143e0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e  sing the same in
143f0 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 61 73 20  put document as 
14400 69 6e 20 74 68 65 0a 20 20 70 61 72 61 67 72 61  in the.  paragra
14410 70 68 20 61 62 6f 76 65 2c 20 74 68 65 20 70 6f  ph above, the po
14420 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 20 65  rter tokenizer e
14430 78 74 72 61 63 74 73 20 74 68 65 20 66 6f 6c 6c  xtracts the foll
14440 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a 20 20  owing tokens:.  
14450 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65 69 20  "right now thei 
14460 76 65 72 69 20 66 72 75 73 74 72 61 74 22 2e 20  veri frustrat". 
14470 45 76 65 6e 20 74 68 6f 75 67 68 20 73 6f 6d 65  Even though some
14480 20 6f 66 20 74 68 65 73 65 20 74 65 72 6d 73 20   of these terms 
14490 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20 20 45  are not even.  E
144a0 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c 20 69 6e  nglish words, in
144b0 20 73 6f 6d 65 20 63 61 73 65 73 20 75 73 69 6e   some cases usin
144c0 67 20 74 68 65 6d 20 74 6f 20 62 75 69 6c 64 20  g them to build 
144d0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
144e0 64 65 78 20 69 73 20 6d 6f 72 65 0a 20 20 75 73  dex is more.  us
144f0 65 66 75 6c 20 74 68 61 6e 20 74 68 65 20 6d 6f  eful than the mo
14500 72 65 20 69 6e 74 65 6c 6c 69 67 69 62 6c 65 20  re intelligible 
14510 6f 75 74 70 75 74 20 70 72 6f 64 75 63 65 64 20  output produced 
14520 62 79 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f  by the simple to
14530 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69 6e 67  kenizer..  Using
14540 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65   the porter toke
14550 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f 63 75 6d  nizer, the docum
14560 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d 61 74  ent not only mat
14570 63 68 65 73 20 66 75 6c 6c 2d 74 65 78 74 20 71  ches full-text q
14580 75 65 72 69 65 73 0a 20 20 73 75 63 68 20 61 73  ueries.  such as
14590 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61   "MATCH 'Frustra
145a0 74 65 64 27 22 2c 20 62 75 74 20 61 6c 73 6f 20  ted'", but also 
145b0 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
145c0 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74  "MATCH 'Frustrat
145d0 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68 65 20  ion'",.  as the 
145e0 74 65 72 6d 20 22 46 72 75 73 74 72 61 74 69 6f  term "Frustratio
145f0 6e 22 20 69 73 20 72 65 64 75 63 65 64 20 62 79  n" is reduced by
14600 20 74 68 65 20 50 6f 72 74 65 72 20 73 74 65 6d   the Porter stem
14610 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  mer algorithm to
14620 20 0a 20 20 22 66 72 75 73 74 72 61 74 22 20 2d   .  "frustrat" -
14630 20 6a 75 73 74 20 61 73 20 22 46 72 75 73 74 72   just as "Frustr
14640 61 74 65 64 22 20 69 73 2e 20 53 6f 2c 20 77 68  ated" is. So, wh
14650 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72  en using the por
14660 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 0a 20  ter tokenizer,. 
14670 20 46 54 53 20 69 73 20 61 62 6c 65 20 74 6f 20   FTS is able to 
14680 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20 65 78  find not just ex
14690 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f 72 20  act matches for 
146a0 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c 20 62  queried terms, b
146b0 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61 67 61  ut matches.  aga
146c0 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45 6e 67  inst similar Eng
146d0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 74 65  lish language te
146e0 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20 69 6e  rms. For more in
146f0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
14700 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65 6d 6d   .  Porter Stemm
14710 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20 70 6c  er algorithm, pl
14720 65 61 73 65 20 72 65 66 65 72 20 74 6f 20 74 68  ease refer to th
14730 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20 61 62  e page linked ab
14740 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78 61 6d  ove...<p>.  Exam
14750 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69 6e 67  ple illustrating
14760 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
14770 62 65 74 77 65 65 6e 20 74 68 65 20 22 73 69 6d  between the "sim
14780 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74 65 72  ple" and "porter
14790 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 3a 0a  ".  tokenizers:.
147a0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
147b0 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61  i>-- Create a ta
147c0 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 73 69  ble using the si
147d0 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20  mple tokenizer. 
147e0 49 6e 73 65 72 74 20 61 20 64 6f 63 75 6d 65 6e  Insert a documen
147f0 74 20 69 6e 74 6f 20 69 74 2e 3c 2f 69 3e 0a 20  t into it.</i>. 
14800 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
14810 54 41 42 4c 45 20 73 69 6d 70 6c 65 20 55 53 49  TABLE simple USI
14820 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65  NG fts3(tokenize
14830 3d 73 69 6d 70 6c 65 29 3b 0a 20 20 49 4e 53 45  =simple);.  INSE
14840 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c 65 20 56  RT INTO simple V
14850 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77  ALUES('Right now
14860 20 74 68 65 79 27 27 72 65 20 76 65 72 79 20 66   they''re very f
14870 72 75 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20  rustrated');..  
14880 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72 73 74 20  <i>-- The first 
14890 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
148a0 20 74 77 6f 20 71 75 65 72 69 65 73 20 6d 61 74   two queries mat
148b0 63 68 65 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  ches the documen
148c0 74 20 73 74 6f 72 65 64 20 69 6e 3c 2f 69 3e 0a  t stored in</i>.
148d0 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 22 73    <i>-- table "s
148e0 69 6d 70 6c 65 22 2e 20 54 68 65 20 73 65 63 6f  imple". The seco
148f0 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 3c 2f 69 3e  nd does not.</i>
14900 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
14910 20 73 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69   simple WHERE si
14920 6d 70 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73  mple MATCH 'Frus
14930 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c 45 43  trated';.  SELEC
14940 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20  T * FROM simple 
14950 57 48 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54  WHERE simple MAT
14960 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27  CH 'Frustration'
14970 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
14980 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  e a table using 
14990 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
149a0 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 74 68 65  izer. Insert the
149b0 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e 74 20 69   same document i
149c0 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20 43 52 45  nto it</i>.  CRE
149d0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
149e0 45 20 70 6f 72 74 65 72 20 55 53 49 4e 47 20 66  E porter USING f
149f0 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  ts3(tokenize=por
14a00 74 65 72 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ter);.  INSERT I
14a10 4e 54 4f 20 70 6f 72 74 65 72 20 56 41 4c 55 45  NTO porter VALUE
14a20 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65  S('Right now the
14a30 79 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74  y''re very frust
14a40 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d  rated');..  <i>-
14a50 2d 20 42 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  - Both of the fo
14a60 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20  llowing queries 
14a70 6d 61 74 63 68 20 74 68 65 20 64 6f 63 75 6d 65  match the docume
14a80 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62  nt stored in tab
14a90 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e  le "porter".</i>
14aa0 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
14ab0 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f   porter WHERE po
14ac0 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75 73  rter MATCH 'Frus
14ad0 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c 45 43  trated';.  SELEC
14ae0 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20  T * FROM porter 
14af0 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54  WHERE porter MAT
14b00 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27  CH 'Frustration'
14b10 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
14b20 3c 70 3e 0a 20 20 49 66 20 74 68 69 73 20 65 78  <p>.  If this ex
14b30 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69  tension is compi
14b40 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
14b50 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 20 70  ITE_ENABLE_ICU p
14b60 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a 20 20 73  re-processor.  s
14b70 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2c 20 74  ymbol defined, t
14b80 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
14b90 20 61 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65   a built-in toke
14ba0 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22 69 63 75  nizer named "icu
14bb0 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ".  implemented 
14bc0 75 73 69 6e 67 20 74 68 65 20 49 43 55 20 6c 69  using the ICU li
14bd0 62 72 61 72 79 2e 20 54 68 65 20 66 69 72 73 74  brary. The first
14be0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
14bf0 20 74 6f 20 74 68 65 0a 20 20 78 43 72 65 61 74   to the.  xCreat
14c00 65 28 29 20 6d 65 74 68 6f 64 20 28 73 65 65 20  e() method (see 
14c10 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68  fts3_tokenizer.h
14c20 29 20 6f 66 20 74 68 69 73 20 74 6f 6b 65 6e 69  ) of this tokeni
14c30 7a 65 72 20 6d 61 79 20 62 65 0a 20 20 61 6e 20  zer may be.  an 
14c40 49 43 55 20 6c 6f 63 61 6c 65 20 69 64 65 6e 74  ICU locale ident
14c50 69 66 69 65 72 2e 20 46 6f 72 20 65 78 61 6d 70  ifier. For examp
14c60 6c 65 20 22 74 72 5f 54 52 22 20 66 6f 72 20 54  le "tr_TR" for T
14c70 75 72 6b 69 73 68 20 61 73 20 75 73 65 64 0a 20  urkish as used. 
14c80 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f 72 20 22   in Turkey, or "
14c90 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e 67 6c 69  en_AU" for Engli
14ca0 73 68 20 61 73 20 75 73 65 64 20 69 6e 20 41 75  sh as used in Au
14cb0 73 74 72 61 6c 69 61 2e 20 46 6f 72 20 65 78 61  stralia. For exa
14cc0 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
14cd0 6b 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  k>.    CREATE VI
14ce0 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68 61 69  RTUAL TABLE thai
14cf0 5f 74 65 78 74 20 55 53 49 4e 47 20 66 74 73 33  _text USING fts3
14d00 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d  (text, tokenize=
14d10 69 63 75 20 74 68 5f 54 48 29 0a 3c 2f 63 6f 64  icu th_TH).</cod
14d20 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
14d30 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65 72  he ICU tokenizer
14d40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14d50 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e 20  is very simple. 
14d60 49 74 20 73 70 6c 69 74 73 20 74 68 65 20 69 6e  It splits the in
14d70 70 75 74 0a 20 20 74 65 78 74 20 61 63 63 6f 72  put.  text accor
14d80 64 69 6e 67 20 74 6f 20 74 68 65 20 49 43 55 20  ding to the ICU 
14d90 72 75 6c 65 73 20 66 6f 72 20 66 69 6e 64 69 6e  rules for findin
14da0 67 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 69 65  g word boundarie
14db0 73 20 61 6e 64 20 64 69 73 63 61 72 64 73 0a 20  s and discards. 
14dc0 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74 68 61 74   any tokens that
14dd0 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c   consist entirel
14de0 79 20 6f 66 20 77 68 69 74 65 2d 73 70 61 63 65  y of white-space
14df0 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 73 75  . This may be su
14e00 69 74 61 62 6c 65 0a 20 20 66 6f 72 20 73 6f 6d  itable.  for som
14e10 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 69  e applications i
14e20 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73 2c 20  n some locales, 
14e30 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20 49 66 20  but not all. If 
14e40 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a 20 20 70  more complex.  p
14e50 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71  rocessing is req
14e60 75 69 72 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  uired, for examp
14e70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  le to implement 
14e80 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20 20 64 69  stemming or.  di
14e90 73 63 61 72 64 20 70 75 6e 63 74 75 61 74 69 6f  scard punctuatio
14ea0 6e 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  n, this can be d
14eb0 6f 6e 65 20 62 79 20 63 72 65 61 74 69 6e 67 20  one by creating 
14ec0 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69 6d  a tokenizer.  im
14ed0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
14ee0 74 20 75 73 65 73 20 74 68 65 20 49 43 55 20 74  t uses the ICU t
14ef0 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70 61 72 74  okenizer as part
14f00 20 6f 66 20 69 74 73 20 69 6d 70 6c 65 6d 65 6e   of its implemen
14f10 74 61 74 69 6f 6e 2e 0a 0a 3c 68 32 3e 43 75 73  tation...<h2>Cus
14f20 74 6f 6d 20 28 55 73 65 72 20 49 6d 70 6c 65 6d  tom (User Implem
14f30 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69 7a 65 72  ented) Tokenizer
14f40 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41 73  s</h2>..<p>.  As
14f50 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 75 69   well as the bui
14f60 6c 74 2d 69 6e 20 22 73 69 6d 70 6c 65 22 2c 20  lt-in "simple", 
14f70 22 70 6f 72 74 65 72 22 20 61 6e 64 20 28 70 6f  "porter" and (po
14f80 73 73 69 62 6c 79 29 20 22 69 63 75 22 20 74 6f  ssibly) "icu" to
14f90 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 46 54 53 20  kenizers,.  FTS 
14fa0 65 78 70 6f 72 74 73 20 61 6e 20 69 6e 74 65 72  exports an inter
14fb0 66 61 63 65 20 74 68 61 74 20 61 6c 6c 6f 77 73  face that allows
14fc0 20 75 73 65 72 73 20 74 6f 20 69 6d 70 6c 65 6d   users to implem
14fd0 65 6e 74 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e  ent custom token
14fe0 69 7a 65 72 73 0a 20 20 75 73 69 6e 67 20 43 2e  izers.  using C.
14ff0 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75   The interface u
15000 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  sed to create a 
15010 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  new tokenizer is
15020 20 64 65 66 69 6e 65 64 20 61 6e 64 20 0a 20 20   defined and .  
15030 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
15040 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts3_tokenizer.
15050 68 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 0a  h source file...
15060 3c 70 3e 0a 20 20 52 65 67 69 73 74 65 72 69 6e  <p>.  Registerin
15070 67 20 61 20 6e 65 77 20 46 54 53 20 74 6f 6b 65  g a new FTS toke
15080 6e 69 7a 65 72 20 69 73 20 73 69 6d 69 6c 61 72  nizer is similar
15090 20 74 6f 20 72 65 67 69 73 74 65 72 69 6e 67 20   to registering 
150a0 61 20 6e 65 77 0a 20 20 76 69 72 74 75 61 6c 20  a new.  virtual 
150b0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77 69 74  table module wit
150c0 68 20 53 51 4c 69 74 65 2e 20 54 68 65 20 75 73  h SQLite. The us
150d0 65 72 20 70 61 73 73 65 73 20 61 20 70 6f 69 6e  er passes a poin
150e0 74 65 72 20 74 6f 20 61 0a 20 20 73 74 72 75 63  ter to a.  struc
150f0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
15100 70 6f 69 6e 74 65 72 73 20 74 6f 20 76 61 72 69  pointers to vari
15110 6f 75 73 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ous callback fun
15120 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 6d 61  ctions that.  ma
15130 6b 65 20 75 70 20 74 68 65 20 69 6d 70 6c 65 6d  ke up the implem
15140 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
15150 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 74 79  new tokenizer ty
15160 70 65 2e 20 46 6f 72 20 74 6f 6b 65 6e 69 7a 65  pe. For tokenize
15170 72 73 2c 0a 20 20 74 68 65 20 73 74 72 75 63 74  rs,.  the struct
15180 75 72 65 20 28 64 65 66 69 6e 65 64 20 69 6e 20  ure (defined in 
15190 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68  fts3_tokenizer.h
151a0 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 22 73  ) is called.  "s
151b0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
151c0 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70 3e 0a 20  _module"...<p>. 
151d0 20 46 54 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   FTS does not ex
151e0 70 6f 73 65 20 61 20 43 2d 66 75 6e 63 74 69 6f  pose a C-functio
151f0 6e 20 74 68 61 74 20 75 73 65 72 73 20 63 61 6c  n that users cal
15200 6c 20 74 6f 20 72 65 67 69 73 74 65 72 20 6e 65  l to register ne
15210 77 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 20 74 79  w.  tokenizer ty
15220 70 65 73 20 77 69 74 68 20 61 20 64 61 74 61 62  pes with a datab
15230 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 6e 73 74  ase handle. Inst
15240 65 61 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72  ead, the pointer
15250 20 6d 75 73 74 0a 20 20 62 65 20 65 6e 63 6f 64   must.  be encod
15260 65 64 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f  ed as an SQL blo
15270 62 20 76 61 6c 75 65 20 61 6e 64 20 70 61 73 73  b value and pass
15280 65 64 20 74 6f 20 46 54 53 20 74 68 72 6f 75 67  ed to FTS throug
15290 68 20 74 68 65 20 53 51 4c 0a 20 20 65 6e 67 69  h the SQL.  engi
152a0 6e 65 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67  ne by evaluating
152b0 20 61 20 73 70 65 63 69 61 6c 20 73 63 61 6c 61   a special scala
152c0 72 20 66 75 6e 63 74 69 6f 6e 2c 20 22 66 74 73  r function, "fts
152d0 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 22 2e 0a  3_tokenizer()"..
152e0 20 20 54 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e    The fts3_token
152f0 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  izer() function 
15300 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69  may be called wi
15310 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72  th one or two ar
15320 67 75 6d 65 6e 74 73 2c 0a 20 20 61 73 20 66 6f  guments,.  as fo
15330 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  llows:..<codeblo
15340 63 6b 3e 0a 20 20 20 20 53 45 4c 45 43 54 20 66  ck>.    SELECT f
15350 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c  ts3_tokenizer(&l
15360 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65  t;tokenizer-name
15370 26 67 74 3b 29 3b 0a 20 20 20 20 53 45 4c 45 43  &gt;);.    SELEC
15380 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
15390 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e  (&lt;tokenizer-n
153a0 61 6d 65 26 67 74 3b 2c 20 26 6c 74 3b 73 71 6c  ame&gt;, &lt;sql
153b0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
153c0 6f 64 75 6c 65 20 70 74 72 26 67 74 3b 29 3b 0a  odule ptr&gt;);.
153d0 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
153e0 3e 0a 20 20 57 68 65 72 65 20 3c 74 6f 6b 65 6e  >.  Where <token
153f0 69 7a 65 72 2d 6e 61 6d 65 3e 20 69 73 20 61 20  izer-name> is a 
15400 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 79 69  string identifyi
15410 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  ng the tokenizer
15420 20 61 6e 64 0a 20 20 3c 73 71 6c 69 74 65 33 5f   and.  <sqlite3_
15430 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
15440 20 70 74 72 3e 20 69 73 20 61 20 70 6f 69 6e 74   ptr> is a point
15450 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
15460 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
15470 65 0a 20 20 73 74 72 75 63 74 75 72 65 20 65 6e  e.  structure en
15480 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20  coded as an SQL 
15490 62 6c 6f 62 2e 20 49 66 20 74 68 65 20 73 65 63  blob. If the sec
154a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
154b0 70 72 65 73 65 6e 74 2c 0a 20 20 69 74 20 69 73  present,.  it is
154c0 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74   registered as t
154d0 6f 6b 65 6e 69 7a 65 72 20 3c 74 6f 6b 65 6e 69  okenizer <tokeni
154e0 7a 65 72 2d 6e 61 6d 65 3e 20 61 6e 64 20 61 20  zer-name> and a 
154f0 63 6f 70 79 20 6f 66 20 69 74 0a 20 20 72 65 74  copy of it.  ret
15500 75 72 6e 65 64 2e 20 49 66 20 6f 6e 6c 79 20 6f  urned. If only o
15510 6e 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70  ne argument is p
15520 61 73 73 65 64 2c 20 61 20 70 6f 69 6e 74 65 72  assed, a pointer
15530 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65   to the tokenize
15540 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  r.  implementati
15550 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67  on currently reg
15560 69 73 74 65 72 65 64 20 61 73 20 3c 74 6f 6b 65  istered as <toke
15570 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 69 73 20 72  nizer-name> is r
15580 65 74 75 72 6e 65 64 2c 0a 20 20 65 6e 63 6f 64  eturned,.  encod
15590 65 64 20 61 73 20 61 20 62 6c 6f 62 2e 20 4f 72  ed as a blob. Or
155a0 2c 20 69 66 20 6e 6f 20 73 75 63 68 20 74 6f 6b  , if no such tok
155b0 65 6e 69 7a 65 72 20 65 78 69 73 74 73 2c 20 61  enizer exists, a
155c0 6e 20 53 51 4c 20 65 78 63 65 70 74 69 6f 6e 0a  n SQL exception.
155d0 20 20 28 65 72 72 6f 72 29 20 69 73 20 72 61 69    (error) is rai
155e0 73 65 64 2e 0a 0a 3c 70 3e 0a 20 20 3c 62 3e 53  sed...<p>.  <b>S
155f0 45 43 55 52 49 54 59 20 57 41 52 4e 49 4e 47 3c  ECURITY WARNING<
15600 2f 62 3e 3a 20 49 66 20 74 68 65 20 66 74 73 33  /b>: If the fts3
15610 2f 34 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  /4 extension is 
15620 75 73 65 64 20 69 6e 20 61 6e 20 65 6e 76 69 72  used in an envir
15630 6f 6e 6d 65 6e 74 0a 20 20 77 68 65 72 65 20 70  onment.  where p
15640 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 61 6c 69 63  otentially malic
15650 69 6f 75 73 20 75 73 65 72 73 20 6d 61 79 20 65  ious users may e
15660 78 65 63 75 74 65 20 61 72 62 69 74 72 61 72 79  xecute arbitrary
15670 20 53 51 4c 2c 20 74 68 65 79 20 73 68 6f 75 6c   SQL, they shoul
15680 64 20 0a 20 20 62 65 20 70 72 65 76 65 6e 74 65  d .  be prevente
15690 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 69 6e 67 20  d from invoking 
156a0 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  the fts3_tokeniz
156b0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 70  er() function, p
156c0 6f 73 73 69 62 6c 79 20 75 73 69 6e 67 20 0a 20  ossibly using . 
156d0 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 65   the [sqlite3_se
156e0 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 7c 61  t_authorizer()|a
156f0 75 74 68 6f 72 69 73 61 74 69 6f 6e 20 63 61 6c  uthorisation cal
15700 6c 62 61 63 6b 5d 2e 0a 0a 3c 70 3e 0a 20 20 54  lback]...<p>.  T
15710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
15720 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  ck contains an e
15730 78 61 6d 70 6c 65 20 6f 66 20 63 61 6c 6c 69 6e  xample of callin
15740 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e  g the fts3_token
15750 69 7a 65 72 28 29 0a 20 20 66 75 6e 63 74 69 6f  izer().  functio
15760 6e 20 66 72 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a  n from C code:..
15770 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
15780 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69 73 74 65  >/*.  ** Registe
15790 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  r a tokenizer im
157a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 74  plementation wit
157b0 68 20 46 54 53 33 20 6f 72 20 46 54 53 34 2e 0a  h FTS3 or FTS4..
157c0 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 72    */</i>.  int r
157d0 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72  egisterTokenizer
157e0 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  (.    sqlite3 *d
157f0 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  b,.    char *zNa
15800 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  me,.    const sq
15810 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
15820 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b 0a 20  module *p.  ){. 
15830 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
15840 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15850 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  mt;.    const ch
15860 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
15870 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  CT fts3_tokenize
15880 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20 20 72  r(?, ?)";..    r
15890 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
158a0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
158b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
158c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
158d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
158e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
158f0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ..    sqlite3_bi
15900 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
15910 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
15920 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
15930 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
15940 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26 70 2c  ob(pStmt, 2, &p,
15950 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51 4c 49   sizeof(p), SQLI
15960 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
15970 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
15980 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  mt);..    return
15990 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
159a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  e(pStmt);.  }.. 
159b0 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75 65 72   <i>/*.  ** Quer
159c0 79 20 46 54 53 20 66 6f 72 20 74 68 65 20 74 6f  y FTS for the to
159d0 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
159e0 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61  tation named zNa
159f0 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69  me..  */</i>.  i
15a00 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e 69 7a 65  nt queryTokenize
15a10 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  r(.    sqlite3 *
15a20 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  db,.    char *zN
15a30 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73  ame,.    const s
15a40 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
15a50 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 20 20 29  _module **pp.  )
15a60 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
15a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
15a80 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74  pStmt;.    const
15a90 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
15aa0 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e  ELECT fts3_token
15ab0 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 20 20 2a  izer(?)";..    *
15ac0 70 70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  pp = 0;.    rc =
15ad0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
15ae0 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
15af0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
15b00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15b10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15b20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
15b30 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15b40 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
15b50 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
15b60 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
15b70 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
15b80 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
15b90 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ) ){.      if( s
15ba0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
15bb0 70 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51  pe(pStmt, 0)==SQ
15bc0 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
15bd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20       memcpy(pp, 
15be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
15bf0 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 20 73  lob(pStmt, 0), s
15c00 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20 20 20  izeof(*pp));.   
15c10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
15c20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
15c30 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
15c40 20 20 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e    }.</codeblock>
15c50 0a 0a 20 20 0a 3c 68 31 20 74 61 67 73 3d 22 73  ..  .<h1 tags="s
15c60 65 67 6d 65 6e 74 20 62 74 72 65 65 22 3e 44 61  egment btree">Da
15c70 74 61 20 53 74 72 75 63 74 75 72 65 73 3c 2f 68  ta Structures</h
15c80 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 73  1>..<p>.  This s
15c90 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73  ection describes
15ca0 20 61 74 20 61 20 68 69 67 68 2d 6c 65 76 65 6c   at a high-level
15cb0 20 74 68 65 20 77 61 79 20 74 68 65 20 46 54 53   the way the FTS
15cc0 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73 20 69   module stores i
15cd0 74 73 0a 20 20 69 6e 64 65 78 20 61 6e 64 20 63  ts.  index and c
15ce0 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 64 61  ontent in the da
15cf0 74 61 62 61 73 65 2e 20 49 74 20 69 73 20 3c 62  tabase. It is <b
15d00 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74  >not necessary t
15d10 6f 20 72 65 61 64 20 6f 72 20 0a 20 20 75 6e 64  o read or .  und
15d20 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61 74 65  erstand the mate
15d30 72 69 61 6c 20 69 6e 20 74 68 69 73 20 73 65 63  rial in this sec
15d40 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  tion in order to
15d50 20 75 73 65 20 46 54 53 3c 2f 62 3e 20 69 6e 20   use FTS</b> in 
15d60 61 6e 20 0a 20 20 61 70 70 6c 69 63 61 74 69 6f  an .  applicatio
15d70 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 6d  n. However, it m
15d80 61 79 20 62 65 20 75 73 65 66 75 6c 20 74 6f 20  ay be useful to 
15d90 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 76 65  application deve
15da0 6c 6f 70 65 72 73 20 61 74 74 65 6d 70 74 69 6e  lopers attemptin
15db0 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79 7a 65 20  g .  to analyze 
15dc0 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64 20 46  and understand F
15dd0 54 53 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63  TS performance c
15de0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
15df0 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70 65 72 73  or to developers
15e00 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61 74 69 6e   .  contemplatin
15e10 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 74  g enhancements t
15e20 6f 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 46  o the existing F
15e30 54 53 20 66 65 61 74 75 72 65 20 73 65 74 2e 0a  TS feature set..
15e40 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
15e50 74 20 2a 73 68 61 64 6f 77 74 61 62 20 7b 46 54  t *shadowtab {FT
15e60 53 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 7d  S shadow tables}
15e70 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20 46 6f 72  </tcl>.<p>.  For
15e80 20 65 61 63 68 20 46 54 53 20 76 69 72 74 75 61   each FTS virtua
15e90 6c 20 74 61 62 6c 65 20 69 6e 20 61 20 64 61 74  l table in a dat
15ea0 61 62 61 73 65 2c 20 74 68 72 65 65 20 74 6f 20  abase, three to 
15eb0 66 69 76 65 20 72 65 61 6c 20 28 6e 6f 6e 2d 76  five real (non-v
15ec0 69 72 74 75 61 6c 29 20 74 61 62 6c 65 73 0a 20  irtual) tables. 
15ed0 20 61 72 65 20 63 72 65 61 74 65 64 20 74 6f 20   are created to 
15ee0 73 74 6f 72 65 20 74 68 65 20 75 6e 64 65 72 6c  store the underl
15ef0 79 69 6e 67 20 64 61 74 61 2e 20 20 54 68 65 73  ying data.  Thes
15f00 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20 61 72  e real tables ar
15f10 65 20 63 61 6c 6c 65 64 20 22 73 68 61 64 6f 77  e called "shadow
15f20 20 74 61 62 6c 65 73 22 2e 0a 20 20 54 68 65 20   tables"..  The 
15f30 72 65 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20  real tables are 
15f40 6e 61 6d 65 64 20 22 25 5f 63 6f 6e 74 65 6e 74  named "%_content
15f50 22 2c 0a 20 20 22 25 5f 73 65 67 64 69 72 22 2c  ",.  "%_segdir",
15f60 20 22 25 5f 73 65 67 6d 65 6e 74 73 22 2c 20 22   "%_segments", "
15f70 25 5f 73 74 61 74 22 2c 20 61 6e 64 20 22 25 5f  %_stat", and "%_
15f80 64 6f 63 73 69 7a 65 22 2c 20 77 68 65 72 65 20  docsize", where 
15f90 22 25 22 20 69 73 20 72 65 70 6c 61 63 65 64 20  "%" is replaced 
15fa0 62 79 20 74 68 65 20 6e 61 6d 65 0a 20 20 6f 66  by the name.  of
15fb0 20 74 68 65 20 46 54 53 20 76 69 72 74 75 61 6c   the FTS virtual
15fc0 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54   table...<p>.  T
15fd0 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75  he leftmost colu
15fe0 6d 6e 20 6f 66 20 74 68 65 20 22 25 5f 63 6f 6e  mn of the "%_con
15ff0 74 65 6e 74 22 20 74 61 62 6c 65 20 69 73 20 61  tent" table is a
16000 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
16010 59 20 4b 45 59 20 66 69 65 6c 64 0a 20 20 6e 61  Y KEY field.  na
16020 6d 65 64 20 22 64 6f 63 69 64 22 2e 20 46 6f 6c  med "docid". Fol
16030 6c 6f 77 69 6e 67 20 74 68 69 73 20 69 73 20 6f  lowing this is o
16040 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 65 61  ne column for ea
16050 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
16060 20 46 54 53 0a 20 20 76 69 72 74 75 61 6c 20 74   FTS.  virtual t
16070 61 62 6c 65 20 61 73 20 64 65 63 6c 61 72 65 64  able as declared
16080 20 62 79 20 74 68 65 20 75 73 65 72 2c 20 6e 61   by the user, na
16090 6d 65 64 20 62 79 20 70 72 65 70 65 6e 64 69 6e  med by prependin
160a0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  g the column nam
160b0 65 0a 20 20 73 75 70 70 6c 69 65 64 20 62 79 20  e.  supplied by 
160c0 74 68 65 20 75 73 65 72 20 77 69 74 68 20 22 63  the user with "c
160d0 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65 72 65  <i>N</i>", where
160e0 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65   <i>N</i> is the
160f0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 0a 20   index of the . 
16100 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 74   column within t
16110 68 65 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65 72  he table, number
16120 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
16130 72 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77  right starting w
16140 69 74 68 20 30 2e 20 44 61 74 61 0a 20 20 74 79  ith 0. Data.  ty
16150 70 65 73 20 73 75 70 70 6c 69 65 64 20 61 73 20  pes supplied as 
16160 70 61 72 74 20 6f 66 20 74 68 65 20 76 69 72 74  part of the virt
16170 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
16180 61 74 69 6f 6e 20 61 72 65 20 6e 6f 74 20 75 73  ation are not us
16190 65 64 20 61 73 0a 20 20 70 61 72 74 20 6f 66 20  ed as.  part of 
161a0 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
161b0 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ble declaration.
161c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
161d0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
161e0 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  -- Virtual table
161f0 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e   declaration</i>
16200 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
16210 4c 20 54 41 42 4c 45 20 61 62 63 20 55 53 49 4e  L TABLE abc USIN
16220 47 20 66 74 73 34 28 61 20 4e 55 4d 42 45 52 2c  G fts4(a NUMBER,
16230 20 62 20 54 45 58 54 2c 20 63 29 3b 0a 0a 20 20   b TEXT, c);..  
16240 3c 69 3e 2d 2d 20 43 6f 72 72 65 73 70 6f 6e 64  <i>-- Correspond
16250 69 6e 67 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  ing %_content ta
16260 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c  ble declaration<
16270 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42  /i>.  CREATE TAB
16280 4c 45 20 61 62 63 5f 63 6f 6e 74 65 6e 74 28 64  LE abc_content(d
16290 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ocid INTEGER PRI
162a0 4d 41 52 59 20 4b 45 59 2c 20 63 30 61 2c 20 63  MARY KEY, c0a, c
162b0 31 62 2c 20 63 32 63 29 3b 0a 3c 2f 63 6f 64 65  1b, c2c);.</code
162c0 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
162d0 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
162e0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 75  e contains the u
162f0 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64 61 74  nadulterated dat
16300 61 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  a inserted by th
16310 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f 20 74  e user .  into t
16320 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74  he FTS virtual t
16330 61 62 6c 65 20 62 79 20 74 68 65 20 75 73 65 72  able by the user
16340 2e 20 49 66 20 74 68 65 20 75 73 65 72 20 64 6f  . If the user do
16350 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
16360 79 0a 20 20 73 75 70 70 6c 79 20 61 20 22 64 6f  y.  supply a "do
16370 63 69 64 22 20 76 61 6c 75 65 20 77 68 65 6e 20  cid" value when 
16380 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64  inserting record
16390 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c 65 63 74  s, one is select
163a0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
163b0 0a 20 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  .  by the system
163c0 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f 73  ...<p>.  The %_s
163d0 74 61 74 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a  tat and %_docsiz
163e0 65 20 74 61 62 6c 65 73 20 61 72 65 20 6f 6e 6c  e tables are onl
163f0 79 20 63 72 65 61 74 65 64 20 69 66 20 74 68 65  y created if the
16400 20 46 54 53 20 74 61 62 6c 65 20 75 73 65 73 20   FTS table uses 
16410 74 68 65 0a 20 20 46 54 53 34 20 6d 6f 64 75 6c  the.  FTS4 modul
16420 65 2c 20 6e 6f 74 20 46 54 53 33 2e 20 46 75 72  e, not FTS3. Fur
16430 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 25 5f  thermore, the %_
16440 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 69 73  docsize table is
16450 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 0a   omitted if the.
16460 20 20 46 54 53 34 20 74 61 62 6c 65 20 69 73 20    FTS4 table is 
16470 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
16480 20 5b 46 54 53 34 20 6d 61 74 63 68 69 6e 66 6f   [FTS4 matchinfo
16490 20 6f 70 74 69 6f 6e 7c 22 6d 61 74 63 68 69 6e   option|"matchin
164a0 66 6f 3d 66 74 73 33 22 5d 20 64 69 72 65 63 74  fo=fts3"] direct
164b0 69 76 65 0a 20 20 73 70 65 63 69 66 69 65 64 20  ive.  specified 
164c0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 43  as part of the C
164d0 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
164e0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  BLE statement. I
164f0 66 20 74 68 65 79 20 61 72 65 20 63 72 65 61 74  f they are creat
16500 65 64 2c 0a 20 20 74 68 65 20 73 63 68 65 6d 61  ed,.  the schema
16510 20 6f 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   of the two tabl
16520 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
16530 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  :.<codeblock>.  
16540 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73  CREATE TABLE %_s
16550 74 61 74 28 0a 20 20 20 20 69 64 20 49 4e 54 45  tat(.    id INTE
16560 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
16570 20 0a 20 20 20 20 76 61 6c 75 65 20 42 4c 4f 42   .    value BLOB
16580 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  .  );..  CREATE 
16590 54 41 42 4c 45 20 25 5f 64 6f 63 73 69 7a 65 28  TABLE %_docsize(
165a0 0a 20 20 20 20 64 6f 63 69 64 20 49 4e 54 45 47  .    docid INTEG
165b0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  ER PRIMARY KEY,.
165c0 20 20 20 20 73 69 7a 65 20 42 4c 4f 42 0a 20 20      size BLOB.  
165d0 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
165e0 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68 20  .<p>.  For each 
165f0 72 6f 77 20 69 6e 20 74 68 65 20 46 54 53 20 74  row in the FTS t
16600 61 62 6c 65 2c 20 74 68 65 20 25 5f 64 6f 63 73  able, the %_docs
16610 69 7a 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ize table contai
16620 6e 73 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  ns a correspondi
16630 6e 67 0a 20 20 72 6f 77 20 77 69 74 68 20 74 68  ng.  row with th
16640 65 20 73 61 6d 65 20 22 64 6f 63 69 64 22 20 76  e same "docid" v
16650 61 6c 75 65 2e 20 54 68 65 20 22 73 69 7a 65 22  alue. The "size"
16660 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
16670 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e  a blob consistin
16680 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20  g.  of <i>N</i> 
16690 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68 65  FTS varints, whe
166a0 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74  re <i>N</i> is t
166b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
166c0 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
166d0 73 0a 20 20 69 6e 20 74 68 65 20 74 61 62 6c 65  s.  in the table
166e0 2e 20 45 61 63 68 20 76 61 72 69 6e 74 20 69 6e  . Each varint in
166f0 20 74 68 65 20 22 73 69 7a 65 22 20 62 6c 6f 62   the "size" blob
16700 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16710 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 0a  f tokens in the.
16720 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
16730 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 61 73  column of the as
16740 73 6f 63 69 61 74 65 64 20 72 6f 77 20 69 6e 20  sociated row in 
16750 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54  the FTS table. T
16760 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 0a  he %_stat table.
16770 20 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e    always contain
16780 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 77  s a single row w
16790 69 74 68 20 74 68 65 20 22 69 64 22 20 63 6f 6c  ith the "id" col
167a0 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e 20 54 68  umn set to 0. Th
167b0 65 20 22 76 61 6c 75 65 22 20 0a 20 20 63 6f 6c  e "value" .  col
167c0 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 62  umn contains a b
167d0 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  lob consisting o
167e0 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e 20 46 54 53  f <i>N+1</i> FTS
167f0 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20   varints, where 
16800 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69 73 20 61 67  <i>N</i>.  is ag
16810 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
16820 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63  f user-defined c
16830 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
16840 53 20 74 61 62 6c 65 2e 20 54 68 65 20 66 69 72  S table. The fir
16850 73 74 0a 20 20 76 61 72 69 6e 74 20 69 6e 20 74  st.  varint in t
16860 68 65 20 62 6c 6f 62 20 69 73 20 73 65 74 20 74  he blob is set t
16870 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
16880 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
16890 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
168a0 0a 20 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  .  second and su
168b0 62 73 65 71 75 65 6e 74 20 76 61 72 69 6e 74 73  bsequent varints
168c0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f 74   contain the tot
168d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
168e0 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20  ens stored in.  
168f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16900 67 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c  g column for all
16910 20 72 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53   rows of the FTS
16920 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54   table...<p>.  T
16930 68 65 20 74 77 6f 20 72 65 6d 61 69 6e 69 6e 67  he two remaining
16940 20 74 61 62 6c 65 73 2c 20 25 5f 73 65 67 6d 65   tables, %_segme
16950 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72  nts and %_segdir
16960 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  , are used to st
16970 6f 72 65 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d  ore the .  full-
16980 74 65 78 74 20 69 6e 64 65 78 2e 20 43 6f 6e 63  text index. Conc
16990 65 70 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 69  eptually, this i
169a0 6e 64 65 78 20 69 73 20 61 20 6c 6f 6f 6b 75 70  ndex is a lookup
169b0 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 70 73   table that maps
169c0 20 65 61 63 68 20 0a 20 20 74 65 72 6d 20 28 77   each .  term (w
169d0 6f 72 64 29 20 74 6f 20 74 68 65 20 73 65 74 20  ord) to the set 
169e0 6f 66 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20  of docid values 
169f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
16a00 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
16a10 0a 20 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  .  %_content tab
16a20 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  le that contain 
16a30 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75  one or more occu
16a40 72 72 65 6e 63 65 73 20 6f 66 20 74 68 65 20 74  rrences of the t
16a50 65 72 6d 2e 20 54 6f 0a 20 20 72 65 74 72 69 65  erm. To.  retrie
16a60 76 65 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  ve all documents
16a70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20   that contain a 
16a80 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
16a90 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 0a 20  the FTS module. 
16aa0 20 71 75 65 72 69 65 73 20 74 68 69 73 20 69 6e   queries this in
16ab0 64 65 78 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  dex to determine
16ac0 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 69   the set of doci
16ad0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 72 65 63  d values for rec
16ae0 6f 72 64 73 20 74 68 61 74 0a 20 20 63 6f 6e 74  ords that.  cont
16af0 61 69 6e 20 74 68 65 20 74 65 72 6d 2c 20 74 68  ain the term, th
16b00 65 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  en retrieves the
16b10 20 72 65 71 75 69 72 65 64 20 64 6f 63 75 6d 65   required docume
16b20 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 63  nts from the %_c
16b30 6f 6e 74 65 6e 74 0a 20 20 74 61 62 6c 65 2e 20  ontent.  table. 
16b40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
16b50 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
16b60 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c  FTS virtual tabl
16b70 65 2c 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  e, the %_segment
16b80 73 0a 20 20 61 6e 64 20 25 5f 73 65 67 64 69 72  s.  and %_segdir
16b90 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61   tables are alwa
16ba0 79 73 20 63 72 65 61 74 65 64 20 61 73 20 66 6f  ys created as fo
16bb0 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  llows:..<codeblo
16bc0 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42  ck>.  CREATE TAB
16bd0 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 0a 20  LE %_segments(. 
16be0 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47     blockid INTEG
16bf0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
16c00 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72        <i>-- B-tr
16c10 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69 3e 0a 20  ee node id</i>. 
16c20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62 20 20 20     block blob   
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72        <i>-- B-tr
16c50 65 65 20 6e 6f 64 65 20 64 61 74 61 3c 2f 69 3e  ee node data</i>
16c60 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  .  );..  CREATE 
16c70 54 41 42 4c 45 20 25 5f 73 65 67 64 69 72 28 0a  TABLE %_segdir(.
16c80 20 20 20 20 6c 65 76 65 6c 20 49 4e 54 45 47 45      level INTEGE
16c90 52 2c 0a 20 20 20 20 69 64 78 20 49 4e 54 45 47  R,.    idx INTEG
16ca0 45 52 2c 0a 20 20 20 20 73 74 61 72 74 5f 62 6c  ER,.    start_bl
16cb0 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20  ock INTEGER,    
16cc0 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d             <i>--
16cd0 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66 69 72 73   Blockid of firs
16ce0 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d  t node in %_segm
16cf0 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 6c 65 61  ents</i>.    lea
16d00 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e  ves_end_block IN
16d10 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20  TEGER,          
16d20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66  <i>-- Blockid of
16d30 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f 64 65 20   last leaf node 
16d40 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69  in %_segments</i
16d50 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 20  >.    end_block 
16d60 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20  INTEGER,        
16d70 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42           <i>-- B
16d80 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74 20 6e  lockid of last n
16d90 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74  ode in %_segment
16da0 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f 74 20 42  s</i>.    root B
16db0 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20 20 20  LOB,            
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
16dd0 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f 74 20 6e  -- B-tree root n
16de0 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50 52 49 4d  ode</i>.    PRIM
16df0 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c 20 69  ARY KEY(level, i
16e00 64 78 29 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62  dx).  );.</codeb
16e10 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
16e20 20 73 63 68 65 6d 61 20 64 65 70 69 63 74 65 64   schema depicted
16e30 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 64 65   above is not de
16e40 73 69 67 6e 65 64 20 74 6f 20 73 74 6f 72 65 20  signed to store 
16e50 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
16e60 64 65 78 20 0a 20 20 64 69 72 65 63 74 6c 79 2e  dex .  directly.
16e70 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 20   Instead, it is 
16e80 75 73 65 64 20 74 6f 20 6f 6e 65 20 6f 72 20 6d  used to one or m
16e90 6f 72 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  ore b-tree struc
16ea0 74 75 72 65 73 2e 20 54 68 65 72 65 0a 20 20 69  tures. There.  i
16eb0 73 20 6f 6e 65 20 62 2d 74 72 65 65 20 66 6f 72  s one b-tree for
16ec0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
16ed0 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
16ee0 20 54 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   The %_segdir ta
16ef0 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e 74 61 69  ble.  row contai
16f00 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ns the root node
16f10 20 61 6e 64 20 76 61 72 69 6f 75 73 20 6d 65 74   and various met
16f20 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
16f30 64 20 77 69 74 68 20 74 68 65 0a 20 20 62 2d 74  d with the.  b-t
16f40 72 65 65 20 73 74 72 75 63 74 75 72 65 2c 20 61  ree structure, a
16f50 6e 64 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  nd the %_segment
16f60 73 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  s table contains
16f70 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e 6f 6e 2d   all other (non-
16f80 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65 65 20 6e  root).  b-tree n
16f90 6f 64 65 73 2e 20 45 61 63 68 20 62 2d 74 72 65  odes. Each b-tre
16fa0 65 20 69 73 20 72 65 66 65 72 72 65 64 20 74 6f  e is referred to
16fb0 20 61 73 20 61 20 22 73 65 67 6d 65 6e 74 22 2e   as a "segment".
16fc0 20 4f 6e 63 65 20 69 74 20 68 61 73 0a 20 20 62   Once it has.  b
16fd0 65 65 6e 20 63 72 65 61 74 65 64 2c 20 61 20 73  een created, a s
16fe0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73  egment b-tree is
16ff0 20 6e 65 76 65 72 20 75 70 64 61 74 65 64 20 28   never updated (
17000 61 6c 74 68 6f 75 67 68 20 69 74 20 6d 61 79 20  although it may 
17010 62 65 0a 20 20 64 65 6c 65 74 65 64 20 61 6c 74  be.  deleted alt
17020 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70 3e 0a 20  ogether)...<p>. 
17030 20 54 68 65 20 6b 65 79 73 20 75 73 65 64 20 62   The keys used b
17040 79 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62  y each segment b
17050 2d 74 72 65 65 20 61 72 65 20 74 65 72 6d 73 20  -tree are terms 
17060 28 77 6f 72 64 73 29 2e 20 41 73 20 77 65 6c 6c  (words). As well
17070 20 61 73 20 74 68 65 0a 20 20 6b 65 79 2c 20 65   as the.  key, e
17080 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  ach segment b-tr
17090 65 65 20 65 6e 74 72 79 20 68 61 73 20 61 6e 20  ee entry has an 
170a0 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f 63 6c  associated "docl
170b0 69 73 74 22 20 28 64 6f 63 75 6d 65 6e 74 20 6c  ist" (document l
170c0 69 73 74 29 2e 0a 20 20 41 20 64 6f 63 6c 69 73  ist)..  A doclis
170d0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
170e0 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69  ro or more entri
170f0 65 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 65  es, where each e
17100 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntry consists of
17110 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41  :..<ul>.  <li> A
17120 20 64 6f 63 69 64 20 28 64 6f 63 75 6d 65 6e 74   docid (document
17130 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c 6c 69 3e   id), and.  <li>
17140 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 20   A list of term 
17150 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20 66 6f 72  offsets, one for
17160 20 65 61 63 68 20 6f 63 63 75 72 72 65 6e 63 65   each occurrence
17170 20 6f 66 20 74 68 65 20 74 65 72 6d 20 77 69 74   of the term wit
17180 68 69 6e 0a 20 20 20 20 20 20 20 74 68 65 20 64  hin.       the d
17190 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65 72 6d 20  ocument. A term 
171a0 6f 66 66 73 65 74 20 69 6e 64 69 63 61 74 65 73  offset indicates
171b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
171c0 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29 0a 20 20  okens (words).  
171d0 20 20 20 20 20 74 68 61 74 20 6f 63 63 75 72 20       that occur 
171e0 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 20  before the term 
171f0 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20 6e 6f 74  in question, not
17200 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
17210 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
17220 20 6f 72 20 62 79 74 65 73 2e 20 46 6f 72 20 65   or bytes. For e
17230 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 65 72 6d  xample, the term
17240 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 74   offset of the t
17250 65 72 6d 20 22 77 61 72 22 20 69 6e 20 74 68 65  erm "war" in the
17260 0a 20 20 20 20 20 20 20 70 68 72 61 73 65 20 22  .       phrase "
17270 41 6e 63 65 73 74 72 61 6c 20 76 6f 69 63 65 73  Ancestral voices
17280 20 70 72 6f 70 68 65 73 79 69 6e 67 20 77 61 72   prophesying war
17290 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a  !" is 3..</ul>..
172a0 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73 20 77 69  <p>.  Entries wi
172b0 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 61  thin a doclist a
172c0 72 65 20 73 6f 72 74 65 64 20 62 79 20 64 6f 63  re sorted by doc
172d0 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73 20 77 69  id. Positions wi
172e0 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 0a 20  thin a doclist. 
172f0 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65   entry are store
17300 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  d in ascending o
17310 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  rder...<p>.  The
17320 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17330 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c 2d 74 65   logical full-te
17340 78 74 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  xt index is foun
17350 64 20 62 79 20 6d 65 72 67 69 6e 67 20 74 68 65  d by merging the
17360 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  .  contents of a
17370 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ll segment b-tre
17380 65 73 2e 20 49 66 20 61 20 74 65 72 6d 20 69 73  es. If a term is
17390 20 70 72 65 73 65 6e 74 20 69 6e 20 6d 6f 72 65   present in more
173a0 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73 65 67 6d   than one.  segm
173b0 65 6e 74 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  ent b-tree, then
173c0 20 69 74 20 6d 61 70 73 20 74 6f 20 74 68 65 20   it maps to the 
173d0 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e  union of each in
173e0 64 69 76 69 64 75 61 6c 20 64 6f 63 6c 69 73 74  dividual doclist
173f0 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61 20 73 69  . If,.  for a si
17400 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68 65 20 73  ngle term, the s
17410 61 6d 65 20 64 6f 63 69 64 20 6f 63 63 75 72 73  ame docid occurs
17420 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   in more than on
17430 65 20 64 6f 63 6c 69 73 74 2c 20 74 68 65 6e 20  e doclist, then 
17440 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f 63 6c 69  only.  the docli
17450 73 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  st that is part 
17460 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
17470 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 65 67  ntly created seg
17480 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20 0a  ment b-tree is .
17490 20 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c    considered val
174a0 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75 6c 74  id. ..<p>.  Mult
174b0 69 70 6c 65 20 62 2d 74 72 65 65 20 73 74 72 75  iple b-tree stru
174c0 63 74 75 72 65 73 20 61 72 65 20 75 73 65 64 20  ctures are used 
174d0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e  instead of a sin
174e0 67 6c 65 20 62 2d 74 72 65 65 20 74 6f 20 72 65  gle b-tree to re
174f0 64 75 63 65 0a 20 20 74 68 65 20 63 6f 73 74 20  duce.  the cost 
17500 6f 66 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63  of inserting rec
17510 6f 72 64 73 20 69 6e 74 6f 20 46 54 53 20 74 61  ords into FTS ta
17520 62 6c 65 73 2e 20 57 68 65 6e 20 61 20 6e 65 77  bles. When a new
17530 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 69 6e   record is .  in
17540 73 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 46  serted into an F
17550 54 53 20 74 61 62 6c 65 20 74 68 61 74 20 61 6c  TS table that al
17560 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
17570 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c 20 69 74   lot of data, it
17580 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20 74 68 61   is.  likely tha
17590 74 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 74 65  t many of the te
175a0 72 6d 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72  rms in the new r
175b0 65 63 6f 72 64 20 61 72 65 20 61 6c 72 65 61 64  ecord are alread
175c0 79 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 61  y present in.  a
175d0 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f 66   large number of
175e0 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f 72 64   existing record
175f0 73 2e 20 49 66 20 61 20 73 69 6e 67 6c 65 20 62  s. If a single b
17600 2d 74 72 65 65 20 77 65 72 65 20 75 73 65 64 2c  -tree were used,
17610 20 74 68 65 6e 0a 20 20 6c 61 72 67 65 20 64 6f   then.  large do
17620 63 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 73  clist structures
17630 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62   would have to b
17640 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  e loaded from th
17650 65 20 64 61 74 61 62 61 73 65 2c 0a 20 20 61 6d  e database,.  am
17660 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75 64 65  ended to include
17670 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20 61   the new docid a
17680 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  nd term-offset l
17690 69 73 74 2c 20 74 68 65 6e 20 77 72 69 74 74 65  ist, then writte
176a0 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74 68 65 20  n back.  to the 
176b0 64 61 74 61 62 61 73 65 2e 20 55 73 69 6e 67 20  database. Using 
176c0 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20  multiple b-tree 
176d0 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73 20 74 68  tables allows th
176e0 69 73 20 74 6f 20 62 65 20 61 76 6f 69 64 65 64  is to be avoided
176f0 0a 20 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  .  by creating a
17700 20 6e 65 77 20 62 2d 74 72 65 65 20 77 68 69 63   new b-tree whic
17710 68 20 63 61 6e 20 62 65 20 6d 65 72 67 65 64 20  h can be merged 
17720 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
17730 67 20 62 2d 74 72 65 65 0a 20 20 28 6f 72 20 62  g b-tree.  (or b
17740 2d 74 72 65 65 73 29 20 6c 61 74 65 72 20 6f 6e  -trees) later on
17750 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20 62 2d 74  . Merging of b-t
17760 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20 63  ree structures c
17770 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  an be performed 
17780 61 73 0a 20 20 61 20 62 61 63 6b 67 72 6f 75 6e  as.  a backgroun
17790 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e 63 65 20  d task, or once 
177a0 61 20 63 65 72 74 61 69 6e 20 6e 75 6d 62 65 72  a certain number
177b0 20 6f 66 20 73 65 70 61 72 61 74 65 20 62 2d 74   of separate b-t
177c0 72 65 65 20 73 74 72 75 63 74 75 72 65 73 0a 20  ree structures. 
177d0 20 68 61 76 65 20 62 65 65 6e 20 61 63 63 75 6d   have been accum
177e0 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f 75 72 73  ulated. Of cours
177f0 65 2c 20 74 68 69 73 20 73 63 68 65 6d 65 20 6d  e, this scheme m
17800 61 6b 65 73 20 71 75 65 72 69 65 73 20 6d 6f 72  akes queries mor
17810 65 20 65 78 70 65 6e 73 69 76 65 0a 20 20 28 61  e expensive.  (a
17820 73 20 74 68 65 20 46 54 53 20 63 6f 64 65 20 6d  s the FTS code m
17830 61 79 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  ay have to look 
17840 75 70 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65  up individual te
17850 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  rms in more than
17860 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65 20 61 6e   one.  b-tree an
17870 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
17880 6c 74 73 29 2c 20 62 75 74 20 69 74 20 68 61 73  lts), but it has
17890 20 62 65 65 6e 20 66 6f 75 6e 64 20 74 68 61 74   been found that
178a0 20 69 6e 20 70 72 61 63 74 69 63 65 20 74 68 69   in practice thi
178b0 73 0a 20 20 6f 76 65 72 68 65 61 64 20 69 73 20  s.  overhead is 
178c0 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69 62 6c 65  often negligible
178d0 2e 0a 20 20 0a 3c 68 32 3e 56 61 72 69 61 62 6c  ..  .<h2>Variabl
178e0 65 20 4c 65 6e 67 74 68 20 49 6e 74 65 67 65 72  e Length Integer
178f0 20 28 76 61 72 69 6e 74 29 20 46 6f 72 6d 61 74   (varint) Format
17900 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 74  </h2>..<p>.  Int
17910 65 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72  eger values stor
17920 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65  ed as part of se
17930 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6e 6f 64  gment b-tree nod
17940 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20 75  es are encoded u
17950 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 20 76  sing the.  FTS v
17960 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20 54 68  arint format. Th
17970 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 73  is encoding is s
17980 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c 62 3e 6e  imilar, but <b>n
17990 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c 2f 62 3e  ot identical</b>
179a0 2c 20 74 6f 0a 20 20 74 68 65 20 3c 61 20 68 72  , to.  the <a hr
179b0 65 66 3d 22 66 69 6c 65 66 6f 72 6d 61 74 2e 68  ef="fileformat.h
179c0 74 6d 6c 23 76 61 72 69 6e 74 5f 66 6f 72 6d 61  tml#varint_forma
179d0 74 22 3e 53 51 4c 69 74 65 20 76 61 72 69 6e 74  t">SQLite varint
179e0 20 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a 0a 3c 70   format</a>...<p
179f0 3e 0a 20 20 41 6e 20 65 6e 63 6f 64 65 64 20 46  >.  An encoded F
17a00 54 53 20 76 61 72 69 6e 74 20 63 6f 6e 73 75 6d  TS varint consum
17a10 65 73 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 61  es between one a
17a20 6e 64 20 74 65 6e 20 62 79 74 65 73 20 6f 66 20  nd ten bytes of 
17a30 73 70 61 63 65 2e 20 54 68 65 0a 20 20 6e 75 6d  space. The.  num
17a40 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
17a50 75 69 72 65 64 20 69 73 20 64 65 74 65 72 6d 69  uired is determi
17a60 6e 65 64 20 62 79 20 74 68 65 20 73 69 67 6e 20  ned by the sign 
17a70 61 6e 64 20 6d 61 67 6e 69 74 75 64 65 20 6f 66  and magnitude of
17a80 20 74 68 65 0a 20 20 69 6e 74 65 67 65 72 20 76   the.  integer v
17a90 61 6c 75 65 20 65 6e 63 6f 64 65 64 2e 20 4d 6f  alue encoded. Mo
17aa0 72 65 20 61 63 63 75 72 61 74 65 6c 79 2c 20 74  re accurately, t
17ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17ac0 65 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  es used to store
17ad0 0a 20 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69  .  the encoded i
17ae0 6e 74 65 67 65 72 20 64 65 70 65 6e 64 73 20 6f  nteger depends o
17af0 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f  n the position o
17b00 66 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  f the most signi
17b10 66 69 63 61 6e 74 20 73 65 74 20 62 69 74 0a 20  ficant set bit. 
17b20 20 69 6e 20 74 68 65 20 36 34 2d 62 69 74 20 74   in the 64-bit t
17b30 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 72  wos-complement r
17b40 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
17b50 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
17b60 75 65 2e 20 4e 65 67 61 74 69 76 65 0a 20 20 76  ue. Negative.  v
17b70 61 6c 75 65 73 20 61 6c 77 61 79 73 20 68 61 76  alues always hav
17b80 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  e the most signi
17b90 66 69 63 61 6e 74 20 62 69 74 20 73 65 74 20 28  ficant bit set (
17ba0 74 68 65 20 73 69 67 6e 20 62 69 74 29 2c 20 61  the sign bit), a
17bb0 6e 64 20 73 6f 20 61 72 65 0a 20 20 61 6c 77 61  nd so are.  alwa
17bc0 79 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20  ys stored using 
17bd0 74 68 65 20 66 75 6c 6c 20 74 65 6e 20 62 79 74  the full ten byt
17be0 65 73 2e 20 50 6f 73 69 74 69 76 65 20 69 6e 74  es. Positive int
17bf0 65 67 65 72 20 76 61 6c 75 65 73 20 6d 61 79 20  eger values may 
17c00 62 65 0a 20 20 73 74 6f 72 65 64 20 75 73 69 6e  be.  stored usin
17c10 67 20 6c 65 73 73 20 73 70 61 63 65 2e 0a 0a 3c  g less space...<
17c20 70 3e 0a 20 20 54 68 65 20 66 69 6e 61 6c 20 62  p>.  The final b
17c30 79 74 65 20 6f 66 20 61 6e 20 65 6e 63 6f 64 65  yte of an encode
17c40 64 20 46 54 53 20 76 61 72 69 6e 74 20 68 61 73  d FTS varint has
17c50 20 69 74 73 20 6d 6f 73 74 20 73 69 67 6e 69 66   its most signif
17c60 69 63 61 6e 74 20 62 69 74 20 0a 20 20 63 6c 65  icant bit .  cle
17c70 61 72 65 64 2e 20 41 6c 6c 20 70 72 65 63 65 64  ared. All preced
17c80 69 6e 67 20 62 79 74 65 73 20 68 61 76 65 20 74  ing bytes have t
17c90 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63  he most signific
17ca0 61 6e 74 20 62 69 74 20 73 65 74 2e 20 44 61 74  ant bit set. Dat
17cb0 61 0a 20 20 69 73 20 73 74 6f 72 65 64 20 69 6e  a.  is stored in
17cc0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73   the remaining s
17cd0 65 76 65 6e 20 6c 65 61 73 74 20 73 69 67 6e 69  even least signi
17ce0 66 69 63 61 6e 74 20 62 69 74 73 20 6f 66 20 65  ficant bits of e
17cf0 61 63 68 20 62 79 74 65 2e 0a 20 20 54 68 65 20  ach byte..  The 
17d00 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
17d10 65 20 65 6e 63 6f 64 65 64 20 72 65 70 72 65 73  e encoded repres
17d20 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  entation contain
17d30 73 20 74 68 65 20 6c 65 61 73 74 20 73 69 67 6e  s the least sign
17d40 69 66 69 63 61 6e 74 0a 20 20 73 65 76 65 6e 20  ificant.  seven 
17d50 62 69 74 73 20 6f 66 20 74 68 65 20 65 6e 63 6f  bits of the enco
17d60 64 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ded integer valu
17d70 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 62 79  e. The second by
17d80 74 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65  te of the encode
17d90 64 0a 20 20 72 65 70 72 65 73 65 6e 74 61 74 69  d.  representati
17da0 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  on, if it is pre
17db0 73 65 6e 74 2c 20 63 6f 6e 74 61 69 6e 73 20 74  sent, contains t
17dc0 68 65 20 73 65 76 65 6e 20 6e 65 78 74 20 6c 65  he seven next le
17dd0 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  ast significant.
17de0 20 20 62 69 74 73 20 6f 66 20 74 68 65 20 69 6e    bits of the in
17df0 74 65 67 65 72 20 76 61 6c 75 65 2c 20 61 6e 64  teger value, and
17e00 20 73 6f 20 6f 6e 2e 20 54 68 65 20 66 6f 6c 6c   so on. The foll
17e10 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74  owing table cont
17e20 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 0a 20 20  ains examples.  
17e30 6f 66 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67  of encoded integ
17e40 65 72 20 76 61 6c 75 65 73 3a 0a 0a 3c 74 61 62  er values:..<tab
17e50 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20  le striped=1>.  
17e60 3c 74 72 3e 3c 74 68 3e 44 65 63 69 6d 61 6c 3c  <tr><th>Decimal<
17e70 74 68 3e 48 65 78 61 64 65 63 69 6d 61 6c 3c 74  th>Hexadecimal<t
17e80 68 20 77 69 64 74 68 3d 31 30 30 25 3e 45 6e 63  h width=100%>Enc
17e90 6f 64 65 64 20 52 65 70 72 65 73 65 6e 74 61 74  oded Representat
17ea0 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 34 33  ion.  <tr><td>43
17eb0 3c 74 64 3e 30 78 30 30 30 30 30 30 30 30 30 30  <td>0x0000000000
17ec0 30 30 30 30 32 42 3c 74 64 3e 30 78 32 42 20 0a  00002B<td>0x2B .
17ed0 20 20 3c 74 72 3e 3c 74 64 3e 32 30 30 38 31 35    <tr><td>200815
17ee0 3c 74 64 3e 30 78 30 30 30 30 30 30 30 30 30 30  <td>0x0000000000
17ef0 30 33 31 30 36 46 3c 74 64 3e 30 78 39 43 20 30  03106F<td>0x9C 0
17f00 78 41 30 20 30 78 30 43 0a 20 20 3c 74 72 3e 3c  xA0 0x0C.  <tr><
17f10 74 64 3e 2d 31 3c 74 64 3e 30 78 46 46 46 46 46  td>-1<td>0xFFFFF
17f20 46 46 46 46 46 46 46 46 46 46 46 3c 74 64 3e 30  FFFFFFFFFFF<td>0
17f30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
17f40 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
17f50 46 20 30 78 46 46 20 30 78 46 46 20 30 78 30 31  F 0xFF 0xFF 0x01
17f60 0a 3c 2f 74 61 62 6c 65 3e 0a 20 20 0a 0a 3c 68  .</table>.  ..<h
17f70 32 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65  2>Segment B-Tree
17f80 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70   Format</h2>..<p
17f90 3e 0a 20 20 53 65 67 6d 65 6e 74 20 62 2d 74 72  >.  Segment b-tr
17fa0 65 65 73 20 61 72 65 20 70 72 65 66 69 78 2d 63  ees are prefix-c
17fb0 6f 6d 70 72 65 73 73 65 64 20 62 2b 2d 74 72 65  ompressed b+-tre
17fc0 65 73 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65  es. There is one
17fd0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
17fe0 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69    for each row i
17ff0 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
18000 61 62 6c 65 20 28 73 65 65 20 61 62 6f 76 65 29  able (see above)
18010 2e 20 54 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  . The root node 
18020 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 0a 20  of the segment. 
18030 20 62 2d 74 72 65 65 20 69 73 20 73 74 6f 72 65   b-tree is store
18040 64 20 61 73 20 61 20 62 6c 6f 62 20 69 6e 20 74  d as a blob in t
18050 68 65 20 22 72 6f 6f 74 22 20 66 69 65 6c 64 20  he "root" field 
18060 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
18070 64 69 6e 67 20 72 6f 77 0a 20 20 6f 66 20 74 68  ding row.  of th
18080 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
18090 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e 6f 64 65  . All other node
180a0 73 20 28 69 66 20 61 6e 79 20 65 78 69 73 74 29  s (if any exist)
180b0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
180c0 68 65 20 0a 20 20 22 62 6c 6f 62 22 20 63 6f 6c  he .  "blob" col
180d0 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67  umn of the %_seg
180e0 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 4e 6f 64  ments table. Nod
180f0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 25 5f  es within the %_
18100 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 61  segments table a
18110 72 65 0a 20 20 69 64 65 6e 74 69 66 69 65 64 20  re.  identified 
18120 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  by the integer v
18130 61 6c 75 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  alue in the bloc
18140 6b 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  kid field of the
18150 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20   corresponding. 
18160 20 72 6f 77 2e 20 54 68 65 20 66 6f 6c 6c 6f 77   row. The follow
18170 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
18180 62 65 73 20 74 68 65 20 66 69 65 6c 64 73 20 6f  bes the fields o
18190 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  f the %_segdir t
181a0 61 62 6c 65 3a 0a 0a 3c 74 61 62 6c 65 20 73 74  able:..<table st
181b0 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c  riped=1>.  <tr><
181c0 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  th>Column       
181d0 20 20 20 20 3c 74 68 20 77 69 64 74 68 3d 31 30      <th width=10
181e0 30 25 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f  0%>Interpretatio
181f0 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 65 76 65  n.  <tr><td>leve
18200 6c 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64  l            <td
18210 3e 20 0a 20 20 20 20 42 65 74 77 65 65 6e 20 74  > .    Between t
18220 68 65 6d 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  hem, the content
18230 73 20 6f 66 20 74 68 65 20 22 6c 65 76 65 6c 22  s of the "level"
18240 20 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64   and "idx" field
18250 73 20 64 65 66 69 6e 65 20 74 68 65 0a 20 20 20  s define the.   
18260 20 72 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66   relative age of
18270 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
18280 72 65 65 2e 20 54 68 65 20 73 6d 61 6c 6c 65 72  ree. The smaller
18290 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
182a0 64 20 69 6e 20 74 68 65 0a 20 20 20 20 22 6c 65  d in the.    "le
182b0 76 65 6c 22 20 66 69 65 6c 64 2c 20 74 68 65 20  vel" field, the 
182c0 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79 20 74 68  more recently th
182d0 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
182e0 20 77 61 73 20 63 72 65 61 74 65 64 2e 20 49 66   was created. If
182f0 20 74 77 6f 0a 20 20 20 20 73 65 67 6d 65 6e 74   two.    segment
18300 20 62 2d 74 72 65 65 73 20 61 72 65 20 6f 66 20   b-trees are of 
18310 74 68 65 20 73 61 6d 65 20 22 6c 65 76 65 6c 22  the same "level"
18320 2c 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69  , the segment wi
18330 74 68 20 74 68 65 20 6c 61 72 67 65 72 0a 20 20  th the larger.  
18340 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69    value stored i
18350 6e 20 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75  n the "idx" colu
18360 6d 6e 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e  mn is more recen
18370 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b  t. The PRIMARY K
18380 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  EY constraint.  
18390 20 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 64 69    on the %_segdi
183a0 72 20 74 61 62 6c 65 20 70 72 65 76 65 6e 74 73  r table prevents
183b0 20 61 6e 79 20 74 77 6f 20 73 65 67 6d 65 6e 74   any two segment
183c0 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 68  s from having th
183d0 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20  e same value.   
183e0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 22 6c   for both the "l
183f0 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20  evel" and "idx" 
18400 66 69 65 6c 64 73 2e 0a 20 20 3c 74 72 3e 3c 74  fields..  <tr><t
18410 64 3e 69 64 78 20 20 20 20 20 20 20 20 20 20 20  d>idx           
18420 20 20 20 3c 74 64 3e 20 53 65 65 20 61 62 6f 76     <td> See abov
18430 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 73 74 61  e..  <tr><td>sta
18440 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20 3c 74  rt_block      <t
18450 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b  d>.    The block
18460 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  id that correspo
18470 6e 64 73 20 74 6f 20 74 68 65 20 6e 6f 64 65 20  nds to the node 
18480 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
18490 74 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 0a  t blockid that .
184a0 20 20 20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74      belongs to t
184b0 68 69 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  his segment b-tr
184c0 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74  ee. Or zero if t
184d0 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e  he entire segmen
184e0 74 20 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74  t b-tree.    fit
184f0 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f  s on the root no
18500 64 65 2e 20 49 66 20 69 74 20 65 78 69 73 74 73  de. If it exists
18510 2c 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61  , this node is a
18520 6c 77 61 79 73 20 61 20 6c 65 61 66 20 6e 6f 64  lways a leaf nod
18530 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 65 61  e..  <tr><td>lea
18540 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74  ves_end_block <t
18550 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b  d>.    The block
18560 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  id that correspo
18570 6e 64 73 20 74 6f 20 74 68 65 20 6c 65 61 66 20  nds to the leaf 
18580 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c 61  node with the la
18590 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 0a 20  rgest blockid . 
185a0 20 20 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20     that belongs 
185b0 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  to this segment 
185c0 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20  b-tree. Or zero 
185d0 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65  if the entire se
185e0 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20  gment b-tree.   
185f0 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f   fits on the roo
18600 74 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74  t node..  <tr><t
18610 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e  d>end_block <td>
18620 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64  .    The blockid
18630 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
18640 73 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f  s to the interio
18650 72 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20  r node with the 
18660 6c 61 72 67 65 73 74 20 0a 20 20 20 20 62 6c 6f  largest .    blo
18670 63 6b 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67  ckid that belong
18680 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e  s to this segmen
18690 74 20 62 2d 74 72 65 65 2e 20 20 4f 72 20 7a 65  t b-tree.  Or ze
186a0 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
186b0 20 73 65 67 6d 65 6e 74 0a 20 20 20 20 62 2d 74   segment.    b-t
186c0 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ree fits on the 
186d0 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74  root node. If it
186e0 20 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f   exists, this no
186f0 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 6e 0a  de is always an.
18700 20 20 20 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64      interior nod
18710 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 72 6f 6f  e..  <tr><td>roo
18720 74 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74  t             <t
18730 64 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74  d>.    Blob cont
18740 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20  aining the root 
18750 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d  node of the segm
18760 65 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61  ent b-tree..</ta
18770 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72  ble>..<p>.  Apar
18780 74 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20  t from the root 
18790 6e 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20  node, the nodes 
187a0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73  that make up a s
187b0 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d  ingle segment b-
187c0 74 72 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79  tree are.  alway
187d0 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61  s stored using a
187e0 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
187f0 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73  ence of blockids
18800 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  . Furthermore, t
18810 68 65 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20  he.  nodes that 
18820 6d 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65  make up a single
18830 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d   level of the b-
18840 74 72 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c  tree are themsel
18850 76 65 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20  ves stored as.  
18860 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f  a contiguous blo
18870 63 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72  ck, in b-tree or
18880 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75  der. The contigu
18890 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ous sequence of 
188a0 62 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20  blockids.  used 
188b0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74  to store the b-t
188c0 72 65 65 20 6c 65 61 76 65 73 20 61 72 65 20 61  ree leaves are a
188d0 6c 6c 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e  llocated startin
188e0 67 20 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b  g with the block
188f0 69 64 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65  id.  value store
18900 64 20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f  d in the "start_
18910 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66  block" column of
18920 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
18930 6e 67 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c  ng %_segdir row,
18940 0a 20 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67  .  and finishing
18950 20 61 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20   at the blockid 
18960 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
18970 74 68 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f  the "leaves_end_
18980 62 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f  block".  field o
18990 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  f the same row. 
189a0 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
189b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72  possible to iter
189c0 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
189d0 74 68 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20  the.  leaves of 
189e0 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
189f0 2c 20 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20  , in key order, 
18a00 62 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68  by traversing th
18a10 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20  e %_segments .  
18a20 74 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64  table in blockid
18a30 20 6f 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61   order from "sta
18a40 72 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65  rt_block" to "le
18a50 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e  aves_end_block".
18a60 20 20 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20    ..<h3>Segment 
18a70 42 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65  B-Tree Leaf Node
18a80 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68  s</h3>..<p>.  Th
18a90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67  e following diag
18aa0 72 61 6d 20 64 65 70 69 63 74 73 20 74 68 65 20  ram depicts the 
18ab0 66 6f 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d  format of a segm
18ac0 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
18ad0 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a  node...<center>.
18ae0 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65    <img src=image
18af0 73 2f 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65  s/fts3_leaf_node
18b00 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65 67 6d  .png>.  <p> Segm
18b10 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20  ent B-Tree Leaf 
18b20 4e 6f 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65  Node Format.</ce
18b30 6e 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  nter>..<p>.  The
18b40 20 66 69 72 73 74 20 74 65 72 6d 20 73 74 6f 72   first term stor
18b50 65 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64 65 20  ed on each node 
18b60 28 22 54 65 72 6d 20 31 22 20 69 6e 20 74 68 65  ("Term 1" in the
18b70 20 66 69 67 75 72 65 20 61 62 6f 76 65 29 20 69   figure above) i
18b80 73 0a 20 20 73 74 6f 72 65 64 20 76 65 72 62 61  s.  stored verba
18b90 74 69 6d 2e 20 45 61 63 68 20 73 75 62 73 65 71  tim. Each subseq
18ba0 75 65 6e 74 20 74 65 72 6d 20 69 73 20 70 72 65  uent term is pre
18bb0 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 77  fix-compressed w
18bc0 69 74 68 20 72 65 73 70 65 63 74 0a 20 20 74 6f  ith respect.  to
18bd0 20 69 74 73 20 70 72 65 64 65 63 65 73 73 6f 72   its predecessor
18be0 2e 20 54 65 72 6d 73 20 61 72 65 20 73 74 6f 72  . Terms are stor
18bf0 65 64 20 77 69 74 68 69 6e 20 61 20 70 61 67 65  ed within a page
18c00 20 69 6e 20 73 6f 72 74 65 64 20 28 6d 65 6d 63   in sorted (memc
18c10 6d 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a 3c 68  mp).  order...<h
18c20 33 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65  3>Segment B-Tree
18c30 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 73 3c   Interior Nodes<
18c40 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  /h3>..<p>.  The 
18c50 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61  following diagra
18c60 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f  m depicts the fo
18c70 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e  rmat of a segmen
18c80 74 20 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f  t b-tree interio
18c90 72 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  r .  (non-leaf) 
18ca0 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a  node...<center>.
18cb0 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65    <img src=image
18cc0 73 2f 66 74 73 33 5f 69 6e 74 65 72 69 6f 72 5f  s/fts3_interior_
18cd0 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20  node.png>.  <p> 
18ce0 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 49  Segment B-Tree I
18cf0 6e 74 65 72 69 6f 72 20 4e 6f 64 65 20 46 6f 72  nterior Node For
18d00 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 0a  mat.</center>...
18d10 3c 68 32 3e 44 6f 63 6c 69 73 74 20 46 6f 72 6d  <h2>Doclist Form
18d20 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41  at</h2>..<p>.  A
18d30 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74   doclist consist
18d40 73 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66  s of an array of
18d50 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
18d60 6e 74 65 67 65 72 73 2c 20 73 65 72 69 61 6c 69  ntegers, seriali
18d70 7a 65 64 20 75 73 69 6e 67 0a 20 20 74 68 65 20  zed using.  the 
18d80 46 54 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61  FTS varint forma
18d90 74 2e 20 45 61 63 68 20 64 6f 63 6c 69 73 74 20  t. Each doclist 
18da0 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 75 70  entry is made up
18db0 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 20   of a series of 
18dc0 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65 20 69  two .  or more i
18dd0 6e 74 65 67 65 72 73 2c 20 61 73 20 66 6f 6c 6c  ntegers, as foll
18de0 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  ows:..<ol>.  <li
18df0 3e 20 54 68 65 20 64 6f 63 69 64 20 76 61 6c 75  > The docid valu
18e00 65 2e 20 54 68 65 20 66 69 72 73 74 20 65 6e 74  e. The first ent
18e10 72 79 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 20  ry in a doclist 
18e20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 69 74  contains the lit
18e30 65 72 61 6c 20 64 6f 63 69 64 0a 20 20 20 20 20  eral docid.     
18e40 20 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72    value. The fir
18e50 73 74 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  st field of each
18e60 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63 6c   subsequent docl
18e70 69 73 74 20 65 6e 74 72 79 20 63 6f 6e 74 61 69  ist entry contai
18e80 6e 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 64  ns the .       d
18e90 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
18ea0 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20  n the new docid 
18eb0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
18ec0 20 6f 6e 65 20 28 61 6c 77 61 79 73 20 61 20 70   one (always a p
18ed0 6f 73 69 74 69 76 65 20 0a 20 20 20 20 20 20 20  ositive .       
18ee0 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69 3e 20  number)..  <li> 
18ef0 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72  Zero or more ter
18f00 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 2e 20  m-offset lists. 
18f10 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69  A term-offset li
18f20 73 74 20 69 73 20 70 72 65 73 65 6e 74 20 66 6f  st is present fo
18f30 72 20 65 61 63 68 0a 20 20 20 20 20 20 20 63 6f  r each.       co
18f40 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20  lumn of the FTS 
18f50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
18f60 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
18f70 74 65 72 6d 2e 20 41 20 74 65 72 6d 2d 6f 66 66  term. A term-off
18f80 73 65 74 0a 20 20 20 20 20 20 20 6c 69 73 74 20  set.       list 
18f90 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
18fa0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
18fb0 3c 6f 6c 3e 0a 20 20 20 20 20 20 20 3c 6c 69 3e  <ol>.       <li>
18fc0 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20   Constant value 
18fd0 31 2e 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  1. This field is
18fe0 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79   omitted for any
18ff0 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
19000 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  t.            as
19010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f  sociated with co
19020 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c  lumn 0..       <
19030 6c 69 3e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  li> The column n
19040 75 6d 62 65 72 20 28 31 20 66 6f 72 20 74 68 65  umber (1 for the
19050 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74   second leftmost
19060 20 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29 2e 20   column, etc.). 
19070 54 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  This.           
19080 20 66 69 65 6c 64 20 69 73 20 6f 6d 69 74 74 65   field is omitte
19090 64 20 66 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f  d for any term-o
190a0 66 66 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63  ffset list assoc
190b0 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d  iated with colum
190c0 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e  n 0..       <li>
190d0 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 2d   A list of term-
190e0 6f 66 66 73 65 74 73 2c 20 73 6f 72 74 65 64 20  offsets, sorted 
190f0 66 72 6f 6d 20 73 6d 61 6c 6c 65 73 74 20 74 6f  from smallest to
19100 20 6c 61 72 67 65 73 74 2e 20 49 6e 73 74 65 61   largest. Instea
19110 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  d.            of
19120 20 73 74 6f 72 69 6e 67 20 74 68 65 20 74 65 72   storing the ter
19130 6d 2d 6f 66 66 73 65 74 20 76 61 6c 75 65 20 6c  m-offset value l
19140 69 74 65 72 61 6c 6c 79 2c 20 65 61 63 68 20 69  iterally, each i
19150 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 0a 20  nteger stored . 
19160 20 20 20 20 20 20 20 20 20 20 20 69 73 20 74 68             is th
19170 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
19180 77 65 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  ween the current
19190 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 61 6e 64   term-offset and
191a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20   the previous . 
191b0 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 28             one (
191c0 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 63  or zero if the c
191d0 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73  urrent term-offs
191e0 65 74 20 69 73 20 74 68 65 20 66 69 72 73 74 29  et is the first)
191f0 2c 20 70 6c 75 73 20 32 2e 0a 20 20 20 20 20 3c  , plus 2..     <
19200 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f 6e 73  /ol>.  <li> Cons
19210 74 61 6e 74 20 76 61 6c 75 65 20 30 2e 0a 3c 2f  tant value 0..</
19220 6f 6c 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20  ol>..<center>.  
19230 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f  <img src=images/
19240 66 74 73 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e  fts3_doclist2.pn
19250 67 3e 0a 20 20 3c 70 3e 20 46 54 53 33 20 44 6f  g>.  <p> FTS3 Do
19260 63 6c 69 73 74 20 46 6f 72 6d 61 74 0a 3c 2f 63  clist Format.</c
19270 65 6e 74 65 72 3e 0a 0a 3c 63 65 6e 74 65 72 3e  enter>..<center>
19280 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67  .  <img src=imag
19290 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 2e  es/fts3_doclist.
192a0 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53 20 44  png>.  <p> FTS D
192b0 6f 63 6c 69 73 74 20 45 6e 74 72 79 20 46 6f 72  oclist Entry For
192c0 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c  mat.</center>..<
192d0 70 3e 0a 20 20 46 6f 72 20 64 6f 63 6c 69 73 74  p>.  For doclist
192e0 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
192f0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
19300 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
19310 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a  lumn of the FTS.
19320 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c    virtual table,
19330 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
19340 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f  ts within the do
19350 63 6c 69 73 74 20 61 72 65 20 73 74 6f 72 65 64  clist are stored
19360 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75   in column .  nu
19370 6d 62 65 72 20 6f 72 64 65 72 2e 20 54 68 69 73  mber order. This
19380 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
19390 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69  e term-offset li
193a0 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
193b0 74 68 20 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28  th .  column 0 (
193c0 69 66 20 61 6e 79 29 20 69 73 20 61 6c 77 61 79  if any) is alway
193d0 73 20 66 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e  s first, allowin
193e0 67 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  g the first two 
193f0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 20 20  fields of the.  
19400 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
19410 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 69   to be omitted i
19420 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 0a 3c 68  n this case...<h
19430 31 20 69 64 3d 61 70 70 65 6e 64 69 78 5f 61 20  1 id=appendix_a 
19440 6e 6f 6e 75 6d 62 65 72 20 74 61 67 73 3d 22 73  nonumber tags="s
19450 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
19460 6e 20 74 69 70 73 22 3e 0a 20 20 41 70 70 65 6e  n tips">.  Appen
19470 64 69 78 20 41 3a 20 53 65 61 72 63 68 20 41 70  dix A: Search Ap
19480 70 6c 69 63 61 74 69 6f 6e 20 54 69 70 73 0a 3c  plication Tips.<
19490 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  /h1>..<p>.  FTS 
194a0 69 73 20 70 72 69 6d 61 72 69 6c 79 20 64 65 73  is primarily des
194b0 69 67 6e 65 64 20 74 6f 20 73 75 70 70 6f 72 74  igned to support
194c0 20 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d 74 65   Boolean full-te
194d0 78 74 20 71 75 65 72 69 65 73 20 2d 20 71 75 65  xt queries - que
194e0 72 69 65 73 0a 20 20 74 6f 20 66 69 6e 64 20 74  ries.  to find t
194f0 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
19500 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  nts that match a
19510 20 73 70 65 63 69 66 69 65 64 20 63 72 69 74 65   specified crite
19520 72 69 61 2e 20 48 6f 77 65 76 65 72 2c 20 6d 61  ria. However, ma
19530 6e 79 20 0a 20 20 28 6d 6f 73 74 3f 29 20 73 65  ny .  (most?) se
19540 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
19550 73 20 72 65 71 75 69 72 65 20 74 68 61 74 20 72  s require that r
19560 65 73 75 6c 74 73 20 61 72 65 20 73 6f 6d 65 68  esults are someh
19570 6f 77 20 72 61 6e 6b 65 64 20 69 6e 20 6f 72 64  ow ranked in ord
19580 65 72 0a 20 20 6f 66 20 22 72 65 6c 65 76 61 6e  er.  of "relevan
19590 63 65 22 2c 20 77 68 65 72 65 20 22 72 65 6c 65  ce", where "rele
195a0 76 61 6e 63 65 22 20 69 73 20 64 65 66 69 6e 65  vance" is define
195b0 64 20 61 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  d as the likelih
195c0 6f 6f 64 20 74 68 61 74 20 74 68 65 20 75 73 65  ood that the use
195d0 72 0a 20 20 77 68 6f 20 70 65 72 66 6f 72 6d 65  r.  who performe
195e0 64 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  d the search is 
195f0 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20 61 20  interested in a 
19600 73 70 65 63 69 66 69 63 20 65 6c 65 6d 65 6e 74  specific element
19610 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
19620 0a 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  .  set of docume
19630 6e 74 73 2e 20 57 68 65 6e 20 75 73 69 6e 67 20  nts. When using 
19640 61 20 73 65 61 72 63 68 20 65 6e 67 69 6e 65 20  a search engine 
19650 74 6f 20 66 69 6e 64 20 64 6f 63 75 6d 65 6e 74  to find document
19660 73 20 6f 6e 20 74 68 65 20 77 6f 72 6c 64 0a 20  s on the world. 
19670 20 77 69 64 65 20 77 65 62 2c 20 74 68 65 20 75   wide web, the u
19680 73 65 72 20 65 78 70 65 63 74 73 20 74 68 61 74  ser expects that
19690 20 74 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c   the most useful
196a0 2c 20 6f 72 20 22 72 65 6c 65 76 61 6e 74 22 2c  , or "relevant",
196b0 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 77 69   documents .  wi
196c0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
196d0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
196e0 20 6f 66 20 72 65 73 75 6c 74 73 2c 20 61 6e 64   of results, and
196f0 20 74 68 61 74 20 65 61 63 68 20 73 75 62 73 65   that each subse
19700 71 75 65 6e 74 20 70 61 67 65 20 0a 20 20 63 6f  quent page .  co
19710 6e 74 61 69 6e 73 20 70 72 6f 67 72 65 73 73 69  ntains progressi
19720 76 65 6c 79 20 6c 65 73 73 20 72 65 6c 65 76 61  vely less releva
19730 6e 74 20 72 65 73 75 6c 74 73 2e 20 45 78 61 63  nt results. Exac
19740 74 6c 79 20 68 6f 77 20 61 20 6d 61 63 68 69 6e  tly how a machin
19750 65 20 63 61 6e 20 0a 20 20 64 65 74 65 72 6d 69  e can .  determi
19760 6e 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 6c 65  ne document rele
19770 76 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 61  vance based on a
19780 20 75 73 65 72 73 20 71 75 65 72 79 20 69 73 20   users query is 
19790 61 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 72  a complicated pr
197a0 6f 62 6c 65 6d 0a 20 20 61 6e 64 20 74 68 65 20  oblem.  and the 
197b0 73 75 62 6a 65 63 74 20 6f 66 20 6d 75 63 68 20  subject of much 
197c0 6f 6e 67 6f 69 6e 67 20 72 65 73 65 61 72 63 68  ongoing research
197d0 2e 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76 65 72  ...<p>.  One ver
197e0 79 20 73 69 6d 70 6c 65 20 73 63 68 65 6d 65 20  y simple scheme 
197f0 6d 69 67 68 74 20 62 65 20 74 6f 20 63 6f 75 6e  might be to coun
19800 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19810 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
19820 20 0a 20 20 75 73 65 72 73 20 73 65 61 72 63 68   .  users search
19830 20 74 65 72 6d 73 20 69 6e 20 65 61 63 68 20 72   terms in each r
19840 65 73 75 6c 74 20 64 6f 63 75 6d 65 6e 74 2e 20  esult document. 
19850 54 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73 20  Those documents 
19860 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 6d  that contain.  m
19870 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  any instances of
19880 20 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 63   the terms are c
19890 6f 6e 73 69 64 65 72 65 64 20 6d 6f 72 65 20 72  onsidered more r
198a0 65 6c 65 76 61 6e 74 20 74 68 61 6e 20 74 68 6f  elevant than tho
198b0 73 65 20 77 69 74 68 0a 20 20 61 20 73 6d 61 6c  se with.  a smal
198c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74  l number of inst
198d0 61 6e 63 65 73 20 6f 66 20 65 61 63 68 20 74 65  ances of each te
198e0 72 6d 2e 20 49 6e 20 61 6e 20 46 54 53 20 61 70  rm. In an FTS ap
198f0 70 6c 69 63 61 74 69 6f 6e 2c 20 74 68 65 20 0a  plication, the .
19900 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d    number of term
19910 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 65 61   instances in ea
19920 63 68 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  ch result could 
19930 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
19940 20 63 6f 75 6e 74 69 6e 67 0a 20 20 74 68 65 20   counting.  the 
19950 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  number of intege
19960 72 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  rs in the return
19970 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 5b 6f   value of the [o
19980 66 66 73 65 74 73 5d 20 66 75 6e 63 74 69 6f 6e  ffsets] function
19990 2e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..  The followin
199a0 67 20 65 78 61 6d 70 6c 65 20 73 68 6f 77 73 20  g example shows 
199b0 61 20 71 75 65 72 79 20 74 68 61 74 20 63 6f 75  a query that cou
199c0 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62  ld be used to ob
199d0 74 61 69 6e 20 74 68 65 0a 20 20 74 65 6e 20 6d  tain the.  ten m
199e0 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73  ost relevant res
199f0 75 6c 74 73 20 66 6f 72 20 61 20 71 75 65 72 79  ults for a query
19a00 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20   entered by the 
19a10 75 73 65 72 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  user:..<codebloc
19a20 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20  k>.  <i>-- This 
19a30 65 78 61 6d 70 6c 65 20 28 61 6e 64 20 61 6c 6c  example (and all
19a40 20 6f 74 68 65 72 73 20 69 6e 20 74 68 69 73 20   others in this 
19a50 73 65 63 74 69 6f 6e 29 20 61 73 73 75 6d 65 73  section) assumes
19a60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
19a70 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41  chema</i>.  CREA
19a80 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
19a90 20 64 6f 63 75 6d 65 6e 74 73 20 55 53 49 4e 47   documents USING
19aa0 20 66 74 73 33 28 74 69 74 6c 65 2c 20 63 6f 6e   fts3(title, con
19ab0 74 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  tent);..  <i>-- 
19ac0 41 73 73 75 6d 69 6e 67 20 74 68 65 20 61 70 70  Assuming the app
19ad0 6c 69 63 61 74 69 6f 6e 20 68 61 73 20 73 75 70  lication has sup
19ae0 70 6c 69 65 64 20 61 6e 20 53 51 4c 69 74 65 20  plied an SQLite 
19af0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  user function na
19b00 6d 65 64 20 22 63 6f 75 6e 74 69 6e 74 65 67 65  med "countintege
19b10 72 73 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  rs"</i>.  <i>-- 
19b20 74 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65  that returns the
19b30 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65   number of space
19b40 2d 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67  -separated integ
19b50 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
19b60 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65   its only argume
19b70 6e 74 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  nt,</i>.  <i>-- 
19b80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
19b90 65 72 79 20 63 6f 75 6c 64 20 62 65 20 75 73 65  ery could be use
19ba0 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
19bb0 74 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30  titles of the 10
19bc0 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
19bd0 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69  contain</i>.  <i
19be0 3e 2d 2d 20 74 68 65 20 67 72 65 61 74 65 73 74  >-- the greatest
19bf0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
19c00 6e 63 65 73 20 6f 66 20 74 68 65 20 75 73 65 72  nces of the user
19c10 73 20 71 75 65 72 79 20 74 65 72 6d 73 2e 20 48  s query terms. H
19c20 6f 70 65 66 75 6c 6c 79 2c 20 74 68 65 73 65 20  opefully, these 
19c30 31 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64  10</i>.  <i>-- d
19c40 6f 63 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  ocuments will be
19c50 20 74 68 6f 73 65 20 74 68 61 74 20 74 68 65 20   those that the 
19c60 75 73 65 72 73 20 63 6f 6e 73 69 64 65 72 73 20  users considers 
19c70 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20 74 68 65  more or less the
19c80 20 6d 6f 73 74 20 22 72 65 6c 65 76 61 6e 74 22   most "relevant"
19c90 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74  .</i>.  SELECT t
19ca0 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65  itle FROM docume
19cb0 6e 74 73 20 0a 20 20 20 20 57 48 45 52 45 20 64  nts .    WHERE d
19cc0 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26  ocuments MATCH &
19cd0 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20  lt;query&gt;.   
19ce0 20 4f 52 44 45 52 20 42 59 20 63 6f 75 6e 74 69   ORDER BY counti
19cf0 6e 74 65 67 65 72 73 28 6f 66 66 73 65 74 73 28  ntegers(offsets(
19d00 64 6f 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43  documents)) DESC
19d10 0a 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46  .    LIMIT 10 OF
19d20 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f  FSET 0.</codeblo
19d30 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 71  ck>..<p>.  The q
19d40 75 65 72 79 20 61 62 6f 76 65 20 63 6f 75 6c 64  uery above could
19d50 20 62 65 20 6d 61 64 65 20 74 6f 20 72 75 6e 20   be made to run 
19d60 66 61 73 74 65 72 20 62 79 20 75 73 69 6e 67 20  faster by using 
19d70 74 68 65 20 46 54 53 20 5b 6d 61 74 63 68 69 6e  the FTS [matchin
19d80 66 6f 5d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 74  fo].  function t
19d90 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
19da0 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
19db0 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 74  term instances t
19dc0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 65 61  hat appear in ea
19dd0 63 68 0a 20 20 72 65 73 75 6c 74 2e 20 54 68 65  ch.  result. The
19de0 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74   matchinfo funct
19df0 69 6f 6e 20 69 73 20 6d 75 63 68 20 6d 6f 72 65  ion is much more
19e00 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20   efficient than 
19e10 74 68 65 20 6f 66 66 73 65 74 73 20 0a 20 20 66  the offsets .  f
19e20 75 6e 63 74 69 6f 6e 2e 20 46 75 72 74 68 65 72  unction. Further
19e30 6d 6f 72 65 2c 20 74 68 65 20 6d 61 74 63 68 69  more, the matchi
19e40 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f  nfo function pro
19e50 76 69 64 65 73 20 65 78 74 72 61 20 69 6e 66 6f  vides extra info
19e60 72 6d 61 74 69 6f 6e 0a 20 20 72 65 67 61 72 64  rmation.  regard
19e70 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
19e80 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72  number of occurr
19e90 65 6e 63 65 73 20 6f 66 20 65 61 63 68 20 71 75  ences of each qu
19ea0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
19eb0 65 6e 74 69 72 65 0a 20 20 64 6f 63 75 6d 65 6e  entire.  documen
19ec0 74 20 73 65 74 20 28 6e 6f 74 20 6a 75 73 74 20  t set (not just 
19ed0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 29  the current row)
19ee0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
19ef0 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20  of documents in 
19f00 77 68 69 63 68 20 0a 20 20 65 61 63 68 20 71 75  which .  each qu
19f10 65 72 79 20 74 65 72 6d 20 61 70 70 65 61 72 73  ery term appears
19f20 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 75 73  . This may be us
19f30 65 64 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ed (for example)
19f40 20 74 6f 20 61 74 74 61 63 68 20 61 20 68 69 67   to attach a hig
19f50 68 65 72 0a 20 20 77 65 69 67 68 74 20 74 6f 20  her.  weight to 
19f60 6c 65 73 73 20 63 6f 6d 6d 6f 6e 20 74 65 72 6d  less common term
19f70 73 20 77 68 69 63 68 20 6d 61 79 20 69 6e 63 72  s which may incr
19f80 65 61 73 65 20 74 68 65 20 6f 76 65 72 61 6c 6c  ease the overall
19f90 20 63 6f 6d 70 75 74 65 64 20 72 65 6c 65 76 61   computed releva
19fa0 6e 63 79 20 0a 20 20 6f 66 20 74 68 6f 73 65 20  ncy .  of those 
19fb0 72 65 73 75 6c 74 73 20 74 68 65 20 75 73 65 72  results the user
19fc0 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f 72 65 20   considers more 
19fd0 69 6e 74 65 72 65 73 74 69 6e 67 2e 0a 0a 3c 63  interesting...<c
19fe0 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
19ff0 2d 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  - If the applica
1a000 74 69 6f 6e 20 73 75 70 70 6c 69 65 73 20 61 6e  tion supplies an
1a010 20 53 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e   SQLite user fun
1a020 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 22 72 61  ction called "ra
1a030 6e 6b 22 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c  nk" that</i>.  <
1a040 69 3e 2d 2d 20 69 6e 74 65 72 70 72 65 74 73 20  i>-- interprets 
1a050 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
1a060 20 72 65 74 75 72 6e 65 64 20 62 79 20 6d 61 74   returned by mat
1a070 63 68 69 6e 66 6f 20 61 6e 64 20 72 65 74 75 72  chinfo and retur
1a080 6e 73 20 61 20 6e 75 6d 65 72 69 63 3c 2f 69 3e  ns a numeric</i>
1a090 0a 20 20 3c 69 3e 2d 2d 20 72 65 6c 65 76 61 6e  .  <i>-- relevan
1a0a0 63 79 20 62 61 73 65 64 20 6f 6e 20 69 74 2c 20  cy based on it, 
1a0b0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1a0c0 6e 67 20 53 51 4c 20 6d 61 79 20 62 65 20 75 73  ng SQL may be us
1a0d0 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
1a0e0 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 69 74  </i>.  <i>-- tit
1a0f0 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20 6d 6f  les of the 10 mo
1a100 73 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75  st relevant docu
1a110 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
1a120 61 73 65 74 20 66 6f 72 20 61 20 75 73 65 72 73  aset for a users
1a130 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45   query.</i>.  SE
1a140 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20  LECT title FROM 
1a150 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57  documents .    W
1a160 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
1a170 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
1a180 74 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  t;.    ORDER BY 
1a190 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64  rank(matchinfo(d
1a1a0 6f 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a  ocuments)) DESC.
1a1b0 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46      LIMIT 10 OFF
1a1c0 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63  SET 0.</codebloc
1a1d0 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51  k>..<p>.  The SQ
1a1e0 4c 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 65  L query in the e
1a1f0 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 75 73 65  xample above use
1a200 73 20 6c 65 73 73 20 43 50 55 20 74 68 61 6e 20  s less CPU than 
1a210 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
1a220 65 0a 20 20 69 6e 20 74 68 69 73 20 73 65 63 74  e.  in this sect
1a230 69 6f 6e 2c 20 62 75 74 20 73 74 69 6c 6c 20 68  ion, but still h
1a240 61 73 20 61 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73  as a non-obvious
1a250 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 72 6f   performance pro
1a260 62 6c 65 6d 2e 20 53 51 4c 69 74 65 0a 20 20 73  blem. SQLite.  s
1a270 61 74 69 73 66 69 65 73 20 74 68 69 73 20 71 75  atisfies this qu
1a280 65 72 79 20 62 79 20 72 65 74 72 69 65 76 69 6e  ery by retrievin
1a290 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  g the value of t
1a2a0 68 65 20 22 74 69 74 6c 65 22 20 63 6f 6c 75 6d  he "title" colum
1a2b0 6e 20 61 6e 64 0a 20 20 6d 61 74 63 68 69 6e 66  n and.  matchinf
1a2c0 6f 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  o data from the 
1a2d0 46 54 53 20 6d 6f 64 75 6c 65 20 66 6f 72 20 65  FTS module for e
1a2e0 76 65 72 79 20 72 6f 77 20 6d 61 74 63 68 65 64  very row matched
1a2f0 20 62 79 20 74 68 65 20 75 73 65 72 73 0a 20 20   by the users.  
1a300 71 75 65 72 79 20 62 65 66 6f 72 65 20 69 74 20  query before it 
1a310 73 6f 72 74 73 20 61 6e 64 20 6c 69 6d 69 74 73  sorts and limits
1a320 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 42 65   the results. Be
1a330 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
1a340 20 53 51 4c 69 74 65 27 73 0a 20 20 76 69 72 74   SQLite's.  virt
1a350 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66  ual table interf
1a360 61 63 65 20 77 6f 72 6b 73 2c 20 72 65 74 72 69  ace works, retri
1a370 65 76 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  eving the value 
1a380 6f 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 63  of the "title" c
1a390 6f 6c 75 6d 6e 0a 20 20 72 65 71 75 69 72 65 73  olumn.  requires
1a3a0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 65 6e 74   loading the ent
1a3b0 69 72 65 20 72 6f 77 20 66 72 6f 6d 20 64 69 73  ire row from dis
1a3c0 6b 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  k (including the
1a3d0 20 22 63 6f 6e 74 65 6e 74 22 20 66 69 65 6c 64   "content" field
1a3e0 2c 0a 20 20 77 68 69 63 68 20 6d 61 79 20 62 65  ,.  which may be
1a3f0 20 71 75 69 74 65 20 6c 61 72 67 65 29 2e 20 54   quite large). T
1a400 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69  his means that i
1a410 66 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72  f the users quer
1a420 79 20 6d 61 74 63 68 65 73 0a 20 20 73 65 76 65  y matches.  seve
1a430 72 61 6c 20 74 68 6f 75 73 61 6e 64 20 64 6f 63  ral thousand doc
1a440 75 6d 65 6e 74 73 2c 20 6d 61 6e 79 20 6d 65 67  uments, many meg
1a450 61 62 79 74 65 73 20 6f 66 20 22 74 69 74 6c 65  abytes of "title
1a460 22 20 61 6e 64 20 22 63 6f 6e 74 65 6e 74 22 20  " and "content" 
1a470 64 61 74 61 0a 20 20 6d 61 79 20 62 65 20 6c 6f  data.  may be lo
1a480 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69  aded from disk i
1a490 6e 74 6f 20 6d 65 6d 6f 72 79 20 65 76 65 6e 20  nto memory even 
1a4a0 74 68 6f 75 67 68 20 74 68 65 79 20 77 69 6c 6c  though they will
1a4b0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 0a 20   never be used. 
1a4c0 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
1a4d0 2e 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51  . ..<p>.  The SQ
1a4e0 4c 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 66  L query in the f
1a4f0 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65  ollowing example
1a500 20 62 6c 6f 63 6b 20 69 73 20 6f 6e 65 20 73 6f   block is one so
1a510 6c 75 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 0a  lution to this .
1a520 20 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 20 53 51    problem. In SQ
1a530 4c 69 74 65 2c 20 77 68 65 6e 20 61 20 3c 61 20  Lite, when a <a 
1a540 68 72 65 66 3d 22 6f 70 74 6f 76 65 72 76 69 65  href="optovervie
1a550 77 2e 68 74 6d 6c 23 66 6c 61 74 74 65 6e 69 6e  w.html#flattenin
1a560 67 22 3e 73 75 62 2d 71 75 65 72 79 20 0a 20 20  g">sub-query .  
1a570 75 73 65 64 20 69 6e 20 61 20 6a 6f 69 6e 20 63  used in a join c
1a580 6f 6e 74 61 69 6e 73 20 61 20 4c 49 4d 49 54 20  ontains a LIMIT 
1a590 63 6c 61 75 73 65 3c 2f 61 3e 2c 20 74 68 65 20  clause</a>, the 
1a5a0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
1a5b0 75 62 2d 71 75 65 72 79 20 61 72 65 0a 20 20 63  ub-query are.  c
1a5c0 61 6c 63 75 6c 61 74 65 64 20 61 6e 64 20 73 74  alculated and st
1a5d0 6f 72 65 64 20 69 6e 20 74 65 6d 70 6f 72 61 72  ored in temporar
1a5e0 79 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 74  y table before t
1a5f0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 20 69 73  he main query is
1a600 20 65 78 65 63 75 74 65 64 2e 0a 20 20 54 68 69   executed..  Thi
1a610 73 20 6d 65 61 6e 73 20 74 68 61 74 20 53 51 4c  s means that SQL
1a620 69 74 65 20 77 69 6c 6c 20 6c 6f 61 64 20 6f 6e  ite will load on
1a630 6c 79 20 74 68 65 20 64 6f 63 69 64 20 61 6e 64  ly the docid and
1a640 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20   matchinfo data 
1a650 66 6f 72 20 65 61 63 68 0a 20 20 72 6f 77 20 6d  for each.  row m
1a660 61 74 63 68 69 6e 67 20 74 68 65 20 75 73 65 72  atching the user
1a670 73 20 71 75 65 72 79 20 69 6e 74 6f 20 6d 65 6d  s query into mem
1a680 6f 72 79 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ory, determine t
1a690 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65 73 0a  he docid values.
1a6a0 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
1a6b0 74 6f 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20  to the ten most 
1a6c0 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e  relevant documen
1a6d0 74 73 2c 20 74 68 65 6e 20 6c 6f 61 64 20 6f 6e  ts, then load on
1a6e0 6c 79 20 74 68 65 20 74 69 74 6c 65 0a 20 20 61  ly the title.  a
1a6f0 6e 64 20 63 6f 6e 74 65 6e 74 20 69 6e 66 6f 72  nd content infor
1a700 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 6f 73 65  mation for those
1a710 20 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 6f 6e   10 documents on
1a720 6c 79 2e 20 42 65 63 61 75 73 65 20 62 6f 74 68  ly. Because both
1a730 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 0a 20   the matchinfo. 
1a740 20 61 6e 64 20 64 6f 63 69 64 20 76 61 6c 75 65   and docid value
1a750 73 20 61 72 65 20 67 6c 65 61 6e 65 64 20 65 6e  s are gleaned en
1a760 74 69 72 65 6c 79 20 66 72 6f 6d 20 74 68 65 20  tirely from the 
1a770 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c  full-text index,
1a780 20 74 68 69 73 20 72 65 73 75 6c 74 73 0a 20 20   this results.  
1a790 69 6e 20 64 72 61 6d 61 74 69 63 61 6c 6c 79 20  in dramatically 
1a7a0 6c 65 73 73 20 64 61 74 61 20 62 65 69 6e 67 20  less data being 
1a7b0 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
1a7c0 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 6d 65  database into me
1a7d0 6d 6f 72 79 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mory...<codebloc
1a7e0 6b 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c  k>.  SELECT titl
1a7f0 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73  e FROM documents
1a800 20 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20 20 53   JOIN ( .      S
1a810 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 72 61 6e  ELECT docid, ran
1a820 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75  k(matchinfo(docu
1a830 6d 65 6e 74 73 29 29 20 41 53 20 72 61 6e 6b 20  ments)) AS rank 
1a840 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75  .      FROM docu
1a850 6d 65 6e 74 73 0a 20 20 20 20 20 20 57 48 45 52  ments.      WHER
1a860 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43  E documents MATC
1a870 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a  H &lt;query&gt;.
1a880 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 72        ORDER BY r
1a890 61 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20  ank DESC .      
1a8a0 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
1a8b0 30 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62  0.  ) AS ranktab
1a8c0 6c 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a  le USING(docid).
1a8d0 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 74    ORDER BY rankt
1a8e0 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a 3c  able.rank DESC.<
1a8f0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
1a900 0a 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .  The next bloc
1a910 6b 20 6f 66 20 53 51 4c 20 65 6e 68 61 6e 63 65  k of SQL enhance
1a920 73 20 74 68 65 20 71 75 65 72 79 20 77 69 74 68  s the query with
1a930 20 73 6f 6c 75 74 69 6f 6e 73 20 74 6f 20 74 77   solutions to tw
1a940 6f 20 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 73  o other problems
1a950 0a 20 20 74 68 61 74 20 6d 61 79 20 61 72 69 73  .  that may aris
1a960 65 20 69 6e 20 64 65 76 65 6c 6f 70 69 6e 67 20  e in developing 
1a970 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69  search applicati
1a980 6f 6e 73 20 75 73 69 6e 67 20 46 54 53 3a 0a 0a  ons using FTS:..
1a990 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a  <ol>.  <li> <p>.
1a9a0 20 20 20 20 20 20 20 54 68 65 20 5b 73 6e 69 70         The [snip
1a9b0 70 65 74 5d 20 66 75 6e 63 74 69 6f 6e 20 63 61  pet] function ca
1a9c0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74  nnot be used wit
1a9d0 68 20 74 68 65 20 61 62 6f 76 65 20 71 75 65 72  h the above quer
1a9e0 79 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 20  y. Because.     
1a9f0 20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72    the outer quer
1aa00 79 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  y does not inclu
1aa10 64 65 20 61 20 22 57 48 45 52 45 20 2e 2e 2e 20  de a "WHERE ... 
1aa20 4d 41 54 43 48 22 20 63 6c 61 75 73 65 2c 20 74  MATCH" clause, t
1aa30 68 65 20 73 6e 69 70 70 65 74 20 0a 20 20 20 20  he snippet .    
1aa40 20 20 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20     function may 
1aa50 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
1aa60 20 69 74 2e 20 4f 6e 65 20 73 6f 6c 75 74 69 6f   it. One solutio
1aa70 6e 20 69 73 20 74 6f 20 64 75 70 6c 69 63 61 74  n is to duplicat
1aa80 65 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  e the WHERE.    
1aa90 20 20 20 63 6c 61 75 73 65 20 75 73 65 64 20 62     clause used b
1aaa0 79 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  y the sub-query 
1aab0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1aac0 72 79 2e 20 54 68 65 20 6f 76 65 72 68 65 61 64  ry. The overhead
1aad0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
1aae0 20 20 20 77 69 74 68 20 74 68 69 73 20 69 73 20     with this is 
1aaf0 75 73 75 61 6c 6c 79 20 6e 65 67 6c 69 67 69 62  usually negligib
1ab00 6c 65 2e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20  le..  <li> <p>. 
1ab10 20 20 20 20 20 20 54 68 65 20 72 65 6c 65 76 61        The releva
1ab20 6e 63 79 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e  ncy of a documen
1ab30 74 20 6d 61 79 20 64 65 70 65 6e 64 20 6f 6e 20  t may depend on 
1ab40 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
1ab50 74 68 61 6e 20 6a 75 73 74 0a 20 20 20 20 20 20  than just.      
1ab60 20 74 68 65 20 64 61 74 61 20 61 76 61 69 6c 61   the data availa
1ab70 62 6c 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  ble in the retur
1ab80 6e 20 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68  n value of match
1ab90 69 6e 66 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c  info. For exampl
1aba0 65 0a 20 20 20 20 20 20 20 65 61 63 68 20 64 6f  e.       each do
1abb0 63 75 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  cument in the da
1abc0 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 73  tabase may be as
1abd0 73 69 67 6e 65 64 20 61 20 73 74 61 74 69 63 20  signed a static 
1abe0 77 65 69 67 68 74 20 62 61 73 65 64 0a 20 20 20  weight based.   
1abf0 20 20 20 20 6f 6e 20 66 61 63 74 6f 72 73 20 75      on factors u
1ac00 6e 72 65 6c 61 74 65 64 20 74 6f 20 69 74 73 20  nrelated to its 
1ac10 63 6f 6e 74 65 6e 74 20 28 6f 72 69 67 69 6e 2c  content (origin,
1ac20 20 61 75 74 68 6f 72 2c 20 61 67 65 2c 20 6e 75   author, age, nu
1ac30 6d 62 65 72 0a 20 20 20 20 20 20 20 6f 66 20 72  mber.       of r
1ac40 65 66 65 72 65 6e 63 65 73 20 65 74 63 2e 29 2e  eferences etc.).
1ac50 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   These values ca
1ac60 6e 20 62 65 20 73 74 6f 72 65 64 20 62 79 20 74  n be stored by t
1ac70 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  he application. 
1ac80 20 20 20 20 20 20 69 6e 20 61 20 73 65 70 61 72        in a separ
1ac90 61 74 65 20 74 61 62 6c 65 20 74 68 61 74 20 63  ate table that c
1aca0 61 6e 20 62 65 20 6a 6f 69 6e 65 64 20 61 67 61  an be joined aga
1acb0 69 6e 73 74 20 74 68 65 20 64 6f 63 75 6d 65 6e  inst the documen
1acc0 74 73 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  ts table.       
1acd0 69 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  in the sub-query
1ace0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 61 6e   so that the ran
1acf0 6b 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  k function may a
1ad00 63 63 65 73 73 20 74 68 65 6d 2e 0a 3c 2f 6f 6c  ccess them..</ol
1ad10 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 76 65  >..<p>.  This ve
1ad20 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65  rsion of the que
1ad30 72 79 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c  ry is very simil
1ad40 61 72 20 74 6f 20 74 68 61 74 20 75 73 65 64 20  ar to that used 
1ad50 62 79 20 74 68 65 20 0a 20 20 3c 61 20 68 72 65  by the .  <a hre
1ad60 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  f="http://www.sq
1ad70 6c 69 74 65 2e 6f 72 67 2f 73 65 61 72 63 68 3f  lite.org/search?
1ad80 71 3d 66 74 73 33 22 3e 73 71 6c 69 74 65 2e 6f  q=fts3">sqlite.o
1ad90 72 67 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  rg documentation
1ada0 20 73 65 61 72 63 68 3c 2f 61 3e 20 0a 20 20 61   search</a> .  a
1adb0 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c 63 6f  pplication...<co
1adc0 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
1add0 20 54 68 69 73 20 74 61 62 6c 65 20 73 74 6f 72   This table stor
1ade0 65 73 20 74 68 65 20 73 74 61 74 69 63 20 77 65  es the static we
1adf0 69 67 68 74 20 61 73 73 69 67 6e 65 64 20 74 6f  ight assigned to
1ae00 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69   each document i
1ae10 6e 20 46 54 53 20 74 61 62 6c 65 3c 2f 69 3e 0a  n FTS table</i>.
1ae20 20 20 3c 69 3e 2d 2d 20 22 64 6f 63 75 6d 65 6e    <i>-- "documen
1ae30 74 73 22 2e 20 46 6f 72 20 65 61 63 68 20 72 6f  ts". For each ro
1ae40 77 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  w in the documen
1ae50 74 73 20 74 61 62 6c 65 20 74 68 65 72 65 20 69  ts table there i
1ae60 73 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  s a correspondin
1ae70 67 20 72 6f 77 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  g row</i>.  <i>-
1ae80 2d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  - with the same 
1ae90 64 6f 63 69 64 20 76 61 6c 75 65 20 69 6e 20 74  docid value in t
1aea0 68 69 73 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  his table.</i>. 
1aeb0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f   CREATE TABLE do
1aec0 63 75 6d 65 6e 74 73 5f 64 61 74 61 28 64 6f 63  cuments_data(doc
1aed0 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
1aee0 52 59 20 4b 45 59 2c 20 77 65 69 67 68 74 29 3b  RY KEY, weight);
1aef0 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71  ..  <i>-- This q
1af00 75 65 72 79 20 69 73 20 73 69 6d 69 6c 61 72 20  uery is similar 
1af10 74 6f 20 74 68 65 20 6f 6e 65 20 69 6e 20 74 68  to the one in th
1af20 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 65  e block above, e
1af30 78 63 65 70 74 20 74 68 61 74 3a 3c 2f 69 3e 0a  xcept that:</i>.
1af40 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
1af50 3e 2d 2d 20 20 20 31 2e 20 49 74 20 72 65 74 75  >--   1. It retu
1af60 72 6e 73 20 61 20 22 73 6e 69 70 70 65 74 22 20  rns a "snippet" 
1af70 6f 66 20 74 65 78 74 20 61 6c 6f 6e 67 20 77 69  of text along wi
1af80 74 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  th the document 
1af90 74 69 74 6c 65 20 66 6f 72 20 64 69 73 70 6c 61  title for displa
1afa0 79 2e 20 53 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  y. So</i>.  <i>-
1afb0 2d 20 20 20 20 20 20 74 68 61 74 20 74 68 65 20  -      that the 
1afc0 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e  snippet function
1afd0 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20 74 68   may be used, th
1afe0 65 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54  e "WHERE ... MAT
1aff0 43 48 20 2e 2e 2e 22 20 63 6c 61 75 73 65 20 66  CH ..." clause f
1b000 72 6f 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  rom</i>.  <i>-- 
1b010 20 20 20 20 20 74 68 65 20 73 75 62 2d 71 75 65       the sub-que
1b020 72 79 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  ry is duplicated
1b030 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1b040 65 72 79 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ery.</i>.  <i>--
1b050 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 32  </i>.  <i>--   2
1b060 2e 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20  . The sub-query 
1b070 6a 6f 69 6e 73 20 74 68 65 20 64 6f 63 75 6d 65  joins the docume
1b080 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68 20 74  nts table with t
1b090 68 65 20 64 6f 63 75 6d 65 6e 74 5f 64 61 74 61  he document_data
1b0a0 20 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 3c   table, so that<
1b0b0 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
1b0c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b0d0 6f 66 20 74 68 65 20 72 61 6e 6b 20 66 75 6e 63  of the rank func
1b0e0 74 69 6f 6e 20 68 61 73 20 61 63 63 65 73 73 20  tion has access 
1b0f0 74 6f 20 74 68 65 20 73 74 61 74 69 63 20 77 65  to the static we
1b100 69 67 68 74 20 61 73 73 69 67 6e 65 64 3c 2f 69  ight assigned</i
1b110 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74  >.  <i>--      t
1b120 6f 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e  o each document.
1b130 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69  </i>.  SELECT ti
1b140 74 6c 65 2c 20 73 6e 69 70 70 65 74 28 64 6f 63  tle, snippet(doc
1b150 75 6d 65 6e 74 73 29 20 46 52 4f 4d 20 64 6f 63  uments) FROM doc
1b160 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20  uments JOIN ( . 
1b170 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69       SELECT doci
1b180 64 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66  d, rank(matchinf
1b190 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c 20 64 6f  o(documents), do
1b1a0 63 75 6d 65 6e 74 73 5f 64 61 74 61 2e 77 65 69  cuments_data.wei
1b1b0 67 68 74 29 20 41 53 20 72 61 6e 6b 0a 20 20 20  ght) AS rank.   
1b1c0 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74     FROM document
1b1d0 73 20 4a 4f 49 4e 20 64 6f 63 75 6d 65 6e 74 73  s JOIN documents
1b1e0 5f 64 61 74 61 20 55 53 49 4e 47 28 64 6f 63 69  _data USING(doci
1b1f0 64 29 0a 20 20 20 20 20 20 57 48 45 52 45 20 64  d).      WHERE d
1b200 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26  ocuments MATCH &
1b210 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20  lt;query&gt;.   
1b220 20 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b     ORDER BY rank
1b230 20 44 45 53 43 20 0a 20 20 20 20 20 20 4c 49 4d   DESC .      LIM
1b240 49 54 20 31 30 20 4f 46 46 53 45 54 20 30 0a 20  IT 10 OFFSET 0. 
1b250 20 29 20 41 53 20 72 61 6e 6b 74 61 62 6c 65 20   ) AS ranktable 
1b260 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20 20 57  USING(docid).  W
1b270 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
1b280 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
1b290 74 3b 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61  t;.  ORDER BY ra
1b2a0 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53  nktable.rank DES
1b2b0 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  C.</codeblock>..
1b2c0 3c 70 3e 0a 20 20 41 6c 6c 20 74 68 65 20 65 78  <p>.  All the ex
1b2d0 61 6d 70 6c 65 20 71 75 65 72 69 65 73 20 61 62  ample queries ab
1b2e0 6f 76 65 20 72 65 74 75 72 6e 20 74 68 65 20 74  ove return the t
1b2f0 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74  en most relevant
1b300 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 0a   query results..
1b310 20 20 42 79 20 6d 6f 64 69 66 79 69 6e 67 20 74    By modifying t
1b320 68 65 20 76 61 6c 75 65 73 20 75 73 65 64 20 77  he values used w
1b330 69 74 68 20 74 68 65 20 4f 46 46 53 45 54 20 61  ith the OFFSET a
1b340 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73  nd LIMIT clauses
1b350 2c 20 61 20 71 75 65 72 79 20 0a 20 20 74 6f 20  , a query .  to 
1b360 72 65 74 75 72 6e 20 28 73 61 79 29 20 74 68 65  return (say) the
1b370 20 6e 65 78 74 20 74 65 6e 20 6d 6f 73 74 20 72   next ten most r
1b380 65 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73 20  elevant results 
1b390 69 73 20 65 61 73 79 20 74 6f 20 63 6f 6e 73 74  is easy to const
1b3a0 72 75 63 74 2e 20 0a 20 20 54 68 69 73 20 6d 61  ruct. .  This ma
1b3b0 79 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74  y be used to obt
1b3c0 61 69 6e 20 74 68 65 20 64 61 74 61 20 72 65 71  ain the data req
1b3d0 75 69 72 65 64 20 66 6f 72 20 61 20 73 65 61 72  uired for a sear
1b3e0 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ch applications 
1b3f0 73 65 63 6f 6e 64 0a 20 20 61 6e 64 20 73 75 62  second.  and sub
1b400 73 65 71 75 65 6e 74 20 70 61 67 65 73 20 6f 66  sequent pages of
1b410 20 72 65 73 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20   results...<p>. 
1b420 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
1b430 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d  contains an exam
1b440 70 6c 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f  ple rank functio
1b450 6e 20 74 68 61 74 20 75 73 65 73 20 6d 61 74 63  n that uses matc
1b460 68 69 6e 66 6f 20 64 61 74 61 20 0a 20 20 69 6d  hinfo data .  im
1b470 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 43 2e 20  plemented in C. 
1b480 49 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e  Instead of a sin
1b490 67 6c 65 20 77 65 69 67 68 74 2c 20 69 74 20 61  gle weight, it a
1b4a0 6c 6c 6f 77 73 20 61 20 77 65 69 67 68 74 20 74  llows a weight t
1b4b0 6f 20 62 65 20 0a 20 20 65 78 74 65 72 6e 61 6c  o be .  external
1b4c0 6c 79 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  ly assigned to e
1b4d0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61  ach column of ea
1b4e0 63 68 20 64 6f 63 75 6d 65 6e 74 2e 20 49 74 20  ch document. It 
1b4f0 6d 61 79 20 62 65 20 72 65 67 69 73 74 65 72 65  may be registere
1b500 64 0a 20 20 77 69 74 68 20 53 51 4c 69 74 65 20  d.  with SQLite 
1b510 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 75  like any other u
1b520 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 69  ser function usi
1b530 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61  ng [sqlite3_crea
1b540 74 65 5f 66 75 6e 63 74 69 6f 6e 5d 2e 0a 0a 3c  te_function]...<
1b550 63 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69 3e 2f 2a  codeblock>.<i>/*
1b560 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51 4c 69 74  </i>.<i>** SQLit
1b570 65 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 66  e user defined f
1b580 75 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65 20 77  unction to use w
1b590 69 74 68 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  ith matchinfo() 
1b5a0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  to calculate the
1b5b0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76  </i>.<i>** relev
1b5c0 61 6e 63 79 20 6f 66 20 61 6e 20 46 54 53 20 6d  ancy of an FTS m
1b5d0 61 74 63 68 2e 20 54 68 65 20 76 61 6c 75 65 20  atch. The value 
1b5e0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
1b5f0 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 3c  relevancy score<
1b600 2f 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20 72 65 61  /i>.<i>** (a rea
1b610 6c 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20  l value greater 
1b620 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1b630 20 7a 65 72 6f 29 2e 20 41 20 6c 61 72 67 65 72   zero). A larger
1b640 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1b650 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61 20 6d 6f   </i>.<i>** a mo
1b660 72 65 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75  re relevant docu
1b670 6d 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c  ment.</i>.<i>**<
1b680 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 6f 76  /i>.<i>** The ov
1b690 65 72 61 6c 6c 20 72 65 6c 65 76 61 6e 63 79 20  erall relevancy 
1b6a0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
1b6b0 73 75 6d 20 6f 66 20 74 68 65 20 72 65 6c 65 76  sum of the relev
1b6c0 61 6e 63 69 65 73 20 6f 66 20 65 61 63 68 20 3c  ancies of each <
1b6d0 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e  /i>.<i>** column
1b6e0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 46 54   value in the FT
1b6f0 53 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 6c  S table. The rel
1b700 65 76 61 6e 63 79 20 6f 66 20 61 20 63 6f 6c 75  evancy of a colu
1b710 6d 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 3c  mn value is the<
1b720 2f 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20 6f 66  /i>.<i>** sum of
1b730 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1b740 6f 72 20 65 61 63 68 20 72 65 70 6f 72 74 61 62  or each reportab
1b750 6c 65 20 70 68 72 61 73 65 20 69 6e 20 74 68 65  le phrase in the
1b760 20 46 54 53 20 71 75 65 72 79 3a 3c 2f 69 3e 0a   FTS query:</i>.
1b770 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
1b780 20 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74    (&lt;hit count
1b790 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61  &gt; / &lt;globa
1b7a0 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20  l hit count&gt) 
1b7b0 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69  * &lt;column wei
1b7c0 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 2a  ght&gt;</i>.<i>*
1b7d0 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68 65 72  *</i>.<i>** wher
1b7e0 65 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26  e &lt;hit count&
1b7f0 67 74 3b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  gt; is the numbe
1b800 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  r of instances o
1b810 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
1b820 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f  the</i>.<i>** co
1b830 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  lumn value of th
1b840 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 6e  e current row an
1b850 64 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69 74  d &lt;global hit
1b860 20 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68   count&gt; is th
1b870 65 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c 69 3e  e number</i>.<i>
1b880 2a 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ** of instances 
1b890 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e  of the phrase in
1b8a0 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
1b8b0 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20   of all rows in 
1b8c0 74 68 65 20 46 54 53 3c 2f 69 3e 0a 3c 69 3e 2a  the FTS</i>.<i>*
1b8d0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 26 6c 74  * table. The &lt
1b8e0 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26 67  ;column weight&g
1b8f0 74 3b 20 69 73 20 61 20 77 65 69 67 68 74 69 6e  t; is a weightin
1b900 67 20 66 61 63 74 6f 72 20 61 73 73 69 67 6e 65  g factor assigne
1b910 64 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a 3c 69  d to each</i>.<i
1b920 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  >** column by th
1b930 65 20 63 61 6c 6c 65 72 20 28 73 65 65 20 62 65  e caller (see be
1b940 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c  low).</i>.<i>**<
1b950 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 66 69  /i>.<i>** The fi
1b960 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
1b970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
1b980 73 74 20 62 65 20 74 68 65 20 72 65 74 75 72 6e  st be the return
1b990 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 46 54   value of the FT
1b9a0 53 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d 61 74  S </i>.<i>** mat
1b9b0 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f  chinfo() functio
1b9c0 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  n. Following thi
1b9d0 73 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 61 72  s must be one ar
1b9e0 67 75 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  gument for each 
1b9f0 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69 3e 2a  column </i>.<i>*
1ba00 2a 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62  * of the FTS tab
1ba10 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  le containing a 
1ba20 6e 75 6d 65 72 69 63 20 77 65 69 67 68 74 20 66  numeric weight f
1ba30 61 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  actor for the co
1ba40 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f 69 3e  rresponding </i>
1ba50 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 45  .<i>** column. E
1ba60 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69 3e 2a  xample:</i>.<i>*
1ba70 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20  *</i>.<i>**     
1ba80 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1ba90 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55  ABLE documents U
1baa0 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c  SING fts3(title,
1bab0 20 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a 3c 69   content)</i>.<i
1bac0 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68  >**</i>.<i>** Th
1bad0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
1bae0 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 6f  y returns the do
1baf0 63 69 64 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74  cids of document
1bb00 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
1bb10 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c   full-text</i>.<
1bb20 69 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74 3b 71  i>** query &lt;q
1bb30 75 65 72 79 26 67 74 3b 20 73 6f 72 74 65 64 20  uery&gt; sorted 
1bb40 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65 61  from most to lea
1bb50 73 74 20 72 65 6c 65 76 61 6e 74 2e 20 57 68 65  st relevant. Whe
1bb60 6e 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c 2f 69  n calculating</i
1bb70 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61 6e 63  >.<i>** relevanc
1bb80 65 2c 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e  e, query term in
1bb90 73 74 61 6e 63 65 73 20 69 6e 20 74 68 65 20 27  stances in the '
1bba0 74 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20 61 72  title' column ar
1bbb0 65 20 67 69 76 65 6e 20 74 77 69 63 65 20 74 68  e given twice th
1bbc0 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65 69 67  e</i>.<i>** weig
1bbd0 68 74 69 6e 67 20 6f 66 20 74 68 6f 73 65 20 69  hting of those i
1bbe0 6e 20 74 68 65 20 27 63 6f 6e 74 65 6e 74 27 20  n the 'content' 
1bbf0 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69 3e 2a  column.</i>.<i>*
1bc00 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20  *</i>.<i>**     
1bc10 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
1bc20 4d 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f 69 3e  M documents </i>
1bc30 0a 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45 52 45  .<i>**     WHERE
1bc40 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
1bc50 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 3c   &lt;query&gt; <
1bc60 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 4f 52  /i>.<i>**     OR
1bc70 44 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63  DER BY rank(matc
1bc80 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29  hinfo(documents)
1bc90 2c 20 31 2e 30 2c 20 30 2e 35 29 20 44 45 53 43  , 1.0, 0.5) DESC
1bca0 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e 0a 73  </i>.<i>*/</i>.s
1bcb0 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 66  tatic void rankf
1bcc0 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1bcd0 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e  ext *pCtx, int n
1bce0 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Val, sqlite3_val
1bcf0 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 69  ue **apVal){.  i
1bd00 6e 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f 3b 20  nt *aMatchinfo; 
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
1bd20 69 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  i>/* Return valu
1bd30 65 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 28 29  e of matchinfo()
1bd40 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 43   */</i>.  int nC
1bd50 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
1bd60 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
1bd70 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
1bd80 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
1bd90 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50 68 72  /</i>.  int nPhr
1bda0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1bdb0 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e 75          <i>/* Nu
1bdc0 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20  mber of phrases 
1bdd0 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a 2f 3c  in the query */<
1bde0 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68 72 61 73  /i>.  int iPhras
1bdf0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1be00 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72        <i>/* Curr
1be10 65 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c 2f 69  ent phrase */</i
1be20 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f 72 65  >.  double score
1be30 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20   = 0.0;         
1be40 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75 65 20      <i>/* Value 
1be50 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f 69 3e  to return */</i>
1be60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ..  assert( size
1be70 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a 0a 3c  of(int)==4 );..<
1be80 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  i>  /* Check tha
1be90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1bea0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
1beb0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1bec0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 3c 2f 69  n is correct.</i
1bed0 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e 6f 74  >.<i>  ** If not
1bee0 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e 67 5f  , jump to wrong_
1bef0 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20 53 65 74  number_args. Set
1bf00 20 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f 20 70   aMatchinfo to p
1bf10 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 72 72 61  oint to the arra
1bf20 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6f 66  y</i>.<i>  ** of
1bf30 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
1bf40 72 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  r values returne
1bf50 64 20 62 79 20 46 54 53 20 66 75 6e 63 74 69 6f  d by FTS functio
1bf60 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53 65 74  n matchinfo. Set
1bf70 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e 50 68  </i>.<i>  ** nPh
1bf80 72 61 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  rase to contain 
1bf90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
1bfa0 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 73  portable phrases
1bfb0 20 69 6e 20 74 68 65 20 75 73 65 72 73 20 66 75   in the users fu
1bfc0 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69 3e 20  ll-text</i>.<i> 
1bfd0 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64 20 6e   ** query, and n
1bfe0 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  Col to the numbe
1bff0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1c000 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 3c  the table.</i>.<
1c010 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 66 28  i>  */</i>.  if(
1c020 20 6e 56 61 6c 26 6c 74 3b 31 20 29 20 67 6f 74   nVal&lt;1 ) got
1c030 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61  o wrong_number_a
1c040 72 67 73 3b 0a 20 20 61 4d 61 74 63 68 69 6e 66  rgs;.  aMatchinf
1c050 6f 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  o = (unsigned in
1c060 74 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  t *)sqlite3_valu
1c070 65 5f 62 6c 6f 62 28 61 70 56 61 6c 26 23 78 35  e_blob(apVal&#x5
1c080 42 3b 30 26 23 78 35 44 3b 29 3b 0a 20 20 6e 50  B;0&#x5D;);.  nP
1c090 68 72 61 73 65 20 3d 20 61 4d 61 74 63 68 69 6e  hrase = aMatchin
1c0a0 66 6f 26 23 78 35 42 3b 30 26 23 78 35 44 3b 3b  fo&#x5B;0&#x5D;;
1c0b0 0a 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68  .  nCol = aMatch
1c0c0 69 6e 66 6f 26 23 78 35 42 3b 31 26 23 78 35 44  info&#x5B;1&#x5D
1c0d0 3b 3b 0a 20 20 69 66 28 20 6e 56 61 6c 21 3d 28  ;;.  if( nVal!=(
1c0e0 31 2b 6e 43 6f 6c 29 20 29 20 67 6f 74 6f 20 77  1+nCol) ) goto w
1c0f0 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73  rong_number_args
1c100 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74 65 72 61  ;..<i>  /* Itera
1c110 74 65 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  te through each 
1c120 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 75 73  phrase in the us
1c130 65 72 73 20 71 75 65 72 79 2e 20 2a 2f 3c 2f 69  ers query. */</i
1c140 3e 0a 20 20 66 6f 72 28 69 50 68 72 61 73 65 3d  >.  for(iPhrase=
1c150 30 3b 20 69 50 68 72 61 73 65 26 6c 74 3b 6e 50  0; iPhrase&lt;nP
1c160 68 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b  hrase; iPhrase++
1c170 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  ){.    int iCol;
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72 65       <i>/* Curre
1c1a0 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c 2f 69 3e  nt column */</i>
1c1b0 0a 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e 6f 77 20  ..<i>    /* Now 
1c1c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1c1d0 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
1c1e0 68 65 20 75 73 65 72 73 20 71 75 65 72 79 2e 20  he users query. 
1c1f0 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c  For each column,
1c200 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 69  </i>.<i>    ** i
1c210 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 6c  ncrement the rel
1c220 65 76 61 6e 63 79 20 73 63 6f 72 65 20 62 79 3a  evancy score by:
1c230 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 3c 2f  </i>.<i>    **</
1c240 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 20 20 28  i>.<i>    **   (
1c250 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67 74  &lt;hit count&gt
1c260 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68  ; / &lt;global h
1c270 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a 20 26  it count&gt) * &
1c280 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74  lt;column weight
1c290 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20  &gt;</i>.<i>    
1c2a0 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  **</i>.<i>    **
1c2b0 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35   aPhraseinfo&#x5
1c2c0 42 3b 26 23 78 35 44 3b 20 70 6f 69 6e 74 73 20  B;&#x5D; points 
1c2d0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1c2e0 74 68 65 20 64 61 74 61 20 66 6f 72 20 70 68 72  the data for phr
1c2f0 61 73 65 20 69 50 68 72 61 73 65 2e 20 53 6f 3c  ase iPhrase. So<
1c300 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 74 68  /i>.<i>    ** th
1c310 65 20 68 69 74 20 63 6f 75 6e 74 20 61 6e 64 20  e hit count and 
1c320 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74  global hit count
1c330 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
1c340 6e 20 61 72 65 20 66 6f 75 6e 64 20 69 6e 20 3c  n are found in <
1c350 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 61 50  /i>.<i>    ** aP
1c360 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 69  hraseinfo&#x5B;i
1c370 43 6f 6c 2a 33 26 23 78 35 44 3b 20 61 6e 64 20  Col*3&#x5D; and 
1c380 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
1c390 3b 69 43 6f 6c 2a 33 2b 31 26 23 78 35 44 3b 2c  ;iCol*3+1&#x5D;,
1c3a0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 3c 2f   respectively.</
1c3b0 69 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c 2f 69 3e  i>.<i>    */</i>
1c3c0 0a 20 20 20 20 69 6e 74 20 2a 61 50 68 72 61 73  .    int *aPhras
1c3d0 65 69 6e 66 6f 20 3d 20 26 61 4d 61 74 63 68 69  einfo = &aMatchi
1c3e0 6e 66 6f 26 23 78 35 42 3b 32 20 2b 20 69 50 68  nfo&#x5B;2 + iPh
1c3f0 72 61 73 65 2a 6e 43 6f 6c 2a 33 26 23 78 35 44  rase*nCol*3&#x5D
1c400 3b 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  ;;.    for(iCol=
1c410 30 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43 6f 6c 3b  0; iCol&lt;nCol;
1c420 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1c430 69 6e 74 20 6e 48 69 74 43 6f 75 6e 74 20 3d 20  int nHitCount = 
1c440 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
1c450 3b 33 2a 69 43 6f 6c 26 23 78 35 44 3b 3b 0a 20  ;3*iCol&#x5D;;. 
1c460 20 20 20 20 20 69 6e 74 20 6e 47 6c 6f 62 61 6c       int nGlobal
1c470 48 69 74 43 6f 75 6e 74 20 3d 20 61 50 68 72 61  HitCount = aPhra
1c480 73 65 69 6e 66 6f 26 23 78 35 42 3b 33 2a 69 43  seinfo&#x5B;3*iC
1c490 6f 6c 2b 31 26 23 78 35 44 3b 3b 0a 20 20 20 20  ol+1&#x5D;;.    
1c4a0 20 20 64 6f 75 62 6c 65 20 77 65 69 67 68 74 20    double weight 
1c4b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1c4c0 64 6f 75 62 6c 65 28 61 70 56 61 6c 26 23 78 35  double(apVal&#x5
1c4d0 42 3b 69 43 6f 6c 2b 31 26 23 78 35 44 3b 29 3b  B;iCol+1&#x5D;);
1c4e0 0a 20 20 20 20 20 20 69 66 28 20 6e 48 69 74 43  .      if( nHitC
1c4f0 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  ount>0 ){.      
1c500 20 20 73 63 6f 72 65 20 2b 3d 20 28 28 64 6f 75    score += ((dou
1c510 62 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20 2f 20  ble)nHitCount / 
1c520 28 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61 6c 48  (double)nGlobalH
1c530 69 74 43 6f 75 6e 74 29 20 2a 20 77 65 69 67 68  itCount) * weigh
1c540 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1c550 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1c560 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
1c570 74 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20 72 65  tx, score);.  re
1c580 74 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 4a  turn;..<i>  /* J
1c590 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
1c5a0 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
1c5b0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 61  arguments are pa
1c5c0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1c5d0 63 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77 72 6f  ction */</i>.wro
1c5e0 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3a 0a  ng_number_args:.
1c5f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1c600 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 77 72  _error(pCtx, "wr
1c610 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
1c620 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
1c630 69 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d 31 29  ion rank()", -1)
1c640 3b 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ;.}.</codeblock>
1c650 0a                                               .