Documentation Source Text

Hex Artifact Content
Login

Artifact 852a60ee892534f7b20693cc06767159a66e4c0c:


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 75 61 67  ent *fts4languag
12bf0 65 69 64 20 7b 46 54 53 34 20 6c 61 6e 67 75 61  eid {FTS4 langua
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 75 61 67 65 69 64 20 6f 70 74 69   languageid 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 26 6c 74 3b 3d 35 29 20 61 72  or lid&lt;=5) ar
130c0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 0a 3c 70  e undefined...<p
130d0 3e 0a 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65  >.  If the conte
130e0 6e 74 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  nt option is use
130f0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
13100 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69   languageid opti
13110 6f 6e 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 6e  on,.  then the n
13120 61 6d 65 64 20 6c 61 6e 67 75 61 67 65 69 64 20  amed languageid 
13130 63 6f 6c 75 6d 6e 20 6d 75 73 74 20 65 78 69 73  column must exis
13140 74 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  t in the content
13150 3d 20 74 61 62 6c 65 0a 20 20 28 73 75 62 6a 65  = table.  (subje
13160 63 74 20 74 6f 20 74 68 65 20 75 73 75 61 6c 20  ct to the usual 
13170 72 75 6c 65 73 20 2d 20 69 66 20 61 20 71 75 65  rules - if a que
13180 72 79 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  ry never needs t
13190 6f 20 72 65 61 64 20 74 68 65 0a 20 20 63 6f 6e  o read the.  con
131a0 74 65 6e 74 20 74 61 62 6c 65 20 74 68 65 6e 20  tent table then 
131b0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
131c0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 29   does not apply)
131d0 2e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68  ...<p>.  When th
131e0 65 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74  e languageid opt
131f0 69 6f 6e 20 69 73 20 75 73 65 64 2c 20 53 51 4c  ion is used, SQL
13200 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ite invokes the 
13210 78 4c 61 6e 67 75 61 67 65 69 64 28 29 0a 20 20  xLanguageid().  
13220 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  on the sqlite3_t
13230 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
13240 6f 62 6a 65 63 74 20 69 6d 6d 65 64 69 61 74 65  object immediate
13250 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
13260 65 63 74 0a 20 20 69 73 20 63 72 65 61 74 65 64  ect.  is created
13270 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 61 73   in order to pas
13280 73 20 69 6e 20 74 68 65 20 6c 61 6e 67 75 61 67  s in the languag
13290 65 20 69 64 20 74 68 61 74 20 70 61 72 74 69 63  e id that partic
132a0 75 6c 61 72 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  ular.  tokenizer
132b0 20 73 68 6f 75 6c 64 20 75 73 65 2e 20 20 54 68   should use.  Th
132c0 65 20 78 4c 61 6e 67 75 61 67 65 69 64 28 29 20  e xLanguageid() 
132d0 6d 65 74 68 6f 64 20 77 69 6c 6c 20 6e 65 76 65  method will neve
132e0 72 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 6d 6f  r be called.  mo
132f0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 66 6f 72  re than once for
13300 20 61 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b 65   any single toke
13310 6e 69 7a 65 72 20 6f 62 6a 65 63 74 2e 0a 20 20  nizer object..  
13320 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
13330 65 6e 74 20 66 74 73 34 6d 61 74 63 68 69 6e 66  ent fts4matchinf
13340 6f 20 7b 46 54 53 34 20 6d 61 74 63 68 69 6e 66  o {FTS4 matchinf
13350 6f 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  o option}</tcl>.
13360 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 6d  <h2 tags="fts4 m
13370 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 22  atchinfo option"
13380 3e 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 3d 20  >The matchinfo= 
13390 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e  option</h2>..<p>
133a0 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
133b0 20 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79   option may only
133c0 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 76   be set to the v
133d0 61 6c 75 65 20 22 66 74 73 33 22 2e 20 0a 20 20  alue "fts3". .  
133e0 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 65  Attempting to se
133f0 74 20 6d 61 74 63 68 69 6e 66 6f 20 74 6f 20 61  t matchinfo to a
13400 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
13410 61 6e 20 22 66 74 73 33 22 20 69 73 20 61 6e 20  an "fts3" is an 
13420 65 72 72 6f 72 2e 0a 20 20 49 66 20 74 68 69 73  error..  If this
13430 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69   option is speci
13440 66 69 65 64 2c 20 74 68 65 6e 20 73 6f 6d 65 20  fied, then some 
13450 6f 66 20 74 68 65 20 65 78 74 72 61 20 69 6e 66  of the extra inf
13460 6f 72 6d 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  ormation stored 
13470 62 79 0a 20 20 46 54 53 34 20 69 73 20 6f 6d 69  by.  FTS4 is omi
13480 74 74 65 64 2e 20 54 68 69 73 20 72 65 64 75 63  tted. This reduc
13490 65 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  es the amount of
134a0 20 64 69 73 6b 20 73 70 61 63 65 20 63 6f 6e 73   disk space cons
134b0 75 6d 65 64 20 62 79 0a 20 20 61 6e 20 46 54 53  umed by.  an FTS
134c0 34 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 69 74  4 table until it
134d0 20 69 73 20 61 6c 6d 6f 73 74 20 74 68 65 20 73   is almost the s
134e0 61 6d 65 20 61 73 20 74 68 65 20 61 6d 6f 75 6e  ame as the amoun
134f0 74 20 74 68 61 74 20 77 6f 75 6c 64 0a 20 20 62  t that would.  b
13500 65 20 75 73 65 64 20 62 79 20 74 68 65 20 65 71  e used by the eq
13510 75 69 76 61 6c 65 6e 74 20 46 54 53 33 20 74 61  uivalent FTS3 ta
13520 62 6c 65 2c 20 62 75 74 20 61 6c 73 6f 20 6d 65  ble, but also me
13530 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
13540 61 0a 20 20 61 63 63 65 73 73 65 64 20 62 79 20  a.  accessed by 
13550 70 61 73 73 69 6e 67 20 74 68 65 20 27 6c 27 20  passing the 'l' 
13560 66 6c 61 67 20 74 6f 20 74 68 65 20 5b 6d 61 74  flag to the [mat
13570 63 68 69 6e 66 6f 28 29 5d 20 66 75 6e 63 74 69  chinfo()] functi
13580 6f 6e 20 69 73 0a 20 20 6e 6f 74 20 61 76 61 69  on is.  not avai
13590 6c 61 62 6c 65 2e 20 0a 0a 3c 74 63 6c 3e 68 64  lable. ..<tcl>hd
135a0 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 70 72  _fragment fts4pr
135b0 65 66 69 78 20 7b 46 54 53 34 20 70 72 65 66 69  efix {FTS4 prefi
135c0 78 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  x option}</tcl>.
135d0 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 70  <h2 tags="fts4 p
135e0 72 65 66 69 78 20 6f 70 74 69 6f 6e 22 3e 54 68  refix option">Th
135f0 65 20 70 72 65 66 69 78 3d 20 6f 70 74 69 6f 6e  e prefix= option
13600 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 5e 54 68  </h2>..<p>.  ^Th
13610 65 20 46 54 53 34 20 70 72 65 66 69 78 20 6f 70  e FTS4 prefix op
13620 74 69 6f 6e 20 63 61 75 73 65 73 20 46 54 53 20  tion causes FTS 
13630 74 6f 20 69 6e 64 65 78 20 74 65 72 6d 20 70 72  to index term pr
13640 65 66 69 78 65 73 20 6f 66 20 73 70 65 63 69 66  efixes of specif
13650 69 65 64 20 6c 65 6e 67 74 68 73 0a 20 20 69 6e  ied lengths.  in
13660 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 74 68   the same way th
13670 61 74 20 69 74 20 61 6c 77 61 79 73 20 69 6e 64  at it always ind
13680 65 78 65 73 20 63 6f 6d 70 6c 65 74 65 20 74 65  exes complete te
13690 72 6d 73 2e 20 20 5e 54 68 65 20 70 72 65 66 69  rms.  ^The prefi
136a0 78 20 6f 70 74 69 6f 6e 0a 20 20 6d 75 73 74 20  x option.  must 
136b0 62 65 20 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d  be set to a comm
136c0 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a separated list
136d0 20 6f 66 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e   of positive non
136e0 2d 7a 65 72 6f 20 69 6e 74 65 67 65 72 73 2e 20  -zero integers. 
136f0 0a 20 20 5e 46 6f 72 20 65 61 63 68 20 76 61 6c  .  ^For each val
13700 75 65 20 4e 20 69 6e 20 74 68 65 20 6c 69 73 74  ue N in the list
13710 2c 20 70 72 65 66 69 78 65 73 20 6f 66 20 6c 65  , prefixes of le
13720 6e 67 74 68 20 4e 20 62 79 74 65 73 20 28 77 68  ngth N bytes (wh
13730 65 6e 20 65 6e 63 6f 64 65 64 20 0a 20 20 75 73  en encoded .  us
13740 69 6e 67 20 55 54 46 2d 38 29 20 61 72 65 20 69  ing UTF-8) are i
13750 6e 64 65 78 65 64 2e 20 20 5e 46 54 53 34 20 75  ndexed.  ^FTS4 u
13760 73 65 73 20 74 65 72 6d 20 70 72 65 66 69 78 20  ses term prefix 
13770 69 6e 64 65 78 65 73 20 74 6f 20 73 70 65 65 64  indexes to speed
13780 20 75 70 0a 20 20 5b 70 72 65 66 69 78 20 71 75   up.  [prefix qu
13790 65 72 69 65 73 5d 2e 20 54 68 65 20 63 6f 73 74  eries]. The cost
137a0 2c 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 73 20  , of course, is 
137b0 74 68 61 74 20 69 6e 64 65 78 69 6e 67 20 74 65  that indexing te
137c0 72 6d 20 70 72 65 66 69 78 65 73 20 61 73 0a 20  rm prefixes as. 
137d0 20 77 65 6c 6c 20 61 73 20 63 6f 6d 70 6c 65 74   well as complet
137e0 65 20 74 65 72 6d 73 20 69 6e 63 72 65 61 73 65  e terms increase
137f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
13800 69 7a 65 20 61 6e 64 20 73 6c 6f 77 73 20 64 6f  ize and slows do
13810 77 6e 20 77 72 69 74 65 20 0a 20 20 6f 70 65 72  wn write .  oper
13820 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 46 54  ations on the FT
13830 53 34 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  S4 table...<p>. 
13840 20 50 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   Prefix indexes 
13850 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 6f  may be used to o
13860 70 74 69 6d 69 7a 65 20 5b 70 72 65 66 69 78 20  ptimize [prefix 
13870 71 75 65 72 69 65 73 5d 20 69 6e 20 74 77 6f 20  queries] in two 
13880 63 61 73 65 73 2e 0a 20 20 49 66 20 74 68 65 20  cases..  If the 
13890 71 75 65 72 79 20 69 73 20 66 6f 72 20 61 20 70  query is for a p
138a0 72 65 66 69 78 20 6f 66 20 4e 20 62 79 74 65 73  refix of N bytes
138b0 2c 20 74 68 65 6e 20 61 20 70 72 65 66 69 78 20  , then a prefix 
138c0 69 6e 64 65 78 20 63 72 65 61 74 65 64 0a 20 20  index created.  
138d0 77 69 74 68 20 22 70 72 65 66 69 78 3d 4e 22 20  with "prefix=N" 
138e0 70 72 6f 76 69 64 65 73 20 74 68 65 20 62 65 73  provides the bes
138f0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  t optimization. 
13900 4f 72 2c 20 69 66 20 6e 6f 20 22 70 72 65 66 69  Or, if no "prefi
13910 78 3d 4e 22 0a 20 20 69 6e 64 65 78 20 69 73 20  x=N".  index is 
13920 61 76 61 69 6c 61 62 6c 65 2c 20 61 20 22 70 72  available, a "pr
13930 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64 65 78 20  efix=N+1" index 
13940 69 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 73  imay be used ins
13950 74 65 61 64 2e 20 0a 20 20 55 73 69 6e 67 20 61  tead. .  Using a
13960 20 22 70 72 65 66 69 78 3d 4e 2b 31 22 20 69 6e   "prefix=N+1" in
13970 64 65 78 20 69 73 20 6c 65 73 73 0a 20 20 65 66  dex is less.  ef
13980 66 69 63 69 65 6e 74 20 74 68 61 6e 20 61 20 22  ficient than a "
13990 70 72 65 66 69 78 3d 4e 22 20 69 6e 64 65 78 2c  prefix=N" index,
139a0 20 62 75 74 20 69 73 20 62 65 74 74 65 72 20 74   but is better t
139b0 68 61 6e 20 6e 6f 20 70 72 65 66 69 78 20 69 6e  han no prefix in
139c0 64 65 78 20 61 74 20 61 6c 6c 2e 0a 0a 3c 63 6f  dex at all...<co
139d0 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
139e0 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 34 20   Create an FTS4 
139f0 74 61 62 6c 65 20 77 69 74 68 20 69 6e 64 65 78  table with index
13a00 65 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 32  es to optimize 2
13a10 20 61 6e 64 20 34 20 62 79 74 65 20 70 72 65 66   and 4 byte pref
13a20 69 78 20 71 75 65 72 69 65 73 2e 3c 2f 69 3e 0a  ix queries.</i>.
13a30 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
13a40 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
13a50 66 74 73 34 28 63 31 2c 20 63 32 2c 20 70 72 65  fts4(c1, c2, pre
13a60 66 69 78 3d 22 32 2c 34 22 29 3b 0a 0a 20 20 3c  fix="2,4");..  <
13a70 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
13a80 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73 20 61  ng two queries a
13a90 72 65 20 62 6f 74 68 20 6f 70 74 69 6d 69 7a 65  re both optimize
13aa0 64 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 66  d using the pref
13ab0 69 78 20 69 6e 64 65 78 65 73 2e 3c 2f 69 3e 0a  ix indexes.</i>.
13ac0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13ad0 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
13ae0 48 20 27 61 62 2a 27 3b 0a 20 20 53 45 4c 45 43  H 'ab*';.  SELEC
13af0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
13b00 45 20 74 31 20 4d 41 54 43 48 20 27 61 62 63 64  E t1 MATCH 'abcd
13b10 2a 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  *';..  <i>-- The
13b20 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71   following two q
13b30 75 65 72 69 65 73 20 61 72 65 20 62 6f 74 68 20  ueries are both 
13b40 70 61 72 74 69 61 6c 6c 79 20 6f 70 74 69 6d 69  partially optimi
13b50 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 70 72  zed using the pr
13b60 65 66 69 78 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  efix</i>.  <i>--
13b70 20 69 6e 64 65 78 65 73 2e 20 54 68 65 20 6f 70   indexes. The op
13b80 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
13b90 74 20 61 73 20 70 72 6f 6e 6f 75 6e 63 65 64 20  t as pronounced 
13ba0 61 73 20 69 74 20 69 73 20 66 6f 72 20 74 68 65  as it is for the
13bb0 20 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 3c   queries</i>.  <
13bc0 69 3e 2d 2d 20 61 62 6f 76 65 2c 20 62 75 74 20  i>-- above, but 
13bd0 73 74 69 6c 6c 20 61 6e 20 69 6d 70 72 6f 76 65  still an improve
13be0 6d 65 6e 74 20 6f 76 65 72 20 6e 6f 20 70 72 65  ment over no pre
13bf0 66 69 78 20 69 6e 64 65 78 65 73 20 61 74 20 61  fix indexes at a
13c00 6c 6c 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ll.</i>.  SELECT
13c10 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
13c20 20 74 31 20 4d 41 54 43 48 20 27 61 2a 27 3b 0a   t1 MATCH 'a*';.
13c30 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13c40 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
13c50 48 20 27 61 62 63 2a 27 3b 0a 3c 2f 63 6f 64 65  H 'abc*';.</code
13c60 62 6c 6f 63 6b 3e 0a 0a 3c 68 31 20 69 64 3d 74  block>..<h1 id=t
13c70 6f 6b 65 6e 69 7a 65 72 20 74 61 67 73 3d 22 74  okenizer tags="t
13c80 6f 6b 65 6e 69 7a 65 72 22 3e 54 6f 6b 65 6e 69  okenizer">Tokeni
13c90 7a 65 72 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20  zers</h1>..<p>. 
13ca0 20 41 6e 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65   An FTS tokenize
13cb0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 72 75  r is a set of ru
13cc0 6c 65 73 20 66 6f 72 20 65 78 74 72 61 63 74 69  les for extracti
13cd0 6e 67 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 20  ng terms from a 
13ce0 64 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62  document .  or b
13cf0 61 73 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65  asic FTS full-te
13d00 78 74 20 71 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a  xt query. ..<p>.
13d10 20 20 55 6e 6c 65 73 73 20 61 20 73 70 65 63 69    Unless a speci
13d20 66 69 63 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73  fic tokenizer is
13d30 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
13d40 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  rt of the CREATE
13d50 20 0a 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c   .  VIRTUAL TABL
13d60 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  E statement used
13d70 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 46   to create the F
13d80 54 53 20 74 61 62 6c 65 2c 20 74 68 65 20 64 65  TS table, the de
13d90 66 61 75 6c 74 20 0a 20 20 74 6f 6b 65 6e 69 7a  fault .  tokeniz
13da0 65 72 2c 20 22 73 69 6d 70 6c 65 22 2c 20 69 73  er, "simple", is
13db0 20 75 73 65 64 2e 20 54 68 65 20 73 69 6d 70 6c   used. The simpl
13dc0 65 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72  e tokenizer extr
13dd0 61 63 74 73 20 74 6f 6b 65 6e 73 20 66 72 6f 6d  acts tokens from
13de0 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 6f 72  .  a document or
13df0 20 62 61 73 69 63 20 46 54 53 20 66 75 6c 6c 2d   basic FTS full-
13e00 74 65 78 74 20 71 75 65 72 79 20 61 63 63 6f 72  text query accor
13e10 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
13e20 6f 77 69 6e 67 20 0a 20 20 72 75 6c 65 73 3a 0a  owing .  rules:.
13e30 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20  .<ul>.  <li><p> 
13e40 41 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6e 74  A term is a cont
13e50 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20  iguous sequence 
13e60 6f 66 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72  of eligible char
13e70 61 63 74 65 72 73 2c 20 77 68 65 72 65 20 0a 20  acters, where . 
13e80 20 20 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72     eligible char
13e90 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c 20 61  acters are all a
13ea0 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72  lphanumeric char
13eb0 61 63 74 65 72 73 20 61 6e 64 20 61 6c 6c 20 63  acters and all c
13ec0 68 61 72 61 63 74 65 72 73 20 77 69 74 68 0a 20  haracters with. 
13ed0 20 20 20 55 54 46 20 63 6f 64 65 70 6f 69 6e 74     UTF codepoint
13ee0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
13ef0 72 20 65 71 75 61 6c 20 74 6f 20 31 32 38 2e 20  r equal to 128. 
13f00 41 6c 6c 20 6f 74 68 65 72 20 63 68 61 72 61 63  All other charac
13f10 74 65 72 73 20 61 72 65 0a 20 20 20 20 64 69 73  ters are.    dis
13f20 63 61 72 64 65 64 20 77 68 65 6e 20 73 70 6c 69  carded when spli
13f30 74 74 69 6e 67 20 61 20 64 6f 63 75 6d 65 6e 74  tting a document
13f40 20 69 6e 74 6f 20 74 65 72 6d 73 2e 20 54 68 65   into terms. The
13f50 69 72 20 6f 6e 6c 79 20 63 6f 6e 74 72 69 62 75  ir only contribu
13f60 74 69 6f 6e 20 69 73 0a 20 20 20 20 74 6f 20 73  tion is.    to s
13f70 65 70 61 72 61 74 65 20 61 64 6a 61 63 65 6e 74  eparate adjacent
13f80 20 74 65 72 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c   terms...  <li><
13f90 70 3e 20 41 6c 6c 20 75 70 70 65 72 63 61 73 65  p> All uppercase
13fa0 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74 68   characters with
13fb0 69 6e 20 74 68 65 20 41 53 43 49 49 20 72 61 6e  in the ASCII ran
13fc0 67 65 20 28 55 54 46 20 63 6f 64 65 70 6f 69 6e  ge (UTF codepoin
13fd0 74 73 20 6c 65 73 73 20 0a 20 20 20 20 74 68 61  ts less .    tha
13fe0 6e 20 31 32 38 29 2c 20 61 72 65 20 74 72 61 6e  n 128), are tran
13ff0 73 66 6f 72 6d 65 64 20 74 6f 20 74 68 65 69 72  sformed to their
14000 20 6c 6f 77 65 72 63 61 73 65 20 65 71 75 69 76   lowercase equiv
14010 61 6c 65 6e 74 73 20 61 73 20 70 61 72 74 20 6f  alents as part o
14020 66 20 74 68 65 0a 20 20 20 20 74 6f 6b 65 6e 69  f the.    tokeni
14030 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  zation process. 
14040 54 68 75 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20  Thus, full-text 
14050 71 75 65 72 69 65 73 20 61 72 65 20 63 61 73 65  queries are case
14060 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 77 68 65  -insensitive whe
14070 6e 0a 20 20 20 20 75 73 69 6e 67 20 74 68 65 20  n.    using the 
14080 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72  simple tokenizer
14090 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46  ..</ul>..<p>.  F
140a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
140b0 20 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74   a document cont
140c0 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20  aining the text 
140d0 22 52 69 67 68 74 20 6e 6f 77 2c 20 74 68 65 79  "Right now, they
140e0 27 72 65 20 76 65 72 79 0a 20 20 66 72 75 73 74  're very.  frust
140f0 72 61 74 65 64 2e 22 2c 20 74 68 65 20 74 65 72  rated.", the ter
14100 6d 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ms extracted fro
14110 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 61  m the document a
14120 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
14130 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  .  full-text ind
14140 65 78 20 61 72 65 2c 20 69 6e 20 6f 72 64 65 72  ex are, in order
14150 2c 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65  , "right now the
14160 79 20 72 65 20 76 65 72 79 20 66 72 75 73 74 72  y re very frustr
14170 61 74 65 64 22 2e 20 53 75 63 68 0a 20 20 61 20  ated". Such.  a 
14180 64 6f 63 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d  document would m
14190 61 74 63 68 20 61 20 66 75 6c 6c 2d 74 65 78 74  atch a full-text
141a0 20 71 75 65 72 79 20 73 75 63 68 20 61 73 20 22   query such as "
141b0 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65  MATCH 'Frustrate
141c0 64 27 22 2c 20 0a 20 20 61 73 20 74 68 65 20 73  d'", .  as the s
141d0 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20  imple tokenizer 
141e0 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 74  transforms the t
141f0 65 72 6d 20 69 6e 20 74 68 65 20 71 75 65 72 79  erm in the query
14200 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 0a 20 20   to lowercase.  
14210 62 65 66 6f 72 65 20 73 65 61 72 63 68 69 6e 67  before searching
14220 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
14230 6e 64 65 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20  ndex...<p>.  As 
14240 77 65 6c 6c 20 61 73 20 74 68 65 20 22 73 69 6d  well as the "sim
14250 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  ple" tokenizer, 
14260 74 68 65 20 46 54 53 20 73 6f 75 72 63 65 20 63  the FTS source c
14270 6f 64 65 20 66 65 61 74 75 72 65 73 20 61 20 74  ode features a t
14280 6f 6b 65 6e 69 7a 65 72 20 0a 20 20 74 68 61 74  okenizer .  that
14290 20 75 73 65 73 20 74 68 65 20 3c 61 20 68 72 65   uses the <a hre
142a0 66 3d 22 68 74 74 70 3a 2f 2f 74 61 72 74 61 72  f="http://tartar
142b0 75 73 2e 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50  us.org/~martin/P
142c0 6f 72 74 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50  orterStemmer/">P
142d0 6f 72 74 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e  orter .  Stemmin
142e0 67 20 61 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e  g algorithm</a>.
142f0 20 54 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20   This tokenizer 
14300 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 72 75  uses the same ru
14310 6c 65 73 20 74 6f 20 73 65 70 61 72 61 74 65 0a  les to separate.
14320 20 20 74 68 65 20 69 6e 70 75 74 20 64 6f 63 75    the input docu
14330 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 2c  ment into terms,
14340 20 62 75 74 20 61 73 20 77 65 6c 6c 20 61 73 20   but as well as 
14350 66 6f 6c 64 69 6e 67 20 61 6c 6c 20 74 65 72 6d  folding all term
14360 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 63 61 73  s to lower.  cas
14370 65 20 69 74 20 75 73 65 73 20 74 68 65 20 50 6f  e it uses the Po
14380 72 74 65 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c  rter Stemming al
14390 67 6f 72 69 74 68 6d 20 74 6f 20 72 65 64 75 63  gorithm to reduc
143a0 65 20 72 65 6c 61 74 65 64 20 45 6e 67 6c 69 73  e related Englis
143b0 68 20 6c 61 6e 67 75 61 67 65 0a 20 20 77 6f 72  h language.  wor
143c0 64 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72  ds to a common r
143d0 6f 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  oot. For example
143e0 2c 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  , using the same
143f0 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74 20   input document 
14400 61 73 20 69 6e 20 74 68 65 0a 20 20 70 61 72 61  as in the.  para
14410 67 72 61 70 68 20 61 62 6f 76 65 2c 20 74 68 65  graph above, the
14420 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65   porter tokenize
14430 72 20 65 78 74 72 61 63 74 73 20 74 68 65 20 66  r extracts the f
14440 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a  ollowing tokens:
14450 0a 20 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68  .  "right now th
14460 65 69 20 76 65 72 69 20 66 72 75 73 74 72 61 74  ei veri frustrat
14470 22 2e 20 45 76 65 6e 20 74 68 6f 75 67 68 20 73  ". Even though s
14480 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 74 65 72  ome of these ter
14490 6d 73 20 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a  ms are not even.
144a0 20 20 45 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c    English words,
144b0 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 75   in some cases u
144c0 73 69 6e 67 20 74 68 65 6d 20 74 6f 20 62 75 69  sing them to bui
144d0 6c 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ld the full-text
144e0 20 69 6e 64 65 78 20 69 73 20 6d 6f 72 65 0a 20   index is more. 
144f0 20 75 73 65 66 75 6c 20 74 68 61 6e 20 74 68 65   useful than the
14500 20 6d 6f 72 65 20 69 6e 74 65 6c 6c 69 67 69 62   more intelligib
14510 6c 65 20 6f 75 74 70 75 74 20 70 72 6f 64 75 63  le output produc
14520 65 64 20 62 79 20 74 68 65 20 73 69 6d 70 6c 65  ed by the simple
14530 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73   tokenizer..  Us
14540 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74  ing the porter t
14550 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f  okenizer, the do
14560 63 75 6d 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20  cument not only 
14570 6d 61 74 63 68 65 73 20 66 75 6c 6c 2d 74 65 78  matches full-tex
14580 74 20 71 75 65 72 69 65 73 0a 20 20 73 75 63 68  t queries.  such
14590 20 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73   as "MATCH 'Frus
145a0 74 72 61 74 65 64 27 22 2c 20 62 75 74 20 61 6c  trated'", but al
145b0 73 6f 20 71 75 65 72 69 65 73 20 73 75 63 68 20  so queries such 
145c0 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74  as "MATCH 'Frust
145d0 72 61 74 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74  ration'",.  as t
145e0 68 65 20 74 65 72 6d 20 22 46 72 75 73 74 72 61  he term "Frustra
145f0 74 69 6f 6e 22 20 69 73 20 72 65 64 75 63 65 64  tion" is reduced
14600 20 62 79 20 74 68 65 20 50 6f 72 74 65 72 20 73   by the Porter s
14610 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d  temmer algorithm
14620 20 74 6f 20 0a 20 20 22 66 72 75 73 74 72 61 74   to .  "frustrat
14630 22 20 2d 20 6a 75 73 74 20 61 73 20 22 46 72 75  " - just as "Fru
14640 73 74 72 61 74 65 64 22 20 69 73 2e 20 53 6f 2c  strated" is. So,
14650 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
14660 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72  porter tokenizer
14670 2c 0a 20 20 46 54 53 20 69 73 20 61 62 6c 65 20  ,.  FTS is able 
14680 74 6f 20 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74  to find not just
14690 20 65 78 61 63 74 20 6d 61 74 63 68 65 73 20 66   exact matches f
146a0 6f 72 20 71 75 65 72 69 65 64 20 74 65 72 6d 73  or queried terms
146b0 2c 20 62 75 74 20 6d 61 74 63 68 65 73 0a 20 20  , but matches.  
146c0 61 67 61 69 6e 73 74 20 73 69 6d 69 6c 61 72 20  against similar 
146d0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
146e0 20 74 65 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65   terms. For more
146f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
14700 74 68 65 20 0a 20 20 50 6f 72 74 65 72 20 53 74  the .  Porter St
14710 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c  emmer algorithm,
14720 20 70 6c 65 61 73 65 20 72 65 66 65 72 20 74 6f   please refer to
14730 20 74 68 65 20 70 61 67 65 20 6c 69 6e 6b 65 64   the page linked
14740 20 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45   above...<p>.  E
14750 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74  xample illustrat
14760 69 6e 67 20 74 68 65 20 64 69 66 66 65 72 65 6e  ing the differen
14770 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 22  ce between the "
14780 73 69 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72  simple" and "por
14790 74 65 72 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  ter".  tokenizer
147a0 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  s:..<codeblock>.
147b0 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
147c0 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
147d0 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65   simple tokenize
147e0 72 2e 20 49 6e 73 65 72 74 20 61 20 64 6f 63 75  r. Insert a docu
147f0 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e 3c 2f 69  ment into it.</i
14800 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
14810 41 4c 20 54 41 42 4c 45 20 73 69 6d 70 6c 65 20  AL TABLE simple 
14820 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e  USING fts3(token
14830 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 20 20 49  ize=simple);.  I
14840 4e 53 45 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c  NSERT INTO simpl
14850 65 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20  e VALUES('Right 
14860 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72  now they''re ver
14870 79 20 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a  y frustrated');.
14880 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72  .  <i>-- The fir
14890 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  st of the follow
148a0 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73 20  ing two queries 
148b0 6d 61 74 63 68 65 73 20 74 68 65 20 64 6f 63 75  matches the docu
148c0 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 3c 2f  ment stored in</
148d0 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65  i>.  <i>-- table
148e0 20 22 73 69 6d 70 6c 65 22 2e 20 54 68 65 20 73   "simple". The s
148f0 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 3c  econd does not.<
14900 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
14910 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45 52 45  ROM simple WHERE
14920 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20 27 46   simple MATCH 'F
14930 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45  rustrated';.  SE
14940 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70  LECT * FROM simp
14950 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20  le WHERE simple 
14960 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69  MATCH 'Frustrati
14970 6f 6e 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  on';..  <i>-- Cr
14980 65 61 74 65 20 61 20 74 61 62 6c 65 20 75 73 69  eate a table usi
14990 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f  ng the porter to
149a0 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72 74 20  kenizer. Insert 
149b0 74 68 65 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e  the same documen
149c0 74 20 69 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20  t into it</i>.  
149d0 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
149e0 41 42 4c 45 20 70 6f 72 74 65 72 20 55 53 49 4e  ABLE porter USIN
149f0 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d  G fts3(tokenize=
14a00 70 6f 72 74 65 72 29 3b 0a 20 20 49 4e 53 45 52  porter);.  INSER
14a10 54 20 49 4e 54 4f 20 70 6f 72 74 65 72 20 56 41  T INTO porter VA
14a20 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77 20  LUES('Right now 
14a30 74 68 65 79 27 27 72 65 20 76 65 72 79 20 66 72  they''re very fr
14a40 75 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c  ustrated');..  <
14a50 69 3e 2d 2d 20 42 6f 74 68 20 6f 66 20 74 68 65  i>-- Both of the
14a60 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
14a70 65 73 20 6d 61 74 63 68 20 74 68 65 20 64 6f 63  es match the doc
14a80 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 20  ument stored in 
14a90 74 61 62 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c  table "porter".<
14aa0 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
14ab0 52 4f 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45  ROM porter WHERE
14ac0 20 70 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46   porter MATCH 'F
14ad0 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45  rustrated';.  SE
14ae0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74  LECT * FROM port
14af0 65 72 20 57 48 45 52 45 20 70 6f 72 74 65 72 20  er WHERE porter 
14b00 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69  MATCH 'Frustrati
14b10 6f 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  on';.</codeblock
14b20 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 69 73  >..<p>.  If this
14b30 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f   extension is co
14b40 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
14b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
14b60 55 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a  U pre-processor.
14b70 20 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64    symbol defined
14b80 2c 20 74 68 65 6e 20 74 68 65 72 65 20 65 78 69  , then there exi
14b90 73 74 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 74  sts a built-in t
14ba0 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22  okenizer named "
14bb0 69 63 75 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74  icu".  implement
14bc0 65 64 20 75 73 69 6e 67 20 74 68 65 20 49 43 55  ed using the ICU
14bd0 20 6c 69 62 72 61 72 79 2e 20 54 68 65 20 66 69   library. The fi
14be0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
14bf0 73 65 64 20 74 6f 20 74 68 65 0a 20 20 78 43 72  sed to the.  xCr
14c00 65 61 74 65 28 29 20 6d 65 74 68 6f 64 20 28 73  eate() method (s
14c10 65 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  ee fts3_tokenize
14c20 72 2e 68 29 20 6f 66 20 74 68 69 73 20 74 6f 6b  r.h) of this tok
14c30 65 6e 69 7a 65 72 20 6d 61 79 20 62 65 0a 20 20  enizer may be.  
14c40 61 6e 20 49 43 55 20 6c 6f 63 61 6c 65 20 69 64  an ICU locale id
14c50 65 6e 74 69 66 69 65 72 2e 20 46 6f 72 20 65 78  entifier. For ex
14c60 61 6d 70 6c 65 20 22 74 72 5f 54 52 22 20 66 6f  ample "tr_TR" fo
14c70 72 20 54 75 72 6b 69 73 68 20 61 73 20 75 73 65  r Turkish as use
14c80 64 0a 20 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f  d.  in Turkey, o
14c90 72 20 22 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e  r "en_AU" for En
14ca0 67 6c 69 73 68 20 61 73 20 75 73 65 64 20 69 6e  glish as used in
14cb0 20 41 75 73 74 72 61 6c 69 61 2e 20 46 6f 72 20   Australia. For 
14cc0 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
14cd0 6c 6f 63 6b 3e 0a 20 20 20 20 43 52 45 41 54 45  lock>.    CREATE
14ce0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
14cf0 68 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20 66  hai_text USING f
14d00 74 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69  ts3(text, tokeni
14d10 7a 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 3c 2f  ze=icu th_TH).</
14d20 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
14d30 20 20 54 68 65 20 49 43 55 20 74 6f 6b 65 6e 69    The ICU tokeni
14d40 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  zer implementati
14d50 6f 6e 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c  on is very simpl
14d60 65 2e 20 49 74 20 73 70 6c 69 74 73 20 74 68 65  e. It splits the
14d70 20 69 6e 70 75 74 0a 20 20 74 65 78 74 20 61 63   input.  text ac
14d80 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 49  cording to the I
14d90 43 55 20 72 75 6c 65 73 20 66 6f 72 20 66 69 6e  CU rules for fin
14da0 64 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61  ding word bounda
14db0 72 69 65 73 20 61 6e 64 20 64 69 73 63 61 72 64  ries and discard
14dc0 73 0a 20 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74  s.  any tokens t
14dd0 68 61 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69  hat consist enti
14de0 72 65 6c 79 20 6f 66 20 77 68 69 74 65 2d 73 70  rely of white-sp
14df0 61 63 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ace. This may be
14e00 20 73 75 69 74 61 62 6c 65 0a 20 20 66 6f 72 20   suitable.  for 
14e10 73 6f 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e  some application
14e20 73 20 69 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65  s in some locale
14e30 73 2c 20 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20  s, but not all. 
14e40 49 66 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a  If more complex.
14e50 20 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20    processing is 
14e60 72 65 71 75 69 72 65 64 2c 20 66 6f 72 20 65 78  required, for ex
14e70 61 6d 70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65  ample to impleme
14e80 6e 74 20 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20  nt stemming or. 
14e90 20 64 69 73 63 61 72 64 20 70 75 6e 63 74 75 61   discard punctua
14ea0 74 69 6f 6e 2c 20 74 68 69 73 20 63 61 6e 20 62  tion, this can b
14eb0 65 20 64 6f 6e 65 20 62 79 20 63 72 65 61 74 69  e done by creati
14ec0 6e 67 20 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20  ng a tokenizer. 
14ed0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14ee0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 49 43  that uses the IC
14ef0 55 20 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70  U tokenizer as p
14f00 61 72 74 20 6f 66 20 69 74 73 20 69 6d 70 6c 65  art of its imple
14f10 6d 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c 68 32 3e  mentation...<h2>
14f20 43 75 73 74 6f 6d 20 28 55 73 65 72 20 49 6d 70  Custom (User Imp
14f30 6c 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69  lemented) Tokeni
14f40 7a 65 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  zers</h2>..<p>. 
14f50 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   As well as the 
14f60 62 75 69 6c 74 2d 69 6e 20 22 73 69 6d 70 6c 65  built-in "simple
14f70 22 2c 20 22 70 6f 72 74 65 72 22 20 61 6e 64 20  ", "porter" and 
14f80 28 70 6f 73 73 69 62 6c 79 29 20 22 69 63 75 22  (possibly) "icu"
14f90 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 46   tokenizers,.  F
14fa0 54 53 20 65 78 70 6f 72 74 73 20 61 6e 20 69 6e  TS exports an in
14fb0 74 65 72 66 61 63 65 20 74 68 61 74 20 61 6c 6c  terface that all
14fc0 6f 77 73 20 75 73 65 72 73 20 74 6f 20 69 6d 70  ows users to imp
14fd0 6c 65 6d 65 6e 74 20 63 75 73 74 6f 6d 20 74 6f  lement custom to
14fe0 6b 65 6e 69 7a 65 72 73 0a 20 20 75 73 69 6e 67  kenizers.  using
14ff0 20 43 2e 20 54 68 65 20 69 6e 74 65 72 66 61 63   C. The interfac
15000 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
15010 20 61 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72   a new tokenizer
15020 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20   is defined and 
15030 0a 20 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  .  described in 
15040 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  the fts3_tokeniz
15050 65 72 2e 68 20 73 6f 75 72 63 65 20 66 69 6c 65  er.h source file
15060 2e 0a 0a 3c 70 3e 0a 20 20 52 65 67 69 73 74 65  ...<p>.  Registe
15070 72 69 6e 67 20 61 20 6e 65 77 20 46 54 53 20 74  ring a new FTS t
15080 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 69 6d 69  okenizer is simi
15090 6c 61 72 20 74 6f 20 72 65 67 69 73 74 65 72 69  lar to registeri
150a0 6e 67 20 61 20 6e 65 77 0a 20 20 76 69 72 74 75  ng a new.  virtu
150b0 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
150c0 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68 65  with SQLite. The
150d0 20 75 73 65 72 20 70 61 73 73 65 73 20 61 20 70   user passes a p
150e0 6f 69 6e 74 65 72 20 74 6f 20 61 0a 20 20 73 74  ointer to a.  st
150f0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
15100 6e 67 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 76  ng pointers to v
15110 61 72 69 6f 75 73 20 63 61 6c 6c 62 61 63 6b 20  arious callback 
15120 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20  functions that. 
15130 20 6d 61 6b 65 20 75 70 20 74 68 65 20 69 6d 70   make up the imp
15140 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
15150 68 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72  he new tokenizer
15160 20 74 79 70 65 2e 20 46 6f 72 20 74 6f 6b 65 6e   type. For token
15170 69 7a 65 72 73 2c 0a 20 20 74 68 65 20 73 74 72  izers,.  the str
15180 75 63 74 75 72 65 20 28 64 65 66 69 6e 65 64 20  ucture (defined 
15190 69 6e 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  in fts3_tokenize
151a0 72 2e 68 29 20 69 73 20 63 61 6c 6c 65 64 0a 20  r.h) is called. 
151b0 20 22 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69   "sqlite3_tokeni
151c0 7a 65 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70  zer_module"...<p
151d0 3e 0a 20 20 46 54 53 20 64 6f 65 73 20 6e 6f 74  >.  FTS does not
151e0 20 65 78 70 6f 73 65 20 61 20 43 2d 66 75 6e 63   expose a C-func
151f0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 72 73 20  tion that users 
15200 63 61 6c 6c 20 74 6f 20 72 65 67 69 73 74 65 72  call to register
15210 20 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a 65 72   new.  tokenizer
15220 20 74 79 70 65 73 20 77 69 74 68 20 61 20 64 61   types with a da
15230 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49  tabase handle. I
15240 6e 73 74 65 61 64 2c 20 74 68 65 20 70 6f 69 6e  nstead, the poin
15250 74 65 72 20 6d 75 73 74 0a 20 20 62 65 20 65 6e  ter must.  be en
15260 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20  coded as an SQL 
15270 62 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64 20 70  blob value and p
15280 61 73 73 65 64 20 74 6f 20 46 54 53 20 74 68 72  assed to FTS thr
15290 6f 75 67 68 20 74 68 65 20 53 51 4c 0a 20 20 65  ough the SQL.  e
152a0 6e 67 69 6e 65 20 62 79 20 65 76 61 6c 75 61 74  ngine by evaluat
152b0 69 6e 67 20 61 20 73 70 65 63 69 61 6c 20 73 63  ing a special sc
152c0 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c 20 22  alar function, "
152d0 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
152e0 22 2e 0a 20 20 54 68 65 20 66 74 73 33 5f 74 6f  "..  The fts3_to
152f0 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69  kenizer() functi
15300 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
15310 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f   with one or two
15320 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20 61 73   arguments,.  as
15330 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65   follows:..<code
15340 62 6c 6f 63 6b 3e 0a 20 20 20 20 53 45 4c 45 43  block>.    SELEC
15350 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
15360 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e  (&lt;tokenizer-n
15370 61 6d 65 26 67 74 3b 29 3b 0a 20 20 20 20 53 45  ame&gt;);.    SE
15380 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69  LECT fts3_tokeni
15390 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  zer(&lt;tokenize
153a0 72 2d 6e 61 6d 65 26 67 74 3b 2c 20 26 6c 74 3b  r-name&gt;, &lt;
153b0 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
153c0 72 5f 6d 6f 64 75 6c 65 20 70 74 72 26 67 74 3b  r_module ptr&gt;
153d0 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
153e0 0a 3c 70 3e 0a 20 20 57 68 65 72 65 20 3c 74 6f  .<p>.  Where <to
153f0 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 69 73  kenizer-name> is
15400 20 61 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69   a string identi
15410 66 79 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69  fying the tokeni
15420 7a 65 72 20 61 6e 64 0a 20 20 3c 73 71 6c 69 74  zer and.  <sqlit
15430 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
15440 75 6c 65 20 70 74 72 3e 20 69 73 20 61 20 70 6f  ule ptr> is a po
15450 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
15460 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
15470 64 75 6c 65 0a 20 20 73 74 72 75 63 74 75 72 65  dule.  structure
15480 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 53   encoded as an S
15490 51 4c 20 62 6c 6f 62 2e 20 49 66 20 74 68 65 20  QL blob. If the 
154a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
154b0 69 73 20 70 72 65 73 65 6e 74 2c 0a 20 20 69 74  is present,.  it
154c0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
154d0 73 20 74 6f 6b 65 6e 69 7a 65 72 20 3c 74 6f 6b  s tokenizer <tok
154e0 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 61 6e 64  enizer-name> and
154f0 20 61 20 63 6f 70 79 20 6f 66 20 69 74 0a 20 20   a copy of it.  
15500 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6f 6e 6c  returned. If onl
15510 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 69  y one argument i
15520 73 20 70 61 73 73 65 64 2c 20 61 20 70 6f 69 6e  s passed, a poin
15530 74 65 72 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e  ter to the token
15540 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74  izer.  implement
15550 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ation currently 
15560 72 65 67 69 73 74 65 72 65 64 20 61 73 20 3c 74  registered as <t
15570 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 69  okenizer-name> i
15580 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 65 6e  s returned,.  en
15590 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e  coded as a blob.
155a0 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63 68 20   Or, if no such 
155b0 74 6f 6b 65 6e 69 7a 65 72 20 65 78 69 73 74 73  tokenizer exists
155c0 2c 20 61 6e 20 53 51 4c 20 65 78 63 65 70 74 69  , an SQL excepti
155d0 6f 6e 0a 20 20 28 65 72 72 6f 72 29 20 69 73 20  on.  (error) is 
155e0 72 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a 20 20 3c  raised...<p>.  <
155f0 62 3e 53 45 43 55 52 49 54 59 20 57 41 52 4e 49  b>SECURITY WARNI
15600 4e 47 3c 2f 62 3e 3a 20 49 66 20 74 68 65 20 66  NG</b>: If the f
15610 74 73 33 2f 34 20 65 78 74 65 6e 73 69 6f 6e 20  ts3/4 extension 
15620 69 73 20 75 73 65 64 20 69 6e 20 61 6e 20 65 6e  is used in an en
15630 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 77 68 65 72  vironment.  wher
15640 65 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 61  e potentially ma
15650 6c 69 63 69 6f 75 73 20 75 73 65 72 73 20 6d 61  licious users ma
15660 79 20 65 78 65 63 75 74 65 20 61 72 62 69 74 72  y execute arbitr
15670 61 72 79 20 53 51 4c 2c 20 74 68 65 79 20 73 68  ary SQL, they sh
15680 6f 75 6c 64 20 0a 20 20 62 65 20 70 72 65 76 65  ould .  be preve
15690 6e 74 65 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 69  nted from invoki
156a0 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65  ng the fts3_toke
156b0 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  nizer() function
156c0 2c 20 70 6f 73 73 69 62 6c 79 20 75 73 69 6e 67  , possibly using
156d0 20 0a 20 20 74 68 65 20 5b 73 71 6c 69 74 65 33   .  the [sqlite3
156e0 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
156f0 29 7c 61 75 74 68 6f 72 69 73 61 74 69 6f 6e 20  )|authorisation 
15700 63 61 6c 6c 62 61 63 6b 5d 2e 0a 0a 3c 70 3e 0a  callback]...<p>.
15710 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15720 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61  block contains a
15730 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 63 61 6c  n example of cal
15740 6c 69 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f  ling the fts3_to
15750 6b 65 6e 69 7a 65 72 28 29 0a 20 20 66 75 6e 63  kenizer().  func
15760 74 69 6f 6e 20 66 72 6f 6d 20 43 20 63 6f 64 65  tion from C code
15770 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
15780 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69   <i>/*.  ** Regi
15790 73 74 65 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72  ster a tokenizer
157a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
157b0 77 69 74 68 20 46 54 53 33 20 6f 72 20 46 54 53  with FTS3 or FTS
157c0 34 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e  4..  */</i>.  in
157d0 74 20 72 65 67 69 73 74 65 72 54 6f 6b 65 6e 69  t registerTokeni
157e0 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33  zer(.    sqlite3
157f0 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a   *db,.    char *
15800 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74  zName,.    const
15810 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
15820 65 72 5f 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29  er_module *p.  )
15830 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
15840 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
15850 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74  pStmt;.    const
15860 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
15870 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e  ELECT fts3_token
15880 69 7a 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20  izer(?, ?)";..  
15890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
158a0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
158b0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
158c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
158d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
158e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
158f0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
15900 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
15910 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  , 1, zName, -1, 
15920 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
15930 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
15940 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20  _blob(pStmt, 2, 
15950 26 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 53  &p, sizeof(p), S
15960 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
15970 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
15980 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74  pStmt);..    ret
15990 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
159a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
159b0 0a 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51  ..  <i>/*.  ** Q
159c0 75 65 72 79 20 46 54 53 20 66 6f 72 20 74 68 65  uery FTS for the
159d0 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
159e0 6d 65 6e 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20  mentation named 
159f0 7a 4e 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a  zName..  */</i>.
15a00 20 20 69 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e    int queryToken
15a10 69 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65  izer(.    sqlite
15a20 33 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20  3 *db,.    char 
15a30 2a 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73  *zName,.    cons
15a40 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  t sqlite3_tokeni
15a50 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a  zer_module **pp.
15a60 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b    ){.    int rc;
15a70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
15a80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f  t *pStmt;.    co
15a90 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
15aa0 20 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f   "SELECT fts3_to
15ab0 6b 65 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20  kenizer(?)";..  
15ac0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 72    *pp = 0;.    r
15ad0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
15ae0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
15af0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
15b00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15b30 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ..    sqlite3_bi
15b40 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
15b50 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
15b60 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
15b70 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
15b80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
15b90 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tmt) ){.      if
15ba0 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
15bb0 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d  _type(pStmt, 0)=
15bc0 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
15bd0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
15be0 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  p, sqlite3_colum
15bf0 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
15c00 2c 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a  , sizeof(*pp));.
15c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15c20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
15c30 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
15c40 29 3b 0a 20 20 7d 0a 3c 2f 63 6f 64 65 62 6c 6f  );.  }.</codeblo
15c50 63 6b 3e 0a 0a 20 20 0a 3c 68 31 20 74 61 67 73  ck>..  .<h1 tags
15c60 3d 22 73 65 67 6d 65 6e 74 20 62 74 72 65 65 22  ="segment btree"
15c70 3e 44 61 74 61 20 53 74 72 75 63 74 75 72 65 73  >Data Structures
15c80 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69  </h1>..<p>.  Thi
15c90 73 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69  s section descri
15ca0 62 65 73 20 61 74 20 61 20 68 69 67 68 2d 6c 65  bes at a high-le
15cb0 76 65 6c 20 74 68 65 20 77 61 79 20 74 68 65 20  vel the way the 
15cc0 46 54 53 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65  FTS module store
15cd0 73 20 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e  s its.  index an
15ce0 64 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  d content in the
15cf0 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73   database. It is
15d00 20 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72   <b>not necessar
15d10 79 20 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20  y to read or .  
15d20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d  understand the m
15d30 61 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20  aterial in this 
15d40 73 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72  section in order
15d50 20 74 6f 20 75 73 65 20 46 54 53 3c 2f 62 3e 20   to use FTS</b> 
15d60 69 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61  in an .  applica
15d70 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69  tion. However, i
15d80 74 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20  t may be useful 
15d90 74 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  to application d
15da0 65 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70  evelopers attemp
15db0 74 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79  ting .  to analy
15dc0 7a 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e  ze and understan
15dd0 64 20 46 54 53 20 70 65 72 66 6f 72 6d 61 6e 63  d FTS performanc
15de0 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
15df0 73 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70  s, or to develop
15e00 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61  ers .  contempla
15e10 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74  ting enhancement
15e20 73 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e  s to the existin
15e30 67 20 46 54 53 20 66 65 61 74 75 72 65 20 73 65  g FTS feature se
15e40 74 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  t...<tcl>hd_frag
15e50 6d 65 6e 74 20 2a 73 68 61 64 6f 77 74 61 62 20  ment *shadowtab 
15e60 7b 46 54 53 20 73 68 61 64 6f 77 20 74 61 62 6c  {FTS shadow tabl
15e70 65 73 7d 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20  es}</tcl>.<p>.  
15e80 46 6f 72 20 65 61 63 68 20 46 54 53 20 76 69 72  For each FTS vir
15e90 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 61 20  tual table in a 
15ea0 64 61 74 61 62 61 73 65 2c 20 74 68 72 65 65 20  database, three 
15eb0 74 6f 20 66 69 76 65 20 72 65 61 6c 20 28 6e 6f  to five real (no
15ec0 6e 2d 76 69 72 74 75 61 6c 29 20 74 61 62 6c 65  n-virtual) table
15ed0 73 0a 20 20 61 72 65 20 63 72 65 61 74 65 64 20  s.  are created 
15ee0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 75 6e 64  to store the und
15ef0 65 72 6c 79 69 6e 67 20 64 61 74 61 2e 20 20 54  erlying data.  T
15f00 68 65 73 65 20 72 65 61 6c 20 74 61 62 6c 65 73  hese real tables
15f10 20 61 72 65 20 63 61 6c 6c 65 64 20 22 73 68 61   are called "sha
15f20 64 6f 77 20 74 61 62 6c 65 73 22 2e 0a 20 20 54  dow tables"..  T
15f30 68 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20 61  he real tables a
15f40 72 65 20 6e 61 6d 65 64 20 22 25 5f 63 6f 6e 74  re named "%_cont
15f50 65 6e 74 22 2c 0a 20 20 22 25 5f 73 65 67 64 69  ent",.  "%_segdi
15f60 72 22 2c 20 22 25 5f 73 65 67 6d 65 6e 74 73 22  r", "%_segments"
15f70 2c 20 22 25 5f 73 74 61 74 22 2c 20 61 6e 64 20  , "%_stat", and 
15f80 22 25 5f 64 6f 63 73 69 7a 65 22 2c 20 77 68 65  "%_docsize", whe
15f90 72 65 20 22 25 22 20 69 73 20 72 65 70 6c 61 63  re "%" is replac
15fa0 65 64 20 62 79 20 74 68 65 20 6e 61 6d 65 0a 20  ed by the name. 
15fb0 20 6f 66 20 74 68 65 20 46 54 53 20 76 69 72 74   of the FTS virt
15fc0 75 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a  ual table...<p>.
15fd0 20 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63    The leftmost c
15fe0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22 25 5f  olumn of the "%_
15ff0 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 20 69  content" table i
16000 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
16010 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 0a 20  MARY KEY field. 
16020 20 6e 61 6d 65 64 20 22 64 6f 63 69 64 22 2e 20   named "docid". 
16030 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 69  Following this i
16040 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  s one column for
16050 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
16060 74 68 65 20 46 54 53 0a 20 20 76 69 72 74 75 61  the FTS.  virtua
16070 6c 20 74 61 62 6c 65 20 61 73 20 64 65 63 6c 61  l table as decla
16080 72 65 64 20 62 79 20 74 68 65 20 75 73 65 72 2c  red by the user,
16090 20 6e 61 6d 65 64 20 62 79 20 70 72 65 70 65 6e   named by prepen
160a0 64 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ding the column 
160b0 6e 61 6d 65 0a 20 20 73 75 70 70 6c 69 65 64 20  name.  supplied 
160c0 62 79 20 74 68 65 20 75 73 65 72 20 77 69 74 68  by the user with
160d0 20 22 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68   "c<i>N</i>", wh
160e0 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20  ere <i>N</i> is 
160f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
16100 20 0a 20 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69   .  column withi
16110 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6e 75 6d  n the table, num
16120 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20  bered from left 
16130 74 6f 20 72 69 67 68 74 20 73 74 61 72 74 69 6e  to right startin
16140 67 20 77 69 74 68 20 30 2e 20 44 61 74 61 0a 20  g with 0. Data. 
16150 20 74 79 70 65 73 20 73 75 70 70 6c 69 65 64 20   types supplied 
16160 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 76  as part of the v
16170 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63  irtual table dec
16180 6c 61 72 61 74 69 6f 6e 20 61 72 65 20 6e 6f 74  laration are not
16190 20 75 73 65 64 20 61 73 0a 20 20 70 61 72 74 20   used as.  part 
161a0 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  of the %_content
161b0 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
161c0 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  on. For example:
161d0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
161e0 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61  <i>-- Virtual ta
161f0 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c  ble declaration<
16200 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
16210 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20 55  TUAL TABLE abc U
16220 53 49 4e 47 20 66 74 73 34 28 61 20 4e 55 4d 42  SING fts4(a NUMB
16230 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b 0a  ER, b TEXT, c);.
16240 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73 70  .  <i>-- Corresp
16250 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e 74  onding %_content
16260 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
16270 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  on</i>.  CREATE 
16280 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65 6e  TABLE abc_conten
16290 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20  t(docid INTEGER 
162a0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 30 61  PRIMARY KEY, c0a
162b0 2c 20 63 31 62 2c 20 63 32 63 29 3b 0a 3c 2f 63  , c1b, c2c);.</c
162c0 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
162d0 20 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   The %_content t
162e0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
162f0 65 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20  e unadulterated 
16300 64 61 74 61 20 69 6e 73 65 72 74 65 64 20 62 79  data inserted by
16310 20 74 68 65 20 75 73 65 72 20 0a 20 20 69 6e 74   the user .  int
16320 6f 20 74 68 65 20 46 54 53 20 76 69 72 74 75 61  o the FTS virtua
16330 6c 20 74 61 62 6c 65 20 62 79 20 74 68 65 20 75  l table by the u
16340 73 65 72 2e 20 49 66 20 74 68 65 20 75 73 65 72  ser. If the user
16350 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
16360 69 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20  itly.  supply a 
16370 22 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68  "docid" value wh
16380 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63  en inserting rec
16390 6f 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c  ords, one is sel
163a0 65 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ected automatica
163b0 6c 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79 73  lly.  by the sys
163c0 74 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  tem...<p>.  The 
163d0 25 5f 73 74 61 74 20 61 6e 64 20 25 5f 64 6f 63  %_stat and %_doc
163e0 73 69 7a 65 20 74 61 62 6c 65 73 20 61 72 65 20  size tables are 
163f0 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 69 66 20  only created if 
16400 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 75 73  the FTS table us
16410 65 73 20 74 68 65 0a 20 20 46 54 53 34 20 6d 6f  es the.  FTS4 mo
16420 64 75 6c 65 2c 20 6e 6f 74 20 46 54 53 33 2e 20  dule, not FTS3. 
16430 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65  Furthermore, the
16440 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65   %_docsize table
16450 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
16460 68 65 0a 20 20 46 54 53 34 20 74 61 62 6c 65 20  he.  FTS4 table 
16470 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
16480 74 68 65 20 5b 46 54 53 34 20 6d 61 74 63 68 69  the [FTS4 matchi
16490 6e 66 6f 20 6f 70 74 69 6f 6e 7c 22 6d 61 74 63  nfo option|"matc
164a0 68 69 6e 66 6f 3d 66 74 73 33 22 5d 20 64 69 72  hinfo=fts3"] dir
164b0 65 63 74 69 76 65 0a 20 20 73 70 65 63 69 66 69  ective.  specifi
164c0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
164d0 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
164e0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
164f0 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 63 72  . If they are cr
16500 65 61 74 65 64 2c 0a 20 20 74 68 65 20 73 63 68  eated,.  the sch
16510 65 6d 61 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ema of the two t
16520 61 62 6c 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  ables is as foll
16530 6f 77 73 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ows:.<codeblock>
16540 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
16550 25 5f 73 74 61 74 28 0a 20 20 20 20 69 64 20 49  %_stat(.    id I
16560 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
16570 45 59 2c 20 0a 20 20 20 20 76 61 6c 75 65 20 42  EY, .    value B
16580 4c 4f 42 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41  LOB.  );..  CREA
16590 54 45 20 54 41 42 4c 45 20 25 5f 64 6f 63 73 69  TE TABLE %_docsi
165a0 7a 65 28 0a 20 20 20 20 64 6f 63 69 64 20 49 4e  ze(.    docid IN
165b0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
165c0 59 2c 0a 20 20 20 20 73 69 7a 65 20 42 4c 4f 42  Y,.    size BLOB
165d0 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  .  );.</codebloc
165e0 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61  k>..<p>.  For ea
165f0 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 46 54  ch row in the FT
16600 53 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 64  S table, the %_d
16610 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 63 6f 6e  ocsize table con
16620 74 61 69 6e 73 20 61 20 63 6f 72 72 65 73 70 6f  tains a correspo
16630 6e 64 69 6e 67 0a 20 20 72 6f 77 20 77 69 74 68  nding.  row with
16640 20 74 68 65 20 73 61 6d 65 20 22 64 6f 63 69 64   the same "docid
16650 22 20 76 61 6c 75 65 2e 20 54 68 65 20 22 73 69  " value. The "si
16660 7a 65 22 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  ze" field contai
16670 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73  ns a blob consis
16680 74 69 6e 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c 2f  ting.  of <i>N</
16690 69 3e 20 46 54 53 20 76 61 72 69 6e 74 73 2c 20  i> FTS varints, 
166a0 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69  where <i>N</i> i
166b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
166c0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c  user-defined col
166d0 75 6d 6e 73 0a 20 20 69 6e 20 74 68 65 20 74 61  umns.  in the ta
166e0 62 6c 65 2e 20 45 61 63 68 20 76 61 72 69 6e 74  ble. Each varint
166f0 20 69 6e 20 74 68 65 20 22 73 69 7a 65 22 20 62   in the "size" b
16700 6c 6f 62 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lob is the numbe
16710 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74  r of tokens in t
16720 68 65 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64 69  he.  correspondi
16730 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ng column of the
16740 20 61 73 73 6f 63 69 61 74 65 64 20 72 6f 77 20   associated row 
16750 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  in the FTS table
16760 2e 20 54 68 65 20 25 5f 73 74 61 74 20 74 61 62  . The %_stat tab
16770 6c 65 0a 20 20 61 6c 77 61 79 73 20 63 6f 6e 74  le.  always cont
16780 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ains a single ro
16790 77 20 77 69 74 68 20 74 68 65 20 22 69 64 22 20  w with the "id" 
167a0 63 6f 6c 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e  column set to 0.
167b0 20 54 68 65 20 22 76 61 6c 75 65 22 20 0a 20 20   The "value" .  
167c0 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
167d0 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e  a blob consistin
167e0 67 20 6f 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e 20  g of <i>N+1</i> 
167f0 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68 65  FTS varints, whe
16800 72 65 20 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69 73  re <i>N</i>.  is
16810 20 61 67 61 69 6e 20 74 68 65 20 6e 75 6d 62 65   again the numbe
16820 72 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  r of user-define
16830 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
16840 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20   FTS table. The 
16850 66 69 72 73 74 0a 20 20 76 61 72 69 6e 74 20 69  first.  varint i
16860 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 73 65  n the blob is se
16870 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  t to the total n
16880 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
16890 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20   the FTS table. 
168a0 54 68 65 0a 20 20 73 65 63 6f 6e 64 20 61 6e 64  The.  second and
168b0 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 72 69   subsequent vari
168c0 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  nts contain the 
168d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
168e0 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e  tokens stored in
168f0 0a 20 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  .  the correspon
16900 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 6f 72 20  ding column for 
16910 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
16920 46 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a  FTS table...<p>.
16930 20 20 54 68 65 20 74 77 6f 20 72 65 6d 61 69 6e    The two remain
16940 69 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f 73 65  ing tables, %_se
16950 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67  gments and %_seg
16960 64 69 72 2c 20 61 72 65 20 75 73 65 64 20 74 6f  dir, are used to
16970 20 73 74 6f 72 65 20 74 68 65 20 0a 20 20 66 75   store the .  fu
16980 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 43  ll-text index. C
16990 6f 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68 69  onceptually, thi
169a0 73 20 69 6e 64 65 78 20 69 73 20 61 20 6c 6f 6f  s index is a loo
169b0 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20 6d  kup table that m
169c0 61 70 73 20 65 61 63 68 20 0a 20 20 74 65 72 6d  aps each .  term
169d0 20 28 77 6f 72 64 29 20 74 6f 20 74 68 65 20 73   (word) to the s
169e0 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c 75  et of docid valu
169f0 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
16a00 20 74 6f 20 72 65 63 6f 72 64 73 20 69 6e 20 74   to records in t
16a10 68 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74 20  he .  %_content 
16a20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
16a30 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  in one or more o
16a40 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68  ccurrences of th
16a50 65 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65 74  e term. To.  ret
16a60 72 69 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d 65  rieve all docume
16a70 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
16a80 20 61 20 73 70 65 63 69 66 69 65 64 20 74 65 72   a specified ter
16a90 6d 2c 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c  m, the FTS modul
16aa0 65 0a 20 20 71 75 65 72 69 65 73 20 74 68 69 73  e.  queries this
16ab0 20 69 6e 64 65 78 20 74 6f 20 64 65 74 65 72 6d   index to determ
16ac0 69 6e 65 20 74 68 65 20 73 65 74 20 6f 66 20 64  ine the set of d
16ad0 6f 63 69 64 20 76 61 6c 75 65 73 20 66 6f 72 20  ocid values for 
16ae0 72 65 63 6f 72 64 73 20 74 68 61 74 0a 20 20 63  records that.  c
16af0 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 2c  ontain the term,
16b00 20 74 68 65 6e 20 72 65 74 72 69 65 76 65 73 20   then retrieves 
16b10 74 68 65 20 72 65 71 75 69 72 65 64 20 64 6f 63  the required doc
16b20 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  uments from the 
16b30 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62 6c  %_content.  tabl
16b40 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  e. Regardless of
16b50 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
16b60 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74  he FTS virtual t
16b70 61 62 6c 65 2c 20 74 68 65 20 25 5f 73 65 67 6d  able, the %_segm
16b80 65 6e 74 73 0a 20 20 61 6e 64 20 25 5f 73 65 67  ents.  and %_seg
16b90 64 69 72 20 74 61 62 6c 65 73 20 61 72 65 20 61  dir tables are a
16ba0 6c 77 61 79 73 20 63 72 65 61 74 65 64 20 61 73  lways created as
16bb0 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65   follows:..<code
16bc0 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20  block>.  CREATE 
16bd0 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73  TABLE %_segments
16be0 28 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e  (.    blockid IN
16bf0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
16c00 59 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42  Y,       <i>-- B
16c10 2d 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69  -tree node id</i
16c20 3e 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62  >.    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 20 20 20 3c 69 3e 2d 2d 20 42           <i>-- B
16c50 2d 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61 3c  -tree node data<
16c60 2f 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41  /i>.  );..  CREA
16c70 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64 69  TE TABLE %_segdi
16c80 72 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e 54  r(.    level INT
16c90 45 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49 4e  EGER,.    idx IN
16ca0 54 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72 74  TEGER,.    start
16cb0 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20  _block INTEGER, 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
16cd0 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66  >-- Blockid of f
16ce0 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73  irst node in %_s
16cf0 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20  egments</i>.    
16d00 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
16d10 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20   INTEGER,       
16d20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64     <i>-- Blockid
16d30 20 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f   of last leaf no
16d40 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  de in %_segments
16d50 3c 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f  </i>.    end_blo
16d60 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20  ck INTEGER,     
16d70 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d              <i>-
16d80 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73  - Blockid of las
16d90 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d  t node in %_segm
16da0 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f  ents</i>.    roo
16db0 74 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  t BLOB,         
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f  <i>-- B-tree roo
16de0 74 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50  t node</i>.    P
16df0 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c  RIMARY KEY(level
16e00 2c 20 69 64 78 29 0a 20 20 29 3b 0a 3c 2f 63 6f  , idx).  );.</co
16e10 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
16e20 54 68 65 20 73 63 68 65 6d 61 20 64 65 70 69 63  The schema depic
16e30 74 65 64 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ted above is not
16e40 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 74 6f   designed to sto
16e50 72 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  re the full-text
16e60 20 69 6e 64 65 78 20 0a 20 20 64 69 72 65 63 74   index .  direct
16e70 6c 79 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20  ly. Instead, it 
16e80 69 73 20 75 73 65 64 20 74 6f 20 6f 6e 65 20 6f  is used to one o
16e90 72 20 6d 6f 72 65 20 62 2d 74 72 65 65 20 73 74  r more b-tree st
16ea0 72 75 63 74 75 72 65 73 2e 20 54 68 65 72 65 0a  ructures. There.
16eb0 20 20 69 73 20 6f 6e 65 20 62 2d 74 72 65 65 20    is one b-tree 
16ec0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
16ed0 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
16ee0 6c 65 2e 20 54 68 65 20 25 5f 73 65 67 64 69 72  le. The %_segdir
16ef0 20 74 61 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e   table.  row con
16f00 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e  tains the root n
16f10 6f 64 65 20 61 6e 64 20 76 61 72 69 6f 75 73 20  ode and various 
16f20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
16f30 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
16f40 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
16f50 2c 20 61 6e 64 20 74 68 65 20 25 5f 73 65 67 6d  , and the %_segm
16f60 65 6e 74 73 20 74 61 62 6c 65 20 63 6f 6e 74 61  ents table conta
16f70 69 6e 73 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e  ins all other (n
16f80 6f 6e 2d 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65  on-root).  b-tre
16f90 65 20 6e 6f 64 65 73 2e 20 45 61 63 68 20 62 2d  e nodes. Each b-
16fa0 74 72 65 65 20 69 73 20 72 65 66 65 72 72 65 64  tree is referred
16fb0 20 74 6f 20 61 73 20 61 20 22 73 65 67 6d 65 6e   to as a "segmen
16fc0 74 22 2e 20 4f 6e 63 65 20 69 74 20 68 61 73 0a  t". Once it has.
16fd0 20 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20    been created, 
16fe0 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
16ff0 20 69 73 20 6e 65 76 65 72 20 75 70 64 61 74 65   is never update
17000 64 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 6d  d (although it m
17010 61 79 20 62 65 0a 20 20 64 65 6c 65 74 65 64 20  ay be.  deleted 
17020 61 6c 74 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70  altogether)...<p
17030 3e 0a 20 20 54 68 65 20 6b 65 79 73 20 75 73 65  >.  The keys use
17040 64 20 62 79 20 65 61 63 68 20 73 65 67 6d 65 6e  d by each segmen
17050 74 20 62 2d 74 72 65 65 20 61 72 65 20 74 65 72  t b-tree are ter
17060 6d 73 20 28 77 6f 72 64 73 29 2e 20 41 73 20 77  ms (words). As w
17070 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 6b 65 79  ell as the.  key
17080 2c 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62  , each segment b
17090 2d 74 72 65 65 20 65 6e 74 72 79 20 68 61 73 20  -tree entry has 
170a0 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 22 64  an associated "d
170b0 6f 63 6c 69 73 74 22 20 28 64 6f 63 75 6d 65 6e  oclist" (documen
170c0 74 20 6c 69 73 74 29 2e 0a 20 20 41 20 64 6f 63  t list)..  A doc
170d0 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  list consists of
170e0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e   zero or more en
170f0 74 72 69 65 73 2c 20 77 68 65 72 65 20 65 61 63  tries, where eac
17100 68 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  h entry consists
17110 20 6f 66 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69   of:..<ul>.  <li
17120 3e 20 41 20 64 6f 63 69 64 20 28 64 6f 63 75 6d  > A docid (docum
17130 65 6e 74 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c  ent id), and.  <
17140 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65  li> A list of te
17150 72 6d 20 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20  rm offsets, one 
17160 66 6f 72 20 65 61 63 68 20 6f 63 63 75 72 72 65  for each occurre
17170 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  nce of the term 
17180 77 69 74 68 69 6e 0a 20 20 20 20 20 20 20 74 68  within.       th
17190 65 20 64 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65  e document. A te
171a0 72 6d 20 6f 66 66 73 65 74 20 69 6e 64 69 63 61  rm offset indica
171b0 74 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tes the number o
171c0 66 20 74 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29  f tokens (words)
171d0 0a 20 20 20 20 20 20 20 74 68 61 74 20 6f 63 63  .       that occ
171e0 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 74 65  ur before the te
171f0 72 6d 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20  rm in question, 
17200 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
17210 66 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  f characters.   
17220 20 20 20 20 6f 72 20 62 79 74 65 73 2e 20 46 6f      or bytes. Fo
17230 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  r example, the t
17240 65 72 6d 20 6f 66 66 73 65 74 20 6f 66 20 74 68  erm offset of th
17250 65 20 74 65 72 6d 20 22 77 61 72 22 20 69 6e 20  e term "war" in 
17260 74 68 65 0a 20 20 20 20 20 20 20 70 68 72 61 73  the.       phras
17270 65 20 22 41 6e 63 65 73 74 72 61 6c 20 76 6f 69  e "Ancestral voi
17280 63 65 73 20 70 72 6f 70 68 65 73 79 69 6e 67 20  ces prophesying 
17290 77 61 72 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c  war!" is 3..</ul
172a0 3e 0a 0a 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73  >..<p>.  Entries
172b0 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73   within a doclis
172c0 74 20 61 72 65 20 73 6f 72 74 65 64 20 62 79 20  t are sorted by 
172d0 64 6f 63 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73  docid. Positions
172e0 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73   within a doclis
172f0 74 0a 20 20 65 6e 74 72 79 20 61 72 65 20 73 74  t.  entry are st
17300 6f 72 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  ored in ascendin
17310 67 20 6f 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20  g order...<p>.  
17320 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
17330 74 68 65 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c  the logical full
17340 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73 20 66  -text index is f
17350 6f 75 6e 64 20 62 79 20 6d 65 72 67 69 6e 67 20  ound by merging 
17360 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f  the.  contents o
17370 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d  f all segment b-
17380 74 72 65 65 73 2e 20 49 66 20 61 20 74 65 72 6d  trees. If a term
17390 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 6d   is present in m
173a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73  ore than one.  s
173b0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20 74  egment b-tree, t
173c0 68 65 6e 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hen it maps to t
173d0 68 65 20 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68  he union of each
173e0 20 69 6e 64 69 76 69 64 75 61 6c 20 64 6f 63 6c   individual docl
173f0 69 73 74 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61  ist. If,.  for a
17400 20 73 69 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68   single term, th
17410 65 20 73 61 6d 65 20 64 6f 63 69 64 20 6f 63 63  e same docid occ
17420 75 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  urs in more than
17430 20 6f 6e 65 20 64 6f 63 6c 69 73 74 2c 20 74 68   one doclist, th
17440 65 6e 20 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f  en only.  the do
17450 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 61  clist that is pa
17460 72 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  rt of the most r
17470 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
17480 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
17490 73 20 0a 20 20 63 6f 6e 73 69 64 65 72 65 64 20  s .  considered 
174a0 76 61 6c 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d  valid. ..<p>.  M
174b0 75 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20 73  ultiple b-tree s
174c0 74 72 75 63 74 75 72 65 73 20 61 72 65 20 75 73  tructures are us
174d0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ed instead of a 
174e0 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 74 6f  single b-tree to
174f0 20 72 65 64 75 63 65 0a 20 20 74 68 65 20 63 6f   reduce.  the co
17500 73 74 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20  st of inserting 
17510 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 46 54 53  records into FTS
17520 20 74 61 62 6c 65 73 2e 20 57 68 65 6e 20 61 20   tables. When a 
17530 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 0a 20  new record is . 
17540 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
17550 6e 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74  n FTS table that
17560 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
17570 73 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c  s a lot of data,
17580 20 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20   it is.  likely 
17590 74 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65  that many of the
175a0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65   terms in the ne
175b0 77 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72  w record are alr
175c0 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a  eady present in.
175d0 20 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72    a large number
175e0 20 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65 63   of existing rec
175f0 6f 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c  ords. If a singl
17600 65 20 62 2d 74 72 65 65 20 77 65 72 65 20 75 73  e b-tree were us
17610 65 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65  ed, then.  large
17620 20 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75   doclist structu
17630 72 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74  res would have t
17640 6f 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d  o be loaded from
17650 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20   the database,. 
17660 20 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c   amended to incl
17670 75 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69  ude the new doci
17680 64 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65  d and term-offse
17690 74 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69  t list, then wri
176a0 74 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74  tten back.  to t
176b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 55 73 69  he database. Usi
176c0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72  ng multiple b-tr
176d0 65 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73  ee tables allows
176e0 20 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69   this to be avoi
176f0 64 65 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e  ded.  by creatin
17700 67 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77  g a new b-tree w
17710 68 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67  hich can be merg
17720 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
17730 74 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f  ting b-tree.  (o
17740 72 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72  r b-trees) later
17750 20 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20   on. Merging of 
17760 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
17770 73 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d  s can be perform
17780 65 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72  ed as.  a backgr
17790 6f 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e  ound task, or on
177a0 63 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d  ce a certain num
177b0 62 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 20  ber of separate 
177c0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
177d0 73 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61 63  s.  have been ac
177e0 63 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f  cumulated. Of co
177f0 75 72 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d  urse, this schem
17800 65 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20  e makes queries 
17810 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20  more expensive. 
17820 20 28 61 73 20 74 68 65 20 46 54 53 20 63 6f 64   (as the FTS cod
17830 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c 6f  e may have to lo
17840 6f 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61 6c  ok up individual
17850 20 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74   terms in more t
17860 68 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65  han one.  b-tree
17870 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
17880 65 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74 20  esults), but it 
17890 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 74  has been found t
178a0 68 61 74 20 69 6e 20 70 72 61 63 74 69 63 65 20  hat in practice 
178b0 74 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64 20  this.  overhead 
178c0 69 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69  is often negligi
178d0 62 6c 65 2e 0a 20 20 0a 3c 68 32 3e 56 61 72 69  ble..  .<h2>Vari
178e0 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74 65  able Length Inte
178f0 67 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f 72  ger (varint) For
17900 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  mat</h2>..<p>.  
17910 49 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 73  Integer values s
17920 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
17930 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
17940 6e 6f 64 65 73 20 61 72 65 20 65 6e 63 6f 64 65  nodes are encode
17950 64 20 75 73 69 6e 67 20 74 68 65 0a 20 20 46 54  d using the.  FT
17960 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e  S varint format.
17970 20 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   This encoding i
17980 73 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c  s similar, but <
17990 62 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c  b>not identical<
179a0 2f 62 3e 2c 20 74 6f 0a 20 20 74 68 65 20 3c 61  /b>, to.  the <a
179b0 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d 61   href="fileforma
179c0 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74 5f 66 6f  t.html#varint_fo
179d0 72 6d 61 74 22 3e 53 51 4c 69 74 65 20 76 61 72  rmat">SQLite var
179e0 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a  int format</a>..
179f0 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63 6f 64 65  .<p>.  An encode
17a00 64 20 46 54 53 20 76 61 72 69 6e 74 20 63 6f 6e  d FTS varint con
17a10 73 75 6d 65 73 20 62 65 74 77 65 65 6e 20 6f 6e  sumes between on
17a20 65 20 61 6e 64 20 74 65 6e 20 62 79 74 65 73 20  e and ten bytes 
17a30 6f 66 20 73 70 61 63 65 2e 20 54 68 65 0a 20 20  of space. The.  
17a40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17a50 72 65 71 75 69 72 65 64 20 69 73 20 64 65 74 65  required is dete
17a60 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 73 69  rmined by the si
17a70 67 6e 20 61 6e 64 20 6d 61 67 6e 69 74 75 64 65  gn and magnitude
17a80 20 6f 66 20 74 68 65 0a 20 20 69 6e 74 65 67 65   of the.  intege
17a90 72 20 76 61 6c 75 65 20 65 6e 63 6f 64 65 64 2e  r value encoded.
17aa0 20 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c 79   More accurately
17ab0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
17ac0 62 79 74 65 73 20 75 73 65 64 20 74 6f 20 73 74  bytes used to st
17ad0 6f 72 65 0a 20 20 74 68 65 20 65 6e 63 6f 64 65  ore.  the encode
17ae0 64 20 69 6e 74 65 67 65 72 20 64 65 70 65 6e 64  d integer depend
17af0 73 20 6f 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s on the positio
17b00 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 73 69  n of the most si
17b10 67 6e 69 66 69 63 61 6e 74 20 73 65 74 20 62 69  gnificant set bi
17b20 74 0a 20 20 69 6e 20 74 68 65 20 36 34 2d 62 69  t.  in the 64-bi
17b30 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
17b40 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
17b50 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
17b60 76 61 6c 75 65 2e 20 4e 65 67 61 74 69 76 65 0a  value. Negative.
17b70 20 20 76 61 6c 75 65 73 20 61 6c 77 61 79 73 20    values always 
17b80 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73 69  have the most si
17b90 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73 65  gnificant bit se
17ba0 74 20 28 74 68 65 20 73 69 67 6e 20 62 69 74 29  t (the sign bit)
17bb0 2c 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 61  , and so are.  a
17bc0 6c 77 61 79 73 20 73 74 6f 72 65 64 20 75 73 69  lways stored usi
17bd0 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 65 6e 20  ng the full ten 
17be0 62 79 74 65 73 2e 20 50 6f 73 69 74 69 76 65 20  bytes. Positive 
17bf0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 6d  integer values m
17c00 61 79 20 62 65 0a 20 20 73 74 6f 72 65 64 20 75  ay be.  stored u
17c10 73 69 6e 67 20 6c 65 73 73 20 73 70 61 63 65 2e  sing less space.
17c20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 6e 61  ..<p>.  The fina
17c30 6c 20 62 79 74 65 20 6f 66 20 61 6e 20 65 6e 63  l byte of an enc
17c40 6f 64 65 64 20 46 54 53 20 76 61 72 69 6e 74 20  oded FTS varint 
17c50 68 61 73 20 69 74 73 20 6d 6f 73 74 20 73 69 67  has its most sig
17c60 6e 69 66 69 63 61 6e 74 20 62 69 74 20 0a 20 20  nificant bit .  
17c70 63 6c 65 61 72 65 64 2e 20 41 6c 6c 20 70 72 65  cleared. All pre
17c80 63 65 64 69 6e 67 20 62 79 74 65 73 20 68 61 76  ceding bytes hav
17c90 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69  e the most signi
17ca0 66 69 63 61 6e 74 20 62 69 74 20 73 65 74 2e 20  ficant bit set. 
17cb0 44 61 74 61 0a 20 20 69 73 20 73 74 6f 72 65 64  Data.  is stored
17cc0 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   in the remainin
17cd0 67 20 73 65 76 65 6e 20 6c 65 61 73 74 20 73 69  g seven least si
17ce0 67 6e 69 66 69 63 61 6e 74 20 62 69 74 73 20 6f  gnificant bits o
17cf0 66 20 65 61 63 68 20 62 79 74 65 2e 0a 20 20 54  f each byte..  T
17d00 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
17d10 20 74 68 65 20 65 6e 63 6f 64 65 64 20 72 65 70   the encoded rep
17d20 72 65 73 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 74  resentation cont
17d30 61 69 6e 73 20 74 68 65 20 6c 65 61 73 74 20 73  ains the least s
17d40 69 67 6e 69 66 69 63 61 6e 74 0a 20 20 73 65 76  ignificant.  sev
17d50 65 6e 20 62 69 74 73 20 6f 66 20 74 68 65 20 65  en bits of the e
17d60 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 76  ncoded integer v
17d70 61 6c 75 65 2e 20 54 68 65 20 73 65 63 6f 6e 64  alue. The second
17d80 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e 63   byte of the enc
17d90 6f 64 65 64 0a 20 20 72 65 70 72 65 73 65 6e 74  oded.  represent
17da0 61 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ation, if it is 
17db0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 61 69 6e  present, contain
17dc0 73 20 74 68 65 20 73 65 76 65 6e 20 6e 65 78 74  s the seven next
17dd0 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61   least significa
17de0 6e 74 0a 20 20 62 69 74 73 20 6f 66 20 74 68 65  nt.  bits of the
17df0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20   integer value, 
17e00 61 6e 64 20 73 6f 20 6f 6e 2e 20 54 68 65 20 66  and so on. The f
17e10 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63  ollowing table c
17e20 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c 65 73  ontains examples
17e30 0a 20 20 6f 66 20 65 6e 63 6f 64 65 64 20 69 6e  .  of encoded in
17e40 74 65 67 65 72 20 76 61 6c 75 65 73 3a 0a 0a 3c  teger values:..<
17e50 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e  table striped=1>
17e60 0a 20 20 3c 74 72 3e 3c 74 68 3e 44 65 63 69 6d  .  <tr><th>Decim
17e70 61 6c 3c 74 68 3e 48 65 78 61 64 65 63 69 6d 61  al<th>Hexadecima
17e80 6c 3c 74 68 20 77 69 64 74 68 3d 31 30 30 25 3e  l<th width=100%>
17e90 45 6e 63 6f 64 65 64 20 52 65 70 72 65 73 65 6e  Encoded Represen
17ea0 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64  tation.  <tr><td
17eb0 3e 34 33 3c 74 64 3e 30 78 30 30 30 30 30 30 30  >43<td>0x0000000
17ec0 30 30 30 30 30 30 30 32 42 3c 74 64 3e 30 78 32  00000002B<td>0x2
17ed0 42 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 30 30  B .  <tr><td>200
17ee0 38 31 35 3c 74 64 3e 30 78 30 30 30 30 30 30 30  815<td>0x0000000
17ef0 30 30 30 30 33 31 30 36 46 3c 74 64 3e 30 78 39  00003106F<td>0x9
17f00 43 20 30 78 41 30 20 30 78 30 43 0a 20 20 3c 74  C 0xA0 0x0C.  <t
17f10 72 3e 3c 74 64 3e 2d 31 3c 74 64 3e 30 78 46 46  r><td>-1<td>0xFF
17f20 46 46 46 46 46 46 46 46 46 46 46 46 46 46 3c 74  FFFFFFFFFFFFFF<t
17f30 64 3e 30 78 46 46 20 30 78 46 46 20 30 78 46 46  d>0xFF 0xFF 0xFF
17f40 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20   0xFF 0xFF 0xFF 
17f50 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
17f60 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a 20 20 0a  x01.</table>.  .
17f70 0a 3c 68 32 3e 53 65 67 6d 65 6e 74 20 42 2d 54  .<h2>Segment B-T
17f80 72 65 65 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a  ree Format</h2>.
17f90 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20 62  .<p>.  Segment b
17fa0 2d 74 72 65 65 73 20 61 72 65 20 70 72 65 66 69  -trees are prefi
17fb0 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b 2d  x-compressed b+-
17fc0 74 72 65 65 73 2e 20 54 68 65 72 65 20 69 73 20  trees. There is 
17fd0 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  one segment b-tr
17fe0 65 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f  ee.  for each ro
17ff0 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69  w in the %_segdi
18000 72 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f  r table (see abo
18010 76 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e 6f  ve). The root no
18020 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
18030 74 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73 74  t.  b-tree is st
18040 6f 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69  ored as a blob i
18050 6e 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69 65  n the "root" fie
18060 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ld of the corres
18070 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f 66  ponding row.  of
18080 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
18090 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e  ble. All other n
180a0 6f 64 65 73 20 28 69 66 20 61 6e 79 20 65 78 69  odes (if any exi
180b0 73 74 29 20 61 72 65 20 73 74 6f 72 65 64 20 69  st) are stored i
180c0 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22 20  n the .  "blob" 
180d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f  column of the %_
180e0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
180f0 4e 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68 65  Nodes within the
18100 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
18110 65 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66 69  e are.  identifi
18120 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
18130 72 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 62  r value in the b
18140 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66 20  lockid field of 
18150 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
18160 67 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f 6c  g.  row. The fol
18170 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
18180 63 72 69 62 65 73 20 74 68 65 20 66 69 65 6c 64  cribes the field
18190 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  s of the %_segdi
181a0 72 20 74 61 62 6c 65 3a 0a 0a 3c 74 61 62 6c 65  r table:..<table
181b0 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74   striped=1>.  <t
181c0 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20  r><th>Column    
181d0 20 20 20 20 20 20 20 3c 74 68 20 77 69 64 74 68         <th width
181e0 3d 31 30 30 25 3e 49 6e 74 65 72 70 72 65 74 61  =100%>Interpreta
181f0 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c  tion.  <tr><td>l
18200 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20  evel            
18210 3c 74 64 3e 20 0a 20 20 20 20 42 65 74 77 65 65  <td> .    Betwee
18220 6e 20 74 68 65 6d 2c 20 74 68 65 20 63 6f 6e 74  n them, the cont
18230 65 6e 74 73 20 6f 66 20 74 68 65 20 22 6c 65 76  ents of the "lev
18240 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66 69  el" and "idx" fi
18250 65 6c 64 73 20 64 65 66 69 6e 65 20 74 68 65 0a  elds define the.
18260 20 20 20 20 72 65 6c 61 74 69 76 65 20 61 67 65      relative age
18270 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   of the segment 
18280 62 2d 74 72 65 65 2e 20 54 68 65 20 73 6d 61 6c  b-tree. The smal
18290 6c 65 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  ler the value st
182a0 6f 72 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20  ored in the.    
182b0 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 2c 20 74  "level" field, t
182c0 68 65 20 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79  he more recently
182d0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
182e0 72 65 65 20 77 61 73 20 63 72 65 61 74 65 64 2e  ree was created.
182f0 20 49 66 20 74 77 6f 0a 20 20 20 20 73 65 67 6d   If two.    segm
18300 65 6e 74 20 62 2d 74 72 65 65 73 20 61 72 65 20  ent b-trees are 
18310 6f 66 20 74 68 65 20 73 61 6d 65 20 22 6c 65 76  of the same "lev
18320 65 6c 22 2c 20 74 68 65 20 73 65 67 6d 65 6e 74  el", the segment
18330 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 72   with the larger
18340 0a 20 20 20 20 76 61 6c 75 65 20 73 74 6f 72 65  .    value store
18350 64 20 69 6e 20 74 68 65 20 22 69 64 78 22 20 63  d in the "idx" c
18360 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72 65 20 72 65  olumn is more re
18370 63 65 6e 74 2e 20 54 68 65 20 50 52 49 4d 41 52  cent. The PRIMAR
18380 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
18390 0a 20 20 20 20 6f 6e 20 74 68 65 20 25 5f 73 65  .    on the %_se
183a0 67 64 69 72 20 74 61 62 6c 65 20 70 72 65 76 65  gdir table preve
183b0 6e 74 73 20 61 6e 79 20 74 77 6f 20 73 65 67 6d  nts any two segm
183c0 65 6e 74 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  ents from having
183d0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 0a   the same value.
183e0 20 20 20 20 66 6f 72 20 62 6f 74 68 20 74 68 65      for both the
183f0 20 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64   "level" and "id
18400 78 22 20 66 69 65 6c 64 73 2e 0a 20 20 3c 74 72  x" fields..  <tr
18410 3e 3c 74 64 3e 69 64 78 20 20 20 20 20 20 20 20  ><td>idx        
18420 20 20 20 20 20 20 3c 74 64 3e 20 53 65 65 20 61        <td> See a
18430 62 6f 76 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  bove..  <tr><td>
18440 73 74 61 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20  start_block     
18450 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c   <td>.    The bl
18460 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65  ockid that corre
18470 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6e 6f  sponds to the no
18480 64 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  de with the smal
18490 6c 65 73 74 20 62 6c 6f 63 6b 69 64 20 74 68 61  lest blockid tha
184a0 74 20 0a 20 20 20 20 62 65 6c 6f 6e 67 73 20 74  t .    belongs t
184b0 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62  o this segment b
184c0 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69  -tree. Or zero i
184d0 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67  f the entire seg
184e0 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20  ment b-tree.    
184f0 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74  fits on the root
18500 20 6e 6f 64 65 2e 20 49 66 20 69 74 20 65 78 69   node. If it exi
18510 73 74 73 2c 20 74 68 69 73 20 6e 6f 64 65 20 69  sts, this node i
18520 73 20 61 6c 77 61 79 73 20 61 20 6c 65 61 66 20  s always a leaf 
18530 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  node..  <tr><td>
18540 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
18550 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c   <td>.    The bl
18560 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65  ockid that corre
18570 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c 65  sponds to the le
18580 61 66 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65  af node with the
18590 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64   largest blockid
185a0 20 0a 20 20 20 20 74 68 61 74 20 62 65 6c 6f 6e   .    that belon
185b0 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65  gs to this segme
185c0 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65  nt b-tree. Or ze
185d0 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  ro if the entire
185e0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
185f0 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20      fits on the 
18600 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20 20 3c 74 72  root node..  <tr
18610 3e 3c 74 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c  ><td>end_block <
18620 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63  td>.    The bloc
18630 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70  kid that corresp
18640 6f 6e 64 73 20 74 6f 20 74 68 65 20 69 6e 74 65  onds to the inte
18650 72 69 6f 72 20 6e 6f 64 65 20 77 69 74 68 20 74  rior node with t
18660 68 65 20 6c 61 72 67 65 73 74 20 0a 20 20 20 20  he largest .    
18670 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 62 65 6c  blockid that bel
18680 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65 67  ongs to this seg
18690 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 20 4f 72  ment b-tree.  Or
186a0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74   zero if the ent
186b0 69 72 65 20 73 65 67 6d 65 6e 74 0a 20 20 20 20  ire segment.    
186c0 62 2d 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74  b-tree fits on t
186d0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66  he root node. If
186e0 20 69 74 20 65 78 69 73 74 73 2c 20 74 68 69 73   it exists, this
186f0 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
18700 61 6e 0a 20 20 20 20 69 6e 74 65 72 69 6f 72 20  an.    interior 
18710 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  node..  <tr><td>
18720 72 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  root            
18730 20 3c 74 64 3e 0a 20 20 20 20 42 6c 6f 62 20 63   <td>.    Blob c
18740 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
18750 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 73  ot node of the s
18760 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 0a 3c  egment b-tree..<
18770 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41  /table>..<p>.  A
18780 70 61 72 74 20 66 72 6f 6d 20 74 68 65 20 72 6f  part from the ro
18790 6f 74 20 6e 6f 64 65 2c 20 74 68 65 20 6e 6f 64  ot node, the nod
187a0 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
187b0 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74  a single segment
187c0 20 62 2d 74 72 65 65 20 61 72 65 0a 20 20 61 6c   b-tree are.  al
187d0 77 61 79 73 20 73 74 6f 72 65 64 20 75 73 69 6e  ways stored usin
187e0 67 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73  g a contiguous s
187f0 65 71 75 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b  equence of block
18800 69 64 73 2e 20 46 75 72 74 68 65 72 6d 6f 72 65  ids. Furthermore
18810 2c 20 74 68 65 0a 20 20 6e 6f 64 65 73 20 74 68  , the.  nodes th
18820 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69 6e  at make up a sin
18830 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  gle level of the
18840 20 62 2d 74 72 65 65 20 61 72 65 20 74 68 65 6d   b-tree are them
18850 73 65 6c 76 65 73 20 73 74 6f 72 65 64 20 61 73  selves stored as
18860 0a 20 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  .  a contiguous 
18870 62 6c 6f 63 6b 2c 20 69 6e 20 62 2d 74 72 65 65  block, in b-tree
18880 20 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e 74   order. The cont
18890 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20  iguous sequence 
188a0 6f 66 20 62 6c 6f 63 6b 69 64 73 0a 20 20 75 73  of blockids.  us
188b0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
188c0 62 2d 74 72 65 65 20 6c 65 61 76 65 73 20 61 72  b-tree leaves ar
188d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 61 72  e allocated star
188e0 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 62 6c  ting with the bl
188f0 6f 63 6b 69 64 0a 20 20 76 61 6c 75 65 20 73 74  ockid.  value st
18900 6f 72 65 64 20 69 6e 20 74 68 65 20 22 73 74 61  ored in the "sta
18910 72 74 5f 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e  rt_block" column
18920 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
18930 6e 64 69 6e 67 20 25 5f 73 65 67 64 69 72 20 72  nding %_segdir r
18940 6f 77 2c 0a 20 20 61 6e 64 20 66 69 6e 69 73 68  ow,.  and finish
18950 69 6e 67 20 61 74 20 74 68 65 20 62 6c 6f 63 6b  ing at the block
18960 69 64 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  id value stored 
18970 69 6e 20 74 68 65 20 22 6c 65 61 76 65 73 5f 65  in the "leaves_e
18980 6e 64 5f 62 6c 6f 63 6b 22 0a 20 20 66 69 65 6c  nd_block".  fiel
18990 64 20 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f  d of the same ro
189a0 77 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  w. It is therefo
189b0 72 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69  re possible to i
189c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
189d0 6c 6c 20 74 68 65 0a 20 20 6c 65 61 76 65 73 20  ll the.  leaves 
189e0 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74  of a segment b-t
189f0 72 65 65 2c 20 69 6e 20 6b 65 79 20 6f 72 64 65  ree, in key orde
18a00 72 2c 20 62 79 20 74 72 61 76 65 72 73 69 6e 67  r, by traversing
18a10 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
18a20 0a 20 20 74 61 62 6c 65 20 69 6e 20 62 6c 6f 63  .  table in bloc
18a30 6b 69 64 20 6f 72 64 65 72 20 66 72 6f 6d 20 22  kid order from "
18a40 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 74 6f 20  start_block" to 
18a50 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  "leaves_end_bloc
18a60 6b 22 2e 20 20 0a 0a 3c 68 33 3e 53 65 67 6d 65  k".  ..<h3>Segme
18a70 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e  nt B-Tree Leaf N
18a80 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20  odes</h3>..<p>. 
18a90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
18aa0 69 61 67 72 61 6d 20 64 65 70 69 63 74 73 20 74  iagram depicts t
18ab0 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 73  he format of a s
18ac0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6c 65  egment b-tree le
18ad0 61 66 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65  af node...<cente
18ae0 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d  r>.  <img src=im
18af0 61 67 65 73 2f 66 74 73 33 5f 6c 65 61 66 5f 6e  ages/fts3_leaf_n
18b00 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53  ode.png>.  <p> S
18b10 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65  egment B-Tree Le
18b20 61 66 20 4e 6f 64 65 20 46 6f 72 6d 61 74 0a 3c  af Node Format.<
18b30 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20  /center>..<p>.  
18b40 54 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 73  The first term s
18b50 74 6f 72 65 64 20 6f 6e 20 65 61 63 68 20 6e 6f  tored on each no
18b60 64 65 20 28 22 54 65 72 6d 20 31 22 20 69 6e 20  de ("Term 1" in 
18b70 74 68 65 20 66 69 67 75 72 65 20 61 62 6f 76 65  the figure above
18b80 29 20 69 73 0a 20 20 73 74 6f 72 65 64 20 76 65  ) is.  stored ve
18b90 72 62 61 74 69 6d 2e 20 45 61 63 68 20 73 75 62  rbatim. Each sub
18ba0 73 65 71 75 65 6e 74 20 74 65 72 6d 20 69 73 20  sequent term is 
18bb0 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65  prefix-compresse
18bc0 64 20 77 69 74 68 20 72 65 73 70 65 63 74 0a 20  d with respect. 
18bd0 20 74 6f 20 69 74 73 20 70 72 65 64 65 63 65 73   to its predeces
18be0 73 6f 72 2e 20 54 65 72 6d 73 20 61 72 65 20 73  sor. Terms are s
18bf0 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 20 70  tored within a p
18c00 61 67 65 20 69 6e 20 73 6f 72 74 65 64 20 28 6d  age in sorted (m
18c10 65 6d 63 6d 70 29 0a 20 20 6f 72 64 65 72 2e 0a  emcmp).  order..
18c20 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42 2d 54  .<h3>Segment B-T
18c30 72 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64  ree Interior Nod
18c40 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54  es</h3>..<p>.  T
18c50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61  he following dia
18c60 67 72 61 6d 20 64 65 70 69 63 74 73 20 74 68 65  gram depicts the
18c70 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 73 65 67   format of a seg
18c80 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 74 65  ment b-tree inte
18c90 72 69 6f 72 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61  rior .  (non-lea
18ca0 66 29 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65  f) node...<cente
18cb0 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d  r>.  <img src=im
18cc0 61 67 65 73 2f 66 74 73 33 5f 69 6e 74 65 72 69  ages/fts3_interi
18cd0 6f 72 5f 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c  or_node.png>.  <
18ce0 70 3e 20 53 65 67 6d 65 6e 74 20 42 2d 54 72 65  p> Segment B-Tre
18cf0 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 20  e Interior Node 
18d00 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e  Format.</center>
18d10 0a 0a 0a 3c 68 32 3e 44 6f 63 6c 69 73 74 20 46  ...<h2>Doclist F
18d20 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ormat</h2>..<p>.
18d30 20 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73    A doclist cons
18d40 69 73 74 73 20 6f 66 20 61 6e 20 61 72 72 61 79  ists of an array
18d50 20 6f 66 20 36 34 2d 62 69 74 20 73 69 67 6e 65   of 64-bit signe
18d60 64 20 69 6e 74 65 67 65 72 73 2c 20 73 65 72 69  d integers, seri
18d70 61 6c 69 7a 65 64 20 75 73 69 6e 67 0a 20 20 74  alized using.  t
18d80 68 65 20 46 54 53 20 76 61 72 69 6e 74 20 66 6f  he FTS varint fo
18d90 72 6d 61 74 2e 20 45 61 63 68 20 64 6f 63 6c 69  rmat. Each docli
18da0 73 74 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  st entry is made
18db0 20 75 70 20 6f 66 20 61 20 73 65 72 69 65 73 20   up of a series 
18dc0 6f 66 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72  of two .  or mor
18dd0 65 20 69 6e 74 65 67 65 72 73 2c 20 61 73 20 66  e integers, as f
18de0 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20  ollows:..<ol>.  
18df0 3c 6c 69 3e 20 54 68 65 20 64 6f 63 69 64 20 76  <li> The docid v
18e00 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20  alue. The first 
18e10 65 6e 74 72 79 20 69 6e 20 61 20 64 6f 63 6c 69  entry in a docli
18e20 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  st contains the 
18e30 6c 69 74 65 72 61 6c 20 64 6f 63 69 64 0a 20 20  literal docid.  
18e40 20 20 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20       value. The 
18e50 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 65  first field of e
18e60 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 64  ach subsequent d
18e70 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e  oclist entry con
18e80 74 61 69 6e 73 20 74 68 65 20 0a 20 20 20 20 20  tains the .     
18e90 20 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74    difference bet
18ea0 77 65 65 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  ween the new doc
18eb0 69 64 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  id and the previ
18ec0 6f 75 73 20 6f 6e 65 20 28 61 6c 77 61 79 73 20  ous one (always 
18ed0 61 20 70 6f 73 69 74 69 76 65 20 0a 20 20 20 20  a positive .    
18ee0 20 20 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c     number)..  <l
18ef0 69 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  i> Zero or more 
18f00 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
18f10 73 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74  s. A term-offset
18f20 20 6c 69 73 74 20 69 73 20 70 72 65 73 65 6e 74   list is present
18f30 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20   for each.      
18f40 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
18f50 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  TS virtual table
18f60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
18f70 68 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d 2d  he term. A term-
18f80 6f 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c 69  offset.       li
18f90 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  st consists of t
18fa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
18fb0 20 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20 3c     <ol>.       <
18fc0 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c  li> Constant val
18fd0 75 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c 64  ue 1. This field
18fe0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
18ff0 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  any term-offset 
19000 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  list.           
19010 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19020 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20   column 0..     
19030 20 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75 6d    <li> The colum
19040 6e 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72 20  n number (1 for 
19050 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d  the second leftm
19060 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e  ost column, etc.
19070 29 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  ). This.        
19080 20 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d 69      field is omi
19090 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72  tted for any ter
190a0 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61 73  m-offset list as
190b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f  sociated with co
190c0 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c  lumn 0..       <
190d0 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65  li> A list of te
190e0 72 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72 74  rm-offsets, sort
190f0 65 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73 74  ed from smallest
19100 20 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e 73   to largest. Ins
19110 74 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 20  tead.           
19120 20 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65 20   of storing the 
19130 74 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c 75  term-offset valu
19140 65 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61 63  e literally, eac
19150 68 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64  h integer stored
19160 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73   .            is
19170 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
19180 62 65 74 77 65 65 6e 20 74 68 65 20 63 75 72 72  between the curr
19190 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  ent term-offset 
191a0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
191b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e   .            on
191c0 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74 68  e (or zero if th
191d0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f  e current term-o
191e0 66 66 73 65 74 20 69 73 20 74 68 65 20 66 69 72  ffset is the fir
191f0 73 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20 20  st), plus 2..   
19200 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43    </ol>.  <li> C
19210 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30 2e  onstant value 0.
19220 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 65 6e 74 65 72 3e  .</ol>..<center>
19230 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67  .  <img src=imag
19240 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 32  es/fts3_doclist2
19250 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53 33  .png>.  <p> FTS3
19260 20 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74 0a   Doclist Format.
19270 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 63 65 6e 74  </center>..<cent
19280 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69  er>.  <img src=i
19290 6d 61 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69  mages/fts3_docli
192a0 73 74 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54  st.png>.  <p> FT
192b0 53 20 44 6f 63 6c 69 73 74 20 45 6e 74 72 79 20  S Doclist Entry 
192c0 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e  Format.</center>
192d0 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 64 6f 63 6c  ..<p>.  For docl
192e0 69 73 74 73 20 66 6f 72 20 77 68 69 63 68 20 74  ists for which t
192f0 68 65 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  he term appears 
19300 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  in more than one
19310 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
19320 54 53 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62  TS.  virtual tab
19330 6c 65 2c 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  le, term-offset 
19340 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74 68 65  lists within the
19350 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73 74 6f   doclist are sto
19360 72 65 64 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20  red in column . 
19370 20 6e 75 6d 62 65 72 20 6f 72 64 65 72 2e 20 54   number order. T
19380 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
19390 20 74 68 65 20 74 65 72 6d 2d 6f 66 66 73 65 74   the term-offset
193a0 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64   list associated
193b0 20 77 69 74 68 20 0a 20 20 63 6f 6c 75 6d 6e 20   with .  column 
193c0 30 20 28 69 66 20 61 6e 79 29 20 69 73 20 61 6c  0 (if any) is al
193d0 77 61 79 73 20 66 69 72 73 74 2c 20 61 6c 6c 6f  ways first, allo
193e0 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74  wing the first t
193f0 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  wo fields of the
19400 0a 20 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  .  term-offset l
19410 69 73 74 20 74 6f 20 62 65 20 6f 6d 69 74 74 65  ist to be omitte
19420 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
19430 0a 3c 68 31 20 69 64 3d 61 70 70 65 6e 64 69 78  .<h1 id=appendix
19440 5f 61 20 6e 6f 6e 75 6d 62 65 72 20 74 61 67 73  _a nonumber tags
19450 3d 22 73 65 61 72 63 68 20 61 70 70 6c 69 63 61  ="search applica
19460 74 69 6f 6e 20 74 69 70 73 22 3e 0a 20 20 41 70  tion tips">.  Ap
19470 70 65 6e 64 69 78 20 41 3a 20 53 65 61 72 63 68  pendix A: Search
19480 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 54 69 70   Application Tip
19490 73 0a 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 46  s.</h1>..<p>.  F
194a0 54 53 20 69 73 20 70 72 69 6d 61 72 69 6c 79 20  TS is primarily 
194b0 64 65 73 69 67 6e 65 64 20 74 6f 20 73 75 70 70  designed to supp
194c0 6f 72 74 20 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c  ort Boolean full
194d0 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 2d 20  -text queries - 
194e0 71 75 65 72 69 65 73 0a 20 20 74 6f 20 66 69 6e  queries.  to fin
194f0 64 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  d the set of doc
19500 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63  uments that matc
19510 68 20 61 20 73 70 65 63 69 66 69 65 64 20 63 72  h a specified cr
19520 69 74 65 72 69 61 2e 20 48 6f 77 65 76 65 72 2c  iteria. However,
19530 20 6d 61 6e 79 20 0a 20 20 28 6d 6f 73 74 3f 29   many .  (most?)
19540 20 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74   search applicat
19550 69 6f 6e 73 20 72 65 71 75 69 72 65 20 74 68 61  ions require tha
19560 74 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 6f  t results are so
19570 6d 65 68 6f 77 20 72 61 6e 6b 65 64 20 69 6e 20  mehow ranked in 
19580 6f 72 64 65 72 0a 20 20 6f 66 20 22 72 65 6c 65  order.  of "rele
19590 76 61 6e 63 65 22 2c 20 77 68 65 72 65 20 22 72  vance", where "r
195a0 65 6c 65 76 61 6e 63 65 22 20 69 73 20 64 65 66  elevance" is def
195b0 69 6e 65 64 20 61 73 20 74 68 65 20 6c 69 6b 65  ined as the like
195c0 6c 69 68 6f 6f 64 20 74 68 61 74 20 74 68 65 20  lihood that the 
195d0 75 73 65 72 0a 20 20 77 68 6f 20 70 65 72 66 6f  user.  who perfo
195e0 72 6d 65 64 20 74 68 65 20 73 65 61 72 63 68 20  rmed the search 
195f0 69 73 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e  is interested in
19600 20 61 20 73 70 65 63 69 66 69 63 20 65 6c 65 6d   a specific elem
19610 65 6e 74 20 6f 66 20 74 68 65 20 72 65 74 75 72  ent of the retur
19620 6e 65 64 0a 20 20 73 65 74 20 6f 66 20 64 6f 63  ned.  set of doc
19630 75 6d 65 6e 74 73 2e 20 57 68 65 6e 20 75 73 69  uments. When usi
19640 6e 67 20 61 20 73 65 61 72 63 68 20 65 6e 67 69  ng a search engi
19650 6e 65 20 74 6f 20 66 69 6e 64 20 64 6f 63 75 6d  ne to find docum
19660 65 6e 74 73 20 6f 6e 20 74 68 65 20 77 6f 72 6c  ents on the worl
19670 64 0a 20 20 77 69 64 65 20 77 65 62 2c 20 74 68  d.  wide web, th
19680 65 20 75 73 65 72 20 65 78 70 65 63 74 73 20 74  e user expects t
19690 68 61 74 20 74 68 65 20 6d 6f 73 74 20 75 73 65  hat the most use
196a0 66 75 6c 2c 20 6f 72 20 22 72 65 6c 65 76 61 6e  ful, or "relevan
196b0 74 22 2c 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20  t", documents . 
196c0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
196d0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 70  d as the first p
196e0 61 67 65 20 6f 66 20 72 65 73 75 6c 74 73 2c 20  age of results, 
196f0 61 6e 64 20 74 68 61 74 20 65 61 63 68 20 73 75  and that each su
19700 62 73 65 71 75 65 6e 74 20 70 61 67 65 20 0a 20  bsequent page . 
19710 20 63 6f 6e 74 61 69 6e 73 20 70 72 6f 67 72 65   contains progre
19720 73 73 69 76 65 6c 79 20 6c 65 73 73 20 72 65 6c  ssively less rel
19730 65 76 61 6e 74 20 72 65 73 75 6c 74 73 2e 20 45  evant results. E
19740 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6d 61 63  xactly how a mac
19750 68 69 6e 65 20 63 61 6e 20 0a 20 20 64 65 74 65  hine can .  dete
19760 72 6d 69 6e 65 20 64 6f 63 75 6d 65 6e 74 20 72  rmine document r
19770 65 6c 65 76 61 6e 63 65 20 62 61 73 65 64 20 6f  elevance based o
19780 6e 20 61 20 75 73 65 72 73 20 71 75 65 72 79 20  n a users query 
19790 69 73 20 61 20 63 6f 6d 70 6c 69 63 61 74 65 64  is a complicated
197a0 20 70 72 6f 62 6c 65 6d 0a 20 20 61 6e 64 20 74   problem.  and t
197b0 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 6d 75  he subject of mu
197c0 63 68 20 6f 6e 67 6f 69 6e 67 20 72 65 73 65 61  ch ongoing resea
197d0 72 63 68 2e 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20  rch...<p>.  One 
197e0 76 65 72 79 20 73 69 6d 70 6c 65 20 73 63 68 65  very simple sche
197f0 6d 65 20 6d 69 67 68 74 20 62 65 20 74 6f 20 63  me might be to c
19800 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
19810 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  of instances of 
19820 74 68 65 20 0a 20 20 75 73 65 72 73 20 73 65 61  the .  users sea
19830 72 63 68 20 74 65 72 6d 73 20 69 6e 20 65 61 63  rch terms in eac
19840 68 20 72 65 73 75 6c 74 20 64 6f 63 75 6d 65 6e  h result documen
19850 74 2e 20 54 68 6f 73 65 20 64 6f 63 75 6d 65 6e  t. Those documen
19860 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a  ts that contain.
19870 20 20 6d 61 6e 79 20 69 6e 73 74 61 6e 63 65 73    many instances
19880 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   of the terms ar
19890 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6d 6f 72  e considered mor
198a0 65 20 72 65 6c 65 76 61 6e 74 20 74 68 61 6e 20  e relevant than 
198b0 74 68 6f 73 65 20 77 69 74 68 0a 20 20 61 20 73  those with.  a s
198c0 6d 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  mall number of i
198d0 6e 73 74 61 6e 63 65 73 20 6f 66 20 65 61 63 68  nstances of each
198e0 20 74 65 72 6d 2e 20 49 6e 20 61 6e 20 46 54 53   term. In an FTS
198f0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 74 68   application, th
19900 65 20 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 74  e .  number of t
19910 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e  erm instances in
19920 20 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 75   each result cou
19930 6c 64 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ld be determined
19940 20 62 79 20 63 6f 75 6e 74 69 6e 67 0a 20 20 74   by counting.  t
19950 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  he number of int
19960 65 67 65 72 73 20 69 6e 20 74 68 65 20 72 65 74  egers in the ret
19970 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
19980 20 5b 6f 66 66 73 65 74 73 5d 20 66 75 6e 63 74   [offsets] funct
19990 69 6f 6e 2e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f  ion..  The follo
199a0 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 73 68 6f  wing example sho
199b0 77 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ws a query that 
199c0 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
199d0 20 6f 62 74 61 69 6e 20 74 68 65 0a 20 20 74 65   obtain the.  te
199e0 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20  n most relevant 
199f0 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 71 75  results for a qu
19a00 65 72 79 20 65 6e 74 65 72 65 64 20 62 79 20 74  ery entered by t
19a10 68 65 20 75 73 65 72 3a 0a 0a 3c 63 6f 64 65 62  he user:..<codeb
19a20 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  lock>.  <i>-- Th
19a30 69 73 20 65 78 61 6d 70 6c 65 20 28 61 6e 64 20  is example (and 
19a40 61 6c 6c 20 6f 74 68 65 72 73 20 69 6e 20 74 68  all others in th
19a50 69 73 20 73 65 63 74 69 6f 6e 29 20 61 73 73 75  is section) assu
19a60 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  mes the followin
19a70 67 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43  g schema</i>.  C
19a80 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
19a90 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55 53  BLE documents US
19aa0 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20  ING fts3(title, 
19ab0 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e  content);..  <i>
19ac0 2d 2d 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  -- Assuming the 
19ad0 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 73 20  application has 
19ae0 73 75 70 70 6c 69 65 64 20 61 6e 20 53 51 4c 69  supplied an SQLi
19af0 74 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  te user function
19b00 20 6e 61 6d 65 64 20 22 63 6f 75 6e 74 69 6e 74   named "countint
19b10 65 67 65 72 73 22 3c 2f 69 3e 0a 20 20 3c 69 3e  egers"</i>.  <i>
19b20 2d 2d 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  -- that returns 
19b30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  the number of sp
19b40 61 63 65 2d 73 65 70 61 72 61 74 65 64 20 69 6e  ace-separated in
19b50 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64  tegers contained
19b60 20 69 6e 20 69 74 73 20 6f 6e 6c 79 20 61 72 67   in its only arg
19b70 75 6d 65 6e 74 2c 3c 2f 69 3e 0a 20 20 3c 69 3e  ument,</i>.  <i>
19b80 2d 2d 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- the following
19b90 20 71 75 65 72 79 20 63 6f 75 6c 64 20 62 65 20   query could be 
19ba0 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74  used to return t
19bb0 68 65 20 74 69 74 6c 65 73 20 6f 66 20 74 68 65  he titles of the
19bc0 20 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 74 68   10 documents th
19bd0 61 74 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20  at contain</i>. 
19be0 20 3c 69 3e 2d 2d 20 74 68 65 20 67 72 65 61 74   <i>-- the great
19bf0 65 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  est number of in
19c00 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 75  stances of the u
19c10 73 65 72 73 20 71 75 65 72 79 20 74 65 72 6d 73  sers query terms
19c20 2e 20 48 6f 70 65 66 75 6c 6c 79 2c 20 74 68 65  . Hopefully, the
19c30 73 65 20 31 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  se 10</i>.  <i>-
19c40 2d 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 6c 6c  - documents will
19c50 20 62 65 20 74 68 6f 73 65 20 74 68 61 74 20 74   be those that t
19c60 68 65 20 75 73 65 72 73 20 63 6f 6e 73 69 64 65  he users conside
19c70 72 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20  rs more or less 
19c80 74 68 65 20 6d 6f 73 74 20 22 72 65 6c 65 76 61  the most "releva
19c90 6e 74 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  nt".</i>.  SELEC
19ca0 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63  T title FROM doc
19cb0 75 6d 65 6e 74 73 20 0a 20 20 20 20 57 48 45 52  uments .    WHER
19cc0 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43  E documents MATC
19cd0 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a  H &lt;query&gt;.
19ce0 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6f 75      ORDER BY cou
19cf0 6e 74 69 6e 74 65 67 65 72 73 28 6f 66 66 73 65  ntintegers(offse
19d00 74 73 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 44  ts(documents)) D
19d10 45 53 43 0a 20 20 20 20 4c 49 4d 49 54 20 31 30  ESC.    LIMIT 10
19d20 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65   OFFSET 0.</code
19d30 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
19d40 65 20 71 75 65 72 79 20 61 62 6f 76 65 20 63 6f  e query above co
19d50 75 6c 64 20 62 65 20 6d 61 64 65 20 74 6f 20 72  uld be made to r
19d60 75 6e 20 66 61 73 74 65 72 20 62 79 20 75 73 69  un faster by usi
19d70 6e 67 20 74 68 65 20 46 54 53 20 5b 6d 61 74 63  ng the FTS [matc
19d80 68 69 6e 66 6f 5d 0a 20 20 66 75 6e 63 74 69 6f  hinfo].  functio
19d90 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  n to determine t
19da0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  he number of que
19db0 72 79 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65  ry term instance
19dc0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
19dd0 20 65 61 63 68 0a 20 20 72 65 73 75 6c 74 2e 20   each.  result. 
19de0 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75  The matchinfo fu
19df0 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 6d  nction is much m
19e00 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74 68  ore efficient th
19e10 61 6e 20 74 68 65 20 6f 66 66 73 65 74 73 20 0a  an the offsets .
19e20 20 20 66 75 6e 63 74 69 6f 6e 2e 20 46 75 72 74    function. Furt
19e30 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 6d 61 74  hermore, the mat
19e40 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20  chinfo function 
19e50 70 72 6f 76 69 64 65 73 20 65 78 74 72 61 20 69  provides extra i
19e60 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 72 65 67  nformation.  reg
19e70 61 72 64 69 6e 67 20 74 68 65 20 6f 76 65 72 61  arding the overa
19e80 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63  ll number of occ
19e90 75 72 72 65 6e 63 65 73 20 6f 66 20 65 61 63 68  urrences of each
19ea0 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 20 74   query term in t
19eb0 68 65 20 65 6e 74 69 72 65 0a 20 20 64 6f 63 75  he entire.  docu
19ec0 6d 65 6e 74 20 73 65 74 20 28 6e 6f 74 20 6a 75  ment set (not ju
19ed0 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  st the current r
19ee0 6f 77 29 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ow) and the numb
19ef0 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
19f00 69 6e 20 77 68 69 63 68 20 0a 20 20 65 61 63 68  in which .  each
19f10 20 71 75 65 72 79 20 74 65 72 6d 20 61 70 70 65   query term appe
19f20 61 72 73 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ars. This may be
19f30 20 75 73 65 64 20 28 66 6f 72 20 65 78 61 6d 70   used (for examp
19f40 6c 65 29 20 74 6f 20 61 74 74 61 63 68 20 61 20  le) to attach a 
19f50 68 69 67 68 65 72 0a 20 20 77 65 69 67 68 74 20  higher.  weight 
19f60 74 6f 20 6c 65 73 73 20 63 6f 6d 6d 6f 6e 20 74  to less common t
19f70 65 72 6d 73 20 77 68 69 63 68 20 6d 61 79 20 69  erms which may i
19f80 6e 63 72 65 61 73 65 20 74 68 65 20 6f 76 65 72  ncrease the over
19f90 61 6c 6c 20 63 6f 6d 70 75 74 65 64 20 72 65 6c  all computed rel
19fa0 65 76 61 6e 63 79 20 0a 20 20 6f 66 20 74 68 6f  evancy .  of tho
19fb0 73 65 20 72 65 73 75 6c 74 73 20 74 68 65 20 75  se results the u
19fc0 73 65 72 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f  ser considers mo
19fd0 72 65 20 69 6e 74 65 72 65 73 74 69 6e 67 2e 0a  re interesting..
19fe0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
19ff0 69 3e 2d 2d 20 49 66 20 74 68 65 20 61 70 70 6c  i>-- If the appl
1a000 69 63 61 74 69 6f 6e 20 73 75 70 70 6c 69 65 73  ication supplies
1a010 20 61 6e 20 53 51 4c 69 74 65 20 75 73 65 72 20   an SQLite user 
1a020 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1a030 22 72 61 6e 6b 22 20 74 68 61 74 3c 2f 69 3e 0a  "rank" that</i>.
1a040 20 20 3c 69 3e 2d 2d 20 69 6e 74 65 72 70 72 65    <i>-- interpre
1a050 74 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ts the blob of d
1a060 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79 20  ata returned by 
1a070 6d 61 74 63 68 69 6e 66 6f 20 61 6e 64 20 72 65  matchinfo and re
1a080 74 75 72 6e 73 20 61 20 6e 75 6d 65 72 69 63 3c  turns a numeric<
1a090 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 72 65 6c 65  /i>.  <i>-- rele
1a0a0 76 61 6e 63 79 20 62 61 73 65 64 20 6f 6e 20 69  vancy based on i
1a0b0 74 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  t, then the foll
1a0c0 6f 77 69 6e 67 20 53 51 4c 20 6d 61 79 20 62 65  owing SQL may be
1a0d0 20 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20   used to return 
1a0e0 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  the</i>.  <i>-- 
1a0f0 74 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30  titles of the 10
1a100 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64   most relevant d
1a110 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  ocuments in the 
1a120 64 61 74 61 73 65 74 20 66 6f 72 20 61 20 75 73  dataset for a us
1a130 65 72 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20  ers query.</i>. 
1a140 20 53 45 4c 45 43 54 20 74 69 74 6c 65 20 46 52   SELECT title FR
1a150 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20  OM documents .  
1a160 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74    WHERE document
1a170 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72  s MATCH &lt;quer
1a180 79 26 67 74 3b 0a 20 20 20 20 4f 52 44 45 52 20  y&gt;.    ORDER 
1a190 42 59 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66  BY rank(matchinf
1a1a0 6f 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 44 45  o(documents)) DE
1a1b0 53 43 0a 20 20 20 20 4c 49 4d 49 54 20 31 30 20  SC.    LIMIT 10 
1a1c0 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62  OFFSET 0.</codeb
1a1d0 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
1a1e0 20 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74 68   SQL query in th
1a1f0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
1a200 75 73 65 73 20 6c 65 73 73 20 43 50 55 20 74 68  uses less CPU th
1a210 61 6e 20 74 68 65 20 66 69 72 73 74 20 65 78 61  an the first exa
1a220 6d 70 6c 65 0a 20 20 69 6e 20 74 68 69 73 20 73  mple.  in this s
1a230 65 63 74 69 6f 6e 2c 20 62 75 74 20 73 74 69 6c  ection, but stil
1a240 6c 20 68 61 73 20 61 20 6e 6f 6e 2d 6f 62 76 69  l has a non-obvi
1a250 6f 75 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ous performance 
1a260 70 72 6f 62 6c 65 6d 2e 20 53 51 4c 69 74 65 0a  problem. SQLite.
1a270 20 20 73 61 74 69 73 66 69 65 73 20 74 68 69 73    satisfies this
1a280 20 71 75 65 72 79 20 62 79 20 72 65 74 72 69 65   query by retrie
1a290 76 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f  ving the value o
1a2a0 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 63 6f  f the "title" co
1a2b0 6c 75 6d 6e 20 61 6e 64 0a 20 20 6d 61 74 63 68  lumn and.  match
1a2c0 69 6e 66 6f 20 64 61 74 61 20 66 72 6f 6d 20 74  info data from t
1a2d0 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 20 66 6f  he FTS module fo
1a2e0 72 20 65 76 65 72 79 20 72 6f 77 20 6d 61 74 63  r every row matc
1a2f0 68 65 64 20 62 79 20 74 68 65 20 75 73 65 72 73  hed by the users
1a300 0a 20 20 71 75 65 72 79 20 62 65 66 6f 72 65 20  .  query before 
1a310 69 74 20 73 6f 72 74 73 20 61 6e 64 20 6c 69 6d  it sorts and lim
1a320 69 74 73 20 74 68 65 20 72 65 73 75 6c 74 73 2e  its the results.
1a330 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
1a340 77 61 79 20 53 51 4c 69 74 65 27 73 0a 20 20 76  way SQLite's.  v
1a350 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74  irtual table int
1a360 65 72 66 61 63 65 20 77 6f 72 6b 73 2c 20 72 65  erface works, re
1a370 74 72 69 65 76 69 6e 67 20 74 68 65 20 76 61 6c  trieving the val
1a380 75 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c 65  ue of the "title
1a390 22 20 63 6f 6c 75 6d 6e 0a 20 20 72 65 71 75 69  " column.  requi
1a3a0 72 65 73 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  res loading the 
1a3b0 65 6e 74 69 72 65 20 72 6f 77 20 66 72 6f 6d 20  entire row from 
1a3c0 64 69 73 6b 20 28 69 6e 63 6c 75 64 69 6e 67 20  disk (including 
1a3d0 74 68 65 20 22 63 6f 6e 74 65 6e 74 22 20 66 69  the "content" fi
1a3e0 65 6c 64 2c 0a 20 20 77 68 69 63 68 20 6d 61 79  eld,.  which may
1a3f0 20 62 65 20 71 75 69 74 65 20 6c 61 72 67 65 29   be quite large)
1a400 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1a410 74 20 69 66 20 74 68 65 20 75 73 65 72 73 20 71  t if the users q
1a420 75 65 72 79 20 6d 61 74 63 68 65 73 0a 20 20 73  uery matches.  s
1a430 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 20  everal thousand 
1a440 64 6f 63 75 6d 65 6e 74 73 2c 20 6d 61 6e 79 20  documents, many 
1a450 6d 65 67 61 62 79 74 65 73 20 6f 66 20 22 74 69  megabytes of "ti
1a460 74 6c 65 22 20 61 6e 64 20 22 63 6f 6e 74 65 6e  tle" and "conten
1a470 74 22 20 64 61 74 61 0a 20 20 6d 61 79 20 62 65  t" data.  may be
1a480 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
1a490 6b 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 65 76  k into memory ev
1a4a0 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
1a4b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
1a4c0 64 0a 20 20 66 6f 72 20 61 6e 79 20 70 75 72 70  d.  for any purp
1a4d0 6f 73 65 2e 20 0a 0a 3c 70 3e 0a 20 20 54 68 65  ose. ..<p>.  The
1a4e0 20 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74 68   SQL query in th
1a4f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d  e following exam
1a500 70 6c 65 20 62 6c 6f 63 6b 20 69 73 20 6f 6e 65  ple block is one
1a510 20 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 74 68 69   solution to thi
1a520 73 20 0a 20 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  s .  problem. In
1a530 20 53 51 4c 69 74 65 2c 20 77 68 65 6e 20 61 20   SQLite, when a 
1a540 3c 61 20 68 72 65 66 3d 22 6f 70 74 6f 76 65 72  <a href="optover
1a550 76 69 65 77 2e 68 74 6d 6c 23 66 6c 61 74 74 65  view.html#flatte
1a560 6e 69 6e 67 22 3e 73 75 62 2d 71 75 65 72 79 20  ning">sub-query 
1a570 0a 20 20 75 73 65 64 20 69 6e 20 61 20 6a 6f 69  .  used in a joi
1a580 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 4c 49 4d  n contains a LIM
1a590 49 54 20 63 6c 61 75 73 65 3c 2f 61 3e 2c 20 74  IT clause</a>, t
1a5a0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1a5b0 65 20 73 75 62 2d 71 75 65 72 79 20 61 72 65 0a  e sub-query are.
1a5c0 20 20 63 61 6c 63 75 6c 61 74 65 64 20 61 6e 64    calculated and
1a5d0 20 73 74 6f 72 65 64 20 69 6e 20 74 65 6d 70 6f   stored in tempo
1a5e0 72 61 72 79 20 74 61 62 6c 65 20 62 65 66 6f 72  rary table befor
1a5f0 65 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79  e the main query
1a600 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
1a610 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1a620 53 51 4c 69 74 65 20 77 69 6c 6c 20 6c 6f 61 64  SQLite will load
1a630 20 6f 6e 6c 79 20 74 68 65 20 64 6f 63 69 64 20   only the docid 
1a640 61 6e 64 20 6d 61 74 63 68 69 6e 66 6f 20 64 61  and matchinfo da
1a650 74 61 20 66 6f 72 20 65 61 63 68 0a 20 20 72 6f  ta for each.  ro
1a660 77 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 75  w matching the u
1a670 73 65 72 73 20 71 75 65 72 79 20 69 6e 74 6f 20  sers query into 
1a680 6d 65 6d 6f 72 79 2c 20 64 65 74 65 72 6d 69 6e  memory, determin
1a690 65 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c 75  e the docid valu
1a6a0 65 73 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64 69  es.  correspondi
1a6b0 6e 67 20 74 6f 20 74 68 65 20 74 65 6e 20 6d 6f  ng to the ten mo
1a6c0 73 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75  st relevant docu
1a6d0 6d 65 6e 74 73 2c 20 74 68 65 6e 20 6c 6f 61 64  ments, then load
1a6e0 20 6f 6e 6c 79 20 74 68 65 20 74 69 74 6c 65 0a   only the title.
1a6f0 20 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69 6e    and content in
1a700 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1a710 6f 73 65 20 31 30 20 64 6f 63 75 6d 65 6e 74 73  ose 10 documents
1a720 20 6f 6e 6c 79 2e 20 42 65 63 61 75 73 65 20 62   only. Because b
1a730 6f 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 66  oth the matchinf
1a740 6f 0a 20 20 61 6e 64 20 64 6f 63 69 64 20 76 61  o.  and docid va
1a750 6c 75 65 73 20 61 72 65 20 67 6c 65 61 6e 65 64  lues are gleaned
1a760 20 65 6e 74 69 72 65 6c 79 20 66 72 6f 6d 20 74   entirely from t
1a770 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1a780 65 78 2c 20 74 68 69 73 20 72 65 73 75 6c 74 73  ex, this results
1a790 0a 20 20 69 6e 20 64 72 61 6d 61 74 69 63 61 6c  .  in dramatical
1a7a0 6c 79 20 6c 65 73 73 20 64 61 74 61 20 62 65 69  ly less data bei
1a7b0 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74  ng loaded from t
1a7c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f  he database into
1a7d0 20 6d 65 6d 6f 72 79 2e 0a 0a 3c 63 6f 64 65 62   memory...<codeb
1a7e0 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 74  lock>.  SELECT t
1a7f0 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65  itle FROM docume
1a800 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20 20  nts JOIN ( .    
1a810 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20    SELECT docid, 
1a820 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64  rank(matchinfo(d
1a830 6f 63 75 6d 65 6e 74 73 29 29 20 41 53 20 72 61  ocuments)) AS ra
1a840 6e 6b 20 0a 20 20 20 20 20 20 46 52 4f 4d 20 64  nk .      FROM d
1a850 6f 63 75 6d 65 6e 74 73 0a 20 20 20 20 20 20 57  ocuments.      W
1a860 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
1a870 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
1a880 74 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  t;.      ORDER B
1a890 59 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20  Y rank DESC .   
1a8a0 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53     LIMIT 10 OFFS
1a8b0 45 54 20 30 0a 20 20 29 20 41 53 20 72 61 6e 6b  ET 0.  ) AS rank
1a8c0 74 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69  table USING(doci
1a8d0 64 29 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61  d).  ORDER BY ra
1a8e0 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53  nktable.rank DES
1a8f0 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  C.</codeblock>..
1a900 3c 70 3e 0a 20 20 54 68 65 20 6e 65 78 74 20 62  <p>.  The next b
1a910 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 65 6e 68 61  lock of SQL enha
1a920 6e 63 65 73 20 74 68 65 20 71 75 65 72 79 20 77  nces the query w
1a930 69 74 68 20 73 6f 6c 75 74 69 6f 6e 73 20 74 6f  ith solutions to
1a940 20 74 77 6f 20 6f 74 68 65 72 20 70 72 6f 62 6c   two other probl
1a950 65 6d 73 0a 20 20 74 68 61 74 20 6d 61 79 20 61  ems.  that may a
1a960 72 69 73 65 20 69 6e 20 64 65 76 65 6c 6f 70 69  rise in developi
1a970 6e 67 20 73 65 61 72 63 68 20 61 70 70 6c 69 63  ng search applic
1a980 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 46 54 53  ations using FTS
1a990 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c  :..<ol>.  <li> <
1a9a0 70 3e 0a 20 20 20 20 20 20 20 54 68 65 20 5b 73  p>.       The [s
1a9b0 6e 69 70 70 65 74 5d 20 66 75 6e 63 74 69 6f 6e  nippet] function
1a9c0 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
1a9d0 77 69 74 68 20 74 68 65 20 61 62 6f 76 65 20 71  with the above q
1a9e0 75 65 72 79 2e 20 42 65 63 61 75 73 65 0a 20 20  uery. Because.  
1a9f0 20 20 20 20 20 74 68 65 20 6f 75 74 65 72 20 71       the outer q
1aa00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 69 6e  uery does not in
1aa10 63 6c 75 64 65 20 61 20 22 57 48 45 52 45 20 2e  clude a "WHERE .
1aa20 2e 2e 20 4d 41 54 43 48 22 20 63 6c 61 75 73 65  .. MATCH" clause
1aa30 2c 20 74 68 65 20 73 6e 69 70 70 65 74 20 0a 20  , the snippet . 
1aa40 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 6d        function m
1aa50 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
1aa60 69 74 68 20 69 74 2e 20 4f 6e 65 20 73 6f 6c 75  ith it. One solu
1aa70 74 69 6f 6e 20 69 73 20 74 6f 20 64 75 70 6c 69  tion is to dupli
1aa80 63 61 74 65 20 74 68 65 20 57 48 45 52 45 0a 20  cate the WHERE. 
1aa90 20 20 20 20 20 20 63 6c 61 75 73 65 20 75 73 65        clause use
1aaa0 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75 65  d by the sub-que
1aab0 72 79 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ry in the outer 
1aac0 71 75 65 72 79 2e 20 54 68 65 20 6f 76 65 72 68  query. The overh
1aad0 65 61 64 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ead associated. 
1aae0 20 20 20 20 20 20 77 69 74 68 20 74 68 69 73 20        with this 
1aaf0 69 73 20 75 73 75 61 6c 6c 79 20 6e 65 67 6c 69  is usually negli
1ab00 67 69 62 6c 65 2e 0a 20 20 3c 6c 69 3e 20 3c 70  gible..  <li> <p
1ab10 3e 0a 20 20 20 20 20 20 20 54 68 65 20 72 65 6c  >.       The rel
1ab20 65 76 61 6e 63 79 20 6f 66 20 61 20 64 6f 63 75  evancy of a docu
1ab30 6d 65 6e 74 20 6d 61 79 20 64 65 70 65 6e 64 20  ment may depend 
1ab40 6f 6e 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  on something oth
1ab50 65 72 20 74 68 61 6e 20 6a 75 73 74 0a 20 20 20  er than just.   
1ab60 20 20 20 20 74 68 65 20 64 61 74 61 20 61 76 61      the data ava
1ab70 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65  ilable in the re
1ab80 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6d 61  turn value of ma
1ab90 74 63 68 69 6e 66 6f 2e 20 46 6f 72 20 65 78 61  tchinfo. For exa
1aba0 6d 70 6c 65 0a 20 20 20 20 20 20 20 65 61 63 68  mple.       each
1abb0 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68 65   document in the
1abc0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
1abd0 20 61 73 73 69 67 6e 65 64 20 61 20 73 74 61 74   assigned a stat
1abe0 69 63 20 77 65 69 67 68 74 20 62 61 73 65 64 0a  ic weight based.
1abf0 20 20 20 20 20 20 20 6f 6e 20 66 61 63 74 6f 72         on factor
1ac00 73 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 69  s unrelated to i
1ac10 74 73 20 63 6f 6e 74 65 6e 74 20 28 6f 72 69 67  ts content (orig
1ac20 69 6e 2c 20 61 75 74 68 6f 72 2c 20 61 67 65 2c  in, author, age,
1ac30 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 6f   number.       o
1ac40 66 20 72 65 66 65 72 65 6e 63 65 73 20 65 74 63  f references etc
1ac50 2e 29 2e 20 54 68 65 73 65 20 76 61 6c 75 65 73  .). These values
1ac60 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 62   can be stored b
1ac70 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
1ac80 6e 0a 20 20 20 20 20 20 20 69 6e 20 61 20 73 65  n.       in a se
1ac90 70 61 72 61 74 65 20 74 61 62 6c 65 20 74 68 61  parate table tha
1aca0 74 20 63 61 6e 20 62 65 20 6a 6f 69 6e 65 64 20  t can be joined 
1acb0 61 67 61 69 6e 73 74 20 74 68 65 20 64 6f 63 75  against the docu
1acc0 6d 65 6e 74 73 20 74 61 62 6c 65 0a 20 20 20 20  ments table.    
1acd0 20 20 20 69 6e 20 74 68 65 20 73 75 62 2d 71 75     in the sub-qu
1ace0 65 72 79 20 73 6f 20 74 68 61 74 20 74 68 65 20  ery so that the 
1acf0 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6d 61  rank function ma
1ad00 79 20 61 63 63 65 73 73 20 74 68 65 6d 2e 0a 3c  y access them..<
1ad10 2f 6f 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73  /ol>..<p>.  This
1ad20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1ad30 71 75 65 72 79 20 69 73 20 76 65 72 79 20 73 69  query is very si
1ad40 6d 69 6c 61 72 20 74 6f 20 74 68 61 74 20 75 73  milar to that us
1ad50 65 64 20 62 79 20 74 68 65 20 0a 20 20 3c 61 20  ed by the .  <a 
1ad60 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77  href="http://www
1ad70 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 65 61 72  .sqlite.org/sear
1ad80 63 68 3f 71 3d 66 74 73 33 22 3e 73 71 6c 69 74  ch?q=fts3">sqlit
1ad90 65 2e 6f 72 67 20 64 6f 63 75 6d 65 6e 74 61 74  e.org documentat
1ada0 69 6f 6e 20 73 65 61 72 63 68 3c 2f 61 3e 20 0a  ion search</a> .
1adb0 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a    application...
1adc0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
1add0 3e 2d 2d 20 54 68 69 73 20 74 61 62 6c 65 20 73  >-- This table s
1ade0 74 6f 72 65 73 20 74 68 65 20 73 74 61 74 69 63  tores the static
1adf0 20 77 65 69 67 68 74 20 61 73 73 69 67 6e 65 64   weight assigned
1ae00 20 74 6f 20 65 61 63 68 20 64 6f 63 75 6d 65 6e   to each documen
1ae10 74 20 69 6e 20 46 54 53 20 74 61 62 6c 65 3c 2f  t in FTS table</
1ae20 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 6f 63 75  i>.  <i>-- "docu
1ae30 6d 65 6e 74 73 22 2e 20 46 6f 72 20 65 61 63 68  ments". For each
1ae40 20 72 6f 77 20 69 6e 20 74 68 65 20 64 6f 63 75   row in the docu
1ae50 6d 65 6e 74 73 20 74 61 62 6c 65 20 74 68 65 72  ments table ther
1ae60 65 20 69 73 20 61 20 63 6f 72 72 65 73 70 6f 6e  e is a correspon
1ae70 64 69 6e 67 20 72 6f 77 3c 2f 69 3e 0a 20 20 3c  ding row</i>.  <
1ae80 69 3e 2d 2d 20 77 69 74 68 20 74 68 65 20 73 61  i>-- with the sa
1ae90 6d 65 20 64 6f 63 69 64 20 76 61 6c 75 65 20 69  me docid value i
1aea0 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 3c 2f 69  n this table.</i
1aeb0 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  >.  CREATE TABLE
1aec0 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61 28   documents_data(
1aed0 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52  docid INTEGER PR
1aee0 49 4d 41 52 59 20 4b 45 59 2c 20 77 65 69 67 68  IMARY KEY, weigh
1aef0 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  t);..  <i>-- Thi
1af00 73 20 71 75 65 72 79 20 69 73 20 73 69 6d 69 6c  s query is simil
1af10 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 69 6e  ar to the one in
1af20 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
1af30 2c 20 65 78 63 65 70 74 20 74 68 61 74 3a 3c 2f  , except that:</
1af40 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
1af50 20 3c 69 3e 2d 2d 20 20 20 31 2e 20 49 74 20 72   <i>--   1. It r
1af60 65 74 75 72 6e 73 20 61 20 22 73 6e 69 70 70 65  eturns a "snippe
1af70 74 22 20 6f 66 20 74 65 78 74 20 61 6c 6f 6e 67  t" of text along
1af80 20 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d 65   with the docume
1af90 6e 74 20 74 69 74 6c 65 20 66 6f 72 20 64 69 73  nt title for dis
1afa0 70 6c 61 79 2e 20 53 6f 3c 2f 69 3e 0a 20 20 3c  play. So</i>.  <
1afb0 69 3e 2d 2d 20 20 20 20 20 20 74 68 61 74 20 74  i>--      that t
1afc0 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74  he snippet funct
1afd0 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64 2c  ion may be used,
1afe0 20 74 68 65 20 22 57 48 45 52 45 20 2e 2e 2e 20   the "WHERE ... 
1aff0 4d 41 54 43 48 20 2e 2e 2e 22 20 63 6c 61 75 73  MATCH ..." claus
1b000 65 20 66 72 6f 6d 3c 2f 69 3e 0a 20 20 3c 69 3e  e from</i>.  <i>
1b010 2d 2d 20 20 20 20 20 20 74 68 65 20 73 75 62 2d  --      the sub-
1b020 71 75 65 72 79 20 69 73 20 64 75 70 6c 69 63 61  query is duplica
1b030 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ted in the outer
1b040 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 3c 69   query.</i>.  <i
1b050 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  >--</i>.  <i>-- 
1b060 20 20 32 2e 20 54 68 65 20 73 75 62 2d 71 75 65    2. The sub-que
1b070 72 79 20 6a 6f 69 6e 73 20 74 68 65 20 64 6f 63  ry joins the doc
1b080 75 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74  uments table wit
1b090 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 5f 64  h the document_d
1b0a0 61 74 61 20 74 61 62 6c 65 2c 20 73 6f 20 74 68  ata table, so th
1b0b0 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  at</i>.  <i>--  
1b0c0 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69      implementati
1b0d0 6f 6e 20 6f 66 20 74 68 65 20 72 61 6e 6b 20 66  on of the rank f
1b0e0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 63 63 65  unction has acce
1b0f0 73 73 20 74 6f 20 74 68 65 20 73 74 61 74 69 63  ss to the static
1b100 20 77 65 69 67 68 74 20 61 73 73 69 67 6e 65 64   weight assigned
1b110 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
1b120 20 20 74 6f 20 65 61 63 68 20 64 6f 63 75 6d 65    to each docume
1b130 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  nt.</i>.  SELECT
1b140 20 74 69 74 6c 65 2c 20 73 6e 69 70 70 65 74 28   title, snippet(
1b150 64 6f 63 75 6d 65 6e 74 73 29 20 46 52 4f 4d 20  documents) FROM 
1b160 64 6f 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 28  documents JOIN (
1b170 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 64   .      SELECT d
1b180 6f 63 69 64 2c 20 72 61 6e 6b 28 6d 61 74 63 68  ocid, rank(match
1b190 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c  info(documents),
1b1a0 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61 2e   documents_data.
1b1b0 77 65 69 67 68 74 29 20 41 53 20 72 61 6e 6b 0a  weight) AS rank.
1b1c0 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d        FROM docum
1b1d0 65 6e 74 73 20 4a 4f 49 4e 20 64 6f 63 75 6d 65  ents JOIN docume
1b1e0 6e 74 73 5f 64 61 74 61 20 55 53 49 4e 47 28 64  nts_data USING(d
1b1f0 6f 63 69 64 29 0a 20 20 20 20 20 20 57 48 45 52  ocid).      WHER
1b200 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43  E documents MATC
1b210 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a  H &lt;query&gt;.
1b220 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 72        ORDER BY r
1b230 61 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20  ank DESC .      
1b240 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
1b250 30 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62  0.  ) AS ranktab
1b260 6c 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a  le USING(docid).
1b270 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74    WHERE document
1b280 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72  s MATCH &lt;quer
1b290 79 26 67 74 3b 0a 20 20 4f 52 44 45 52 20 42 59  y&gt;.  ORDER BY
1b2a0 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20   ranktable.rank 
1b2b0 44 45 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  DESC.</codeblock
1b2c0 3e 0a 0a 3c 70 3e 0a 20 20 41 6c 6c 20 74 68 65  >..<p>.  All the
1b2d0 20 65 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73   example queries
1b2e0 20 61 62 6f 76 65 20 72 65 74 75 72 6e 20 74 68   above return th
1b2f0 65 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76  e ten most relev
1b300 61 6e 74 20 71 75 65 72 79 20 72 65 73 75 6c 74  ant query result
1b310 73 2e 0a 20 20 42 79 20 6d 6f 64 69 66 79 69 6e  s..  By modifyin
1b320 67 20 74 68 65 20 76 61 6c 75 65 73 20 75 73 65  g the values use
1b330 64 20 77 69 74 68 20 74 68 65 20 4f 46 46 53 45  d with the OFFSE
1b340 54 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75  T and LIMIT clau
1b350 73 65 73 2c 20 61 20 71 75 65 72 79 20 0a 20 20  ses, a query .  
1b360 74 6f 20 72 65 74 75 72 6e 20 28 73 61 79 29 20  to return (say) 
1b370 74 68 65 20 6e 65 78 74 20 74 65 6e 20 6d 6f 73  the next ten mos
1b380 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75 6c  t relevant resul
1b390 74 73 20 69 73 20 65 61 73 79 20 74 6f 20 63 6f  ts is easy to co
1b3a0 6e 73 74 72 75 63 74 2e 20 0a 20 20 54 68 69 73  nstruct. .  This
1b3b0 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1b3c0 6f 62 74 61 69 6e 20 74 68 65 20 64 61 74 61 20  obtain the data 
1b3d0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 73  required for a s
1b3e0 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
1b3f0 6e 73 20 73 65 63 6f 6e 64 0a 20 20 61 6e 64 20  ns second.  and 
1b400 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65 73  subsequent pages
1b410 20 6f 66 20 72 65 73 75 6c 74 73 2e 0a 0a 3c 70   of results...<p
1b420 3e 0a 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f  >.  The next blo
1b430 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  ck contains an e
1b440 78 61 6d 70 6c 65 20 72 61 6e 6b 20 66 75 6e 63  xample rank func
1b450 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6d  tion that uses m
1b460 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 0a 20  atchinfo data . 
1b470 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
1b480 43 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20  C. Instead of a 
1b490 73 69 6e 67 6c 65 20 77 65 69 67 68 74 2c 20 69  single weight, i
1b4a0 74 20 61 6c 6c 6f 77 73 20 61 20 77 65 69 67 68  t allows a weigh
1b4b0 74 20 74 6f 20 62 65 20 0a 20 20 65 78 74 65 72  t to be .  exter
1b4c0 6e 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 74  nally assigned t
1b4d0 6f 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  o each column of
1b4e0 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 20   each document. 
1b4f0 49 74 20 6d 61 79 20 62 65 20 72 65 67 69 73 74  It may be regist
1b500 65 72 65 64 0a 20 20 77 69 74 68 20 53 51 4c 69  ered.  with SQLi
1b510 74 65 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65  te like any othe
1b520 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  r user function 
1b530 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63  using [sqlite3_c
1b540 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5d 2e  reate_function].
1b550 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69  ..<codeblock>.<i
1b560 3e 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51  >/*</i>.<i>** SQ
1b570 4c 69 74 65 20 75 73 65 72 20 64 65 66 69 6e 65  Lite user define
1b580 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75 73  d function to us
1b590 65 20 77 69 74 68 20 6d 61 74 63 68 69 6e 66 6f  e with matchinfo
1b5a0 28 29 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  () to calculate 
1b5b0 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65  the</i>.<i>** re
1b5c0 6c 65 76 61 6e 63 79 20 6f 66 20 61 6e 20 46 54  levancy of an FT
1b5d0 53 20 6d 61 74 63 68 2e 20 54 68 65 20 76 61 6c  S match. The val
1b5e0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
1b5f0 68 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63 6f  he relevancy sco
1b600 72 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20  re</i>.<i>** (a 
1b610 72 65 61 6c 20 76 61 6c 75 65 20 67 72 65 61 74  real value great
1b620 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1b630 20 74 6f 20 7a 65 72 6f 29 2e 20 41 20 6c 61 72   to zero). A lar
1b640 67 65 72 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ger value indica
1b650 74 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61  tes </i>.<i>** a
1b660 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20 64   more relevant d
1b670 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e  ocument.</i>.<i>
1b680 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65  **</i>.<i>** The
1b690 20 6f 76 65 72 61 6c 6c 20 72 65 6c 65 76 61 6e   overall relevan
1b6a0 63 79 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  cy returned is t
1b6b0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 72 65  he sum of the re
1b6c0 6c 65 76 61 6e 63 69 65 73 20 6f 66 20 65 61 63  levancies of eac
1b6d0 68 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  h </i>.<i>** col
1b6e0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 65  umn value in the
1b6f0 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20   FTS table. The 
1b700 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20 63  relevancy of a c
1b710 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 74  olumn value is t
1b720 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d  he</i>.<i>** sum
1b730 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b740 67 20 66 6f 72 20 65 61 63 68 20 72 65 70 6f 72  g for each repor
1b750 74 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e 20  table phrase in 
1b760 74 68 65 20 46 54 53 20 71 75 65 72 79 3a 3c 2f  the FTS query:</
1b770 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e  i>.<i>**</i>.<i>
1b780 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63 6f  **   (&lt;hit co
1b790 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c  unt&gt; / &lt;gl
1b7a0 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67  obal hit count&g
1b7b0 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20  t) * &lt;column 
1b7c0 77 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c  weight&gt;</i>.<
1b7d0 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77  i>**</i>.<i>** w
1b7e0 68 65 72 65 20 26 6c 74 3b 68 69 74 20 63 6f 75  here &lt;hit cou
1b7f0 6e 74 26 67 74 3b 20 69 73 20 74 68 65 20 6e 75  nt&gt; is the nu
1b800 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65  mber of instance
1b810 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20  s of the phrase 
1b820 69 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a  in the</i>.<i>**
1b830 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66   column value of
1b840 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1b850 20 61 6e 64 20 26 6c 74 3b 67 6c 6f 62 61 6c 20   and &lt;global 
1b860 68 69 74 20 63 6f 75 6e 74 26 67 74 3b 20 69 73  hit count&gt; is
1b870 20 74 68 65 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a   the number</i>.
1b880 3c 69 3e 2a 2a 20 6f 66 20 69 6e 73 74 61 6e 63  <i>** of instanc
1b890 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  es of the phrase
1b8a0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c   in the same col
1b8b0 75 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20  umn of all rows 
1b8c0 69 6e 20 74 68 65 20 46 54 53 3c 2f 69 3e 0a 3c  in the FTS</i>.<
1b8d0 69 3e 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20  i>** table. The 
1b8e0 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68  &lt;column weigh
1b8f0 74 26 67 74 3b 20 69 73 20 61 20 77 65 69 67 68  t&gt; is a weigh
1b900 74 69 6e 67 20 66 61 63 74 6f 72 20 61 73 73 69  ting factor assi
1b910 67 6e 65 64 20 74 6f 20 65 61 63 68 3c 2f 69 3e  gned to each</i>
1b920 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79  .<i>** column by
1b930 20 74 68 65 20 63 61 6c 6c 65 72 20 28 73 65 65   the caller (see
1b940 20 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e   below).</i>.<i>
1b950 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65  **</i>.<i>** The
1b960 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b970 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1b980 20 6d 75 73 74 20 62 65 20 74 68 65 20 72 65 74   must be the ret
1b990 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
1b9a0 20 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20   FTS </i>.<i>** 
1b9b0 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63  matchinfo() func
1b9c0 74 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  tion. Following 
1b9d0 74 68 69 73 20 6d 75 73 74 20 62 65 20 6f 6e 65  this must be one
1b9e0 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 65 61   argument for ea
1b9f0 63 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c  ch column </i>.<
1ba00 69 3e 2a 2a 20 6f 66 20 74 68 65 20 46 54 53 20  i>** of the FTS 
1ba10 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ba20 20 61 20 6e 75 6d 65 72 69 63 20 77 65 69 67 68   a numeric weigh
1ba30 74 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68 65  t factor for the
1ba40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c   corresponding <
1ba50 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e  /i>.<i>** column
1ba60 2e 20 45 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c  . Example:</i>.<
1ba70 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
1ba80 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
1ba90 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74  L TABLE document
1baa0 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74  s USING fts3(tit
1bab0 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e  le, content)</i>
1bac0 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  .<i>**</i>.<i>**
1bad0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
1bae0 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65  uery returns the
1baf0 20 64 6f 63 69 64 73 20 6f 66 20 64 6f 63 75 6d   docids of docum
1bb00 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20  ents that match 
1bb10 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69  the full-text</i
1bb20 3e 0a 3c 69 3e 2a 2a 20 71 75 65 72 79 20 26 6c  >.<i>** query &l
1bb30 74 3b 71 75 65 72 79 26 67 74 3b 20 73 6f 72 74  t;query&gt; sort
1bb40 65 64 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20  ed from most to 
1bb50 6c 65 61 73 74 20 72 65 6c 65 76 61 6e 74 2e 20  least relevant. 
1bb60 57 68 65 6e 20 63 61 6c 63 75 6c 61 74 69 6e 67  When calculating
1bb70 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76  </i>.<i>** relev
1bb80 61 6e 63 65 2c 20 71 75 65 72 79 20 74 65 72 6d  ance, query term
1bb90 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74 68   instances in th
1bba0 65 20 27 74 69 74 6c 65 27 20 63 6f 6c 75 6d 6e  e 'title' column
1bbb0 20 61 72 65 20 67 69 76 65 6e 20 74 77 69 63 65   are given twice
1bbc0 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77   the</i>.<i>** w
1bbd0 65 69 67 68 74 69 6e 67 20 6f 66 20 74 68 6f 73  eighting of thos
1bbe0 65 20 69 6e 20 74 68 65 20 27 63 6f 6e 74 65 6e  e in the 'conten
1bbf0 74 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c  t' column.</i>.<
1bc00 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
1bc10 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
1bc20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 3c  FROM documents <
1bc30 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 57 48  /i>.<i>**     WH
1bc40 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
1bc50 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
1bc60 3b 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20  ; </i>.<i>**    
1bc70 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28 6d   ORDER BY rank(m
1bc80 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e  atchinfo(documen
1bc90 74 73 29 2c 20 31 2e 30 2c 20 30 2e 35 29 20 44  ts), 1.0, 0.5) D
1bca0 45 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69  ESC</i>.<i>*/</i
1bcb0 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  >.static void ra
1bcc0 6e 6b 66 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  nkfunc(sqlite3_c
1bcd0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e  ontext *pCtx, in
1bce0 74 20 6e 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f  t nVal, sqlite3_
1bcf0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a  value **apVal){.
1bd00 20 20 69 6e 74 20 2a 61 4d 61 74 63 68 69 6e 66    int *aMatchinf
1bd10 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1bd20 20 20 3c 69 3e 2f 2a 20 52 65 74 75 72 6e 20 76    <i>/* Return v
1bd30 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e 66  alue of matchinf
1bd40 6f 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74  o() */</i>.  int
1bd50 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
1bd70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
1bd80 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
1bd90 65 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e  e */</i>.  int n
1bda0 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20  Phrase;         
1bdb0 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a             <i>/*
1bdc0 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73   Number of phras
1bdd0 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  es in the query 
1bde0 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68  */</i>.  int iPh
1bdf0 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  rase;           
1be00 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43           <i>/* C
1be10 75 72 72 65 6e 74 20 70 68 72 61 73 65 20 2a 2f  urrent phrase */
1be20 3c 2f 69 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63  </i>.  double sc
1be30 6f 72 65 20 3d 20 30 2e 30 3b 20 20 20 20 20 20  ore = 0.0;      
1be40 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c         <i>/* Val
1be50 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c  ue to return */<
1be60 2f 69 3e 0a 0a 20 20 61 73 73 65 72 74 28 20 73  /i>..  assert( s
1be70 69 7a 65 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b  izeof(int)==4 );
1be80 0a 0a 3c 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20  ..<i>  /* Check 
1be90 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1bea0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1beb0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1bec0 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
1bed0 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20  </i>.<i>  ** If 
1bee0 6e 6f 74 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f  not, jump to wro
1bef0 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20  ng_number_args. 
1bf00 53 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 20 74  Set aMatchinfo t
1bf10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  o point to the a
1bf20 72 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a  rray</i>.<i>  **
1bf30 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   of unsigned int
1bf40 65 67 65 72 20 76 61 6c 75 65 73 20 72 65 74 75  eger values retu
1bf50 72 6e 65 64 20 62 79 20 46 54 53 20 66 75 6e 63  rned by FTS func
1bf60 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20  tion matchinfo. 
1bf70 53 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  Set</i>.<i>  ** 
1bf80 6e 50 68 72 61 73 65 20 74 6f 20 63 6f 6e 74 61  nPhrase to conta
1bf90 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1bfa0 20 72 65 70 6f 72 74 61 62 6c 65 20 70 68 72 61   reportable phra
1bfb0 73 65 73 20 69 6e 20 74 68 65 20 75 73 65 72 73  ses in the users
1bfc0 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c   full-text</i>.<
1bfd0 69 3e 20 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e  i>  ** query, an
1bfe0 64 20 6e 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75  d nCol to the nu
1bff0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1c000 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69  in the table.</i
1c010 3e 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20  >.<i>  */</i>.  
1c020 69 66 28 20 6e 56 61 6c 26 6c 74 3b 31 20 29 20  if( nVal&lt;1 ) 
1c030 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65  goto wrong_numbe
1c040 72 5f 61 72 67 73 3b 0a 20 20 61 4d 61 74 63 68  r_args;.  aMatch
1c050 69 6e 66 6f 20 3d 20 28 75 6e 73 69 67 6e 65 64  info = (unsigned
1c060 20 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 5f 76   int *)sqlite3_v
1c070 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 26  alue_blob(apVal&
1c080 23 78 35 42 3b 30 26 23 78 35 44 3b 29 3b 0a 20  #x5B;0&#x5D;);. 
1c090 20 6e 50 68 72 61 73 65 20 3d 20 61 4d 61 74 63   nPhrase = aMatc
1c0a0 68 69 6e 66 6f 26 23 78 35 42 3b 30 26 23 78 35  hinfo&#x5B;0&#x5
1c0b0 44 3b 3b 0a 20 20 6e 43 6f 6c 20 3d 20 61 4d 61  D;;.  nCol = aMa
1c0c0 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 31 26 23  tchinfo&#x5B;1&#
1c0d0 78 35 44 3b 3b 0a 20 20 69 66 28 20 6e 56 61 6c  x5D;;.  if( nVal
1c0e0 21 3d 28 31 2b 6e 43 6f 6c 29 20 29 20 67 6f 74  !=(1+nCol) ) got
1c0f0 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61  o wrong_number_a
1c100 72 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74  rgs;..<i>  /* It
1c110 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61  erate through ea
1c120 63 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65  ch phrase in the
1c130 20 75 73 65 72 73 20 71 75 65 72 79 2e 20 2a 2f   users query. */
1c140 3c 2f 69 3e 0a 20 20 66 6f 72 28 69 50 68 72 61  </i>.  for(iPhra
1c150 73 65 3d 30 3b 20 69 50 68 72 61 73 65 26 6c 74  se=0; iPhrase&lt
1c160 3b 6e 50 68 72 61 73 65 3b 20 69 50 68 72 61 73  ;nPhrase; iPhras
1c170 65 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  e++){.    int iC
1c180 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
1c190 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75          <i>/* Cu
1c1a0 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c  rrent column */<
1c1b0 2f 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e  /i>..<i>    /* N
1c1c0 6f 77 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  ow iterate throu
1c1d0 67 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  gh each column i
1c1e0 6e 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72  n the users quer
1c1f0 79 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75  y. For each colu
1c200 6d 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a  mn,</i>.<i>    *
1c210 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
1c220 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 20  relevancy score 
1c230 62 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a  by:</i>.<i>    *
1c240 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20  *</i>.<i>    ** 
1c250 20 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74    (&lt;hit count
1c260 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61  &gt; / &lt;globa
1c270 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20  l hit count&gt) 
1c280 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69  * &lt;column wei
1c290 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20  ght&gt;</i>.<i> 
1c2a0 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20     **</i>.<i>   
1c2b0 20 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f 26   ** aPhraseinfo&
1c2c0 23 78 35 42 3b 26 23 78 35 44 3b 20 70 6f 69 6e  #x5B;&#x5D; poin
1c2d0 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ts to the start 
1c2e0 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  of the data for 
1c2f0 70 68 72 61 73 65 20 69 50 68 72 61 73 65 2e 20  phrase iPhrase. 
1c300 53 6f 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  So</i>.<i>    **
1c310 20 74 68 65 20 68 69 74 20 63 6f 75 6e 74 20 61   the hit count a
1c320 6e 64 20 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f  nd global hit co
1c330 75 6e 74 73 20 66 6f 72 20 65 61 63 68 20 63 6f  unts for each co
1c340 6c 75 6d 6e 20 61 72 65 20 66 6f 75 6e 64 20 69  lumn are found i
1c350 6e 20 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  n </i>.<i>    **
1c360 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35   aPhraseinfo&#x5
1c370 42 3b 69 43 6f 6c 2a 33 26 23 78 35 44 3b 20 61  B;iCol*3&#x5D; a
1c380 6e 64 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23  nd aPhraseinfo&#
1c390 78 35 42 3b 69 43 6f 6c 2a 33 2b 31 26 23 78 35  x5B;iCol*3+1&#x5
1c3a0 44 3b 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  D;, respectively
1c3b0 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c  .</i>.<i>    */<
1c3c0 2f 69 3e 0a 20 20 20 20 69 6e 74 20 2a 61 50 68  /i>.    int *aPh
1c3d0 72 61 73 65 69 6e 66 6f 20 3d 20 26 61 4d 61 74  raseinfo = &aMat
1c3e0 63 68 69 6e 66 6f 26 23 78 35 42 3b 32 20 2b 20  chinfo&#x5B;2 + 
1c3f0 69 50 68 72 61 73 65 2a 6e 43 6f 6c 2a 33 26 23  iPhrase*nCol*3&#
1c400 78 35 44 3b 3b 0a 20 20 20 20 66 6f 72 28 69 43  x5D;;.    for(iC
1c410 6f 6c 3d 30 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43  ol=0; iCol&lt;nC
1c420 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
1c430 20 20 20 69 6e 74 20 6e 48 69 74 43 6f 75 6e 74     int nHitCount
1c440 20 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23   = aPhraseinfo&#
1c450 78 35 42 3b 33 2a 69 43 6f 6c 26 23 78 35 44 3b  x5B;3*iCol&#x5D;
1c460 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 6c 6f  ;.      int nGlo
1c470 62 61 6c 48 69 74 43 6f 75 6e 74 20 3d 20 61 50  balHitCount = aP
1c480 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 33  hraseinfo&#x5B;3
1c490 2a 69 43 6f 6c 2b 31 26 23 78 35 44 3b 3b 0a 20  *iCol+1&#x5D;;. 
1c4a0 20 20 20 20 20 64 6f 75 62 6c 65 20 77 65 69 67       double weig
1c4b0 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ht = sqlite3_val
1c4c0 75 65 5f 64 6f 75 62 6c 65 28 61 70 56 61 6c 26  ue_double(apVal&
1c4d0 23 78 35 42 3b 69 43 6f 6c 2b 31 26 23 78 35 44  #x5B;iCol+1&#x5D
1c4e0 3b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 48  ;);.      if( nH
1c4f0 69 74 43 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20  itCount>0 ){.   
1c500 20 20 20 20 20 73 63 6f 72 65 20 2b 3d 20 28 28       score += ((
1c510 64 6f 75 62 6c 65 29 6e 48 69 74 43 6f 75 6e 74  double)nHitCount
1c520 20 2f 20 28 64 6f 75 62 6c 65 29 6e 47 6c 6f 62   / (double)nGlob
1c530 61 6c 48 69 74 43 6f 75 6e 74 29 20 2a 20 77 65  alHitCount) * we
1c540 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ight;.      }.  
1c550 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
1c560 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
1c570 28 70 43 74 78 2c 20 73 63 6f 72 65 29 3b 0a 20  (pCtx, score);. 
1c580 20 72 65 74 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f   return;..<i>  /
1c590 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
1c5a0 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  he wrong number 
1c5b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  of arguments are
1c5c0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1c5d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a  function */</i>.
1c5e0 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67  wrong_number_arg
1c5f0 73 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  s:.  sqlite3_res
1c600 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
1c610 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
1c620 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
1c630 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29 22 2c 20  nction rank()", 
1c640 2d 31 29 3b 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f  -1);.}.</codeblo
1c650 63 6b 3e 0a                                      ck>.