Documentation Source Text

Hex Artifact Content
Login

Artifact 005ee39344a6dd7779dc489e0c0a4281b2a4c290:


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 6d 61 74 63 68 69  irective [matchi
1060: 6e 66 6f 5f 66 74 73 33 7c 22 6d 61 74 63 68 69  nfo_fts3|"matchi
1070: 6e 66 6f 3d 66 74 73 33 22 5d 20 61 73 20 70 61  nfo=fts3"] as pa
1080: 72 74 20 6f 66 20 74 68 65 20 46 54 53 34 20 74  rt of the FTS4 t
1090: 61 62 6c 65 0a 20 20 20 20 20 20 20 64 65 63 6c  able.       decl
10a0: 61 72 61 74 69 6f 6e 2c 20 62 75 74 20 74 68 69  aration, but thi
10b0: 73 20 63 6f 6d 65 73 20 61 74 20 74 68 65 20 65  s comes at the e
10c0: 78 70 65 6e 73 65 20 6f 66 20 73 61 63 72 69 66  xpense of sacrif
10d0: 69 63 69 6e 67 20 73 6f 6d 65 20 6f 66 20 74 68  icing some of th
10e0: 65 0a 20 20 20 20 20 20 20 65 78 74 72 61 20 73  e.       extra s
10f0: 75 70 70 6f 72 74 65 64 20 6d 61 74 63 68 69 6e  upported matchin
1100: 66 6f 28 29 20 6f 70 74 69 6f 6e 73 2e 0a 0a 20  fo() options... 
1110: 20 3c 6c 69 3e 20 3c 70 3e 46 54 53 34 20 70 72   <li> <p>FTS4 pr
1120: 6f 76 69 64 65 73 20 68 6f 6f 6b 73 20 28 74 68  ovides hooks (th
1130: 65 20 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75  e compress and u
1140: 6e 63 6f 6d 70 72 65 73 73 20 0a 20 20 20 20 20  ncompress .     
1150: 20 20 5b 46 54 53 34 20 6f 70 74 69 6f 6e 73 7c    [FTS4 options|
1160: 6f 70 74 69 6f 6e 73 5d 29 20 61 6c 6c 6f 77 69  options]) allowi
1170: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 74  ng data to be st
1180: 6f 72 65 64 20 69 6e 20 61 20 63 6f 6d 70 72 65  ored in a compre
1190: 73 73 65 64 20 0a 20 20 20 20 20 20 20 66 6f 72  ssed .       for
11a0: 6d 2c 20 72 65 64 75 63 69 6e 67 20 64 69 73 6b  m, reducing disk
11b0: 20 75 73 61 67 65 20 61 6e 64 20 49 4f 2e 0a 3c   usage and IO..<
11c0: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 34  /ul>..<p>.  FTS4
11d0: 20 69 73 20 61 6e 20 65 6e 68 61 6e 63 65 6d 65   is an enhanceme
11e0: 6e 74 20 74 6f 20 46 54 53 33 2e 20 20 46 54 53  nt to FTS3.  FTS
11f0: 33 20 68 61 73 20 62 65 65 6e 20 61 76 61 69 6c  3 has been avail
1200: 61 62 6c 65 20 73 69 6e 63 65 20 53 51 4c 69 74  able since SQLit
1210: 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e 35 2e 30  e [version 3.5.0
1220: 5d 20 69 6e 0a 20 20 32 30 30 37 2d 30 39 2d 30  ] in.  2007-09-0
1230: 34 2e 20 20 54 68 65 20 65 6e 68 61 6e 63 65 6d  4.  The enhancem
1240: 65 6e 74 73 20 66 6f 72 20 46 54 53 34 20 77 65  ents for FTS4 we
1250: 72 65 20 61 64 64 65 64 20 77 69 74 68 20 53 51  re added with SQ
1260: 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e  Lite [version 3.
1270: 37 2e 34 5d 20 6f 6e 20 32 30 31 30 2d 31 32 2d  7.4] on 2010-12-
1280: 30 38 2e 0a 0a 3c 70 3e 0a 20 20 57 68 69 63 68  08...<p>.  Which
1290: 20 6d 6f 64 75 6c 65 2c 20 46 54 53 33 20 6f 72   module, FTS3 or
12a0: 20 46 54 53 34 2c 20 73 68 6f 75 6c 64 20 79 6f   FTS4, should yo
12b0: 75 20 75 73 65 20 69 6e 20 79 6f 75 72 20 61 70  u use in your ap
12c0: 70 6c 69 63 61 74 69 6f 6e 3f 20 20 46 54 53 34  plication?  FTS4
12d0: 20 69 73 0a 20 20 73 6f 6d 65 74 69 6d 65 73 20   is.  sometimes 
12e0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 66 61  significantly fa
12f0: 73 74 65 72 20 74 68 61 6e 20 46 54 53 33 2c 20  ster than FTS3, 
1300: 65 76 65 6e 20 6f 72 64 65 72 73 20 6f 66 20 6d  even orders of m
1310: 61 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 0a  agnitude faster.
1320: 20 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74    depending on t
1330: 68 65 20 71 75 65 72 79 2c 20 74 68 6f 75 67 68  he query, though
1340: 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1350: 61 73 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ase the performa
1360: 6e 63 65 20 6f 66 20 74 68 65 20 74 77 6f 0a 20  nce of the two. 
1370: 20 6d 6f 64 75 6c 65 73 20 69 73 20 73 69 6d 69   modules is simi
1380: 6c 61 72 2e 20 46 54 53 34 20 61 6c 73 6f 20 6f  lar. FTS4 also o
1390: 66 66 65 72 73 20 74 68 65 20 65 6e 68 61 6e 63  ffers the enhanc
13a0: 65 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d  ed [matchinfo()]
13b0: 20 6f 75 74 70 75 74 73 20 77 68 69 63 68 0a 20   outputs which. 
13c0: 20 63 61 6e 20 62 65 20 75 73 65 66 75 6c 20 69   can be useful i
13d0: 6e 20 72 61 6e 6b 69 6e 67 20 74 68 65 20 72 65  n ranking the re
13e0: 73 75 6c 74 73 20 6f 66 20 61 20 5b 46 54 53 20  sults of a [FTS 
13f0: 4d 41 54 43 48 7c 4d 41 54 43 48 5d 20 6f 70 65  MATCH|MATCH] ope
1400: 72 61 74 69 6f 6e 2e 20 20 4f 6e 20 74 68 65 0a  ration.  On the.
1410: 20 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 6e    other hand, in
1420: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
1430: 61 20 5b 6d 61 74 63 68 69 6e 66 6f 5f 66 74 73  a [matchinfo_fts
1440: 33 7c 6d 61 74 63 68 69 6e 66 6f 3d 66 74 73 33  3|matchinfo=fts3
1450: 5d 20 64 69 72 65 63 74 69 76 65 20 46 54 53 34  ] directive FTS4
1460: 20 72 65 71 75 69 72 65 73 20 61 20 6c 69 74 74   requires a litt
1470: 6c 65 0a 20 20 6d 6f 72 65 20 64 69 73 6b 20 73  le.  more disk s
1480: 70 61 63 65 20 74 68 61 6e 20 46 54 53 33 2c 20  pace than FTS3, 
1490: 74 68 6f 75 67 68 20 6f 6e 6c 79 20 61 20 70 65  though only a pe
14a0: 72 63 65 6e 74 20 6f 66 20 74 77 6f 20 69 6e 20  rcent of two in 
14b0: 6d 6f 73 74 20 63 61 73 65 73 2e 0a 0a 3c 70 3e  most cases...<p>
14c0: 0a 20 20 46 6f 72 20 6e 65 77 65 72 20 61 70 70  .  For newer app
14d0: 6c 69 63 61 74 69 6f 6e 73 2c 20 46 54 53 34 20  lications, FTS4 
14e0: 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 3b 20  is recommended; 
14f0: 74 68 6f 75 67 68 20 69 66 20 63 6f 6d 70 61 74  though if compat
1500: 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
1510: 65 72 20 0a 20 20 76 65 72 73 69 6f 6e 73 20 6f  er .  versions o
1520: 66 20 53 51 4c 69 74 65 20 69 73 20 69 6d 70 6f  f SQLite is impo
1530: 72 74 61 6e 74 2c 20 74 68 65 6e 20 46 54 53 33  rtant, then FTS3
1540: 20 77 69 6c 6c 20 75 73 75 61 6c 6c 79 20 73 65   will usually se
1550: 72 76 65 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  rve just as well
1560: 2e 20 20 0a 0a 3c 68 32 3e 43 72 65 61 74 69 6e  .  ..<h2>Creatin
1570: 67 20 61 6e 64 20 44 65 73 74 72 6f 79 69 6e 67  g and Destroying
1580: 20 46 54 53 20 54 61 62 6c 65 73 3c 2f 68 32 3e   FTS Tables</h2>
1590: 0a 0a 3c 70 3e 0a 20 20 4c 69 6b 65 20 6f 74 68  ..<p>.  Like oth
15a0: 65 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  er virtual table
15b0: 20 74 79 70 65 73 2c 20 6e 65 77 20 46 54 53 20   types, new FTS 
15c0: 74 61 62 6c 65 73 20 61 72 65 20 63 72 65 61 74  tables are creat
15d0: 65 64 20 75 73 69 6e 67 20 61 20 0a 20 20 5b 43  ed using a .  [C
15e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
15f0: 42 4c 45 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20  BLE] statement. 
1600: 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 2c  The module name,
1610: 20 77 68 69 63 68 20 66 6f 6c 6c 6f 77 73 0a 20   which follows. 
1620: 20 74 68 65 20 55 53 49 4e 47 20 6b 65 79 77 6f   the USING keywo
1630: 72 64 2c 20 69 73 20 65 69 74 68 65 72 20 22 66  rd, is either "f
1640: 74 73 33 22 20 6f 72 20 22 66 74 73 34 22 2e 20  ts3" or "fts4". 
1650: 54 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  The virtual tabl
1660: 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  e module argumen
1670: 74 73 20 6d 61 79 0a 20 20 62 65 20 6c 65 66 74  ts may.  be left
1680: 20 65 6d 70 74 79 2c 20 69 6e 20 77 68 69 63 68   empty, in which
1690: 20 63 61 73 65 20 61 6e 20 46 54 53 20 74 61 62   case an FTS tab
16a0: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
16b0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 0a 20   user-defined . 
16c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 63   column named "c
16d0: 6f 6e 74 65 6e 74 22 20 69 73 20 63 72 65 61 74  ontent" is creat
16e0: 65 64 2e 20 41 6c 74 65 72 6e 61 74 69 76 65 6c  ed. Alternativel
16f0: 79 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20 61 72  y, the module ar
1700: 67 75 6d 65 6e 74 73 0a 20 20 6d 61 79 20 62 65  guments.  may be
1710: 20 70 61 73 73 65 64 20 61 20 6c 69 73 74 20 6f   passed a list o
1720: 66 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  f comma separate
1730: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  d column names. 
1740: 0a 0a 3c 70 3e 0a 20 20 49 66 20 63 6f 6c 75 6d  ..<p>.  If colum
1750: 6e 20 6e 61 6d 65 73 20 61 72 65 20 65 78 70 6c  n names are expl
1760: 69 63 69 74 6c 79 20 70 72 6f 76 69 64 65 64 20  icitly provided 
1770: 66 6f 72 20 74 68 65 20 46 54 53 20 74 61 62 6c  for the FTS tabl
1780: 65 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 74  e as part of.  t
1790: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
17a0: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
17b0: 74 2c 20 74 68 65 6e 20 61 20 64 61 74 61 74 79  t, then a dataty
17c0: 70 65 20 6e 61 6d 65 20 6d 61 79 20 62 65 20 6f  pe name may be o
17d0: 70 74 69 6f 6e 61 6c 6c 79 20 0a 20 20 73 70 65  ptionally .  spe
17e0: 63 69 66 69 65 64 20 66 6f 72 20 65 61 63 68 20  cified for each 
17f0: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 69 73 20  column. This is 
1800: 70 75 72 65 20 73 79 6e 74 61 63 74 69 63 20 73  pure syntactic s
1810: 75 67 61 72 2c 20 74 68 65 0a 20 20 73 75 70 70  ugar, the.  supp
1820: 6c 69 65 64 20 74 79 70 65 6e 61 6d 65 73 20 61  lied typenames a
1830: 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 46  re not used by F
1840: 54 53 20 6f 72 20 74 68 65 20 53 51 4c 69 74 65  TS or the SQLite
1850: 20 63 6f 72 65 20 66 6f 72 20 61 6e 79 0a 20 20   core for any.  
1860: 70 75 72 70 6f 73 65 2e 20 54 68 65 20 73 61 6d  purpose. The sam
1870: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6e 79  e applies to any
1880: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 70 65   constraints spe
1890: 63 69 66 69 65 64 20 61 6c 6f 6e 67 20 77 69 74  cified along wit
18a0: 68 20 61 6e 0a 20 20 46 54 53 20 63 6f 6c 75 6d  h an.  FTS colum
18b0: 6e 20 6e 61 6d 65 20 2d 20 74 68 65 79 20 61 72  n name - they ar
18c0: 65 20 70 61 72 73 65 64 20 62 75 74 20 6e 6f 74  e parsed but not
18d0: 20 75 73 65 64 20 6f 72 20 72 65 63 6f 72 64 65   used or recorde
18e0: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 0a  d by the system.
18f0: 20 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 0a 3c    in any way...<
1900: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
1910: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
1920: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 64 61   table named "da
1930: 74 61 22 20 77 69 74 68 20 6f 6e 65 20 63 6f 6c  ta" with one col
1940: 75 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22 3a  umn - "content":
1950: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
1960: 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61 74 61  RTUAL TABLE data
1970: 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 0a   USING fts3();..
1980: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
1990: 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65  n FTS table name
19a0: 64 20 22 70 61 67 65 73 22 20 77 69 74 68 20 74  d "pages" with t
19b0: 68 72 65 65 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69  hree columns:</i
19c0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
19d0: 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20 55  AL TABLE pages U
19e0: 53 49 4e 47 20 66 74 73 34 28 74 69 74 6c 65 2c  SING fts4(title,
19f0: 20 6b 65 79 77 6f 72 64 73 2c 20 62 6f 64 79 29   keywords, body)
1a00: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
1a10: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e  e an FTS table n
1a20: 61 6d 65 64 20 22 6d 61 69 6c 22 20 77 69 74 68  amed "mail" with
1a30: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e 20 44 61   two columns. Da
1a40: 74 61 74 79 70 65 73 0a 20 20 2d 2d 20 61 6e 64  tatypes.  -- and
1a50: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 73 74 72 61 69   column constrai
1a60: 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
1a70: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  d along with eac
1a80: 68 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 73 65 0a  h column. These.
1a90: 20 20 2d 2d 20 61 72 65 20 63 6f 6d 70 6c 65 74    -- are complet
1aa0: 65 6c 79 20 69 67 6e 6f 72 65 64 20 62 79 20 46  ely ignored by F
1ab0: 54 53 20 61 6e 64 20 53 51 4c 69 74 65 2e 20 3c  TS and SQLite. <
1ac0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1ad0: 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20  TUAL TABLE mail 
1ae0: 55 53 49 4e 47 20 66 74 73 33 28 0a 20 20 20 20  USING fts3(.    
1af0: 73 75 62 6a 65 63 74 20 56 41 52 43 48 41 52 28  subject VARCHAR(
1b00: 32 35 36 29 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 20  256) NOT NULL,. 
1b10: 20 20 20 62 6f 64 79 20 54 45 58 54 20 43 48 45     body TEXT CHE
1b20: 43 4b 28 6c 65 6e 67 74 68 28 62 6f 64 79 29 26  CK(length(body)&
1b30: 6c 74 3b 31 30 32 34 30 29 0a 20 20 29 3b 0a 3c  lt;10240).  );.<
1b40: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
1b50: 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 61 20  .  As well as a 
1b60: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c  list of columns,
1b70: 20 74 68 65 20 6d 6f 64 75 6c 65 20 61 72 67 75   the module argu
1b80: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1b90: 61 20 43 52 45 41 54 45 0a 20 20 56 49 52 54 55  a CREATE.  VIRTU
1ba0: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
1bb0: 6e 74 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  nt used to creat
1bc0: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d  e an FTS table m
1bd0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  ay be used to sp
1be0: 65 63 69 66 79 0a 20 20 61 20 5b 74 6f 6b 65 6e  ecify.  a [token
1bf0: 69 7a 65 72 5d 2e 20 54 68 69 73 20 69 73 20 64  izer]. This is d
1c00: 6f 6e 65 20 62 79 20 73 70 65 63 69 66 79 69 6e  one by specifyin
1c10: 67 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68  g a string of th
1c20: 65 20 66 6f 72 6d 0a 20 20 22 74 6f 6b 65 6e 69  e form.  "tokeni
1c30: 7a 65 3d 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  ze=&lt;tokenizer
1c40: 20 6e 61 6d 65 26 67 74 3b 20 26 6c 74 3b 74 6f   name&gt; &lt;to
1c50: 6b 65 6e 69 7a 65 72 20 61 72 67 73 26 67 74 3b  kenizer args&gt;
1c60: 22 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  " in place of a 
1c70: 63 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65 2c 20 77  column.  name, w
1c80: 68 65 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a  here &lt;tokeniz
1c90: 65 72 20 6e 61 6d 65 26 67 74 3b 20 69 73 20 74  er name&gt; is t
1ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1cb0: 6f 6b 65 6e 69 7a 65 72 20 74 6f 20 75 73 65 20  okenizer to use 
1cc0: 61 6e 64 0a 20 20 26 6c 74 3b 74 6f 6b 65 6e 69  and.  &lt;tokeni
1cd0: 7a 65 72 20 61 72 67 73 26 67 74 3b 20 69 73 20  zer args&gt; is 
1ce0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74  an optional list
1cf0: 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 73   of whitespace s
1d00: 65 70 61 72 61 74 65 64 20 71 75 61 6c 69 66 69  eparated qualifi
1d10: 65 72 73 0a 20 20 74 6f 20 70 61 73 73 20 74 6f  ers.  to pass to
1d20: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69   the tokenizer i
1d30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 41  mplementation. A
1d40: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63 69   tokenizer speci
1d50: 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 62 65 0a  fication may be.
1d60: 20 20 70 6c 61 63 65 64 20 61 6e 79 77 68 65 72    placed anywher
1d70: 65 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e in the column 
1d80: 6c 69 73 74 2c 20 62 75 74 20 61 74 20 6d 6f 73  list, but at mos
1d90: 74 20 6f 6e 65 20 74 6f 6b 65 6e 69 7a 65 72 20  t one tokenizer 
1da0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 0a 20  declaration is. 
1db0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 65 61 63   allowed for eac
1dc0: 68 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  h CREATE VIRTUAL
1dd0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1de0: 2e 20 5b 74 6f 6b 65 6e 69 7a 65 72 7c 53 65 65  . [tokenizer|See
1df0: 20 62 65 6c 6f 77 5d 20 66 6f 72 20 61 20 0a 20   below] for a . 
1e00: 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72 69   detailed descri
1e10: 70 74 69 6f 6e 20 6f 66 20 75 73 69 6e 67 20 28  ption of using (
1e20: 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
1e30: 79 2c 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 29  y, implementing)
1e40: 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 0a 3c   a tokenizer...<
1e50: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
1e60: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
1e70: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61   table named "pa
1e80: 70 65 72 73 22 20 77 69 74 68 20 74 77 6f 20 63  pers" with two c
1e90: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73  olumns that uses
1ea0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
1eb0: 20 74 6f 6b 65 6e 69 7a 65 72 20 22 70 6f 72 74   tokenizer "port
1ec0: 65 72 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54  er".</i>.  CREAT
1ed0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1ee0: 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73  papers USING fts
1ef0: 33 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65  3(author, docume
1f00: 6e 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  nt, tokenize=por
1f10: 74 65 72 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43  ter);..  <i>-- C
1f20: 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  reate an FTS tab
1f30: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
1f40: 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65   column - "conte
1f50: 6e 74 22 20 2d 20 74 68 61 74 20 75 73 65 73 3c  nt" - that uses<
1f60: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1f70: 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a  "simple" tokeniz
1f80: 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  er.</i>.  CREATE
1f90: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
1fa0: 61 74 61 20 55 53 49 4e 47 20 66 74 73 34 28 74  ata USING fts4(t
1fb0: 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b  okenize=simple);
1fc0: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
1fd0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69   an FTS table wi
1fe0: 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 74  th two columns t
1ff0: 68 61 74 20 75 73 65 73 20 74 68 65 20 22 69 63  hat uses the "ic
2000: 75 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f 69  u" tokenizer.</i
2010: 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 71 75  >.  <i>-- The qu
2020: 61 6c 69 66 69 65 72 20 22 65 6e 5f 41 55 22 20  alifier "en_AU" 
2030: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
2040: 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
2050: 6d 65 6e 74 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20  mentation</i>.  
2060: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2070: 41 42 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e 47  ABLE names USING
2080: 20 66 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b 65   fts3(a, b, toke
2090: 6e 69 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29 3b  nize=icu en_AU);
20a0: 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
20b0: 70 3e 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20  p>.  FTS tables 
20c0: 6d 61 79 20 62 65 20 64 72 6f 70 70 65 64 20 66  may be dropped f
20d0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20e0: 20 75 73 69 6e 67 20 61 6e 20 6f 72 64 69 6e 61   using an ordina
20f0: 72 79 20 5b 44 52 4f 50 20 54 41 42 4c 45 5d 0a  ry [DROP TABLE].
2100: 20 20 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f 72    statement. For
2110: 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65   example:..<code
2120: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
2130: 72 65 61 74 65 2c 20 74 68 65 6e 20 69 6d 6d 65  reate, then imme
2140: 64 69 61 74 65 6c 79 20 64 72 6f 70 2c 20 61 6e  diately drop, an
2150: 20 46 54 53 34 20 74 61 62 6c 65 2e 3c 2f 69 3e   FTS4 table.</i>
2160: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
2170: 4c 20 54 41 42 4c 45 20 64 61 74 61 20 55 53 49  L TABLE data USI
2180: 4e 47 20 66 74 73 34 28 29 3b 0a 20 20 44 52 4f  NG fts4();.  DRO
2190: 50 20 54 41 42 4c 45 20 64 61 74 61 3b 0a 3c 2f  P TABLE data;.</
21a0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 3e  codeblock>..<h2>
21b0: 50 6f 70 75 6c 61 74 69 6e 67 20 46 54 53 20 54  Populating FTS T
21c0: 61 62 6c 65 73 3c 2f 68 32 3e 0a 0a 20 20 3c 70  ables</h2>..  <p
21d0: 3e 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65 73  >.    FTS tables
21e0: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 75   are populated u
21f0: 73 69 6e 67 20 5b 49 4e 53 45 52 54 5d 2c 20 5b  sing [INSERT], [
2200: 55 50 44 41 54 45 5d 20 61 6e 64 20 5b 44 45 4c  UPDATE] and [DEL
2210: 45 54 45 5d 0a 20 20 20 20 73 74 61 74 65 6d 65  ETE].    stateme
2220: 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  nts in the same 
2230: 77 61 79 20 61 73 20 6f 72 64 69 6e 61 72 79 20  way as ordinary 
2240: 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20 61 72  SQLite tables ar
2250: 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 41 73  e...  <p>.    As
2260: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 63 6f 6c   well as the col
2270: 75 6d 6e 73 20 6e 61 6d 65 64 20 62 79 20 74 68  umns named by th
2280: 65 20 75 73 65 72 20 28 6f 72 20 74 68 65 20 22  e user (or the "
2290: 63 6f 6e 74 65 6e 74 22 20 63 6f 6c 75 6d 6e 20  content" column 
22a0: 69 66 20 6e 6f 0a 20 20 20 20 6d 6f 64 75 6c 65  if no.    module
22b0: 20 61 72 67 75 6d 65 6e 74 73 20 77 65 72 65 20   arguments were 
22c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
22d0: 74 20 6f 66 20 74 68 65 20 5b 43 52 45 41 54 45  t of the [CREATE
22e0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 5d 20   VIRTUAL TABLE] 
22f0: 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74 29 2c  .    statement),
2300: 20 65 61 63 68 20 46 54 53 20 74 61 62 6c 65 20   each FTS table 
2310: 68 61 73 20 61 20 22 72 6f 77 69 64 22 20 63 6f  has a "rowid" co
2320: 6c 75 6d 6e 2e 20 54 68 65 20 72 6f 77 69 64 20  lumn. The rowid 
2330: 6f 66 20 61 6e 20 46 54 53 0a 20 20 20 20 74 61  of an FTS.    ta
2340: 62 6c 65 20 62 65 68 61 76 65 73 20 69 6e 20 74  ble behaves in t
2350: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74  he same way as t
2360: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
2370: 6f 66 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 53  of an ordinary S
2380: 51 4c 69 74 65 20 0a 20 20 20 20 74 61 62 6c 65  QLite .    table
2390: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
23a0: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
23b0: 69 6e 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  in the rowid col
23c0: 75 6d 6e 20 6f 66 20 61 6e 20 46 54 53 20 74 61  umn of an FTS ta
23d0: 62 6c 65 20 0a 20 20 20 20 72 65 6d 61 69 6e 20  ble .    remain 
23e0: 75 6e 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  unchanged if the
23f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 62   database is reb
2400: 75 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20 5b  uilt using the [
2410: 56 41 43 55 55 4d 5d 20 63 6f 6d 6d 61 6e 64 2e  VACUUM] command.
2420: 20 0a 20 20 20 20 46 6f 72 20 46 54 53 20 74 61   .    For FTS ta
2430: 62 6c 65 73 2c 20 22 64 6f 63 69 64 22 20 69 73  bles, "docid" is
2440: 20 61 6c 6c 6f 77 65 64 20 61 73 20 61 6e 20 61   allowed as an a
2450: 6c 69 61 73 20 61 6c 6f 6e 67 20 77 69 74 68 20  lias along with 
2460: 74 68 65 20 75 73 75 61 6c 20 22 72 6f 77 69 64  the usual "rowid
2470: 22 2c 0a 20 20 20 20 22 6f 69 64 22 20 61 6e 64  ",.    "oid" and
2480: 20 22 5f 6f 69 64 5f 22 20 69 64 65 6e 74 69 66   "_oid_" identif
2490: 69 65 72 73 2e 20 41 74 74 65 6d 70 74 69 6e 67  iers. Attempting
24a0: 20 74 6f 20 69 6e 73 65 72 74 20 6f 72 20 75 70   to insert or up
24b0: 64 61 74 65 20 61 20 72 6f 77 20 77 69 74 68 20  date a row with 
24c0: 61 20 0a 20 20 20 20 64 6f 63 69 64 20 76 61 6c  a .    docid val
24d0: 75 65 20 74 68 61 74 20 61 6c 72 65 61 64 79 20  ue that already 
24e0: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 74 61  exists in the ta
24f0: 62 6c 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2c  ble is an error,
2500: 20 6a 75 73 74 20 61 73 20 69 74 20 77 6f 75 6c   just as it woul
2510: 64 20 0a 20 20 20 20 62 65 20 77 69 74 68 20 61  d .    be with a
2520: 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74  n ordinary SQLit
2530: 65 20 74 61 62 6c 65 2e 0a 0a 20 20 3c 70 3e 0a  e table...  <p>.
2540: 20 20 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65      There is one
2550: 20 6f 74 68 65 72 20 73 75 62 74 6c 65 20 64 69   other subtle di
2560: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2570: 20 22 64 6f 63 69 64 22 20 61 6e 64 20 74 68 65   "docid" and the
2580: 20 6e 6f 72 6d 61 6c 20 53 51 4c 69 74 65 0a 20   normal SQLite. 
2590: 20 20 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74     aliases for t
25a0: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  he rowid column.
25b0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
25c0: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
25d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 0a 20 20 20  E statement .   
25e0: 20 61 73 73 69 67 6e 73 20 64 69 73 63 72 65 74   assigns discret
25f0: 65 20 76 61 6c 75 65 73 20 74 6f 20 74 77 6f 20  e values to two 
2600: 6f 72 20 6d 6f 72 65 20 61 6c 69 61 73 65 73 20  or more aliases 
2610: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  of the rowid col
2620: 75 6d 6e 2c 20 53 51 4c 69 74 65 20 0a 20 20 20  umn, SQLite .   
2630: 20 77 72 69 74 65 73 20 74 68 65 20 72 69 67 68   writes the righ
2640: 74 6d 6f 73 74 20 6f 66 20 73 75 63 68 20 76 61  tmost of such va
2650: 6c 75 65 73 20 73 70 65 63 69 66 69 65 64 20 69  lues specified i
2660: 6e 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20  n the INSERT or 
2670: 55 50 44 41 54 45 0a 20 20 20 20 73 74 61 74 65  UPDATE.    state
2680: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61  ment to the data
2690: 62 61 73 65 2e 20 48 6f 77 65 76 65 72 2c 20 61  base. However, a
26a0: 73 73 69 67 6e 69 6e 67 20 61 20 6e 6f 6e 2d 4e  ssigning a non-N
26b0: 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 6f 74  ULL value to bot
26c0: 68 0a 20 20 20 20 74 68 65 20 22 64 6f 63 69 64  h.    the "docid
26d0: 22 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  " and one or mor
26e0: 65 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  e of the SQLite 
26f0: 72 6f 77 69 64 20 61 6c 69 61 73 65 73 20 77 68  rowid aliases wh
2700: 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 0a  en inserting or.
2710: 20 20 20 20 75 70 64 61 74 69 6e 67 20 61 6e 20      updating an 
2720: 46 54 53 20 74 61 62 6c 65 20 69 73 20 63 6f 6e  FTS table is con
2730: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
2740: 2e 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20  . See below for 
2750: 61 6e 20 65 78 61 6d 70 6c 65 2e 0a 0a 3c 63 6f  an example...<co
2760: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
2770: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 20 74   Create an FTS t
2780: 61 62 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54  able</i>.  CREAT
2790: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
27a0: 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 34  pages USING fts4
27b0: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a  (title, body);..
27c0: 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61    <i>-- Insert a
27d0: 20 72 6f 77 20 77 69 74 68 20 61 20 73 70 65 63   row with a spec
27e0: 69 66 69 63 20 64 6f 63 69 64 20 76 61 6c 75 65  ific docid value
27f0: 2e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49  .</i>.  INSERT I
2800: 4e 54 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c  NTO pages(docid,
2810: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
2820: 4c 55 45 53 28 35 33 2c 20 27 48 6f 6d 65 20 50  LUES(53, 'Home P
2830: 61 67 65 27 2c 20 27 53 51 4c 69 74 65 20 69 73  age', 'SQLite is
2840: 20 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27 29   a software...')
2850: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72  ;..  <i>-- Inser
2860: 74 20 61 20 72 6f 77 20 61 6e 64 20 61 6c 6c 6f  t a row and allo
2870: 77 20 46 54 53 20 74 6f 20 61 73 73 69 67 6e 20  w FTS to assign 
2880: 61 20 64 6f 63 69 64 20 76 61 6c 75 65 20 75 73  a docid value us
2890: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61 6c 67  ing the same alg
28a0: 6f 72 69 74 68 6d 20 61 73 3c 2f 69 3e 0a 20 20  orithm as</i>.  
28b0: 3c 69 3e 2d 2d 20 53 51 4c 69 74 65 20 75 73 65  <i>-- SQLite use
28c0: 73 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  s for ordinary t
28d0: 61 62 6c 65 73 2e 20 49 6e 20 74 68 69 73 20 63  ables. In this c
28e0: 61 73 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69  ase the new doci
28f0: 64 20 77 69 6c 6c 20 62 65 20 35 34 2c 3c 2f 69  d will be 54,</i
2900: 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 67 72  >.  <i>-- one gr
2910: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
2920: 61 72 67 65 73 74 20 64 6f 63 69 64 20 63 75 72  argest docid cur
2930: 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69  rently present i
2940: 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e  n the table.</i>
2950: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
2960: 61 67 65 73 28 74 69 74 6c 65 2c 20 62 6f 64 79  ages(title, body
2970: 29 20 56 41 4c 55 45 53 28 27 44 6f 77 6e 6c 6f  ) VALUES('Downlo
2980: 61 64 27 2c 20 27 41 6c 6c 20 53 51 4c 69 74 65  ad', 'All SQLite
2990: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e 27   source code...'
29a0: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 68 61 6e  );..  <i>-- Chan
29b0: 67 65 20 74 68 65 20 74 69 74 6c 65 20 6f 66 20  ge the title of 
29c0: 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  the row just ins
29d0: 65 72 74 65 64 2e 3c 2f 69 3e 0a 20 20 55 50 44  erted.</i>.  UPD
29e0: 41 54 45 20 70 61 67 65 73 20 53 45 54 20 74 69  ATE pages SET ti
29f0: 74 6c 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64 20  tle = 'Download 
2a00: 53 51 4c 69 74 65 27 20 57 48 45 52 45 20 72 6f  SQLite' WHERE ro
2a10: 77 69 64 20 3d 20 35 34 3b 0a 0a 20 20 3c 69 3e  wid = 54;..  <i>
2a20: 2d 2d 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  -- Delete the en
2a30: 74 69 72 65 20 74 61 62 6c 65 20 63 6f 6e 74 65  tire table conte
2a40: 6e 74 73 2e 3c 2f 69 3e 0a 20 20 44 45 4c 45 54  nts.</i>.  DELET
2a50: 45 20 46 52 4f 4d 20 70 61 67 65 73 3b 0a 0a 20  E FROM pages;.. 
2a60: 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
2a70: 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
2a80: 2e 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  . It is not poss
2a90: 69 62 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 6e  ible to assign n
2aa0: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 74  on-NULL values t
2ab0: 6f 20 62 6f 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e  o both</i>.  <i>
2ac0: 2d 2d 20 74 68 65 20 72 6f 77 69 64 20 61 6e 64  -- the rowid and
2ad0: 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 73 20 6f   docid columns o
2ae0: 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 3c  f an FTS table.<
2af0: 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  /i>.  INSERT INT
2b00: 4f 20 70 61 67 65 73 28 72 6f 77 69 64 2c 20 64  O pages(rowid, d
2b10: 6f 63 69 64 2c 20 74 69 74 6c 65 2c 20 62 6f 64  ocid, title, bod
2b20: 79 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  y) VALUES(1, 2, 
2b30: 27 41 20 74 69 74 6c 65 27 2c 20 27 41 20 64 6f  'A title', 'A do
2b40: 63 75 6d 65 6e 74 20 62 6f 64 79 27 29 3b 0a 3c  cument body');.<
2b50: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c  /codeblock>..  <
2b60: 70 3e 0a 20 20 20 20 54 6f 20 73 75 70 70 6f 72  p>.    To suppor
2b70: 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  t full-text quer
2b80: 69 65 73 2c 20 46 54 53 20 6d 61 69 6e 74 61 69  ies, FTS maintai
2b90: 6e 73 20 61 6e 20 69 6e 76 65 72 74 65 64 20 69  ns an inverted i
2ba0: 6e 64 65 78 20 74 68 61 74 20 6d 61 70 73 0a 20  ndex that maps. 
2bb0: 20 20 20 66 72 6f 6d 20 65 61 63 68 20 75 6e 69     from each uni
2bc0: 71 75 65 20 74 65 72 6d 20 6f 72 20 77 6f 72 64  que term or word
2bd0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
2be0: 20 74 68 65 20 64 61 74 61 73 65 74 20 74 6f 20   the dataset to 
2bf0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 0a 20 20  the locations.  
2c00: 20 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 70    in which it ap
2c10: 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
2c20: 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
2c30: 20 46 6f 72 20 74 68 65 20 63 75 72 69 6f 75 73   For the curious
2c40: 2c 20 61 20 0a 20 20 20 20 63 6f 6d 70 6c 65 74  , a .    complet
2c50: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
2c60: 20 74 68 65 20 5b 73 65 67 6d 65 6e 74 20 62 74   the [segment bt
2c70: 72 65 65 7c 64 61 74 61 20 73 74 72 75 63 74 75  ree|data structu
2c80: 72 65 5d 20 75 73 65 64 20 74 6f 20 73 74 6f 72  re] used to stor
2c90: 65 0a 20 20 20 20 74 68 69 73 20 69 6e 64 65 78  e.    this index
2ca0: 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
2cb0: 62 61 73 65 20 66 69 6c 65 20 61 70 70 65 61 72  base file appear
2cc0: 73 20 62 65 6c 6f 77 2e 20 41 20 66 65 61 74 75  s below. A featu
2cd0: 72 65 20 6f 66 0a 20 20 20 20 74 68 69 73 20 64  re of.    this d
2ce0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
2cf0: 20 74 68 61 74 20 61 74 20 61 6e 79 20 74 69 6d   that at any tim
2d00: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
2d10: 61 79 20 63 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20  ay contain not. 
2d20: 20 20 20 6f 6e 65 20 69 6e 64 65 78 20 62 2d 74     one index b-t
2d30: 72 65 65 2c 20 62 75 74 20 73 65 76 65 72 61 6c  ree, but several
2d40: 20 64 69 66 66 65 72 65 6e 74 20 62 2d 74 72 65   different b-tre
2d50: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 63 72  es that are incr
2d60: 65 6d 65 6e 74 61 6c 6c 79 0a 20 20 20 20 6d 65  ementally.    me
2d70: 72 67 65 64 20 61 73 20 72 6f 77 73 20 61 72 65  rged as rows are
2d80: 20 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74   inserted, updat
2d90: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
2da0: 54 68 69 73 20 74 65 63 68 6e 69 71 75 65 20 69  This technique i
2db0: 6d 70 72 6f 76 65 73 20 0a 20 20 20 20 70 65 72  mproves .    per
2dc0: 66 6f 72 6d 61 6e 63 65 20 77 68 65 6e 20 77 72  formance when wr
2dd0: 69 74 69 6e 67 20 74 6f 20 61 6e 20 46 54 53 20  iting to an FTS 
2de0: 74 61 62 6c 65 2c 20 62 75 74 20 63 61 75 73 65  table, but cause
2df0: 73 20 73 6f 6d 65 20 6f 76 65 72 68 65 61 64 20  s some overhead 
2e00: 66 6f 72 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78  for.    full-tex
2e10: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 20 75  t queries that u
2e20: 73 65 20 74 68 65 20 69 6e 64 65 78 2e 20 45 78  se the index. Ex
2e30: 65 63 75 74 69 6e 67 20 61 6e 20 53 51 4c 20 73  ecuting an SQL s
2e40: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a  tatement of the.
2e50: 20 20 20 20 66 6f 72 6d 20 22 49 4e 53 45 52 54      form "INSERT
2e60: 20 49 4e 54 4f 20 26 6c 74 3b 66 74 73 2d 74 61   INTO &lt;fts-ta
2e70: 62 6c 65 26 67 74 3b 28 26 6c 74 3b 66 74 73 2d  ble&gt;(&lt;fts-
2e80: 74 61 62 6c 65 26 67 74 3b 29 20 56 41 4c 55 45  table&gt;) VALUE
2e90: 53 28 27 6f 70 74 69 6d 69 7a 65 27 29 22 0a 20  S('optimize')". 
2ea0: 20 20 20 63 61 75 73 65 73 20 46 54 53 20 74 6f     causes FTS to
2eb0: 20 6d 65 72 67 65 20 61 6c 6c 20 65 78 69 73 74   merge all exist
2ec0: 69 6e 67 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ing index b-tree
2ed0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2ee0: 6c 61 72 67 65 0a 20 20 20 20 62 2d 74 72 65 65  large.    b-tree
2ef0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2f00: 65 6e 74 69 72 65 20 69 6e 64 65 78 2e 20 54 68  entire index. Th
2f10: 69 73 20 63 61 6e 20 62 65 20 61 6e 20 65 78 70  is can be an exp
2f20: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
2f30: 2c 0a 20 20 20 20 62 75 74 20 6d 61 79 20 73 70  ,.    but may sp
2f40: 65 65 64 20 75 70 20 66 75 74 75 72 65 20 71 75  eed up future qu
2f50: 65 72 69 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20  eries. ..  <p>. 
2f60: 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
2f70: 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
2f80: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
2f90: 66 6f 72 20 61 6e 20 46 54 53 20 74 61 62 6c 65  for an FTS table
2fa0: 20 6e 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73   named.    "docs
2fb0: 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ":..<codeblock>.
2fc0: 20 20 3c 69 3e 2d 2d 20 4f 70 74 69 6d 69 7a 65    <i>-- Optimize
2fd0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
2fe0: 72 75 63 74 75 72 65 20 6f 66 20 46 54 53 20 74  ructure of FTS t
2ff0: 61 62 6c 65 20 22 64 6f 63 73 22 2e 3c 2f 69 3e  able "docs".</i>
3000: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
3010: 6f 63 73 28 64 6f 63 73 29 20 56 41 4c 55 45 53  ocs(docs) VALUES
3020: 28 27 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 3c 2f  ('optimize');.</
3030: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70  codeblock>..  <p
3040: 3e 0a 20 20 20 20 54 68 65 20 73 74 61 74 65 6d  >.    The statem
3050: 65 6e 74 20 61 62 6f 76 65 20 6d 61 79 20 61 70  ent above may ap
3060: 70 65 61 72 20 73 79 6e 74 61 63 74 69 63 61 6c  pear syntactical
3070: 6c 79 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20  ly incorrect to 
3080: 73 6f 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20  some. Refer to. 
3090: 20 20 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64     the section d
30a0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 5b 73  escribing the [s
30b0: 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65  imple fts querie
30c0: 73 5d 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  s] for an explan
30d0: 61 74 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20  ation...  <p>.  
30e0: 20 20 54 68 65 72 65 20 69 73 20 61 6e 6f 74 68    There is anoth
30f0: 65 72 2c 20 64 65 70 72 65 63 61 74 65 64 2c 20  er, deprecated, 
3100: 6d 65 74 68 6f 64 20 66 6f 72 20 69 6e 76 6f 6b  method for invok
3110: 69 6e 67 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  ing the optimize
3120: 20 0a 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20   .    operation 
3130: 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  using a SELECT s
3140: 74 61 74 65 6d 65 6e 74 2e 20 4e 65 77 20 63 6f  tatement. New co
3150: 64 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 74  de should use st
3160: 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 73 69 6d  atements.    sim
3170: 69 6c 61 72 20 74 6f 20 74 68 65 20 49 4e 53 45  ilar to the INSE
3180: 52 54 20 61 62 6f 76 65 20 74 6f 20 6f 70 74 69  RT above to opti
3190: 6d 69 7a 65 20 46 54 53 20 73 74 72 75 63 74 75  mize FTS structu
31a0: 72 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22  res...<h2 tags="
31b0: 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69  simple fts queri
31c0: 65 73 22 3e 53 69 6d 70 6c 65 20 46 54 53 20 51  es">Simple FTS Q
31d0: 75 65 72 69 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  ueries</h2>..<p>
31e0: 0a 20 20 41 73 20 66 6f 72 20 61 6c 6c 20 6f 74  .  As for all ot
31f0: 68 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65  her SQLite table
3200: 73 2c 20 76 69 72 74 75 61 6c 20 6f 72 20 6f 74  s, virtual or ot
3210: 68 65 72 77 69 73 65 2c 20 64 61 74 61 20 69 73  herwise, data is
3220: 20 72 65 74 72 69 65 76 65 64 0a 20 20 66 72 6f   retrieved.  fro
3230: 6d 20 46 54 53 20 74 61 62 6c 65 73 20 75 73 69  m FTS tables usi
3240: 6e 67 20 61 20 5b 53 45 4c 45 43 54 5d 20 73 74  ng a [SELECT] st
3250: 61 74 65 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20  atement...<p>.  
3260: 46 54 53 20 74 61 62 6c 65 73 20 63 61 6e 20 62  FTS tables can b
3270: 65 20 71 75 65 72 69 65 64 20 65 66 66 69 63 69  e queried effici
3280: 65 6e 74 6c 79 20 75 73 69 6e 67 20 53 45 4c 45  ently using SELE
3290: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  CT statements of
32a0: 20 74 77 6f 0a 20 20 64 69 66 66 65 72 65 6e 74   two.  different
32b0: 20 66 6f 72 6d 73 3a 0a 0a 3c 75 6c 3e 0a 20 20   forms:..<ul>.  
32c0: 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 51  <li><p>.    <b>Q
32d0: 75 65 72 79 20 62 79 20 72 6f 77 69 64 3c 2f 62  uery by rowid</b
32e0: 3e 2e 20 49 66 20 74 68 65 20 57 48 45 52 45 20  >. If the WHERE 
32f0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
3300: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
3310: 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 75     contains a su
3320: 62 2d 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  b-clause of the 
3330: 66 6f 72 6d 20 22 72 6f 77 69 64 20 3d 20 3f 22  form "rowid = ?"
3340: 2c 20 77 68 65 72 65 20 3f 20 69 73 20 61 6e 20  , where ? is an 
3350: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a  SQL expression,.
3360: 20 20 20 20 46 54 53 20 69 73 20 61 62 6c 65 20      FTS is able 
3370: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
3380: 72 65 71 75 65 73 74 65 64 20 72 6f 77 20 64 69  requested row di
3390: 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74 68 65  rectly using the
33a0: 20 65 71 75 69 76 61 6c 65 6e 74 20 0a 20 20 20   equivalent .   
33b0: 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 5b 49   of an SQLite [I
33c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
33d0: 45 59 5d 20 69 6e 64 65 78 2e 0a 0a 20 20 3c 6c  EY] index...  <l
33e0: 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 46 75 6c  i><p>.    <b>Ful
33f0: 6c 2d 74 65 78 74 20 71 75 65 72 79 3c 2f 62 3e  l-text query</b>
3400: 2e 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  . If the WHERE c
3410: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
3420: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
3430: 6e 74 61 69 6e 73 0a 20 20 20 20 61 20 73 75 62  ntains.    a sub
3440: 2d 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66  -clause of the f
3450: 6f 72 6d 20 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26  orm "&lt;column&
3460: 67 74 3b 20 4d 41 54 43 48 20 3f 22 2c 20 46 54  gt; MATCH ?", FT
3470: 53 20 69 73 20 61 62 6c 65 20 74 6f 20 75 73 65  S is able to use
3480: 20 0a 20 20 20 20 74 68 65 20 62 75 69 6c 74 2d   .    the built-
3490: 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  in full-text ind
34a0: 65 78 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ex to restrict t
34b0: 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 6f  he search to tho
34c0: 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20  se documents .  
34d0: 20 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65    that match the
34e0: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
34f0: 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 69 65   string specifie
3500: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68  d as the right-h
3510: 61 6e 64 20 6f 70 65 72 61 6e 64 0a 20 20 20 20  and operand.    
3520: 6f 66 20 74 68 65 20 4d 41 54 43 48 20 63 6c 61  of the MATCH cla
3530: 75 73 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a  use..</ul>..<p>.
3540: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20    If neither of 
3550: 74 68 65 73 65 20 74 77 6f 20 71 75 65 72 79 20  these two query 
3560: 73 74 72 61 74 65 67 69 65 73 20 63 61 6e 20 62  strategies can b
3570: 65 20 75 73 65 64 2c 20 61 6c 6c 0a 20 20 71 75  e used, all.  qu
3580: 65 72 69 65 73 20 6f 6e 20 46 54 53 20 74 61 62  eries on FTS tab
3590: 6c 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  les are implemen
35a0: 74 65 64 20 75 73 69 6e 67 20 61 20 6c 69 6e 65  ted using a line
35b0: 61 72 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65  ar scan of the e
35c0: 6e 74 69 72 65 0a 20 20 74 61 62 6c 65 2e 20 49  ntire.  table. I
35d0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  f the table cont
35e0: 61 69 6e 73 20 6c 61 72 67 65 20 61 6d 6f 75 6e  ains large amoun
35f0: 74 73 20 6f 66 20 64 61 74 61 2c 20 74 68 69 73  ts of data, this
3600: 20 6d 61 79 20 62 65 20 61 6e 20 0a 20 20 69 6d   may be an .  im
3610: 70 72 61 63 74 69 63 61 6c 20 61 70 70 72 6f 61  practical approa
3620: 63 68 20 28 74 68 65 20 66 69 72 73 74 20 65 78  ch (the first ex
3630: 61 6d 70 6c 65 20 6f 6e 20 74 68 69 73 20 70 61  ample on this pa
3640: 67 65 20 73 68 6f 77 73 20 74 68 61 74 20 61 20  ge shows that a 
3650: 6c 69 6e 65 61 72 0a 20 20 73 63 61 6e 20 6f 66  linear.  scan of
3660: 20 31 2e 35 20 47 42 20 6f 66 20 64 61 74 61 20   1.5 GB of data 
3670: 74 61 6b 65 73 20 61 72 6f 75 6e 64 20 33 30 20  takes around 30 
3680: 73 65 63 6f 6e 64 73 20 75 73 69 6e 67 20 61 20  seconds using a 
3690: 6d 6f 64 65 72 6e 20 50 43 29 2e 0a 0a 3c 63 6f  modern PC)...<co
36a0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
36b0: 20 54 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e   The examples in
36c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 73 73 75   this block assu
36d0: 6d 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  me the following
36e0: 20 46 54 53 20 74 61 62 6c 65 3a 3c 2f 69 3e 0a   FTS table:</i>.
36f0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
3700: 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e   TABLE mail USIN
3710: 47 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20  G fts3(subject, 
3720: 62 6f 64 79 29 3b 0a 0a 20 20 53 45 4c 45 43 54  body);..  SELECT
3730: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
3740: 52 45 20 72 6f 77 69 64 20 3d 20 31 35 3b 20 20  RE rowid = 15;  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
3760: 3e 2d 2d 20 46 61 73 74 2e 20 52 6f 77 69 64 20  >-- Fast. Rowid 
3770: 6c 6f 6f 6b 75 70 2e 3c 2f 69 3e 0a 20 20 53 45  lookup.</i>.  SE
3780: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
3790: 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43   WHERE body MATC
37a0: 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20  H 'sqlite';     
37b0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
37c0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
37d0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
37e0: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
37f0: 69 6c 20 4d 41 54 43 48 20 27 73 65 61 72 63 68  il MATCH 'search
3800: 27 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46  ';       <i>-- F
3810: 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71  ast. Full-text q
3820: 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  uery.</i>.  SELE
3830: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
3840: 48 45 52 45 20 72 6f 77 69 64 20 42 45 54 57 45  HERE rowid BETWE
3850: 45 4e 20 31 35 20 41 4e 44 20 32 30 3b 20 20 20  EN 15 AND 20;   
3860: 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65  <i>-- Slow. Line
3870: 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53  ar scan.</i>.  S
3880: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
3890: 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20  l WHERE subject 
38a0: 3d 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 20  = 'database';   
38b0: 20 20 20 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c     <i>-- Slow. L
38c0: 69 6e 65 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a  inear scan.</i>.
38d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
38e0: 6d 61 69 6c 20 57 48 45 52 45 20 73 75 62 6a 65  mail WHERE subje
38f0: 63 74 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  ct MATCH 'databa
3900: 73 65 27 3b 20 20 3c 69 3e 2d 2d 20 46 61 73 74  se';  <i>-- Fast
3910: 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  . Full-text quer
3920: 79 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f  y.</i>.</codeblo
3930: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c  ck>..<p>.  In al
3940: 6c 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65  l of the full-te
3950: 78 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65  xt queries above
3960: 2c 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  , the right-hand
3970: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
3980: 4d 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72  MATCH.  operator
3990: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   is a string con
39a0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
39b0: 67 6c 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69  gle term. In thi
39c0: 73 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43  s case, the MATC
39d0: 48 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65  H.  expression e
39e0: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
39f0: 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e   for all documen
3a00: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
3a10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69  one or more .  i
3a20: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
3a30: 73 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28  specified word (
3a40: 22 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63  "sqlite", "searc
3a50: 68 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22  h" or "database"
3a60: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f  , depending .  o
3a70: 6e 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20  n which example 
3a80: 79 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70  you look at). Sp
3a90: 65 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c  ecifying a singl
3aa0: 65 20 74 65 72 6d 20 61 73 20 74 68 65 20 72 69  e term as the ri
3ab0: 67 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61  ght-hand.  opera
3ac0: 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  nd of the MATCH 
3ad0: 6f 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73  operator results
3ae0: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74   in the simplest
3af0: 20 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   and most common
3b00: 20 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c 6c   type .  of full
3b10: 2d 74 65 78 74 20 71 75 65 72 79 20 70 6f 73 73  -text query poss
3b20: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d 6f  ible. However mo
3b30: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 71  re complicated q
3b40: 75 65 72 69 65 73 20 61 72 65 20 70 6f 73 73 69  ueries are possi
3b50: 62 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e 67  ble,.  including
3b60: 20 70 68 72 61 73 65 20 73 65 61 72 63 68 65 73   phrase searches
3b70: 2c 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73 65  , term-prefix se
3b80: 61 72 63 68 65 73 20 61 6e 64 20 73 65 61 72 63  arches and searc
3b90: 68 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74  hes for document
3ba0: 73 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s .  containing 
3bb0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
3bc0: 74 65 72 6d 73 20 6f 63 63 75 72 69 6e 67 20 77  terms occuring w
3bd0: 69 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64 20  ithin a defined 
3be0: 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63  proximity of eac
3bf0: 68 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20 76  h.  other. The v
3c00: 61 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20 77  arious ways in w
3c10: 68 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65  hich the full-te
3c20: 78 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65 20  xt index may be 
3c30: 71 75 65 72 69 65 64 20 61 72 65 0a 20 20 5b 46  queried are.  [F
3c40: 54 53 20 4d 41 54 43 48 7c 64 65 73 63 72 69 62  TS MATCH|describ
3c50: 65 64 20 62 65 6c 6f 77 5d 2e 0a 0a 3c 70 3e 0a  ed below]...<p>.
3c60: 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 66 75 6c 6c    Normally, full
3c70: 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 61 72  -text queries ar
3c80: 65 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  e case-insensiti
3c90: 76 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69  ve. However, thi
3ca0: 73 20 69 73 0a 20 20 69 73 20 64 65 70 65 6e 64  s is.  is depend
3cb0: 65 6e 74 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ent on the speci
3cc0: 66 69 63 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 20  fic [tokenizer] 
3cd0: 75 73 65 64 20 62 79 20 74 68 65 20 46 54 53 20  used by the FTS 
3ce0: 74 61 62 6c 65 0a 20 20 62 65 69 6e 67 20 71 75  table.  being qu
3cf0: 65 72 69 65 64 2e 20 52 65 66 65 72 20 74 6f 20  eried. Refer to 
3d00: 74 68 65 20 73 65 63 74 69 6f 6e 20 6f 6e 20 5b  the section on [
3d10: 74 6f 6b 65 6e 69 7a 65 72 7c 74 6f 6b 65 6e 69  tokenizer|tokeni
3d20: 7a 65 72 73 5d 20 66 6f 72 20 64 65 74 61 69 6c  zers] for detail
3d30: 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 70 61  s...<p>.  The pa
3d40: 72 61 67 72 61 70 68 20 61 62 6f 76 65 20 6e 6f  ragraph above no
3d50: 74 65 73 20 74 68 61 74 20 61 20 4d 41 54 43 48  tes that a MATCH
3d60: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
3d70: 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 61 73 20   simple term as 
3d80: 74 68 65 0a 20 20 72 69 67 68 74 2d 68 61 6e 64  the.  right-hand
3d90: 20 6f 70 65 72 61 6e 64 20 65 76 61 6c 75 61 74   operand evaluat
3da0: 65 73 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  es to true for a
3db0: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
3dc0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 20 20  t contain the.  
3dd0: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20  specified term. 
3de0: 49 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 2c  In this context,
3df0: 20 74 68 65 20 22 64 6f 63 75 6d 65 6e 74 22 20   the "document" 
3e00: 6d 61 79 20 72 65 66 65 72 20 74 6f 20 65 69 74  may refer to eit
3e10: 68 65 72 20 74 68 65 20 0a 20 20 64 61 74 61 20  her the .  data 
3e20: 73 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67  stored in a sing
3e30: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 72  le column of a r
3e40: 6f 77 20 6f 66 20 61 6e 20 46 54 53 20 74 61 62  ow of an FTS tab
3e50: 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 20 63 6f  le, or to the co
3e60: 6e 74 65 6e 74 73 0a 20 20 6f 66 20 61 6c 6c 20  ntents.  of all 
3e70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 73 69 6e  columns in a sin
3e80: 67 6c 65 20 72 6f 77 2c 20 64 65 70 65 6e 64 69  gle row, dependi
3e90: 6e 67 20 6f 6e 20 74 68 65 20 69 64 65 6e 74 69  ng on the identi
3ea0: 66 69 65 72 20 75 73 65 64 20 61 73 20 74 68 65  fier used as the
3eb0: 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65  .  left-hand ope
3ec0: 72 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43  rand to the MATC
3ed0: 48 20 6f 70 65 72 61 74 6f 72 2e 20 49 66 20 74  H operator. If t
3ee0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 73 70  he identifier sp
3ef0: 65 63 69 66 69 65 64 20 61 73 0a 20 20 74 68 65  ecified as.  the
3f00: 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61   left-hand opera
3f10: 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  nd of the MATCH 
3f20: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 6e 20 46  operator is an F
3f30: 54 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  TS table column 
3f40: 6e 61 6d 65 2c 0a 20 20 74 68 65 6e 20 74 68 65  name,.  then the
3f50: 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 74   document that t
3f60: 68 65 20 73 65 61 72 63 68 20 74 65 72 6d 20 6d  he search term m
3f70: 75 73 74 20 62 65 20 63 6f 6e 74 61 69 6e 65 64  ust be contained
3f80: 20 69 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65   in is the value
3f90: 0a 20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  .  stored in the
3fa0: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
3fb0: 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  n. However, if t
3fc0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73  he identifier is
3fd0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74   the name.  of t
3fe0: 68 65 20 46 54 53 20 3c 69 3e 74 61 62 6c 65 3c  he FTS <i>table<
3ff0: 2f 69 3e 20 69 74 73 65 6c 66 2c 20 74 68 65 6e  /i> itself, then
4000: 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61   the MATCH opera
4010: 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f  tor evaluates to
4020: 20 74 72 75 65 0a 20 20 66 6f 72 20 65 61 63 68   true.  for each
4030: 20 72 6f 77 20 6f 66 20 74 68 65 20 46 54 53 20   row of the FTS 
4040: 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20  table for which 
4050: 61 6e 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  any column conta
4060: 69 6e 73 20 74 68 65 20 73 65 61 72 63 68 20 0a  ins the search .
4070: 20 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c    term. The foll
4080: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 64 65  owing example de
4090: 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 69 73 3a  monstrates this:
40a0: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
40b0: 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73 63  <i>-- Example sc
40c0: 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54  hema</i>.  CREAT
40d0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
40e0: 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28  mail USING fts3(
40f0: 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a  subject, body);.
4100: 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65  .  <i>-- Example
4110: 20 74 61 62 6c 65 20 70 6f 70 75 6c 61 74 69 6f   table populatio
4120: 6e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49  n</i>.  INSERT I
4130: 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20  NTO mail(docid, 
4140: 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56  subject, body) V
4150: 41 4c 55 45 53 28 31 2c 20 27 73 6f 66 74 77 61  ALUES(1, 'softwa
4160: 72 65 20 66 65 65 64 62 61 63 6b 27 2c 20 27 66  re feedback', 'f
4170: 6f 75 6e 64 20 69 74 20 74 6f 6f 20 73 6c 6f 77  ound it too slow
4180: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
4190: 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75  O mail(docid, su
41a0: 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c  bject, body) VAL
41b0: 55 45 53 28 32 2c 20 27 73 6f 66 74 77 61 72 65  UES(2, 'software
41c0: 20 66 65 65 64 62 61 63 6b 27 2c 20 27 6e 6f 20   feedback', 'no 
41d0: 66 65 65 64 62 61 63 6b 27 29 3b 0a 20 20 49 4e  feedback');.  IN
41e0: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64  SERT INTO mail(d
41f0: 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20 62  ocid, subject, b
4200: 6f 64 79 29 20 56 41 4c 55 45 53 28 33 2c 20 27  ody) VALUES(3, '
4210: 73 6c 6f 77 20 6c 75 6e 63 68 20 6f 72 64 65 72  slow lunch order
4220: 27 2c 20 20 27 77 61 73 20 61 20 73 6f 66 74 77  ',  'was a softw
4230: 61 72 65 20 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a  are problem');..
4240: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
4250: 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45  queries</i>.  SE
4260: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
4270: 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 4d   WHERE subject M
4280: 41 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b  ATCH 'software';
4290: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
42a0: 73 20 72 6f 77 73 20 31 20 61 6e 64 20 32 3c 2f  s rows 1 and 2</
42b0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
42c0: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 62 6f  OM mail WHERE bo
42d0: 64 79 20 20 20 20 4d 41 54 43 48 20 27 66 65 65  dy    MATCH 'fee
42e0: 64 62 61 63 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d  dback';    <i>--
42f0: 20 53 65 6c 65 63 74 73 20 72 6f 77 20 32 3c 2f   Selects row 2</
4300: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
4310: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
4320: 69 6c 20 20 20 20 4d 41 54 43 48 20 27 73 6f 66  il    MATCH 'sof
4330: 74 77 61 72 65 27 3b 20 20 20 20 3c 69 3e 2d 2d  tware';    <i>--
4340: 20 53 65 6c 65 63 74 73 20 72 6f 77 73 20 31 2c   Selects rows 1,
4350: 20 32 20 61 6e 64 20 33 3c 2f 69 3e 0a 20 20 53   2 and 3</i>.  S
4360: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
4370: 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20  l WHERE mail    
4380: 4d 41 54 43 48 20 27 73 6c 6f 77 27 3b 20 20 20  MATCH 'slow';   
4390: 20 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63       <i>-- Selec
43a0: 74 73 20 72 6f 77 73 20 31 20 61 6e 64 20 33 3c  ts rows 1 and 3<
43b0: 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  /i>.</codeblock>
43c0: 0a 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72  .  .<p>.  At fir
43d0: 73 74 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66  st glance, the f
43e0: 69 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65  inal two full-te
43f0: 78 74 20 71 75 65 72 69 65 73 20 69 6e 20 74 68  xt queries in th
4400: 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
4410: 73 65 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e  seem.  to be syn
4420: 74 61 63 74 69 63 61 6c 6c 79 20 69 6e 63 6f 72  tactically incor
4430: 72 65 63 74 2c 20 61 73 20 74 68 65 72 65 20 69  rect, as there i
4440: 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 28  s a table name (
4450: 22 6d 61 69 6c 22 29 20 75 73 65 64 20 61 73 0a  "mail") used as.
4460: 20 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73    an SQL express
4470: 69 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20  ion. The reason 
4480: 74 68 69 73 20 69 73 20 61 63 63 65 70 74 61 62  this is acceptab
4490: 6c 65 20 69 73 20 74 68 61 74 20 65 61 63 68 20  le is that each 
44a0: 46 54 53 20 74 61 62 6c 65 0a 20 20 61 63 74 75  FTS table.  actu
44b0: 61 6c 6c 79 20 68 61 73 20 61 20 5b 73 71 6c 69  ally has a [sqli
44c0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
44d0: 7c 48 49 44 44 45 4e 5d 20 63 6f 6c 75 6d 6e 20  |HIDDEN] column 
44e0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
44f0: 6d 65 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c  me.  as the tabl
4500: 65 20 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69  e itself (in thi
4510: 73 20 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e  s case, "mail").
4520: 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
4530: 64 20 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75  d in this.  colu
4540: 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e  mn is not meanin
4550: 67 66 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c  gful to the appl
4560: 69 63 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e  ication, but can
4570: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
4580: 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65  .  left-hand ope
4590: 72 61 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20  rand to a MATCH 
45a0: 6f 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73  operator. This s
45b0: 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61  pecial column ma
45c0: 79 20 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73  y also be.  pass
45d0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
45e0: 74 20 74 6f 20 74 68 65 20 5b 73 6e 69 70 70 65  t to the [snippe
45f0: 74 28 29 7c 46 54 53 20 61 75 78 69 6c 69 61 72  t()|FTS auxiliar
4600: 79 20 66 75 6e 63 74 69 6f 6e 73 5d 2e 0a 0a 3c  y functions]...<
4610: 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  p>.  The followi
4620: 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73  ng example illus
4630: 74 72 61 74 65 73 20 74 68 65 20 61 62 6f 76 65  trates the above
4640: 2e 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  . The expression
4650: 73 20 22 64 6f 63 73 22 2c 20 0a 20 20 22 64 6f  s "docs", .  "do
4660: 63 73 2e 64 6f 63 73 22 20 61 6e 64 20 22 6d 61  cs.docs" and "ma
4670: 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 22 20 61 6c  in.docs.docs" al
4680: 6c 20 72 65 66 65 72 20 74 6f 20 63 6f 6c 75 6d  l refer to colum
4690: 6e 20 22 64 6f 63 73 22 2e 20 48 6f 77 65 76 65  n "docs". Howeve
46a0: 72 2c 20 74 68 65 20 0a 20 20 65 78 70 72 65 73  r, the .  expres
46b0: 73 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f 63 73 22  sion "main.docs"
46c0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 66 65 72 20   does not refer 
46d0: 74 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e 2e 20 49  to any column. I
46e0: 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  t could be used 
46f0: 74 6f 20 0a 20 20 72 65 66 65 72 20 74 6f 20 61  to .  refer to a
4700: 20 74 61 62 6c 65 2c 20 62 75 74 20 61 20 74 61   table, but a ta
4710: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4720: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
4730: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 0a  ontext in which.
4740: 20 20 69 74 20 69 73 20 75 73 65 64 20 62 65 6c    it is used bel
4750: 6f 77 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ow...<codeblock>
4760: 0a 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65  .  <i>-- Example
4770: 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52   schema</i>.  CR
4780: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
4790: 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74  LE docs USING ft
47a0: 73 34 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20  s4(content);..  
47b0: 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75  <i>-- Example qu
47c0: 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45  eries</i>.  SELE
47d0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
47e0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
47f0: 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20  'sqlite';       
4800: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e         <i>-- OK.
4810: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
4820: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
4830: 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20  docs.docs MATCH 
4840: 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20  'sqlite';       
4850: 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a    <i>-- OK.</i>.
4860: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4870: 64 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e  docs WHERE main.
4880: 64 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20  docs.docs MATCH 
4890: 27 73 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e  'sqlite';    <i>
48a0: 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c  -- OK.</i>.  SEL
48b0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
48c0: 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20  WHERE main.docs 
48d0: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20  MATCH 'sqlite'; 
48e0: 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72          <i>-- Er
48f0: 72 6f 72 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62  ror.</i>.</codeb
4900: 6c 6f 63 6b 3e 0a 20 0a 3c 68 32 3e 53 75 6d 6d  lock>. .<h2>Summ
4910: 61 72 79 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ary</h2>..<p>.  
4920: 46 72 6f 6d 20 74 68 65 20 75 73 65 72 73 20 70  From the users p
4930: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 46 54  oint of view, FT
4940: 53 20 74 61 62 6c 65 73 20 61 72 65 20 73 69 6d  S tables are sim
4950: 69 6c 61 72 20 74 6f 20 6f 72 64 69 6e 61 72 79  ilar to ordinary
4960: 20 53 51 4c 69 74 65 0a 20 20 74 61 62 6c 65 73   SQLite.  tables
4970: 20 69 6e 20 6d 61 6e 79 20 77 61 79 73 2e 20 44   in many ways. D
4980: 61 74 61 20 6d 61 79 20 62 65 20 61 64 64 65 64  ata may be added
4990: 20 74 6f 2c 20 6d 6f 64 69 66 69 65 64 20 77 69   to, modified wi
49a0: 74 68 69 6e 20 61 6e 64 20 72 65 6d 6f 76 65 64  thin and removed
49b0: 20 0a 20 20 66 72 6f 6d 20 46 54 53 20 74 61 62   .  from FTS tab
49c0: 6c 65 73 20 75 73 69 6e 67 20 74 68 65 20 49 4e  les using the IN
49d0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64  SERT, UPDATE and
49e0: 20 44 45 4c 45 54 45 20 63 6f 6d 6d 61 6e 64 73   DELETE commands
49f0: 20 6a 75 73 74 20 61 73 20 0a 20 20 69 74 20 6d   just as .  it m
4a00: 61 79 20 62 65 20 77 69 74 68 20 6f 72 64 69 6e  ay be with ordin
4a10: 61 72 79 20 74 61 62 6c 65 73 2e 20 53 69 6d 69  ary tables. Simi
4a20: 6c 61 72 6c 79 2c 20 74 68 65 20 53 45 4c 45 43  larly, the SELEC
4a30: 54 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65  T command may be
4a40: 20 75 73 65 64 20 0a 20 20 74 6f 20 71 75 65 72   used .  to quer
4a50: 79 20 64 61 74 61 2e 20 54 68 65 20 66 6f 6c 6c  y data. The foll
4a60: 6f 77 69 6e 67 20 6c 69 73 74 20 73 75 6d 6d 61  owing list summa
4a70: 72 69 7a 65 73 20 74 68 65 20 64 69 66 66 65 72  rizes the differ
4a80: 65 6e 63 65 73 20 62 65 74 77 65 65 6e 20 46 54  ences between FT
4a90: 53 0a 20 20 61 6e 64 20 6f 72 64 69 6e 61 72 79  S.  and ordinary
4aa0: 20 74 61 62 6c 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20   tables:..<ol>. 
4ab0: 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 41 73   <li><p> .    As
4ac0: 20 77 69 74 68 20 61 6c 6c 20 76 69 72 74 75 61   with all virtua
4ad0: 6c 20 74 61 62 6c 65 20 74 79 70 65 73 2c 20 69  l table types, i
4ae0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
4af0: 65 20 74 6f 20 63 72 65 61 74 65 20 69 6e 64 69  e to create indi
4b00: 63 65 73 20 6f 72 0a 20 20 20 20 74 72 69 67 67  ces or.    trigg
4b10: 65 72 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  ers attached to 
4b20: 46 54 53 20 74 61 62 6c 65 73 2e 20 4e 6f 72 20  FTS tables. Nor 
4b30: 69 73 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74  is it possible t
4b40: 6f 20 75 73 65 20 74 68 65 20 41 4c 54 45 52 20  o use the ALTER 
4b50: 54 41 42 4c 45 0a 20 20 20 20 63 6f 6d 6d 61 6e  TABLE.    comman
4b60: 64 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 63  d to add extra c
4b70: 6f 6c 75 6d 6e 73 20 74 6f 20 46 54 53 20 74 61  olumns to FTS ta
4b80: 62 6c 65 73 20 28 61 6c 74 68 6f 75 67 68 20 69  bles (although i
4b90: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
4ba0: 20 75 73 65 0a 20 20 20 20 41 4c 54 45 52 20 54   use.    ALTER T
4bb0: 41 42 4c 45 20 74 6f 20 72 65 6e 61 6d 65 20 61  ABLE to rename a
4bc0: 6e 20 46 54 53 20 74 61 62 6c 65 29 2e 0a 0a 20  n FTS table)... 
4bd0: 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 44 61   <li><p> .    Da
4be0: 74 61 2d 74 79 70 65 73 20 73 70 65 63 69 66 69  ta-types specifi
4bf0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
4c00: 65 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  e "CREATE VIRTUA
4c10: 4c 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65  L TABLE" stateme
4c20: 6e 74 0a 20 20 20 20 75 73 65 64 20 74 6f 20 63  nt.    used to c
4c30: 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  reate an FTS tab
4c40: 6c 65 20 61 72 65 20 69 67 6e 6f 72 65 64 20 63  le are ignored c
4c50: 6f 6d 70 6c 65 74 65 6c 79 2e 20 49 6e 73 74 65  ompletely. Inste
4c60: 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20 6e 6f  ad of the.    no
4c70: 72 6d 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 61  rmal rules for a
4c80: 70 70 6c 79 69 6e 67 20 74 79 70 65 20 5b 61 66  pplying type [af
4c90: 66 69 6e 69 74 79 5d 20 74 6f 20 69 6e 73 65 72  finity] to inser
4ca0: 74 65 64 20 76 61 6c 75 65 73 2c 20 61 6c 6c 0a  ted values, all.
4cb0: 20 20 20 20 76 61 6c 75 65 73 20 69 6e 73 65 72      values inser
4cc0: 74 65 64 20 69 6e 74 6f 20 46 54 53 20 74 61 62  ted into FTS tab
4cd0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65  le columns (exce
4ce0: 70 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 72  pt the special r
4cf0: 6f 77 69 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29  owid.    column)
4d00: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74   are converted t
4d10: 6f 20 74 79 70 65 20 54 45 58 54 20 62 65 66 6f  o type TEXT befo
4d20: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 2e  re being stored.
4d30: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
4d40: 20 46 54 53 20 74 61 62 6c 65 73 20 70 65 72 6d   FTS tables perm
4d50: 69 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 61  it the special a
4d60: 6c 69 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20  lias "docid" to 
4d70: 62 65 20 75 73 65 64 20 74 6f 20 72 65 66 65 72  be used to refer
4d80: 20 74 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69   to the.    rowi
4d90: 64 20 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74  d column support
4da0: 65 64 20 62 79 20 61 6c 6c 20 5b 76 69 72 74 75  ed by all [virtu
4db0: 61 6c 20 74 61 62 6c 65 73 5d 2e 0a 0a 20 20 3c  al tables]...  <
4dc0: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20  li><p> .    The 
4dd0: 5b 46 54 53 20 4d 41 54 43 48 5d 20 6f 70 65 72  [FTS MATCH] oper
4de0: 61 74 6f 72 20 69 73 20 73 75 70 70 6f 72 74 65  ator is supporte
4df0: 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 62 61  d for queries ba
4e00: 73 65 64 20 6f 6e 20 74 68 65 20 62 75 69 6c 74  sed on the built
4e10: 2d 69 6e 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78  -in.    full-tex
4e20: 74 20 69 6e 64 65 78 2e 20 0a 0a 20 20 3c 6c 69  t index. ..  <li
4e30: 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46  ><p> .    The [F
4e40: 54 53 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e  TS auxiliary fun
4e50: 63 74 69 6f 6e 73 5d 2c 20 5b 73 6e 69 70 70 65  ctions], [snippe
4e60: 74 28 29 5d 2c 20 5b 6f 66 66 73 65 74 73 28 29  t()], [offsets()
4e70: 5d 2c 20 61 6e 64 20 5b 6d 61 74 63 68 69 6e 66  ], and [matchinf
4e80: 6f 28 29 5d 20 61 72 65 20 0a 20 20 20 20 61 76  o()] are .    av
4e90: 61 69 6c 61 62 6c 65 20 74 6f 20 73 75 70 70 6f  ailable to suppo
4ea0: 72 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  rt full-text que
4eb0: 72 69 65 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e  ries...  <li><p>
4ec0: 0a 20 20 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61  .    <tcl>hd_fra
4ed0: 67 6d 65 6e 74 20 68 69 64 64 65 6e 63 6f 6c 20  gment hiddencol 
4ee0: 7b 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75  {FTS hidden colu
4ef0: 6d 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 45 76  mn}</tcl>.    Ev
4f00: 65 72 79 20 46 54 53 20 74 61 62 6c 65 20 68 61  ery FTS table ha
4f10: 73 20 61 20 5b 68 69 64 64 65 6e 20 63 6f 6c 75  s a [hidden colu
4f20: 6d 6e 5d 20 77 69 74 68 20 74 68 65 20 0a 20 20  mn] with the .  
4f30: 20 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74    same name as t
4f40: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
4f50: 20 54 68 65 20 76 61 6c 75 65 20 63 6f 6e 74 61   The value conta
4f60: 69 6e 65 64 20 69 6e 20 65 61 63 68 20 72 6f 77  ined in each row
4f70: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 68 69 64   for the.    hid
4f80: 64 65 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20  den column is a 
4f90: 62 6c 6f 62 20 74 68 61 74 20 69 73 20 6f 6e 6c  blob that is onl
4fa0: 79 20 75 73 65 66 75 6c 20 61 73 20 74 68 65 20  y useful as the 
4fb0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
4fc0: 61 0a 20 20 20 20 5b 46 54 53 20 4d 41 54 43 48  a.    [FTS MATCH
4fd0: 7c 4d 41 54 43 48 5d 20 6f 70 65 72 61 74 6f 72  |MATCH] operator
4fe0: 2c 20 6f 72 20 61 73 20 74 68 65 20 6c 65 66 74  , or as the left
4ff0: 2d 6d 6f 73 74 20 61 72 67 75 6d 65 6e 74 20 74  -most argument t
5000: 6f 20 6f 6e 65 0a 20 20 20 20 6f 66 20 74 68 65  o one.    of the
5010: 20 5b 46 54 53 20 61 75 78 69 6c 69 61 72 79 20   [FTS auxiliary 
5020: 66 75 6e 63 74 69 6f 6e 73 5d 2e 0a 20 20 20 20  functions]..    
5030: 0a 0a 3c 2f 6f 6c 3e 0a 0a 0a 3c 68 31 20 74 61  ..</ol>...<h1 ta
5040: 67 73 3d 22 63 6f 6d 70 69 6c 65 20 66 74 73 22  gs="compile fts"
5050: 3e 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 45  >Compiling and E
5060: 6e 61 62 6c 69 6e 67 20 46 54 53 33 20 61 6e 64  nabling FTS3 and
5070: 20 46 54 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a   FTS4</h1>..<p>.
5080: 20 20 41 6c 74 68 6f 75 67 68 20 46 54 53 33 20    Although FTS3 
5090: 61 6e 64 20 46 54 53 34 20 61 72 65 20 69 6e 63  and FTS4 are inc
50a0: 6c 75 64 65 64 20 77 69 74 68 20 74 68 65 20 53  luded with the S
50b0: 51 4c 69 74 65 20 63 6f 72 65 20 73 6f 75 72 63  QLite core sourc
50c0: 65 20 63 6f 64 65 2c 20 74 68 65 79 20 61 72 65  e code, they are
50d0: 20 6e 6f 74 0a 20 20 65 6e 61 62 6c 65 64 20 62   not.  enabled b
50e0: 79 20 64 65 66 61 75 6c 74 2e 20 54 6f 20 62 75  y default. To bu
50f0: 69 6c 64 20 53 51 4c 69 74 65 20 77 69 74 68 20  ild SQLite with 
5100: 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
5110: 79 20 65 6e 61 62 6c 65 64 2c 20 64 65 66 69 6e  y enabled, defin
5120: 65 0a 20 20 74 68 65 20 70 72 65 70 72 6f 63 65  e.  the preproce
5130: 73 73 6f 72 20 6d 61 63 72 6f 20 5b 53 51 4c 49  ssor macro [SQLI
5140: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5d 20  TE_ENABLE_FTS3] 
5150: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 2e 20  when compiling. 
5160: 4e 65 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  New applications
5170: 0a 20 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 64  .  should also d
5180: 65 66 69 6e 65 20 74 68 65 20 5b 53 51 4c 49 54  efine the [SQLIT
5190: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41  E_ENABLE_FTS3_PA
51a0: 52 45 4e 54 48 45 53 49 53 5d 20 6d 61 63 72 6f  RENTHESIS] macro
51b0: 20 74 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20   to enable the. 
51c0: 20 5b 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79   [enhanced query
51d0: 20 73 79 6e 74 61 78 5d 20 28 73 65 65 20 62 65   syntax] (see be
51e0: 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74  low). Usually, t
51f0: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61  his is done by a
5200: 64 64 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c  dding the .  fol
5210: 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63  lowing two switc
5220: 68 65 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  hes to the compi
5230: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
5240: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
5250: 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
5260: 5f 46 54 53 33 0a 20 20 2d 44 53 51 4c 49 54 45  _FTS3.  -DSQLITE
5270: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52  _ENABLE_FTS3_PAR
5280: 45 4e 54 48 45 53 49 53 0a 3c 2f 63 6f 64 65 62  ENTHESIS.</codeb
5290: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 74  lock>..<p>.  Not
52a0: 65 20 74 68 61 74 20 65 6e 61 62 6c 69 6e 67 20  e that enabling 
52b0: 46 54 53 33 20 61 6c 73 6f 20 6d 61 6b 65 73 20  FTS3 also makes 
52c0: 46 54 53 34 20 61 76 61 69 6c 61 62 6c 65 2e 20  FTS4 available. 
52d0: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 61 20   There is not a 
52e0: 73 65 70 61 72 61 74 65 0a 20 20 53 51 4c 49 54  separate.  SQLIT
52f0: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 63 6f  E_ENABLE_FTS4 co
5300: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
5310: 6e 2e 20 20 41 6e 20 62 75 69 6c 64 20 6f 66 20  n.  An build of 
5320: 53 51 4c 69 74 65 20 65 69 74 68 65 72 20 73 75  SQLite either su
5330: 70 70 6f 72 74 73 0a 20 20 62 6f 74 68 20 46 54  pports.  both FT
5340: 53 33 20 61 6e 64 20 46 54 53 34 20 6f 72 20 69  S3 and FTS4 or i
5350: 74 20 73 75 70 70 6f 72 74 73 20 6e 65 69 74 68  t supports neith
5360: 65 72 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 75 73  er...<p>.  If us
5370: 69 6e 67 20 74 68 65 20 61 6d 61 6c 67 61 6d 61  ing the amalgama
5380: 74 69 6f 6e 20 61 75 74 6f 63 6f 6e 66 20 62 61  tion autoconf ba
5390: 73 65 64 20 62 75 69 6c 64 20 73 79 73 74 65 6d  sed build system
53a0: 2c 20 73 65 74 74 69 6e 67 20 74 68 65 20 43 50  , setting the CP
53b0: 50 46 4c 41 47 53 0a 20 20 65 6e 76 69 72 6f 6e  PFLAGS.  environ
53c0: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 77 68  ment variable wh
53d0: 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
53e0: 27 63 6f 6e 66 69 67 75 72 65 27 20 73 63 72 69  'configure' scri
53f0: 70 74 20 69 73 20 61 6e 20 65 61 73 79 0a 20 20  pt is an easy.  
5400: 77 61 79 20 74 6f 20 73 65 74 20 74 68 65 73 65  way to set these
5410: 20 6d 61 63 72 6f 73 2e 20 46 6f 72 20 65 78 61   macros. For exa
5420: 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mple, the follow
5430: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 0a 3c 63  ing command:..<c
5440: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 50 50 46  odeblock>.  CPPF
5450: 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45  LAGS="-DSQLITE_E
5460: 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c  NABLE_FTS3 -DSQL
5470: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
5480: 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63  PARENTHESIS" ./c
5490: 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e  onfigure &lt;con
54a0: 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67  figure options&g
54b0: 74 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  t;.</codeblock>.
54c0: 0a 3c 70 3e 0a 20 20 77 68 65 72 65 20 3c 69 3e  .<p>.  where <i>
54d0: 26 6c 74 3b 63 6f 6e 66 69 67 75 72 65 20 6f 70  &lt;configure op
54e0: 74 69 6f 6e 73 26 67 74 3b 3c 2f 69 3e 20 61 72  tions&gt;</i> ar
54f0: 65 20 74 68 6f 73 65 20 6f 70 74 69 6f 6e 73 20  e those options 
5500: 6e 6f 72 6d 61 6c 6c 79 20 70 61 73 73 65 64 20  normally passed 
5510: 74 6f 0a 20 20 74 68 65 20 63 6f 6e 66 69 67 75  to.  the configu
5520: 72 65 20 73 63 72 69 70 74 2c 20 69 66 20 61 6e  re script, if an
5530: 79 2e 0a 0a 3c 70 3e 0a 20 20 42 65 63 61 75 73  y...<p>.  Becaus
5540: 65 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 20  e FTS3 and FTS4 
5550: 61 72 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  are virtual tabl
5560: 65 73 2c 20 54 68 65 20 5b 53 51 4c 49 54 45 5f  es, The [SQLITE_
5570: 45 4e 41 42 4c 45 5f 46 54 53 33 5d 20 63 6f 6d  ENABLE_FTS3] com
5580: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5590: 0a 20 20 69 73 20 69 6e 63 6f 6d 70 61 74 69 62  .  is incompatib
55a0: 6c 65 20 77 69 74 68 20 74 68 65 20 5b 53 51 4c  le with the [SQL
55b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
55c0: 54 41 42 4c 45 5d 20 6f 70 74 69 6f 6e 2e 0a 0a  TABLE] option...
55d0: 3c 70 3e 0a 20 20 49 66 20 61 20 62 75 69 6c 64  <p>.  If a build
55e0: 20 6f 66 20 53 51 4c 69 74 65 20 64 6f 65 73 20   of SQLite does 
55f0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
5600: 46 54 53 20 6d 6f 64 75 6c 65 73 2c 20 74 68 65  FTS modules, the
5610: 6e 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  n any attempt to
5620: 20 70 72 65 70 61 72 65 20 61 6e 0a 20 20 53 51   prepare an.  SQ
5630: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63  L statement to c
5640: 72 65 61 74 65 20 61 6e 20 46 54 53 33 20 6f 72  reate an FTS3 or
5650: 20 46 54 53 34 20 74 61 62 6c 65 20 6f 72 20 74   FTS4 table or t
5660: 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73  o drop or access
5670: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20   an existing .  
5680: 46 54 53 20 74 61 62 6c 65 20 69 6e 20 61 6e 79  FTS table in any
5690: 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e 20   way will fail. 
56a0: 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  The error messag
56b0: 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
56c0: 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74 6f  be similar .  to
56d0: 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   "no such module
56e0: 3a 20 66 74 73 4e 22 20 28 77 68 65 72 65 20 4e  : ftsN" (where N
56f0: 20 69 73 20 65 69 74 68 65 72 20 33 20 6f 72 20   is either 3 or 
5700: 34 29 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68  4)...<p>.  If th
5710: 65 20 43 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  e C version of t
5720: 68 65 20 3c 61 20 68 72 65 66 3d 68 74 74 70 3a  he <a href=http:
5730: 2f 2f 73 69 74 65 2e 69 63 75 2d 70 72 6f 6a 65  //site.icu-proje
5740: 63 74 2e 6f 72 67 2f 3e 49 43 55 20 6c 69 62 72  ct.org/>ICU libr
5750: 61 72 79 3c 2f 61 3e 0a 20 20 69 73 20 61 76 61  ary</a>.  is ava
5760: 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 46 54 53  ilable, then FTS
5770: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 63 6f 6d   may also be com
5780: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
5790: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
57a0: 0a 20 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72  .  pre-processor
57b0: 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
57c0: 43 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  Compiling with t
57d0: 68 69 73 20 6d 61 63 72 6f 20 65 6e 61 62 6c 65  his macro enable
57e0: 73 20 61 6e 20 46 54 53 0a 20 20 5b 74 6f 6b 65  s an FTS.  [toke
57f0: 6e 69 7a 65 72 5d 20 74 68 61 74 20 75 73 65 73  nizer] that uses
5800: 20 74 68 65 20 49 43 55 20 6c 69 62 72 61 72 79   the ICU library
5810: 20 74 6f 20 73 70 6c 69 74 20 61 20 64 6f 63 75   to split a docu
5820: 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 0a  ment into terms.
5830: 20 20 28 77 6f 72 64 73 29 20 75 73 69 6e 67 20    (words) using 
5840: 74 68 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 20  the conventions 
5850: 66 6f 72 20 61 20 73 70 65 63 69 66 69 65 64 20  for a specified 
5860: 6c 61 6e 67 75 61 67 65 20 61 6e 64 20 6c 6f 63  language and loc
5870: 61 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ale...<codeblock
5880: 3e 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  >.  -DSQLITE_ENA
5890: 42 4c 45 5f 49 43 55 0a 3c 2f 63 6f 64 65 62 6c  BLE_ICU.</codebl
58a0: 6f 63 6b 3e 0a 20 20 0a 0a 3c 68 31 20 74 61 67  ock>.  ..<h1 tag
58b0: 73 3d 22 46 54 53 20 4d 41 54 43 48 22 3e 46 75  s="FTS MATCH">Fu
58c0: 6c 6c 2d 74 65 78 74 20 49 6e 64 65 78 20 51 75  ll-text Index Qu
58d0: 65 72 69 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a  eries</h1>..<p>.
58e0: 20 20 54 68 65 20 6d 6f 73 74 20 75 73 65 66 75    The most usefu
58f0: 6c 20 74 68 69 6e 67 20 61 62 6f 75 74 20 46 54  l thing about FT
5900: 53 20 74 61 62 6c 65 73 20 69 73 20 74 68 65 20  S tables is the 
5910: 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
5920: 20 62 65 20 0a 20 20 70 65 72 66 6f 72 6d 65 64   be .  performed
5930: 20 75 73 69 6e 67 20 74 68 65 20 62 75 69 6c 74   using the built
5940: 2d 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  -in full-text in
5950: 64 65 78 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71  dex. Full-text q
5960: 75 65 72 69 65 73 20 61 72 65 20 0a 20 20 70 65  ueries are .  pe
5970: 72 66 6f 72 6d 65 64 20 62 79 20 73 70 65 63 69  rformed by speci
5980: 66 79 69 6e 67 20 61 20 63 6c 61 75 73 65 20 6f  fying a clause o
5990: 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 22 26  f the form .  "&
59a0: 6c 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41  lt;column&gt; MA
59b0: 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78  TCH &lt;full-tex
59c0: 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  t query expressi
59d0: 6f 6e 26 67 74 3b 22 20 61 73 20 70 61 72 74 20  on&gt;" as part 
59e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 0a 20 20  of the WHERE .  
59f0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
5a00: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
5a10: 74 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f  t reads data fro
5a20: 6d 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 20  m an FTS table. 
5a30: 0a 20 20 5b 73 69 6d 70 6c 65 20 66 74 73 20 71  .  [simple fts q
5a40: 75 65 72 69 65 73 7c 53 69 6d 70 6c 65 20 46 54  ueries|Simple FT
5a50: 53 20 71 75 65 72 69 65 73 5d 20 74 68 61 74 20  S queries] that 
5a60: 72 65 74 75 72 6e 20 61 6c 6c 20 64 6f 63 75 6d  return all docum
5a70: 65 6e 74 73 20 74 68 61 74 20 0a 20 20 63 6f 6e  ents that .  con
5a80: 74 61 69 6e 20 61 20 67 69 76 65 6e 20 74 65 72  tain a given ter
5a90: 6d 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  m are described 
5aa0: 61 62 6f 76 65 2e 20 49 6e 20 74 68 61 74 20 64  above. In that d
5ab0: 69 73 63 75 73 73 69 6f 6e 20 74 68 65 20 72 69  iscussion the ri
5ac0: 67 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61  ght-hand.  opera
5ad0: 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  nd of the MATCH 
5ae0: 6f 70 65 72 61 74 6f 72 20 77 61 73 20 61 73 73  operator was ass
5af0: 75 6d 65 64 20 74 6f 20 62 65 20 61 20 73 74 72  umed to be a str
5b00: 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ing consisting o
5b10: 66 20 61 0a 20 20 73 69 6e 67 6c 65 20 74 65 72  f a.  single ter
5b20: 6d 2e 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  m. This section 
5b30: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6d 6f  describes the mo
5b40: 72 65 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79  re complex query
5b50: 20 74 79 70 65 73 20 73 75 70 70 6f 72 74 65 64   types supported
5b60: 20 0a 20 20 62 79 20 46 54 53 20 74 61 62 6c 65   .  by FTS table
5b70: 73 2c 20 61 6e 64 20 68 6f 77 20 74 68 65 79 20  s, and how they 
5b80: 6d 61 79 20 62 65 20 75 74 69 6c 69 7a 65 64 20  may be utilized 
5b90: 62 79 20 73 70 65 63 69 66 79 69 6e 67 20 61 20  by specifying a 
5ba0: 6d 6f 72 65 0a 20 20 63 6f 6d 70 6c 65 78 20 71  more.  complex q
5bb0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
5bc0: 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
5bd0: 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4d  d operand of a M
5be0: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 0a  ATCH operator...
5bf0: 3c 70 3e 0a 20 20 46 54 53 20 74 61 62 6c 65 73  <p>.  FTS tables
5c00: 20 73 75 70 70 6f 72 74 20 74 68 72 65 65 20 62   support three b
5c10: 61 73 69 63 20 71 75 65 72 79 20 74 79 70 65 73  asic query types
5c20: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70  :..<ul>.  <li><p
5c30: 3e 3c 62 3e 54 6f 6b 65 6e 20 6f 72 20 74 6f 6b  ><b>Token or tok
5c40: 65 6e 20 70 72 65 66 69 78 20 71 75 65 72 69 65  en prefix querie
5c50: 73 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 6e 20 46  s</b>. .    An F
5c60: 54 53 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  TS table may be 
5c70: 71 75 65 72 69 65 64 20 66 6f 72 20 61 6c 6c 20  queried for all 
5c80: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
5c90: 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69 66 69  ontain a specifi
5ca0: 65 64 0a 20 20 20 20 74 65 72 6d 20 28 74 68 65  ed.    term (the
5cb0: 20 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65   [simple fts que
5cc0: 72 69 65 73 7c 73 69 6d 70 6c 65 20 63 61 73 65  ries|simple case
5cd0: 5d 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  ] described abov
5ce0: 65 29 2c 20 6f 72 20 66 6f 72 0a 20 20 20 20 61  e), or for.    a
5cf0: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
5d00: 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d  t contain a term
5d10: 20 77 69 74 68 20 61 20 73 70 65 63 69 66 69 65   with a specifie
5d20: 64 20 70 72 65 66 69 78 2e 20 41 73 20 77 65 20  d prefix. As we 
5d30: 68 61 76 65 0a 20 20 20 20 73 65 65 6e 2c 20 74  have.    seen, t
5d40: 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
5d50: 69 6f 6e 20 66 6f 72 20 61 20 73 70 65 63 69 66  ion for a specif
5d60: 69 63 20 74 65 72 6d 20 69 73 20 73 69 6d 70 6c  ic term is simpl
5d70: 79 20 74 68 65 20 74 65 72 6d 20 69 74 73 65 6c  y the term itsel
5d80: 66 2e 0a 20 20 20 20 54 68 65 20 71 75 65 72 79  f..    The query
5d90: 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64   expression used
5da0: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 61   to search for a
5db0: 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 73 20   term prefix is 
5dc0: 74 68 65 20 70 72 65 66 69 78 0a 20 20 20 20 69  the prefix.    i
5dd0: 74 73 65 6c 66 20 77 69 74 68 20 61 20 27 2a 27  tself with a '*'
5de0: 20 63 68 61 72 61 63 74 65 72 20 61 70 70 65 6e   character appen
5df0: 64 65 64 20 74 6f 20 69 74 2e 20 46 6f 72 20 65  ded to it. For e
5e00: 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c  xample:.</ul>..<
5e10: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
5e20: 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  -- Virtual table
5e30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e   declaration</i>
5e40: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
5e50: 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49  L TABLE docs USI
5e60: 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20 62  NG fts3(title, b
5e70: 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ody);..  <i>-- Q
5e80: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
5e90: 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e  uments containin
5ea0: 67 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75  g the term "linu
5eb0: 78 22 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  x":</i>.  SELECT
5ec0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
5ed0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c  RE docs MATCH 'l
5ee0: 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  inux';..  <i>-- 
5ef0: 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f  Query for all do
5f00: 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69  cuments containi
5f10: 6e 67 20 61 20 74 65 72 6d 20 77 69 74 68 20 74  ng a term with t
5f20: 68 65 20 70 72 65 66 69 78 20 22 6c 69 6e 22 2e  he prefix "lin".
5f30: 20 54 68 69 73 20 77 69 6c 6c 20 6d 61 74 63 68   This will match
5f40: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6c 6c  </i>.  <i>-- all
5f50: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
5f60: 63 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22 2c  contain "linux",
5f70: 20 62 75 74 20 61 6c 73 6f 20 74 68 6f 73 65 20   but also those 
5f80: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72  that contain ter
5f90: 6d 73 20 22 6c 69 6e 65 61 72 22 2c 3c 2f 69 3e  ms "linear",</i>
5fa0: 0a 20 20 3c 69 3e 2d 2d 22 6c 69 6e 6b 65 72 22  .  <i>--"linker"
5fb0: 2c 20 22 6c 69 6e 67 75 69 73 74 69 63 22 20 61  , "linguistic" a
5fc0: 6e 64 20 73 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20 20  nd so on.</i>.  
5fd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
5fe0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
5ff0: 54 43 48 20 27 6c 69 6e 2a 27 3b 0a 3c 2f 63 6f  TCH 'lin*';.</co
6000: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20  deblock>..<ul>. 
6010: 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74   <li style="list
6020: 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e  -style:none"><p>
6030: 0a 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61  .    Normally, a
6040: 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
6050: 70 72 65 66 69 78 20 71 75 65 72 79 20 69 73 20  prefix query is 
6060: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
6070: 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 0a 20  the FTS table . 
6080: 20 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66     column specif
6090: 69 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ied as the right
60a0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
60b0: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
60c0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20  . Or, if the.   
60d0: 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20   special column 
60e0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
60f0: 6d 65 20 61 73 20 74 68 65 20 46 54 53 20 74 61  me as the FTS ta
6100: 62 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73 70  ble itself is sp
6110: 65 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67 61  ecified,.    aga
6120: 69 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  inst all columns
6130: 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f 76  . This may be ov
6140: 65 72 72 69 64 64 65 6e 20 62 79 20 73 70 65 63  erridden by spec
6150: 69 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 2d  ifying a column-
6160: 6e 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77 65  name.    followe
6170: 64 20 62 79 20 61 20 22 3a 22 20 63 68 61 72 61  d by a ":" chara
6180: 63 74 65 72 20 62 65 66 6f 72 65 20 61 20 62 61  cter before a ba
6190: 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e 20  sic term query. 
61a0: 54 68 65 72 65 20 6d 61 79 20 62 65 20 73 70 61  There may be spa
61b0: 63 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20 74  ce.    between t
61c0: 68 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20 74  he ":" and the t
61d0: 65 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72  erm to query for
61e0: 2c 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65 65  , but not betwee
61f0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61 6d  n the column-nam
6200: 65 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22 3a  e.    and the ":
6210: 22 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f 72  " character. For
6220: 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a   example:.</ul>.
6230: 20 20 20 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a     .<codeblock>.
6240: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 74 68    <i>-- Query th
6250: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 64  e database for d
6260: 6f 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68 69  ocuments for whi
6270: 63 68 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e  ch the term "lin
6280: 75 78 22 20 61 70 70 65 61 72 73 20 69 6e 3c 2f  ux" appears in</
6290: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64  i>.  <i>-- the d
62a0: 6f 63 75 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61  ocument title, a
62b0: 6e 64 20 74 68 65 20 74 65 72 6d 20 22 70 72 6f  nd the term "pro
62c0: 62 6c 65 6d 73 22 20 61 70 70 65 61 72 73 20 69  blems" appears i
62d0: 6e 20 65 69 74 68 65 72 20 74 68 65 20 74 69 74  n either the tit
62e0: 6c 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f  le</i>.  <i>-- o
62f0: 72 20 62 6f 64 79 20 6f 66 20 74 68 65 20 64 6f  r body of the do
6300: 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45  cument.</i>.  SE
6310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
6320: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
6330: 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 70  H 'title:linux p
6340: 72 6f 62 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e  roblems';..  <i>
6350: 2d 2d 20 51 75 65 72 79 20 74 68 65 20 64 61 74  -- Query the dat
6360: 61 62 61 73 65 20 66 6f 72 20 64 6f 63 75 6d 65  abase for docume
6370: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  nts for which th
6380: 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 20 61  e term "linux" a
6390: 70 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a 20 20  ppears in</i>.  
63a0: 3c 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75 6d 65  <i>-- the docume
63b0: 6e 74 20 74 69 74 6c 65 2c 20 61 6e 64 20 74 68  nt title, and th
63c0: 65 20 74 65 72 6d 20 22 64 72 69 76 65 72 22 20  e term "driver" 
63d0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 62  appears in the b
63e0: 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d  ody of the docum
63f0: 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ent</i>.  <i>-- 
6400: 28 22 64 72 69 76 65 72 22 20 6d 61 79 20 61 6c  ("driver" may al
6410: 73 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  so appear in the
6420: 20 74 69 74 6c 65 2c 20 62 75 74 20 74 68 69 73   title, but this
6430: 20 61 6c 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74 20   alone will not 
6440: 73 61 74 69 73 66 79 20 74 68 65 3c 2f 69 3e 2e  satisfy the</i>.
6450: 0a 20 20 3c 69 3e 2d 2d 20 71 75 65 72 79 20 63  .  <i>-- query c
6460: 72 69 74 65 72 69 61 29 2e 3c 2f 69 3e 0a 20 20  riteria).</i>.  
6470: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
6480: 63 73 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41  cs WHERE body MA
6490: 54 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78  TCH 'title:linux
64a0: 20 64 72 69 76 65 72 27 3b 0a 3c 2f 63 6f 64 65   driver';.</code
64b0: 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c  block>..<ul>.  <
64c0: 6c 69 3e 3c 70 3e 3c 62 3e 50 68 72 61 73 65 20  li><p><b>Phrase 
64d0: 71 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20 20 20  queries</b>..   
64e0: 20 41 20 70 68 72 61 73 65 20 71 75 65 72 79 20   A phrase query 
64f0: 69 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  is a query that 
6500: 72 65 74 72 69 65 76 65 73 20 61 6c 6c 20 64 6f  retrieves all do
6510: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
6520: 74 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d 69 6e  tain a.    nomin
6530: 61 74 65 64 20 73 65 74 20 6f 66 20 74 65 72 6d  ated set of term
6540: 73 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78  s or term prefix
6550: 65 73 20 69 6e 20 61 20 73 70 65 63 69 66 69 65  es in a specifie
6560: 64 20 6f 72 64 65 72 20 77 69 74 68 20 6e 6f 0a  d order with no.
6570: 20 20 20 20 69 6e 74 65 72 76 65 6e 69 6e 67 20      intervening 
6580: 74 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65 20 71  tokens. Phrase q
6590: 75 65 72 69 65 73 20 61 72 65 20 73 70 65 63 69  ueries are speci
65a0: 66 69 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e  fied by enclosin
65b0: 67 20 61 20 73 70 61 63 65 0a 20 20 20 20 73 65  g a space.    se
65c0: 70 61 72 61 74 65 64 20 73 65 71 75 65 6e 63 65  parated sequence
65d0: 20 6f 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72   of terms or ter
65e0: 6d 20 70 72 65 66 69 78 65 73 20 69 6e 20 64 6f  m prefixes in do
65f0: 75 62 6c 65 20 71 75 6f 74 65 73 20 28 22 29 2e  uble quotes (").
6600: 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  .    For example
6610: 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c  :.</ul>..<codebl
6620: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  ock>.  <i>-- Que
6630: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
6640: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
6650: 6e 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69  n the phrase "li
6660: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
6670: 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
6680: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
6690: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c  E docs MATCH '"l
66a0: 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e  inux application
66b0: 73 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  s"';..  <i>-- Qu
66c0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
66d0: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
66e0: 69 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74  in a phrase that
66f0: 20 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61   matches "lin* a
6700: 70 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73  pp*". As well as
6710: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69  </i>.  <i>-- "li
6720: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
6730: 22 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74  ", this will mat
6740: 63 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65  ch common phrase
6750: 73 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c  s such as "linol
6760: 65 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c  eum appliances"<
6770: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22  /i>.  <i>-- or "
6780: 6c 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22  link apprentice"
6790: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
67a0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
67b0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
67c0: 6e 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63 6f 64  n* app*"';.</cod
67d0: 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20  eblock>..<ul>.  
67e0: 3c 6c 69 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20 71  <li><p><b>NEAR q
67f0: 75 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20 20  ueries</b>. .   
6800: 20 41 20 4e 45 41 52 20 71 75 65 72 79 20 69 73   A NEAR query is
6810: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 72 65   a query that re
6820: 74 75 72 6e 73 20 64 6f 63 75 6d 65 6e 74 73 20  turns documents 
6830: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74  that contain a t
6840: 77 6f 20 6f 72 0a 20 20 20 20 6d 6f 72 65 20 6e  wo or.    more n
6850: 6f 6d 69 6e 61 74 65 64 20 74 65 72 6d 73 20 6f  ominated terms o
6860: 72 20 70 68 72 61 73 65 73 20 77 69 74 68 69 6e  r phrases within
6870: 20 61 20 73 70 65 63 69 66 69 65 64 20 70 72 6f   a specified pro
6880: 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 0a  ximity of each .
6890: 20 20 20 20 6f 74 68 65 72 20 28 62 79 20 64 65      other (by de
68a0: 66 61 75 6c 74 20 77 69 74 68 20 31 30 20 6f 72  fault with 10 or
68b0: 20 6c 65 73 73 20 69 6e 74 65 72 76 65 6e 69 6e   less intervenin
68c0: 67 20 74 65 72 6d 73 29 2e 20 41 20 4e 45 41 52  g terms). A NEAR
68d0: 20 71 75 65 72 79 20 69 73 20 0a 20 20 20 20 73   query is .    s
68e0: 70 65 63 69 66 69 65 64 20 62 79 20 70 75 74 74  pecified by putt
68f0: 69 6e 67 20 74 68 65 20 6b 65 79 77 6f 72 64 20  ing the keyword 
6900: 22 4e 45 41 52 22 20 62 65 74 77 65 65 6e 20 74  "NEAR" between t
6910: 77 6f 20 70 68 72 61 73 65 2c 20 74 65 72 6d 20  wo phrase, term 
6920: 6f 72 20 0a 20 20 20 20 74 65 72 6d 20 70 72 65  or .    term pre
6930: 66 69 78 20 71 75 65 72 69 65 73 2e 20 54 6f 20  fix queries. To 
6940: 73 70 65 63 69 66 79 20 61 20 70 72 6f 78 69 6d  specify a proxim
6950: 69 74 79 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ity other than t
6960: 68 65 20 64 65 66 61 75 6c 74 2c 0a 20 20 20 20  he default,.    
6970: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
6980: 68 65 20 66 6f 72 6d 20 22 4e 45 41 52 2f 3c 69  he form "NEAR/<i
6990: 3e 26 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20  >&lt;N&gt;</i>" 
69a0: 6d 61 79 20 62 65 20 75 73 65 64 2c 20 77 68 65  may be used, whe
69b0: 72 65 0a 20 20 20 20 3c 69 3e 26 6c 74 3b 4e 26  re.    <i>&lt;N&
69c0: 67 74 3b 3c 2f 69 3e 20 69 73 20 74 68 65 20 6d  gt;</i> is the m
69d0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
69e0: 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72   intervening ter
69f0: 6d 73 20 61 6c 6c 6f 77 65 64 2e 0a 20 20 20 20  ms allowed..    
6a00: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75  For example:.</u
6a10: 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  l>..<codeblock>.
6a20: 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20    <i>-- Virtual 
6a30: 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  table declaratio
6a40: 6e 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  n.</i>.  CREATE 
6a50: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f  VIRTUAL TABLE do
6a60: 63 73 20 55 53 49 4e 47 20 66 74 73 34 28 29 3b  cs USING fts4();
6a70: 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61  ..  <i>-- Virtua
6a80: 6c 20 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f 69  l table data.</i
6a90: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
6aa0: 64 6f 63 73 20 56 41 4c 55 45 53 28 27 53 51 4c  docs VALUES('SQL
6ab0: 69 74 65 20 69 73 20 61 6e 20 41 43 49 44 20 63  ite is an ACID c
6ac0: 6f 6d 70 6c 69 61 6e 74 20 65 6d 62 65 64 64 65  ompliant embedde
6ad0: 64 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74  d relational dat
6ae0: 61 62 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e 74  abase management
6af0: 20 73 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c 69   system');..  <i
6b00: 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61  >-- Search for a
6b10: 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63   document that c
6b20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
6b30: 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22  s "sqlite" and "
6b40: 64 61 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f  database" with</
6b50: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d  i>.  <i>-- not m
6b60: 6f 72 65 20 74 68 61 6e 20 31 30 20 69 6e 74 65  ore than 10 inte
6b70: 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54  rvening terms. T
6b80: 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
6b90: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e  only document in
6ba0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
6bb0: 6c 65 20 64 6f 63 73 20 28 73 69 6e 63 65 20 74  le docs (since t
6bc0: 68 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 73 69  here are only si
6bd0: 78 20 74 65 72 6d 73 20 62 65 74 77 65 65 6e 20  x terms between 
6be0: 22 53 51 4c 69 74 65 22 20 61 6e 64 20 22 64 61  "SQLite" and "da
6bf0: 74 61 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20 3c  tabase"</i> .  <
6c00: 69 3e 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63 75  i>-- in the docu
6c10: 6d 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c  ment)</i>..  SEL
6c20: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
6c30: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
6c40: 20 27 73 71 6c 69 74 65 20 4e 45 41 52 20 64 61   'sqlite NEAR da
6c50: 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d  tabase';..  <i>-
6c60: 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64  - Search for a d
6c70: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e  ocument that con
6c80: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
6c90: 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61  "sqlite" and "da
6ca0: 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e  tabase" with</i>
6cb0: 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72  .  <i>-- not mor
6cc0: 65 20 74 68 61 6e 20 36 20 69 6e 74 65 72 76 65  e than 6 interve
6cd0: 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73  ning terms. This
6ce0: 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 74 68   also matches th
6cf0: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20  e only document 
6d00: 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  in</i>.  <i>-- t
6d10: 61 62 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65 20  able docs. Note 
6d20: 74 68 61 74 20 74 68 65 20 6f 72 64 65 72 20 69  that the order i
6d30: 6e 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d  n which the term
6d40: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
6d50: 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c  document</i>.  <
6d60: 69 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68 61  i>-- does not ha
6d70: 76 65 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ve to be the sam
6d80: 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20 69  e as the order i
6d90: 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 70 70  n which they app
6da0: 65 61 72 20 69 6e 20 74 68 65 20 71 75 65 72 79  ear in the query
6db0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
6dc0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
6dd0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
6de0: 61 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71 6c  abase NEAR/6 sql
6df0: 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53  ite';..  <i>-- S
6e00: 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75  earch for a docu
6e10: 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69  ment that contai
6e20: 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71  ns the terms "sq
6e30: 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62  lite" and "datab
6e40: 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20  ase" with</i>.  
6e50: 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74  <i>-- not more t
6e60: 68 61 6e 20 35 20 69 6e 74 65 72 76 65 6e 69 6e  han 5 intervenin
6e70: 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20 71 75  g terms. This qu
6e80: 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64  ery matches no d
6e90: 6f 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20  ocuments.</i>.  
6ea0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
6eb0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
6ec0: 54 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 45  TCH 'database NE
6ed0: 41 52 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a 20  AR/5 sqlite';.. 
6ee0: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
6ef0: 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61  r a document tha
6f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
6f10: 68 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d 70  hrase "ACID comp
6f20: 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20 74  liant" and the t
6f30: 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  erm</i>.  <i>-- 
6f40: 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68 20  "database" with 
6f50: 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20  not more than 2 
6f60: 74 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67  terms separating
6f70: 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20 6d   the two. This m
6f80: 61 74 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a 20  atches the</i>. 
6f90: 20 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 20   <i>-- document 
6fa0: 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20  stored in table 
6fb0: 64 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  docs.</i>.  SELE
6fc0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
6fd0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
6fe0: 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 32  'database NEAR/2
6ff0: 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74   "ACID compliant
7000: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61  "';..  <i>-- Sea
7010: 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65  rch for a docume
7020: 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  nt that contains
7030: 20 74 68 65 20 70 68 72 61 73 65 20 22 41 43 49   the phrase "ACI
7040: 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e 64  D compliant" and
7050: 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20   the term</i>.  
7060: 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 77  <i>-- "sqlite" w
7070: 69 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61  ith not more tha
7080: 6e 20 32 20 74 65 72 6d 73 20 73 65 70 61 72 61  n 2 terms separa
7090: 74 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54 68  ting the two. Th
70a0: 69 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 3c  is also matches<
70b0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
70c0: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73 74  only document st
70d0: 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f  ored in table do
70e0: 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  cs.</i>.  SELECT
70f0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
7100: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
7110: 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20  ACID compliant" 
7120: 4e 45 41 52 2f 32 20 73 71 6c 69 74 65 27 3b 0a  NEAR/2 sqlite';.
7130: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75  </codeblock>..<u
7140: 6c 3e 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22  l>.  <li style="
7150: 6c 69 73 74 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65  list-style: none
7160: 22 3e 3c 70 3e 0a 20 20 20 20 4d 6f 72 65 20 74  "><p>.    More t
7170: 68 61 6e 20 6f 6e 65 20 4e 45 41 52 20 6f 70 65  han one NEAR ope
7180: 72 61 74 6f 72 20 6d 61 79 20 61 70 70 65 61 72  rator may appear
7190: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 71 75 65   in a single que
71a0: 72 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ry. In this case
71b0: 20 65 61 63 68 0a 20 20 20 20 70 61 69 72 20 6f   each.    pair o
71c0: 66 20 74 65 72 6d 73 20 6f 72 20 70 68 72 61 73  f terms or phras
71d0: 65 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  es separated by 
71e0: 61 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20  a NEAR operator 
71f0: 6d 75 73 74 20 61 70 70 65 61 72 20 77 69 74 68  must appear with
7200: 69 6e 20 74 68 65 0a 20 20 20 20 73 70 65 63 69  in the.    speci
7210: 66 69 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f  fied proximity o
7220: 66 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  f each other in 
7230: 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 55 73  the document. Us
7240: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 61 62  ing the same tab
7250: 6c 65 20 61 6e 64 0a 20 20 20 20 64 61 74 61 20  le and.    data 
7260: 61 73 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  as in the block 
7270: 6f 66 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76  of examples abov
7280: 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62  e:.</ul>..<codeb
7290: 6c 6f 63 6b 3e 20 0a 20 3c 69 3e 2d 2d 20 54 68  lock> . <i>-- Th
72a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
72b0: 79 20 73 65 6c 65 63 74 73 20 64 6f 63 75 6d 65  y selects docume
72c0: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
72d0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
72e0: 20 74 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a 20   the term </i>. 
72f0: 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20   <i>-- "sqlite" 
7300: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77 6f  separated by two
7310: 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 20   or fewer terms 
7320: 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65  from an instance
7330: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61 63   of the term "ac
7340: 69 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  id",</i>.  <i>--
7350: 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 75 72   which is in tur
7360: 6e 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  n separated by t
7370: 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
7380: 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e  s from an instan
7390: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 3c 2f  ce of the term</
73a0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c 61  i>.  <i>-- "rela
73b0: 74 69 6f 6e 61 6c 22 2e 20 41 73 20 69 74 20 68  tional". As it h
73c0: 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 6e 6c 79  appens, the only
73d0: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 61 62   document in tab
73e0: 6c 65 20 64 6f 63 73 20 73 61 74 69 73 66 69 65  le docs satisfie
73f0: 73 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e  s this criteria.
7400: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
7410: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7420: 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69  docs MATCH 'sqli
7430: 74 65 20 4e 45 41 52 2f 32 20 61 63 69 64 20 4e  te NEAR/2 acid N
7440: 45 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c  EAR/2 relational
7450: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  ';..  <i>-- This
7460: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e   query matches n
7470: 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65  o documents. The
7480: 72 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  re is an instanc
7490: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 73  e of the term "s
74a0: 71 6c 69 74 65 22 20 77 69 74 68 3c 2f 69 3e 0a  qlite" with</i>.
74b0: 20 20 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69 65    <i>-- sufficie
74c0: 6e 74 20 70 72 6f 78 69 6d 69 74 79 20 74 6f 20  nt proximity to 
74d0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 22  an instance of "
74e0: 61 63 69 64 22 20 62 75 74 20 69 74 20 69 73 20  acid" but it is 
74f0: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 6c 79  not sufficiently
7500: 20 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e   close</i>.  <i>
7510: 2d 2d 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  -- to an instanc
7520: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 72  e of the term "r
7530: 65 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a  elational".</i>.
7540: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
7550: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7560: 4d 41 54 43 48 20 27 61 63 69 64 20 4e 45 41 52  MATCH 'acid NEAR
7570: 2f 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f 32  /2 sqlite NEAR/2
7580: 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f   relational';.</
7590: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
75a0: 20 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45 41    Phrase and NEA
75b0: 52 20 71 75 65 72 69 65 73 20 6d 61 79 20 6e 6f  R queries may no
75c0: 74 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20  t span multiple 
75d0: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 69 6e 20 61  columns within a
75e0: 20 72 6f 77 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65   row...<p>.  The
75f0: 20 74 68 72 65 65 20 62 61 73 69 63 20 71 75 65   three basic que
7600: 72 79 20 74 79 70 65 73 20 64 65 73 63 72 69 62  ry types describ
7610: 65 64 20 61 62 6f 76 65 20 6d 61 79 20 62 65 20  ed above may be 
7620: 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68  used to query th
7630: 65 20 66 75 6c 6c 2d 74 65 78 74 0a 20 20 69 6e  e full-text.  in
7640: 64 65 78 20 66 6f 72 20 74 68 65 20 73 65 74 20  dex for the set 
7650: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7660: 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63  t match the spec
7670: 69 66 69 65 64 20 63 72 69 74 65 72 69 61 2e 20  ified criteria. 
7680: 55 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 20  Using the.  FTS 
7690: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
76a0: 20 6c 61 6e 67 75 61 67 65 20 69 74 20 69 73 20   language it is 
76b0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 70 65 72 66  possible to perf
76c0: 6f 72 6d 20 76 61 72 69 6f 75 73 20 73 65 74 20  orm various set 
76d0: 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  .  operations on
76e0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
76f0: 62 61 73 69 63 20 71 75 65 72 69 65 73 2e 20 54  basic queries. T
7700: 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
7710: 6c 79 20 74 68 72 65 65 20 0a 20 20 73 75 70 70  ly three .  supp
7720: 6f 72 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73  orted operations
7730: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54  :..<ul>.  <li> T
7740: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
7750: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 3c  determines the <
7760: 62 3e 69 6e 74 65 72 73 65 63 74 69 6f 6e 3c 2f  b>intersection</
7770: 62 3e 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f  b> of two sets o
7780: 66 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20  f documents...  
7790: 3c 6c 69 3e 20 54 68 65 20 4f 52 20 6f 70 65 72  <li> The OR oper
77a0: 61 74 6f 72 20 63 61 6c 63 75 6c 61 74 65 73 20  ator calculates 
77b0: 74 68 65 20 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e  the <b>union</b>
77c0: 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20   of two sets of 
77d0: 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c  documents...  <l
77e0: 69 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61  i> The NOT opera
77f0: 74 6f 72 20 28 6f 72 2c 20 69 66 20 75 73 69 6e  tor (or, if usin
7800: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 73  g the standard s
7810: 79 6e 74 61 78 2c 20 61 20 75 6e 61 72 79 20 22  yntax, a unary "
7820: 2d 22 20 6f 70 65 72 61 74 6f 72 29 0a 20 20 20  -" operator).   
7830: 20 20 20 20 6d 61 79 20 62 65 20 75 73 65 64 20      may be used 
7840: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 3c  to compute the <
7850: 62 3e 72 65 6c 61 74 69 76 65 20 63 6f 6d 70 6c  b>relative compl
7860: 65 6d 65 6e 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65  ement</b> of one
7870: 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 64   set of.       d
7880: 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 72 65  ocuments with re
7890: 73 70 65 63 74 20 74 6f 20 61 6e 6f 74 68 65 72  spect to another
78a0: 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54  ..</ul>..<p>.  T
78b0: 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 73 20 6d  he FTS modules m
78c0: 61 79 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 74  ay be compiled t
78d0: 6f 20 75 73 65 20 6f 6e 65 20 6f 66 20 74 77 6f  o use one of two
78e0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
78f0: 65 6e 74 20 76 65 72 73 69 6f 6e 73 0a 20 20 6f  ent versions.  o
7900: 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  f the full-text 
7910: 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 74 68  query syntax, th
7920: 65 20 22 73 74 61 6e 64 61 72 64 22 20 71 75 65  e "standard" que
7930: 72 79 20 73 79 6e 74 61 78 20 61 6e 64 20 74 68  ry syntax and th
7940: 65 20 22 65 6e 68 61 6e 63 65 64 22 20 0a 20 20  e "enhanced" .  
7950: 71 75 65 72 79 20 73 79 6e 74 61 78 2e 20 54 68  query syntax. Th
7960: 65 20 62 61 73 69 63 20 74 65 72 6d 2c 20 74 65  e basic term, te
7970: 72 6d 2d 70 72 65 66 69 78 2c 20 70 68 72 61 73  rm-prefix, phras
7980: 65 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69  e and NEAR queri
7990: 65 73 20 64 65 73 63 72 69 62 65 64 20 0a 20 20  es described .  
79a0: 61 62 6f 76 65 20 61 72 65 20 74 68 65 20 73 61  above are the sa
79b0: 6d 65 20 69 6e 20 62 6f 74 68 20 76 65 72 73 69  me in both versi
79c0: 6f 6e 73 20 6f 66 20 74 68 65 20 73 79 6e 74 61  ons of the synta
79d0: 78 2e 20 54 68 65 20 77 61 79 20 69 6e 20 77 68  x. The way in wh
79e0: 69 63 68 20 73 65 74 20 0a 20 20 6f 70 65 72 61  ich set .  opera
79f0: 74 69 6f 6e 73 20 61 72 65 20 73 70 65 63 69 66  tions are specif
7a00: 69 65 64 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ied is slightly 
7a10: 64 69 66 66 65 72 65 6e 74 2e 20 54 68 65 20 66  different. The f
7a20: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 75 62  ollowing two sub
7a30: 2d 73 65 63 74 69 6f 6e 73 20 0a 20 20 64 65 73  -sections .  des
7a40: 63 72 69 62 65 20 74 68 65 20 70 61 72 74 20 6f  cribe the part o
7a50: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 79 20  f the two query 
7a60: 73 79 6e 74 61 78 65 73 20 74 68 61 74 20 70 65  syntaxes that pe
7a70: 72 74 61 69 6e 73 20 74 6f 20 73 65 74 20 6f 70  rtains to set op
7a80: 65 72 61 74 69 6f 6e 73 2e 20 0a 20 20 52 65 66  erations. .  Ref
7a90: 65 72 20 74 6f 20 74 68 65 20 64 65 73 63 72 69  er to the descri
7aa0: 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f 20  ption of how to 
7ab0: 5b 63 6f 6d 70 69 6c 65 20 66 74 73 5d 20 66 6f  [compile fts] fo
7ac0: 72 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f  r compilation no
7ad0: 74 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22  tes...<h2 tags="
7ae0: 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73  enhanced query s
7af0: 79 6e 74 61 78 22 3e 0a 20 20 53 65 74 20 4f 70  yntax">.  Set Op
7b00: 65 72 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54  erations Using T
7b10: 68 65 20 45 6e 68 61 6e 63 65 64 20 51 75 65 72  he Enhanced Quer
7b20: 79 20 53 79 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c  y Syntax</h2>..<
7b30: 70 3e 0a 20 20 54 68 65 20 65 6e 68 61 6e 63 65  p>.  The enhance
7b40: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 73  d query syntax s
7b50: 75 70 70 6f 72 74 73 20 74 68 65 20 41 4e 44 2c  upports the AND,
7b60: 20 4f 52 20 61 6e 64 20 4e 4f 54 20 62 69 6e 61   OR and NOT bina
7b70: 72 79 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73  ry set operators
7b80: 2e 0a 20 20 45 61 63 68 20 6f 66 20 74 68 65 20  ..  Each of the 
7b90: 74 77 6f 20 6f 70 65 72 61 6e 64 73 20 74 6f 20  two operands to 
7ba0: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20  an operator may 
7bb0: 62 65 20 61 20 62 61 73 69 63 20 46 54 53 20 71  be a basic FTS q
7bc0: 75 65 72 79 2c 20 6f 72 20 74 68 65 0a 20 20 72  uery, or the.  r
7bd0: 65 73 75 6c 74 20 6f 66 20 61 6e 6f 74 68 65 72  esult of another
7be0: 20 41 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20   AND, OR or NOT 
7bf0: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f  set operation. O
7c00: 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
7c10: 20 65 6e 74 65 72 65 64 0a 20 20 75 73 69 6e 67   entered.  using
7c20: 20 63 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73   capital letters
7c30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
7c40: 79 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  y are interprete
7c50: 64 20 61 73 20 62 61 73 69 63 20 74 65 72 6d 20  d as basic term 
7c60: 71 75 65 72 69 65 73 0a 20 20 69 6e 73 74 65 61  queries.  instea
7c70: 64 20 6f 66 20 73 65 74 20 6f 70 65 72 61 74 6f  d of set operato
7c80: 72 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 41  rs...<p>.  The A
7c90: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20  ND operator may 
7ca0: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 73 70  be implicitly sp
7cb0: 65 63 69 66 69 65 64 2e 20 49 66 20 74 77 6f 20  ecified. If two 
7cc0: 62 61 73 69 63 20 71 75 65 72 69 65 73 20 61 70  basic queries ap
7cd0: 70 65 61 72 20 0a 20 20 77 69 74 68 20 6e 6f 20  pear .  with no 
7ce0: 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72 61 74  operator separat
7cf0: 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 6e 20 46  ing them in an F
7d00: 54 53 20 71 75 65 72 79 20 73 74 72 69 6e 67 2c  TS query string,
7d10: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
7d20: 0a 20 20 74 68 65 20 73 61 6d 65 20 61 73 20 69  .  the same as i
7d30: 66 20 74 68 65 20 74 77 6f 20 62 61 73 69 63 20  f the two basic 
7d40: 71 75 65 72 69 65 73 20 77 65 72 65 20 73 65 70  queries were sep
7d50: 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
7d60: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72   operator..  For
7d70: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
7d80: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 22  ery expression "
7d90: 69 6d 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f  implicit operato
7da0: 72 22 20 69 73 20 61 20 6d 6f 72 65 20 73 75 63  r" is a more suc
7db0: 63 69 6e 63 74 0a 20 20 76 65 72 73 69 6f 6e 20  cinct.  version 
7dc0: 6f 66 20 22 69 6d 70 6c 69 63 69 74 20 41 4e 44  of "implicit AND
7dd0: 20 6f 70 65 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f   operator"...<co
7de0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
7df0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   Virtual table d
7e00: 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20  eclaration</i>. 
7e10: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
7e20: 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47  TABLE docs USING
7e30: 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d   fts3();..  <i>-
7e40: 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  - Virtual table 
7e50: 64 61 74 61 3c 2f 69 3e 0a 20 20 49 4e 53 45 52  data</i>.  INSER
7e60: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
7e70: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
7e80: 45 53 28 31 2c 20 27 61 20 64 61 74 61 62 61 73  ES(1, 'a databas
7e90: 65 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 20  e is a software 
7ea0: 73 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45  system');.  INSE
7eb0: 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63  RT INTO docs(doc
7ec0: 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c  id, content) VAL
7ed0: 55 45 53 28 32 2c 20 27 73 71 6c 69 74 65 20 69  UES(2, 'sqlite i
7ee0: 73 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73  s a software sys
7ef0: 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  tem');.  INSERT 
7f00: 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c  INTO docs(docid,
7f10: 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53   content) VALUES
7f20: 28 33 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61  (3, 'sqlite is a
7f30: 20 64 61 74 61 62 61 73 65 27 29 3b 0a 0a 20 20   database');..  
7f40: 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65  <i>-- Return the
7f50: 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74   set of document
7f60: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  s that contain t
7f70: 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22  he term "sqlite"
7f80: 2c 20 61 6e 64 20 74 68 65 3c 2f 69 3e 0a 20 20  , and the</i>.  
7f90: 3c 69 3e 2d 2d 20 74 65 72 6d 20 22 64 61 74 61  <i>-- term "data
7fa0: 62 61 73 65 22 2e 20 54 68 69 73 20 71 75 65 72  base". This quer
7fb0: 79 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68  y will return th
7fc0: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
7fd0: 64 6f 63 69 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69  docid 3 only.</i
7fe0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
7ff0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
8000: 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20  s MATCH 'sqlite 
8010: 41 4e 44 20 64 61 74 61 62 61 73 65 27 3b 0a 0a  AND database';..
8020: 20 20 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c 20 72    <i>-- Again, r
8030: 65 74 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66  eturn the set of
8040: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
8050: 63 6f 6e 74 61 69 6e 20 62 6f 74 68 20 22 73 71  contain both "sq
8060: 6c 69 74 65 22 20 61 6e 64 3c 2f 69 3e 0a 20 20  lite" and</i>.  
8070: 3c 69 3e 2d 2d 20 22 64 61 74 61 62 61 73 65 22  <i>-- "database"
8080: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65  . This time, use
8090: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e 44   an implicit AND
80a0: 20 6f 70 65 72 61 74 6f 72 2e 20 41 67 61 69 6e   operator. Again
80b0: 2c 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20  , document</i>. 
80c0: 20 3c 69 3e 2d 2d 20 33 20 69 73 20 74 68 65 20   <i>-- 3 is the 
80d0: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 6d 61  only document ma
80e0: 74 63 68 65 64 20 62 79 20 74 68 69 73 20 71 75  tched by this qu
80f0: 65 72 79 2e 20 3c 2f 69 3e 0a 20 20 53 45 4c 45  ery. </i>.  SELE
8100: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
8110: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
8120: 27 64 61 74 61 62 61 73 65 20 73 71 6c 69 74 65  'database sqlite
8130: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ';..  <i>-- Quer
8140: 79 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66  y for the set of
8150: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
8160: 63 6f 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20  contains either 
8170: 22 73 71 6c 69 74 65 22 20 6f 72 20 22 64 61 74  "sqlite" or "dat
8180: 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69  abase".</i>.  <i
8190: 3e 2d 2d 20 41 6c 6c 20 74 68 72 65 65 20 64 6f  >-- All three do
81a0: 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  cuments in the d
81b0: 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 74 63  atabase are matc
81c0: 68 65 64 20 62 79 20 74 68 69 73 20 71 75 65 72  hed by this quer
81d0: 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
81e0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
81f0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
8200: 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61 73 65  lite OR database
8210: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ';..  <i>-- Quer
8220: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
8230: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
8240: 20 74 68 65 20 74 65 72 6d 20 22 64 61 74 61 62   the term "datab
8250: 61 73 65 22 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ase", but do not
8260: 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c   contain</i>.  <
8270: 69 3e 2d 2d 20 74 68 65 20 74 65 72 6d 20 22 73  i>-- the term "s
8280: 71 6c 69 74 65 22 2e 20 44 6f 63 75 6d 65 6e 74  qlite". Document
8290: 20 31 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64   1 is the only d
82a0: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 6d 61 74  ocument that mat
82b0: 63 68 65 73 20 74 68 69 73 20 63 72 69 74 65 72  ches this criter
82c0: 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ia.</i>.  SELECT
82d0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
82e0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
82f0: 61 74 61 62 61 73 65 20 4e 4f 54 20 73 71 6c 69  atabase NOT sqli
8300: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  te';..  <i>-- Th
8310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
8320: 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63  y matches no doc
8330: 75 6d 65 6e 74 73 2e 20 42 65 63 61 75 73 65 20  uments. Because 
8340: 22 61 6e 64 22 20 69 73 20 69 6e 20 6c 6f 77 65  "and" is in lowe
8350: 72 63 61 73 65 20 6c 65 74 74 65 72 73 2c 3c 2f  rcase letters,</
8360: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 74 20 69 73  i>.  <i>-- it is
8370: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
8380: 61 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65  a basic term que
8390: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  ry instead of an
83a0: 20 6f 70 65 72 61 74 6f 72 2e 20 4f 70 65 72 61   operator. Opera
83b0: 74 6f 72 73 20 6d 75 73 74 3c 2f 69 3e 0a 20 20  tors must</i>.  
83c0: 3c 69 3e 2d 2d 20 62 65 20 73 70 65 63 69 66 69  <i>-- be specifi
83d0: 65 64 20 75 73 69 6e 67 20 63 61 70 69 74 61 6c  ed using capital
83e0: 20 6c 65 74 74 65 72 73 2e 20 49 6e 20 70 72 61   letters. In pra
83f0: 63 74 69 63 65 2c 20 74 68 69 73 20 71 75 65 72  ctice, this quer
8400: 79 20 77 69 6c 6c 20 6d 61 74 63 68 20 61 6e 79  y will match any
8410: 20 64 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20   documents</i>. 
8420: 20 3c 69 3e 2d 2d 20 74 68 61 74 20 63 6f 6e 74   <i>-- that cont
8430: 61 69 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20  ain each of the 
8440: 74 68 72 65 65 20 74 65 72 6d 73 20 22 64 61 74  three terms "dat
8450: 61 62 61 73 65 22 2c 20 22 61 6e 64 22 20 61 6e  abase", "and" an
8460: 64 20 22 73 71 6c 69 74 65 22 20 61 74 20 6c 65  d "sqlite" at le
8470: 61 73 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20  ast once.</i>.  
8480: 3c 69 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e  <i>-- No documen
8490: 74 73 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  ts in the exampl
84a0: 65 20 64 61 74 61 20 61 62 6f 76 65 20 6d 61 74  e data above mat
84b0: 63 68 20 74 68 69 73 20 63 72 69 74 65 72 69 61  ch this criteria
84c0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
84d0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
84e0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
84f0: 61 62 61 73 65 20 61 6e 64 20 73 71 6c 69 74 65  abase and sqlite
8500: 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ';.</codeblock>.
8510: 0a 3c 70 3e 0a 20 20 54 68 65 20 65 78 61 6d 70  .<p>.  The examp
8520: 6c 65 73 20 61 62 6f 76 65 20 61 6c 6c 20 75 73  les above all us
8530: 65 20 62 61 73 69 63 20 66 75 6c 6c 2d 74 65 78  e basic full-tex
8540: 74 20 74 65 72 6d 20 71 75 65 72 69 65 73 20 61  t term queries a
8550: 73 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  s both operands 
8560: 6f 66 20 0a 20 20 74 68 65 20 73 65 74 20 6f 70  of .  the set op
8570: 65 72 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73 74  erations demonst
8580: 72 61 74 65 64 2e 20 50 68 72 61 73 65 20 61 6e  rated. Phrase an
8590: 64 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 6d  d NEAR queries m
85a0: 61 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64 2c  ay also be used,
85b0: 0a 20 20 61 73 20 6d 61 79 20 74 68 65 20 72 65  .  as may the re
85c0: 73 75 6c 74 73 20 6f 66 20 6f 74 68 65 72 20 73  sults of other s
85d0: 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 57  et operations. W
85e0: 68 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  hen more than on
85f0: 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 0a  e set operation.
8600: 20 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20    is present in 
8610: 61 6e 20 46 54 53 20 71 75 65 72 79 2c 20 74 68  an FTS query, th
8620: 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  e precedence of 
8630: 6f 70 65 72 61 74 6f 72 73 20 69 73 20 61 73 20  operators is as 
8640: 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65  follows:..<table
8650: 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74   striped=1>.  <t
8660: 72 3e 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74  r><th>Operator<t
8670: 68 3e 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79  h>Enhanced Query
8680: 20 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e   Syntax Preceden
8690: 63 65 0a 20 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54  ce.  <tr><td>NOT
86a0: 20 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72   <td> Highest pr
86b0: 65 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65  ecedence (tighte
86c0: 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20  st grouping)..  
86d0: 3c 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64 3e  <tr><td>AND <td>
86e0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c  .  <tr><td>OR  <
86f0: 74 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65  td> Lowest prece
8700: 64 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67  dence (loosest g
8710: 72 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c  rouping)..</tabl
8720: 65 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75  e>..<p>.  When u
8730: 73 69 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65  sing the enhance
8740: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20  d query syntax, 
8750: 70 61 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20  parenthesis may 
8760: 62 65 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72  be used to overr
8770: 69 64 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c  ide.  the defaul
8780: 74 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  t precedence of 
8790: 74 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72  the various oper
87a0: 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
87b0: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
87c0: 0a 0a 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e  ..  <i>-- Return
87d0: 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65   the docid value
87e0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
87f0: 68 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  h all documents 
8800: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
8810: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f  </i>.  <i>-- two
8820: 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20   terms "sqlite" 
8830: 61 6e 64 20 22 64 61 74 61 62 61 73 65 22 2c 20  and "database", 
8840: 61 6e 64 2f 6f 72 20 63 6f 6e 74 61 69 6e 20 74  and/or contain t
8850: 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61 72 79  he term "library
8860: 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
8870: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8880: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8890: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
88a0: 61 62 61 73 65 20 4f 52 20 6c 69 62 72 61 72 79  abase OR library
88b0: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  ';..  <i>-- This
88c0: 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76 61   query is equiva
88d0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76  lent to the abov
88e0: 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  e.</i>.  SELECT 
88f0: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8900: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8910: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
8920: 61 62 61 73 65 27 0a 20 20 20 20 55 4e 49 4f 4e  abase'.    UNION
8930: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
8940: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8950: 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 62 72  docs MATCH 'libr
8960: 61 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ary';..  <i>-- Q
8970: 75 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74  uery for the set
8980: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68   of documents th
8990: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
89a0: 74 65 72 6d 20 22 6c 69 6e 75 78 22 2c 20 61 6e  term "linux", an
89b0: 64 20 61 74 20 6c 65 61 73 74 3c 2f 69 3e 0a 20  d at least</i>. 
89c0: 20 3c 69 3e 2d 2d 20 6f 6e 65 20 6f 66 20 74 68   <i>-- one of th
89d0: 65 20 70 68 72 61 73 65 73 20 22 73 71 6c 69 74  e phrases "sqlit
89e0: 65 20 64 61 74 61 62 61 73 65 22 20 61 6e 64 20  e database" and 
89f0: 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22  "sqlite library"
8a00: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64  .</i>.  SELECT d
8a10: 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57  ocid FROM docs W
8a20: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
8a30: 27 28 22 73 71 6c 69 74 65 20 64 61 74 61 62 61  '("sqlite databa
8a40: 73 65 22 20 4f 52 20 22 73 71 6c 69 74 65 20 6c  se" OR "sqlite l
8a50: 69 62 72 61 72 79 22 29 20 41 4e 44 20 6c 69 6e  ibrary") AND lin
8a60: 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ux';..  <i>-- Th
8a70: 69 73 20 71 75 65 72 79 20 69 73 20 65 71 75 69  is query is equi
8a80: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62  valent to the ab
8a90: 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ove.</i>.  SELEC
8aa0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
8ab0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
8ac0: 43 48 20 27 6c 69 6e 75 78 27 0a 20 20 20 20 49  CH 'linux'.    I
8ad0: 4e 54 45 52 53 45 43 54 0a 20 20 53 45 4c 45 43  NTERSECT.  SELEC
8ae0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 28 0a 20  T docid FROM (. 
8af0: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
8b00: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8b10: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c  docs MATCH '"sql
8b20: 69 74 65 20 6c 69 62 72 61 72 79 22 27 0a 20 20  ite library"'.  
8b30: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
8b40: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
8b50: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
8b60: 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20 64  MATCH '"sqlite d
8b70: 61 74 61 62 61 73 65 22 27 0a 20 20 29 3b 0a 3c  atabase"'.  );.<
8b80: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68  /codeblock>...<h
8b90: 32 3e 53 65 74 20 4f 70 65 72 61 74 69 6f 6e 73  2>Set Operations
8ba0: 20 55 73 69 6e 67 20 54 68 65 20 53 74 61 6e 64   Using The Stand
8bb0: 61 72 64 20 51 75 65 72 79 20 53 79 6e 74 61 78  ard Query Syntax
8bc0: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53  </h2>..<p>.  FTS
8bd0: 20 71 75 65 72 79 20 73 65 74 20 6f 70 65 72 61   query set opera
8be0: 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20  tions using the 
8bf0: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
8c00: 79 6e 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61  yntax are simila
8c10: 72 2c 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65  r, but.  not ide
8c20: 6e 74 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f  ntical, to set o
8c30: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74  perations with t
8c40: 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72  he enhanced quer
8c50: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a  y syntax. There.
8c60: 20 20 61 72 65 20 66 6f 75 72 20 64 69 66 66 65    are four diffe
8c70: 72 65 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f  rences, as follo
8c80: 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ws:..<ol>.  <li 
8c90: 76 61 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79  value=1><p> Only
8ca0: 20 74 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65   the implicit ve
8cb0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44  rsion of the AND
8cc0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 75 70   operator is sup
8cd0: 70 6f 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63  ported..    Spec
8ce0: 69 66 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e  ifying the strin
8cf0: 67 20 22 41 4e 44 22 20 61 73 20 70 61 72 74 20  g "AND" as part 
8d00: 6f 66 20 61 6e 20 73 74 61 6e 64 61 72 64 20 71  of an standard q
8d10: 75 65 72 79 20 73 79 6e 74 61 78 20 71 75 65 72  uery syntax quer
8d20: 79 20 69 73 0a 20 20 20 20 69 6e 74 65 72 70 72  y is.    interpr
8d30: 65 74 65 64 20 61 73 20 61 20 74 65 72 6d 20 71  eted as a term q
8d40: 75 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74  uery for the set
8d50: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f   of documents co
8d60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
8d70: 6d 20 0a 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f  m .    "and"..</
8d80: 6f 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ol>..<ol>.  <li 
8d90: 76 61 6c 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65  value=2><p> Pare
8da0: 6e 74 68 65 73 69 73 20 61 72 65 20 6e 6f 74 20  nthesis are not 
8db0: 73 75 70 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e  supported..</ol>
8dc0: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
8dd0: 75 65 3d 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54  ue=3><p> The NOT
8de0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   operator is not
8df0: 20 73 75 70 70 6f 72 74 65 64 2e 20 49 6e 73 74   supported. Inst
8e00: 65 61 64 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a  ead of the NOT .
8e10: 20 20 20 20 6f 70 65 72 61 74 6f 72 2c 20 74 68      operator, th
8e20: 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79  e standard query
8e30: 20 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73   syntax supports
8e40: 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65   a unary "-" ope
8e50: 72 61 74 6f 72 20 74 68 61 74 0a 20 20 20 20 6d  rator that.    m
8e60: 61 79 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ay be applied to
8e70: 20 62 61 73 69 63 20 74 65 72 6d 20 61 6e 64 20   basic term and 
8e80: 74 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65 72  term-prefix quer
8e90: 69 65 73 20 28 62 75 74 20 6e 6f 74 20 74 6f 20  ies (but not to 
8ea0: 70 68 72 61 73 65 0a 20 20 20 20 6f 72 20 4e 45  phrase.    or NE
8eb0: 41 52 20 71 75 65 72 69 65 73 29 2e 20 41 20 74  AR queries). A t
8ec0: 65 72 6d 20 6f 72 20 74 65 72 6d 2d 70 72 65 66  erm or term-pref
8ed0: 69 78 20 74 68 61 74 20 68 61 73 20 61 20 75 6e  ix that has a un
8ee0: 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72  ary "-" operator
8ef0: 0a 20 20 20 20 61 74 74 61 63 68 65 64 20 74 6f  .    attached to
8f00: 20 69 74 20 6d 61 79 20 6e 6f 74 20 61 70 70 65   it may not appe
8f10: 61 72 20 61 73 20 61 6e 20 6f 70 65 72 61 6e 64  ar as an operand
8f20: 20 74 6f 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   to an OR operat
8f30: 6f 72 2e 20 41 6e 20 46 54 53 0a 20 20 20 20 71  or. An FTS.    q
8f40: 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  uery may not con
8f50: 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f 66  sist entirely of
8f60: 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 2d 70   terms or term-p
8f70: 72 65 66 69 78 20 71 75 65 72 69 65 73 20 77 69  refix queries wi
8f80: 74 68 20 75 6e 61 72 79 0a 20 20 20 20 22 2d 22  th unary.    "-"
8f90: 20 6f 70 65 72 61 74 6f 72 73 20 61 74 74 61 63   operators attac
8fa0: 68 65 64 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f 6f  hed to them..</o
8fb0: 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  l>..<codeblock>.
8fc0: 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66    <i>-- Search f
8fd0: 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  or the set of do
8fe0: 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e  cuments that con
8ff0: 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 73  tain the term "s
9000: 71 6c 69 74 65 22 20 62 75 74 20 64 6f 3c 2f 69  qlite" but do</i
9010: 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f  >.  <i>-- not co
9020: 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22  ntain the term "
9030: 64 61 74 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20  database".</i>. 
9040: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
9050: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
9060: 41 54 43 48 20 27 73 71 6c 69 74 65 20 2d 64 61  ATCH 'sqlite -da
9070: 74 61 62 61 73 65 27 3b 0a 3c 2f 63 6f 64 65 62  tabase';.</codeb
9080: 6c 6f 63 6b 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c  lock>..<ol>.  <l
9090: 69 20 76 61 6c 75 65 3d 34 3e 3c 70 3e 20 54 68  i value=4><p> Th
90a0: 65 20 72 65 6c 61 74 69 76 65 20 70 72 65 63 65  e relative prece
90b0: 64 65 6e 63 65 20 6f 66 20 74 68 65 20 73 65 74  dence of the set
90c0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 73 20 64   operations is d
90d0: 69 66 66 65 72 65 6e 74 2e 20 0a 20 20 20 49 6e  ifferent. .   In
90e0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 75 73 69   particular, usi
90f0: 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ng the standard 
9100: 71 75 65 72 79 20 73 79 6e 74 61 78 20 74 68 65  query syntax the
9110: 20 22 4f 52 22 20 6f 70 65 72 61 74 6f 72 20 68   "OR" operator h
9120: 61 73 20 61 0a 20 20 20 68 69 67 68 65 72 20 70  as a.   higher p
9130: 72 65 63 65 64 65 6e 63 65 20 74 68 61 6e 20 22  recedence than "
9140: 41 4e 44 22 2e 20 54 68 65 20 70 72 65 63 65 64  AND". The preced
9150: 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72  ence of operator
9160: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65  s when using the
9170: 0a 20 20 20 73 74 61 6e 64 61 72 64 20 71 75 65  .   standard que
9180: 72 79 20 73 79 6e 74 61 78 20 69 73 3a 20 0a 3c  ry syntax is: .<
9190: 2f 6f 6c 3e 0a 0a 3c 74 61 62 6c 65 20 73 74 72  /ol>..<table str
91a0: 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
91b0: 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e 53 74  h>Operator<th>St
91c0: 61 6e 64 61 72 64 20 51 75 65 72 79 20 53 79 6e  andard Query Syn
91d0: 74 61 78 20 50 72 65 63 65 64 65 6e 63 65 0a 20  tax Precedence. 
91e0: 20 3c 74 72 3e 3c 74 64 3e 55 6e 61 72 79 20 22   <tr><td>Unary "
91f0: 2d 22 20 3c 74 64 3e 20 48 69 67 68 65 73 74 20  -" <td> Highest 
9200: 70 72 65 63 65 64 65 6e 63 65 20 28 74 69 67 68  precedence (tigh
9210: 74 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a  test grouping)..
9220: 20 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74    <tr><td>OR  <t
9230: 64 3e 0a 20 20 3c 74 72 3e 3c 74 64 3e 41 4e 44  d>.  <tr><td>AND
9240: 20 3c 74 64 3e 20 4c 6f 77 65 73 74 20 70 72 65   <td> Lowest pre
9250: 63 65 64 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74  cedence (loosest
9260: 20 67 72 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61   grouping)..</ta
9270: 62 6c 65 3e 0a 0a 3c 6f 6c 3e 3c 6c 69 20 73 74  ble>..<ol><li st
9280: 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c 65 3a  yle="list-style:
9290: 6e 6f 6e 65 22 3e 0a 20 20 54 68 65 20 66 6f 6c  none">.  The fol
92a0: 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69  lowing example i
92b0: 6c 6c 75 73 74 72 61 74 65 73 20 70 72 65 63 65  llustrates prece
92c0: 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f  dence of operato
92d0: 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 74 61  rs using the sta
92e0: 6e 64 61 72 64 20 0a 20 20 71 75 65 72 79 20 73  ndard .  query s
92f0: 79 6e 74 61 78 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63  yntax:.</ol>..<c
9300: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
9310: 2d 20 53 65 61 72 63 68 20 66 6f 72 20 64 6f 63  - Search for doc
9320: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
9330: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
9340: 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 22 64   of the terms "d
9350: 61 74 61 62 61 73 65 22 3c 2f 69 3e 0a 20 20 3c  atabase"</i>.  <
9360: 69 3e 2d 2d 20 61 6e 64 20 22 73 71 6c 69 74 65  i>-- and "sqlite
9370: 22 2c 20 61 6e 64 20 61 6c 73 6f 20 63 6f 6e 74  ", and also cont
9380: 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 6c 69  ain the term "li
9390: 62 72 61 72 79 22 2e 20 42 65 63 61 75 73 65 20  brary". Because 
93a0: 6f 66 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  of the differenc
93b0: 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69  es</i>.  <i>-- i
93c0: 6e 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65  n operator prece
93d0: 64 65 6e 63 65 73 2c 20 74 68 69 73 20 71 75 65  dences, this que
93e0: 72 79 20 77 6f 75 6c 64 20 68 61 76 65 20 61 20  ry would have a 
93f0: 64 69 66 66 65 72 65 6e 74 20 69 6e 74 65 72 70  different interp
9400: 72 65 74 61 74 69 6f 6e 20 75 73 69 6e 67 3c 2f  retation using</
9410: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 65  i>.  <i>-- the e
9420: 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79  nhanced query sy
9430: 6e 74 61 78 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ntax.</i>.  SELE
9440: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
9450: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
9460: 27 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62  'sqlite OR datab
9470: 61 73 65 20 6c 69 62 72 61 72 79 27 3b 0a 3c 2f  ase library';.</
9480: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c  codeblock>..<tcl
9490: 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 73 6e 69  >hd_fragment sni
94a0: 70 70 65 74 20 7b 46 54 53 20 61 75 78 69 6c 69  ppet {FTS auxili
94b0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 7d 3c 2f  ary functions}</
94c0: 74 63 6c 3e 0a 3c 68 31 3e 41 75 78 69 6c 69 61  tcl>.<h1>Auxilia
94d0: 72 79 20 46 75 6e 63 74 69 6f 6e 73 20 2d 20 53  ry Functions - S
94e0: 6e 69 70 70 65 74 2c 20 4f 66 66 73 65 74 73 20  nippet, Offsets 
94f0: 61 6e 64 20 4d 61 74 63 68 69 6e 66 6f 3c 2f 68  and Matchinfo</h
9500: 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54  1>..<p>.  The FT
9510: 53 33 20 61 6e 64 20 46 54 53 34 20 6d 6f 64 75  S3 and FTS4 modu
9520: 6c 65 73 20 70 72 6f 76 69 64 65 20 74 68 72 65  les provide thre
9530: 65 20 73 70 65 63 69 61 6c 20 53 51 4c 20 73 63  e special SQL sc
9540: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  alar functions t
9550: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 66 75  hat may be usefu
9560: 6c 0a 20 20 74 6f 20 74 68 65 20 64 65 76 65 6c  l.  to the devel
9570: 6f 70 65 72 73 20 6f 66 20 66 75 6c 6c 2d 74 65  opers of full-te
9580: 78 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 73  xt query systems
9590: 3a 20 22 73 6e 69 70 70 65 74 22 2c 20 22 6f 66  : "snippet", "of
95a0: 66 73 65 74 73 22 20 61 6e 64 0a 20 20 22 6d 61  fsets" and.  "ma
95b0: 74 63 68 69 6e 66 6f 22 2e 20 54 68 65 20 70 75  tchinfo". The pu
95c0: 72 70 6f 73 65 20 6f 66 20 74 68 65 20 22 73 6e  rpose of the "sn
95d0: 69 70 70 65 74 22 20 61 6e 64 20 22 6f 66 66 73  ippet" and "offs
95e0: 65 74 73 22 20 66 75 6e 63 74 69 6f 6e 73 20 69  ets" functions i
95f0: 73 20 74 6f 20 61 6c 6c 6f 77 0a 20 20 74 68 65  s to allow.  the
9600: 20 75 73 65 72 20 74 6f 20 69 64 65 6e 74 69 66   user to identif
9610: 79 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  y the location o
9620: 66 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 20  f queried terms 
9630: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
9640: 64 6f 63 75 6d 65 6e 74 73 2e 0a 20 20 54 68 65  documents..  The
9650: 20 22 6d 61 74 63 68 69 6e 66 6f 22 20 66 75 6e   "matchinfo" fun
9660: 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 74  ction provides t
9670: 68 65 20 75 73 65 72 20 77 69 74 68 20 6d 65 74  he user with met
9680: 72 69 63 73 20 74 68 61 74 20 6d 61 79 20 62 65  rics that may be
9690: 20 75 73 65 66 75 6c 0a 20 20 66 6f 72 20 66 69   useful.  for fi
96a0: 6c 74 65 72 69 6e 67 20 6f 72 20 73 6f 72 74 69  ltering or sorti
96b0: 6e 67 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  ng query results
96c0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
96d0: 6c 65 76 61 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20  levance...<p>.  
96e0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
96f0: 6e 74 20 74 6f 20 61 6c 6c 20 74 68 72 65 65 20  nt to all three 
9700: 73 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c  special SQL scal
9710: 61 72 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 6d  ar functions.  m
9720: 75 73 74 20 62 65 20 74 68 65 20 5b 46 54 53 20  ust be the [FTS 
9730: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 6f  hidden column] o
9740: 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  f the FTS table 
9750: 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
9760: 6e 20 69 73 0a 20 20 61 70 70 6c 69 65 64 20 74  n is.  applied t
9770: 6f 2e 20 20 54 68 65 20 5b 46 54 53 20 68 69 64  o.  The [FTS hid
9780: 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 69 73 20 61  den column] is a
9790: 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2d  n automatically-
97a0: 67 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e  generated column
97b0: 20 66 6f 75 6e 64 20 6f 6e 0a 20 20 61 6c 6c 20   found on.  all 
97c0: 46 54 53 20 74 61 62 6c 65 73 20 74 68 61 74 20  FTS tables that 
97d0: 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
97e0: 65 20 61 73 20 74 68 65 20 46 54 53 20 74 61 62  e as the FTS tab
97f0: 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 46 6f 72  le itself..  For
9800: 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20   example, given 
9810: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d  an FTS table nam
9820: 65 64 20 22 6d 61 69 6c 22 3a 0a 0a 3c 63 6f 64  ed "mail":..<cod
9830: 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54  eblock>.  SELECT
9840: 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46   offsets(mail) F
9850: 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d  ROM mail WHERE m
9860: 61 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75  ail MATCH &lt;fu
9870: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 65 78  ll-text query ex
9880: 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20  pression&gt;;.  
9890: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 6d  SELECT snippet(m
98a0: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
98b0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
98c0: 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75  &lt;full-text qu
98d0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67  ery expression&g
98e0: 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20 6d 61 74  t;;.  SELECT mat
98f0: 63 68 69 6e 66 6f 28 6d 61 69 6c 29 20 46 52 4f  chinfo(mail) FRO
9900: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
9910: 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c  l MATCH &lt;full
9920: 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72  -text query expr
9930: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f  ession&gt;;.</co
9940: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
9950: 54 68 65 20 74 68 72 65 65 20 61 75 78 69 6c 69  The three auxili
9960: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ary functions ar
9970: 65 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 69  e only useful wi
9980: 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  thin a SELECT st
9990: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 75  atement that.  u
99a0: 73 65 73 20 74 68 65 20 46 54 53 20 74 61 62 6c  ses the FTS tabl
99b0: 65 27 73 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  e's full-text in
99c0: 64 65 78 2e 20 5e 49 66 20 75 73 65 64 20 77 69  dex. ^If used wi
99d0: 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 74 68  thin a SELECT th
99e0: 61 74 20 75 73 65 73 0a 20 20 74 68 65 20 22 71  at uses.  the "q
99f0: 75 65 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f  uery by rowid" o
9a00: 72 20 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 20  r "linear scan" 
9a10: 73 74 72 61 74 65 67 69 65 73 2c 20 74 68 65 6e  strategies, then
9a20: 20 74 68 65 20 73 6e 69 70 70 65 74 20 61 6e 64   the snippet and
9a30: 0a 20 20 6f 66 66 73 65 74 73 20 62 6f 74 68 20  .  offsets both 
9a40: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
9a50: 73 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  string, and the 
9a60: 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
9a70: 6f 6e 20 72 65 74 75 72 6e 73 0a 20 20 61 20 62  on returns.  a b
9a80: 6c 6f 62 20 76 61 6c 75 65 20 7a 65 72 6f 20 62  lob value zero b
9a90: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 0a 3c  ytes in size...<
9aa0: 70 20 69 64 3d 6d 61 74 63 68 61 62 6c 65 3e 0a  p id=matchable>.
9ab0: 20 20 41 6c 6c 20 74 68 72 65 65 20 61 75 78 69    All three auxi
9ac0: 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20  liary functions 
9ad0: 65 78 74 72 61 63 74 20 61 20 73 65 74 20 6f 66  extract a set of
9ae0: 20 22 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61   "matchable phra
9af0: 73 65 73 22 20 66 72 6f 6d 0a 20 20 74 68 65 20  ses" from.  the 
9b00: 46 54 53 20 71 75 65 72 79 20 65 78 70 72 65 73  FTS query expres
9b10: 73 69 6f 6e 20 74 6f 20 77 6f 72 6b 20 77 69 74  sion to work wit
9b20: 68 2e 20 54 68 65 20 73 65 74 20 6f 66 20 6d 61  h. The set of ma
9b30: 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20  tchable phrases 
9b40: 66 6f 72 0a 20 20 61 20 67 69 76 65 6e 20 71 75  for.  a given qu
9b50: 65 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ery consists of 
9b60: 61 6c 6c 20 70 68 72 61 73 65 73 20 28 69 6e 63  all phrases (inc
9b70: 6c 75 64 69 6e 67 20 75 6e 71 75 6f 74 65 64 20  luding unquoted 
9b80: 74 6f 6b 65 6e 73 20 61 6e 64 0a 20 20 74 6f 6b  tokens and.  tok
9b90: 65 6e 20 70 72 65 66 69 78 65 73 29 20 69 6e 20  en prefixes) in 
9ba0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
9bb0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
9bc0: 20 61 72 65 20 70 72 65 66 69 78 65 64 20 77 69   are prefixed wi
9bd0: 74 68 0a 20 20 61 20 75 6e 61 72 79 20 22 2d 22  th.  a unary "-"
9be0: 20 6f 70 65 72 61 74 6f 72 20 28 73 74 61 6e 64   operator (stand
9bf0: 61 72 64 20 73 79 6e 74 61 78 29 20 6f 72 20 61  ard syntax) or a
9c00: 72 65 20 70 61 72 74 20 6f 66 20 61 20 73 75 62  re part of a sub
9c10: 2d 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 74  -expression .  t
9c20: 68 61 74 20 69 73 20 75 73 65 64 20 61 73 20 74  hat is used as t
9c30: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  he right-hand op
9c40: 65 72 61 6e 64 20 6f 66 20 61 20 4e 4f 54 20 6f  erand of a NOT o
9c50: 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20  perator...<p>.  
9c60: 57 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  With the followi
9c70: 6e 67 20 70 72 6f 76 69 73 6f 73 2c 20 65 61 63  ng provisos, eac
9c80: 68 20 73 65 72 69 65 73 20 6f 66 20 74 6f 6b 65  h series of toke
9c90: 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ns in the FTS ta
9ca0: 62 6c 65 20 74 68 61 74 0a 20 20 6d 61 74 63 68  ble that.  match
9cb0: 65 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6d 61  es one of the ma
9cc0: 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20  tchable phrases 
9cd0: 69 6e 20 74 68 65 20 71 75 65 72 79 20 65 78 70  in the query exp
9ce0: 72 65 73 73 69 6f 6e 20 69 73 20 6b 6e 6f 77 6e  ression is known
9cf0: 20 61 73 20 61 0a 20 20 22 70 68 72 61 73 65 20   as a.  "phrase 
9d00: 6d 61 74 63 68 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20  match":..<ol>.  
9d10: 3c 6c 69 3e 20 49 66 20 61 20 6d 61 74 63 68 61  <li> If a matcha
9d20: 62 6c 65 20 70 68 72 61 73 65 20 69 73 20 70 61  ble phrase is pa
9d30: 72 74 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f  rt of a series o
9d40: 66 20 70 68 72 61 73 65 73 20 63 6f 6e 6e 65 63  f phrases connec
9d50: 74 65 64 20 62 79 0a 20 20 20 20 20 20 20 4e 45  ted by.       NE
9d60: 41 52 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  AR operators in 
9d70: 74 68 65 20 46 54 53 20 71 75 65 72 79 20 65 78  the FTS query ex
9d80: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 65  pression, then e
9d90: 61 63 68 20 70 68 72 61 73 65 20 6d 61 74 63 68  ach phrase match
9da0: 0a 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20  .       must be 
9db0: 73 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f  sufficiently clo
9dc0: 73 65 20 74 6f 20 6f 74 68 65 72 20 70 68 72 61  se to other phra
9dd0: 73 65 20 6d 61 74 63 68 65 73 20 6f 66 20 74 68  se matches of th
9de0: 65 20 72 65 6c 65 76 61 6e 74 0a 20 20 20 20 20  e relevant.     
9df0: 20 20 74 79 70 65 73 20 74 6f 20 73 61 74 69 73    types to satis
9e00: 66 79 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 64  fy the NEAR cond
9e10: 69 74 69 6f 6e 2e 0a 0a 20 20 3c 6c 69 3e 20 49  ition...  <li> I
9e20: 66 20 74 68 65 20 6d 61 74 63 68 61 62 6c 65 20  f the matchable 
9e30: 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 46 54  phrase in the FT
9e40: 53 20 71 75 65 72 79 20 69 73 20 72 65 73 74 72  S query is restr
9e50: 69 63 74 65 64 20 74 6f 20 6d 61 74 63 68 69 6e  icted to matchin
9e60: 67 0a 20 20 20 20 20 20 20 64 61 74 61 20 69 6e  g.       data in
9e70: 20 61 20 73 70 65 63 69 66 69 65 64 20 46 54 53   a specified FTS
9e80: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
9e90: 68 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20  hen only phrase 
9ea0: 6d 61 74 63 68 65 73 20 74 68 61 74 20 0a 20 20  matches that .  
9eb0: 20 20 20 20 20 6f 63 63 75 72 20 77 69 74 68 69       occur withi
9ec0: 6e 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 72  n that column ar
9ed0: 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 3c 2f  e considered..</
9ee0: 6f 6c 3e 0a 20 0a 3c 74 63 6c 3e 68 64 5f 66 72  ol>. .<tcl>hd_fr
9ef0: 61 67 6d 65 6e 74 20 6f 66 66 73 65 74 73 20 6f  agment offsets o
9f00: 66 66 73 65 74 73 3c 2f 74 63 6c 3e 0a 3c 68 32  ffsets</tcl>.<h2
9f10: 3e 54 68 65 20 4f 66 66 73 65 74 73 20 46 75 6e  >The Offsets Fun
9f20: 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ction</h2>..<p>.
9f30: 20 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 71    For a SELECT q
9f40: 75 65 72 79 20 74 68 61 74 20 75 73 65 73 20 74  uery that uses t
9f50: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
9f60: 65 78 2c 20 74 68 65 20 6f 66 66 73 65 74 73 28  ex, the offsets(
9f70: 29 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65  ) function .  re
9f80: 74 75 72 6e 73 20 61 20 74 65 78 74 20 76 61 6c  turns a text val
9f90: 75 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ue containing a 
9fa0: 73 65 72 69 65 73 20 6f 66 20 73 70 61 63 65 2d  series of space-
9fb0: 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65  separated intege
9fc0: 72 73 2e 20 46 6f 72 0a 20 20 65 61 63 68 20 74  rs. For.  each t
9fd0: 65 72 6d 20 69 6e 20 65 61 63 68 20 3c 61 20 68  erm in each <a h
9fe0: 72 65 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70  ref=#matchable>p
9ff0: 68 72 61 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20  hrase match</a> 
a000: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
a010: 6f 77 2c 20 0a 20 20 74 68 65 72 65 20 61 72 65  ow, .  there are
a020: 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69   four integers i
a030: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6c  n the returned l
a040: 69 73 74 2e 20 45 61 63 68 20 73 65 74 20 6f 66  ist. Each set of
a050: 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69   four integers i
a060: 73 20 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64  s .  interpreted
a070: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74   as follows:..<t
a080: 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
a090: 20 20 3c 74 72 3e 3c 74 68 3e 49 6e 74 65 67 65    <tr><th>Intege
a0a0: 72 20 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61  r <th>Interpreta
a0b0: 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 30  tion.  <tr><td>0
a0c0: 20 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20   .      <td>The 
a0d0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 68  column number th
a0e0: 61 74 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74  at the term inst
a0f0: 61 6e 63 65 20 6f 63 63 75 72 73 20 69 6e 20 28  ance occurs in (
a100: 30 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  0 for the.      
a110: 20 20 20 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c      leftmost col
a120: 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 74  umn of the FTS t
a130: 61 62 6c 65 2c 20 31 20 66 6f 72 20 74 68 65 20  able, 1 for the 
a140: 6e 65 78 74 20 6c 65 66 74 6d 6f 73 74 2c 20 65  next leftmost, e
a150: 74 63 2e 29 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  tc.)..  <tr><td>
a160: 31 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20  1.      <td>The 
a170: 74 65 72 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74  term number of t
a180: 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d  he matching term
a190: 20 77 69 74 68 69 6e 20 74 68 65 20 66 75 6c 6c   within the full
a1a0: 2d 74 65 78 74 20 71 75 65 72 79 0a 20 20 20 20  -text query.    
a1b0: 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
a1c0: 2e 20 54 65 72 6d 73 20 77 69 74 68 69 6e 20 61  . Terms within a
a1d0: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
a1e0: 6e 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  n are numbered s
a1f0: 74 61 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20  tarting.        
a200: 20 20 66 72 6f 6d 20 30 20 69 6e 20 74 68 65 20    from 0 in the 
a210: 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20  order that they 
a220: 6f 63 63 75 72 2e 0a 20 20 3c 74 72 3e 3c 74 64  occur..  <tr><td
a230: 3e 32 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65  >2.      <td>The
a240: 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   byte offset of 
a250: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72  the matching ter
a260: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6c  m within the col
a270: 75 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 33  umn..  <tr><td>3
a280: 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 73  .      <td>The s
a290: 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ize of the match
a2a0: 69 6e 67 20 74 65 72 6d 20 69 6e 20 62 79 74 65  ing term in byte
a2b0: 73 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e  s..</table>..<p>
a2c0: 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a2d0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
a2e0: 65 78 61 6d 70 6c 65 73 20 74 68 61 74 20 75 73  examples that us
a2f0: 65 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75  e the offsets fu
a300: 6e 63 74 69 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c  nction...<codebl
a310: 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56 49  ock>.  CREATE VI
a320: 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c  RTUAL TABLE mail
a330: 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a   USING fts3(subj
a340: 65 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49 4e  ect, body);.  IN
a350: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56  SERT INTO mail V
a360: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72  ALUES('hello wor
a370: 6c 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73 61  ld', 'This messa
a380: 67 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77 6f  ge is a hello wo
a390: 72 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b 0a  rld message.');.
a3a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
a3b0: 69 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65 6e  il VALUES('urgen
a3c0: 74 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54 68  t: serious', 'Th
a3d0: 69 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e 20  is mail is seen 
a3e0: 61 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f 75  as a more seriou
a3f0: 73 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e  s mail');..  <i>
a400: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
a410: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61   query returns a
a420: 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73 20   single row (as 
a430: 69 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20  it matches only 
a440: 74 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20 20  the first</i>.  
a450: 3c 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20 74  <i>-- entry in t
a460: 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68 65  able "mail". The
a470: 20 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62   text returned b
a480: 79 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75  y the offsets fu
a490: 6e 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20  nction is</i>.  
a4a0: 3c 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20 31  <i>-- "0 0 6 5 1
a4b0: 20 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20 20   0 24 5".</i>.  
a4c0: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
a4d0: 2d 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20  - The first set 
a4e0: 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73  of four integers
a4f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69   in the result i
a500: 6e 64 69 63 61 74 65 20 74 68 61 74 20 63 6f 6c  ndicate that col
a510: 75 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  umn 0</i>.  <i>-
a520: 2d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  - contains an in
a530: 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30  stance of term 0
a540: 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79   ("world") at by
a550: 74 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68 65  te offset 6. The
a560: 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c 2f   term instance</
a570: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35 20  i>.  <i>-- is 5 
a580: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
a590: 68 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f 66  he second set of
a5a0: 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 73   four integers s
a5b0: 68 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e  hows that column
a5c0: 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f   1</i>.  <i>-- o
a5d0: 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 72 6f  f the matched ro
a5e0: 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  w contains an in
a5f0: 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30  stance of term 0
a600: 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79   ("world") at by
a610: 74 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20 20  te offset</i>.  
a620: 3c 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e 2c  <i>-- 24. Again,
a630: 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e   the term instan
a640: 63 65 20 69 73 20 35 20 62 79 74 65 73 20 69 6e  ce is 5 bytes in
a650: 20 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c   size.</i>.  SEL
a660: 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c  ECT offsets(mail
a670: 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  ) FROM mail WHER
a680: 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77 6f  E mail MATCH 'wo
a690: 72 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  rld';..  <i>-- T
a6a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
a6b0: 72 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f 20  ry returns also 
a6c0: 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65  matches only the
a6d0: 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74 61   first row in ta
a6e0: 62 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a  ble "mail".</i>.
a6f0: 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73 20    <i>-- In this 
a700: 63 61 73 65 20 74 68 65 20 72 65 74 75 72 6e 65  case the returne
a710: 64 20 74 65 78 74 20 69 73 20 22 31 20 30 20 35  d text is "1 0 5
a720: 20 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f 69   7 1 0 30 7".</i
a730: 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65  >.  SELECT offse
a740: 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61  ts(mail) FROM ma
a750: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
a760: 54 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a 0a  TCH 'message';..
a770: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
a780: 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63  owing query matc
a790: 68 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 72  hes the second r
a7a0: 6f 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69  ow in table "mai
a7b0: 6c 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  l". It returns t
a7c0: 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  he</i>.  <i>-- t
a7d0: 65 78 74 20 22 31 20 30 20 32 38 20 37 20 31 20  ext "1 0 28 7 1 
a7e0: 31 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74 68  1 36 4". Only th
a7f0: 6f 73 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20  ose occurrences 
a800: 6f 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75  of terms "seriou
a810: 73 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69  s" and "mail"</i
a820: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61  >.  <i>-- that a
a830: 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  re part of an in
a840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68  stance of the ph
a850: 72 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61  rase "serious ma
a860: 69 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69  il" are identifi
a870: 65 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69  ed; the</i>.  <i
a880: 3e 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 72  >-- other occurr
a890: 65 6e 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75  ences of "seriou
a8a0: 73 22 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72  s" and "mail" ar
a8b0: 65 20 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20  e ignored.</i>. 
a8c0: 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28   SELECT offsets(
a8d0: 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20  mail) FROM mail 
a8e0: 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48  WHERE mail MATCH
a8f0: 20 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22   '"serious mail"
a900: 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ';.</codeblock>.
a910: 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
a920: 74 20 73 6e 69 70 70 65 74 20 73 6e 69 70 70 65  t snippet snippe
a930: 74 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68 65 20  t</tcl>.<h2>The 
a940: 53 6e 69 70 70 65 74 20 46 75 6e 63 74 69 6f 6e  Snippet Function
a950: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h2>..<p>.  The
a960: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
a970: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  n is used to cre
a980: 61 74 65 20 66 6f 72 6d 61 74 74 65 64 20 66 72  ate formatted fr
a990: 61 67 6d 65 6e 74 73 20 6f 66 20 64 6f 63 75 6d  agments of docum
a9a0: 65 6e 74 20 74 65 78 74 0a 20 20 66 6f 72 20 64  ent text.  for d
a9b0: 69 73 70 6c 61 79 20 61 73 20 70 61 72 74 20 6f  isplay as part o
a9c0: 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  f a full-text qu
a9d0: 65 72 79 20 72 65 73 75 6c 74 73 20 72 65 70 6f  ery results repo
a9e0: 72 74 2e 20 54 68 65 20 73 6e 69 70 70 65 74 20  rt. The snippet 
a9f0: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 6d 61 79 20  function .  may 
aa00: 62 65 20 70 61 73 73 65 64 20 62 65 74 77 65 65  be passed betwee
aa10: 6e 20 6f 6e 65 20 61 6e 64 20 73 69 78 20 61 72  n one and six ar
aa20: 67 75 6d 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c  guments, as foll
aa30: 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ows:..<table str
aa40: 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
aa50: 68 3e 41 72 67 75 6d 65 6e 74 20 3c 74 68 3e 44  h>Argument <th>D
aa60: 65 66 61 75 6c 74 20 56 61 6c 75 65 20 3c 74 68  efault Value <th
aa70: 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c  >Description.  <
aa80: 74 72 3e 3c 74 64 3e 30 20 3c 74 64 3e 4e 2f 41  tr><td>0 <td>N/A
aa90: 0a 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20  .      <td> The 
aaa0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
aab0: 6f 20 74 68 65 20 73 6e 69 70 70 65 74 20 66 75  o the snippet fu
aac0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
aad0: 79 73 20 62 65 20 74 68 65 20 5b 46 54 53 20 68  ys be the [FTS h
aae0: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 0a 20 20  idden column].  
aaf0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
ab00: 46 54 53 20 74 61 62 6c 65 20 62 65 69 6e 67 20  FTS table being 
ab10: 71 75 65 72 69 65 64 20 61 6e 64 20 66 72 6f 6d  queried and from
ab20: 20 77 68 69 63 68 20 74 68 65 20 73 6e 69 70 70   which the snipp
ab30: 65 74 20 69 73 20 74 6f 20 62 65 20 74 61 6b 65  et is to be take
ab40: 6e 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  n.  The.        
ab50: 20 20 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63     [FTS hidden c
ab60: 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61 75 74  olumn] is an aut
ab70: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
ab80: 61 74 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68  ated column with
ab90: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
aba0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
abb0: 20 46 54 53 20 74 61 62 6c 65 20 69 74 73 65 6c   FTS table itsel
abc0: 66 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 20 3c  f..  <tr><td>1 <
abd0: 74 64 3e 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20  td>"&lt;b&gt;". 
abe0: 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 73       <td> The "s
abf0: 74 61 72 74 20 6d 61 74 63 68 22 20 74 65 78 74  tart match" text
ac00: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 20 3c 74  ..  <tr><td>2 <t
ac10: 64 3e 22 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20  d>"&lt;/b&gt;". 
ac20: 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 65       <td> The "e
ac30: 6e 64 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a  nd match" text..
ac40: 20 20 3c 74 72 3e 3c 74 64 3e 33 20 3c 74 64 3e    <tr><td>3 <td>
ac50: 22 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74  "&lt;b&gt;...&lt
ac60: 3b 2f 62 26 67 74 3b 22 0a 20 20 20 20 20 20 3c  ;/b&gt;".      <
ac70: 74 64 3e 20 54 68 65 20 22 65 6c 6c 69 70 73 65  td> The "ellipse
ac80: 73 22 20 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c  s" text..  <tr><
ac90: 74 64 3e 34 20 3c 74 64 3e 2d 31 0a 20 20 20 20  td>4 <td>-1.    
aca0: 20 20 3c 74 64 3e 20 54 68 65 20 46 54 53 20 74    <td> The FTS t
acb0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  able column numb
acc0: 65 72 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  er to extract th
acd0: 65 20 72 65 74 75 72 6e 65 64 20 66 72 61 67 6d  e returned fragm
ace0: 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ents of.        
acf0: 20 20 20 74 65 78 74 20 66 72 6f 6d 2e 20 43 6f     text from. Co
ad00: 6c 75 6d 6e 73 20 61 72 65 20 6e 75 6d 62 65 72  lumns are number
ad10: 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
ad20: 72 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77  right starting w
ad30: 69 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 7a  ith.           z
ad40: 65 72 6f 2e 20 41 20 6e 65 67 61 74 69 76 65 20  ero. A negative 
ad50: 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
ad60: 74 68 61 74 20 74 68 65 20 74 65 78 74 20 6d 61  that the text ma
ad70: 79 20 62 65 20 65 78 74 72 61 63 74 65 64 0a 20  y be extracted. 
ad80: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61            from a
ad90: 6e 79 20 63 6f 6c 75 6d 6e 2e 0a 20 20 3c 74 72  ny column..  <tr
ada0: 3e 3c 74 64 3e 35 20 3c 74 64 3e 2d 31 35 0a 20  ><td>5 <td>-15. 
adb0: 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 61 62       <td> The ab
adc0: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
add0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 61 72 67  this integer arg
ade0: 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 61 73  ument is used as
adf0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
ae00: 20 28 61 70 70 72 6f 78 69 6d 61 74 65 29 20 6e   (approximate) n
ae10: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
ae20: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
ae30: 65 20 72 65 74 75 72 6e 65 64 20 74 65 78 74 20  e returned text 
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75  .           valu
ae50: 65 2e 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  e. The maximum a
ae60: 6c 6c 6f 77 61 62 6c 65 20 61 62 73 6f 6c 75 74  llowable absolut
ae70: 65 20 76 61 6c 75 65 20 69 73 20 36 34 2e 20 54  e value is 64. T
ae80: 68 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 20 20  he value of.    
ae90: 20 20 20 20 20 20 20 74 68 69 73 20 61 72 67 75         this argu
aea0: 6d 65 6e 74 20 69 73 20 72 65 66 65 72 72 65 64  ment is referred
aeb0: 20 74 6f 20 61 73 20 3c 69 3e 4e 3c 2f 69 3e 20   to as <i>N</i> 
aec0: 69 6e 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  in the discussio
aed0: 6e 20 62 65 6c 6f 77 2e 0a 3c 2f 74 61 62 6c 65  n below..</table
aee0: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69  >..<p>.  The sni
aef0: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 66 69  ppet function fi
af00: 72 73 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  rst attempts to 
af10: 66 69 6e 64 20 61 20 66 72 61 67 6d 65 6e 74 20  find a fragment 
af20: 6f 66 20 74 65 78 74 20 63 6f 6e 73 69 73 74 69  of text consisti
af30: 6e 67 0a 20 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f  ng.  of <i>|N|</
af40: 69 3e 20 74 6f 6b 65 6e 73 20 77 69 74 68 69 6e  i> tokens within
af50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
af60: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
af70: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 68 72 61  t least one phra
af80: 73 65 20 0a 20 20 6d 61 74 63 68 20 66 6f 72 20  se .  match for 
af90: 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70  each matchable p
afa0: 68 72 61 73 65 20 6d 61 74 63 68 65 64 20 73 6f  hrase matched so
afb0: 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 63  mewhere in the c
afc0: 75 72 72 65 6e 74 20 72 6f 77 2c 20 0a 20 20 77  urrent row, .  w
afd0: 68 65 72 65 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20  here <i>|N|</i> 
afe0: 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20  is the absolute 
aff0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 69 78  value of the six
b000: 74 68 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  th argument pass
b010: 65 64 20 74 6f 20 74 68 65 0a 20 20 73 6e 69 70  ed to the.  snip
b020: 70 65 74 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  pet function. If
b030: 20 74 68 65 20 74 65 78 74 20 73 74 6f 72 65 64   the text stored
b040: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   in a single col
b050: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73  umn contains les
b060: 73 20 74 68 61 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c  s than.  <i>|N|<
b070: 2f 69 3e 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e  /i> tokens, then
b080: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6c 75   the entire colu
b090: 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 73  mn value is cons
b0a0: 69 64 65 72 65 64 2e 20 54 65 78 74 20 66 72 61  idered. Text fra
b0b0: 67 6d 65 6e 74 73 20 0a 20 20 6d 61 79 20 6e 6f  gments .  may no
b0c0: 74 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20  t span multiple 
b0d0: 63 6f 6c 75 6d 6e 73 2e 0a 0a 3c 70 3e 0a 20 20  columns...<p>.  
b0e0: 49 66 20 73 75 63 68 20 61 20 74 65 78 74 20 66  If such a text f
b0f0: 72 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66  ragment can be f
b100: 6f 75 6e 64 2c 20 69 74 20 69 73 20 72 65 74 75  ound, it is retu
b110: 72 6e 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  rned with the fo
b120: 6c 6c 6f 77 69 6e 67 0a 20 20 6d 6f 64 69 66 69  llowing.  modifi
b130: 63 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20  cations:..<ul>. 
b140: 20 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65 78   <li> If the tex
b150: 74 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20  t fragment does 
b160: 6e 6f 74 20 62 65 67 69 6e 20 61 74 20 74 68 65  not begin at the
b170: 20 73 74 61 72 74 20 6f 66 20 61 20 63 6f 6c 75   start of a colu
b180: 6d 6e 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  mn value,.      
b190: 20 74 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20   the "ellipses" 
b1a0: 74 65 78 74 20 69 73 20 70 72 65 70 65 6e 64 65  text is prepende
b1b0: 64 20 74 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20  d to it..  <li> 
b1c0: 49 66 20 74 68 65 20 74 65 78 74 20 66 72 61 67  If the text frag
b1d0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 66 69  ment does not fi
b1e0: 6e 69 73 68 20 61 74 20 74 68 65 20 65 6e 64 20  nish at the end 
b1f0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  of a column valu
b200: 65 2c 0a 20 20 20 20 20 20 20 74 68 65 20 22 65  e,.       the "e
b210: 6c 6c 69 70 73 65 73 22 20 74 65 78 74 20 69 73  llipses" text is
b220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 2e   appended to it.
b230: 0a 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68  .  <li> For each
b240: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 74 65   token in the te
b250: 78 74 20 66 72 61 67 6d 65 6e 74 20 74 68 61 74  xt fragment that
b260: 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 70 68   is part of a ph
b270: 72 61 73 65 20 6d 61 74 63 68 2c 0a 20 20 20 20  rase match,.    
b280: 20 20 20 74 68 65 20 22 73 74 61 72 74 20 6d 61     the "start ma
b290: 74 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73  tch" text is ins
b2a0: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 66  erted into the f
b2b0: 72 61 67 6d 65 6e 74 20 62 65 66 6f 72 65 20 74  ragment before t
b2c0: 68 65 20 74 6f 6b 65 6e 2c 0a 20 20 20 20 20 20  he token,.      
b2d0: 20 61 6e 64 20 74 68 65 20 22 65 6e 64 20 6d 61   and the "end ma
b2e0: 74 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73  tch" text is ins
b2f0: 65 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  erted immediatel
b300: 79 20 61 66 74 65 72 20 69 74 2e 0a 3c 2f 75 6c  y after it..</ul
b310: 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 6d 6f 72 65  >..<p>.  If more
b320: 20 74 68 61 6e 20 6f 6e 65 20 73 75 63 68 20 66   than one such f
b330: 72 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66  ragment can be f
b340: 6f 75 6e 64 2c 20 74 68 65 6e 20 66 72 61 67 6d  ound, then fragm
b350: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
b360: 6e 0a 20 20 61 20 6c 61 72 67 65 72 20 6e 75 6d  n.  a larger num
b370: 62 65 72 20 6f 66 20 22 65 78 74 72 61 22 20 70  ber of "extra" p
b380: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 61 72  hrase matches ar
b390: 65 20 66 61 76 6f 75 72 65 64 2e 20 54 68 65 20  e favoured. The 
b3a0: 73 74 61 72 74 20 6f 66 0a 20 20 74 68 65 20 73  start of.  the s
b3b0: 65 6c 65 63 74 65 64 20 74 65 78 74 20 66 72 61  elected text fra
b3c0: 67 6d 65 6e 74 20 6d 61 79 20 62 65 20 6d 6f 76  gment may be mov
b3d0: 65 64 20 61 20 66 65 77 20 74 6f 6b 65 6e 73 20  ed a few tokens 
b3e0: 66 6f 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77  forward or backw
b3f0: 61 72 64 0a 20 20 74 6f 20 61 74 74 65 6d 70 74  ard.  to attempt
b400: 20 74 6f 20 63 6f 6e 63 65 6e 74 72 61 74 65 20   to concentrate 
b410: 74 68 65 20 70 68 72 61 73 65 20 6d 61 74 63 68  the phrase match
b420: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 63 65  es toward the ce
b430: 6e 74 65 72 20 6f 66 20 74 68 65 0a 20 20 66 72  nter of the.  fr
b440: 61 67 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41  agment...<p>.  A
b450: 73 73 75 6d 69 6e 67 20 3c 69 3e 4e 3c 2f 69 3e  ssuming <i>N</i>
b460: 20 69 73 20 61 20 70 6f 73 69 74 69 76 65 20 76   is a positive v
b470: 61 6c 75 65 2c 20 69 66 20 6e 6f 20 66 72 61 67  alue, if no frag
b480: 6d 65 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75  ments can be fou
b490: 6e 64 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69  nd that.  contai
b4a0: 6e 20 61 6e 20 70 68 72 61 73 65 20 6d 61 74 63  n an phrase matc
b4b0: 68 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  h corresponding 
b4c0: 74 6f 20 65 61 63 68 20 6d 61 74 63 68 61 62 6c  to each matchabl
b4d0: 65 20 70 68 72 61 73 65 2c 20 74 68 65 20 73 6e  e phrase, the sn
b4e0: 69 70 70 65 74 0a 20 20 66 75 6e 63 74 69 6f 6e  ippet.  function
b4f0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
b500: 64 20 74 77 6f 20 66 72 61 67 6d 65 6e 74 73 20  d two fragments 
b510: 6f 66 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  of approximately
b520: 20 3c 69 3e 4e 3c 2f 69 3e 2f 32 20 74 6f 6b 65   <i>N</i>/2 toke
b530: 6e 73 0a 20 20 74 68 61 74 20 62 65 74 77 65 65  ns.  that betwee
b540: 6e 20 74 68 65 6d 20 63 6f 6e 74 61 69 6e 20 61  n them contain a
b550: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 68 72 61  t least one phra
b560: 73 65 20 6d 61 74 63 68 20 66 6f 72 20 65 61 63  se match for eac
b570: 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  h matchable phra
b580: 73 65 0a 20 20 6d 61 74 63 68 65 64 20 62 79 20  se.  matched by 
b590: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
b5a0: 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
b5b0: 61 74 74 65 6d 70 74 73 20 61 72 65 20 6d 61 64  attempts are mad
b5c0: 65 20 74 6f 20 66 69 6e 64 20 74 68 72 65 65 0a  e to find three.
b5d0: 20 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c    fragments of <
b5e0: 69 3e 4e 3c 2f 69 3e 2f 33 20 74 6f 6b 65 6e 73  i>N</i>/3 tokens
b5f0: 20 65 61 63 68 20 61 6e 64 20 66 69 6e 61 6c 6c   each and finall
b600: 79 20 66 6f 75 72 20 3c 69 3e 4e 3c 2f 69 3e 2f  y four <i>N</i>/
b610: 34 20 74 6f 6b 65 6e 0a 20 20 66 72 61 67 6d 65  4 token.  fragme
b620: 6e 74 73 2e 20 49 66 20 61 20 73 65 74 20 6f 66  nts. If a set of
b630: 20 66 6f 75 72 20 66 72 61 67 6d 65 6e 74 73 20   four fragments 
b640: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20  cannot be found 
b650: 74 68 61 74 20 65 6e 63 6f 6d 70 61 73 73 65 73  that encompasses
b660: 20 74 68 65 0a 20 20 72 65 71 75 69 72 65 64 20   the.  required 
b670: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 2c 20  phrase matches, 
b680: 74 68 65 20 66 6f 75 72 20 66 72 61 67 6d 65 6e  the four fragmen
b690: 74 73 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 34  ts of <i>N</i>/4
b6a0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 72 6f   tokens that pro
b6b0: 76 69 64 65 0a 20 20 74 68 65 20 62 65 73 74 20  vide.  the best 
b6c0: 63 6f 76 65 72 61 67 65 20 61 72 65 20 73 65 6c  coverage are sel
b6d0: 65 63 74 65 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66  ected...<p>.  If
b6e0: 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 61 20 6e   <i>N</i> is a n
b6f0: 65 67 61 74 69 76 65 20 76 61 6c 75 65 2c 20 61  egative value, a
b700: 6e 64 20 6e 6f 20 73 69 6e 67 6c 65 20 66 72 61  nd no single fra
b710: 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75  gment can be fou
b720: 6e 64 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67  nd .  containing
b730: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70 68   the required ph
b740: 72 61 73 65 20 6d 61 74 63 68 65 73 2c 20 74 68  rase matches, th
b750: 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69  e snippet functi
b760: 6f 6e 20 73 65 61 72 63 68 65 73 0a 20 20 66 6f  on searches.  fo
b770: 72 20 74 77 6f 20 66 72 61 67 6d 65 6e 74 73 20  r two fragments 
b780: 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f  of <i>|N|</i> to
b790: 6b 65 6e 73 20 65 61 63 68 2c 20 74 68 65 6e 20  kens each, then 
b7a0: 74 68 72 65 65 2c 20 74 68 65 6e 20 66 6f 75 72  three, then four
b7b0: 2e 20 49 6e 0a 20 20 6f 74 68 65 72 20 77 6f 72  . In.  other wor
b7c0: 64 73 2c 20 69 66 20 74 68 65 20 73 70 65 63 69  ds, if the speci
b7d0: 66 69 65 64 20 76 61 6c 75 65 20 6f 66 20 3c 69  fied value of <i
b7e0: 3e 4e 3c 2f 69 3e 20 69 73 20 6e 65 67 61 74 69  >N</i> is negati
b7f0: 76 65 2c 20 74 68 65 20 73 69 7a 65 73 0a 20 20  ve, the sizes.  
b800: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  of the fragments
b810: 20 69 73 20 6e 6f 74 20 64 65 63 72 65 61 73 65   is not decrease
b820: 64 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f  d if more than o
b830: 6e 65 20 66 72 61 67 6d 65 6e 74 20 69 73 20 72  ne fragment is r
b840: 65 71 75 69 72 65 64 0a 20 20 74 6f 20 70 72 6f  equired.  to pro
b850: 76 69 64 65 20 74 68 65 20 64 65 73 69 72 65 64  vide the desired
b860: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 63 6f   phrase match co
b870: 76 65 72 61 67 65 2e 0a 0a 3c 70 3e 0a 20 20 41  verage...<p>.  A
b880: 66 74 65 72 20 74 68 65 20 3c 69 3e 4d 3c 2f 69  fter the <i>M</i
b890: 3e 20 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65  > fragments have
b8a0: 20 62 65 65 6e 20 6c 6f 63 61 74 65 64 2c 20 77   been located, w
b8b0: 68 65 72 65 20 3c 69 3e 4d 3c 2f 69 3e 20 69 73  here <i>M</i> is
b8c0: 20 62 65 74 77 65 65 6e 0a 20 20 74 77 6f 20 61   between.  two a
b8d0: 6e 64 20 66 6f 75 72 20 61 73 20 64 65 73 63 72  nd four as descr
b8e0: 69 62 65 64 20 69 6e 20 74 68 65 20 70 61 72 61  ibed in the para
b8f0: 67 72 61 70 68 73 20 61 62 6f 76 65 2c 20 74 68  graphs above, th
b900: 65 79 20 61 72 65 20 6a 6f 69 6e 65 64 20 74 6f  ey are joined to
b910: 67 65 74 68 65 72 0a 20 20 69 6e 20 73 6f 72 74  gether.  in sort
b920: 65 64 20 6f 72 64 65 72 20 77 69 74 68 20 74 68  ed order with th
b930: 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78  e "ellipses" tex
b940: 74 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65  t separating the
b950: 6d 2e 20 54 68 65 20 74 68 72 65 65 20 0a 20 20  m. The three .  
b960: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 65 6e  modifications en
b970: 75 6d 65 72 61 74 65 64 20 65 61 72 6c 69 65 72  umerated earlier
b980: 20 61 72 65 20 70 65 72 66 6f 72 6d 65 64 20 6f   are performed o
b990: 6e 20 74 68 65 20 74 65 78 74 20 62 65 66 6f 72  n the text befor
b9a0: 65 20 69 74 20 69 73 20 0a 20 20 72 65 74 75 72  e it is .  retur
b9b0: 6e 65 64 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ned...<codeblock
b9c0: 3e 0a 20 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e 20  >.  <b>Note: In 
b9d0: 74 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 65 78  this block of ex
b9e0: 61 6d 70 6c 65 73 2c 20 6e 65 77 6c 69 6e 65 73  amples, newlines
b9f0: 20 61 6e 64 20 77 68 69 74 65 73 70 61 63 65 20   and whitespace 
ba00: 63 68 61 72 61 63 74 65 72 73 20 68 61 76 65 0a  characters have.
ba10: 20 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20    been inserted 
ba20: 69 6e 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e  into the documen
ba30: 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
ba40: 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c 20 61  the FTS table, a
ba50: 6e 64 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  nd the expected.
ba60: 20 20 72 65 73 75 6c 74 73 20 64 65 73 63 72 69    results descri
ba70: 62 65 64 20 69 6e 20 53 51 4c 20 63 6f 6d 6d 65  bed in SQL comme
ba80: 6e 74 73 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  nts. This is don
ba90: 65 20 74 6f 20 65 6e 68 61 6e 63 65 20 72 65 61  e to enhance rea
baa0: 64 61 62 69 6c 69 74 79 20 6f 6e 6c 79 2c 0a 20  dability only,. 
bab0: 20 74 68 65 79 20 77 6f 75 6c 64 20 6e 6f 74 20   they would not 
bac0: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 61 63  be present in ac
bad0: 74 75 61 6c 20 53 51 4c 69 74 65 20 63 6f 6d 6d  tual SQLite comm
bae0: 61 6e 64 73 20 6f 72 20 6f 75 74 70 75 74 2e 3c  ands or output.<
baf0: 2f 62 3e 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  /b>..  <i>-- Cre
bb00: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
bb10: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f   an FTS table.</
bb20: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
bb30: 55 41 4c 20 54 41 42 4c 45 20 74 65 78 74 20 55  UAL TABLE text U
bb40: 53 49 4e 47 20 66 74 73 34 28 29 3b 0a 20 20 49  SING fts4();.  I
bb50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 78 74 20  NSERT INTO text 
bb60: 56 41 4c 55 45 53 28 27 0a 20 20 20 20 44 75 72  VALUES('.    Dur
bb70: 69 6e 67 20 33 30 20 4e 6f 76 2d 31 20 44 65 63  ing 30 Nov-1 Dec
bb80: 2c 20 32 2d 33 6f 43 20 64 72 6f 70 73 2e 20 43  , 2-3oC drops. C
bb90: 6f 6f 6c 20 69 6e 20 74 68 65 20 75 70 70 65 72  ool in the upper
bba0: 20 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e 69 6d 75   portion, minimu
bbb0: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 34  m temperature 14
bbc0: 2d 31 36 6f 43 20 0a 20 20 20 20 61 6e 64 20 63  -16oC .    and c
bbd0: 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20 6d  ool elsewhere, m
bbe0: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
bbf0: 72 65 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c 64  re 17-20oC. Cold
bc00: 20 74 6f 20 76 65 72 79 20 63 6f 6c 64 20 6f 6e   to very cold on
bc10: 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 0a   mountaintops, .
bc20: 20 20 20 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70      minimum temp
bc30: 65 72 61 74 75 72 65 20 36 2d 31 32 6f 43 2e 20  erature 6-12oC. 
bc40: 4e 6f 72 74 68 65 61 73 74 65 72 6c 79 20 77 69  Northeasterly wi
bc50: 6e 64 73 20 31 35 2d 33 30 20 6b 6d 2f 68 72 2e  nds 15-30 km/hr.
bc60: 20 41 66 74 65 72 20 74 68 61 74 2c 20 74 65 6d   After that, tem
bc70: 70 65 72 61 74 75 72 65 20 0a 20 20 20 20 69 6e  perature .    in
bc80: 63 72 65 61 73 65 73 2e 20 4e 6f 72 74 68 65 61  creases. Northea
bc90: 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31 35 2d  sterly winds 15-
bca0: 33 30 20 6b 6d 2f 68 72 2e 20 20 20 20 20 0a 20  30 km/hr.     . 
bcb0: 20 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68   ');..  <i>-- Th
bcc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
bcd0: 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 65  y returns the te
bce0: 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20  xt value:</i>.  
bcf0: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
bd00: 2d 20 20 20 22 26 6c 74 3b 62 26 67 74 3b 2e 2e  -   "&lt;b&gt;..
bd10: 2e 26 6c 74 3b 2f 62 26 67 74 3b 63 6f 6f 6c 20  .&lt;/b&gt;cool 
bd20: 65 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d  elsewhere, minim
bd30: 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31  um temperature 1
bd40: 37 2d 32 30 6f 43 2e 20 26 6c 74 3b 62 26 67 74  7-20oC. &lt;b&gt
bd50: 3b 43 6f 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20  ;Cold&lt;/b&gt; 
bd60: 74 6f 20 76 65 72 79 20 3c 2f 69 3e 0a 20 20 3c  to very </i>.  <
bd70: 69 3e 2d 2d 20 20 20 20 26 6c 74 3b 62 26 67 74  i>--    &lt;b&gt
bd80: 3b 63 6f 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20  ;cold&lt;/b&gt; 
bd90: 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c  on mountaintops,
bda0: 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61   minimum tempera
bdb0: 74 75 72 65 20 36 26 6c 74 3b 62 26 67 74 3b 2e  ture 6&lt;b&gt;.
bdc0: 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 2e 3c 2f  ..&lt;/b&gt;".</
bdd0: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
bde0: 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28   SELECT snippet(
bdf0: 74 65 78 74 29 20 46 52 4f 4d 20 74 65 78 74 20  text) FROM text 
be00: 57 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48  WHERE text MATCH
be10: 20 27 63 6f 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d   'cold';..  <i>-
be20: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
be30: 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68  query returns th
be40: 65 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69  e text value:</i
be50: 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
be60: 3c 69 3e 2d 2d 20 20 20 22 2e 2e 2e 74 68 65 20  <i>--   "...the 
be70: 75 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 26  upper portion, &
be80: 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b  #91;minimum&#93;
be90: 20 26 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72   &#91;temperatur
bea0: 65 26 23 39 33 3b 20 31 34 2d 31 36 6f 43 20 61  e&#93; 14-16oC a
beb0: 6e 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72  nd cool elsewher
bec0: 65 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  e,</i>.  <i>--  
bed0: 20 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23    &#91;minimum&#
bee0: 39 33 3b 20 26 23 39 31 3b 74 65 6d 70 65 72 61  93; &#91;tempera
bef0: 74 75 72 65 26 23 39 33 3b 20 31 37 2d 32 30 6f  ture&#93; 17-20o
bf00: 43 2e 20 43 6f 6c 64 2e 2e 2e 22 3c 2f 69 3e 0a  C. Cold..."</i>.
bf10: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45    <i>--</i>.  SE
bf20: 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 65 78  LECT snippet(tex
bf30: 74 2c 20 27 26 23 39 31 3b 20 27 26 23 39 33 3b  t, '&#91; '&#93;
bf40: 27 2c 20 27 2e 2e 2e 27 29 20 46 52 4f 4d 20 74  ', '...') FROM t
bf50: 65 78 74 20 57 48 45 52 45 20 74 65 78 74 20 4d  ext WHERE text M
bf60: 41 54 43 48 20 27 22 6d 69 6e 2a 20 74 65 6d 2a  ATCH '"min* tem*
bf70: 22 27 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  "'.</codeblock>.
bf80: 0a 3c 68 32 20 69 64 3d 6d 61 74 63 68 69 6e 66  .<h2 id=matchinf
bf90: 6f 20 74 61 67 73 3d 6d 61 74 63 68 69 6e 66 6f  o tags=matchinfo
bfa0: 3e 54 68 65 20 4d 61 74 63 68 69 6e 66 6f 20 46  >The Matchinfo F
bfb0: 75 6e 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70  unction</h2>..<p
bfc0: 3e 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66  >.  The matchinf
bfd0: 6f 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  o function retur
bfe0: 6e 73 20 61 20 62 6c 6f 62 20 76 61 6c 75 65 2e  ns a blob value.
bff0: 20 49 66 20 69 74 20 69 73 20 75 73 65 64 20 77   If it is used w
c000: 69 74 68 69 6e 20 61 20 71 75 65 72 79 0a 20 20  ithin a query.  
c010: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
c020: 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  e the full-text 
c030: 69 6e 64 65 78 20 28 61 20 22 71 75 65 72 79 20  index (a "query 
c040: 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c 69  by rowid" or "li
c050: 6e 65 61 72 20 73 63 61 6e 22 29 2c 0a 20 20 74  near scan"),.  t
c060: 68 65 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20  hen the blob is 
c070: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
c080: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ze. Otherwise, t
c090: 68 65 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 73  he blob consists
c0a0: 20 6f 66 20 7a 65 72 6f 0a 20 20 6f 72 20 6d 6f   of zero.  or mo
c0b0: 72 65 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e  re 32-bit unsign
c0c0: 65 64 20 69 6e 74 65 67 65 72 73 20 69 6e 20 6d  ed integers in m
c0d0: 61 63 68 69 6e 65 20 62 79 74 65 2d 6f 72 64 65  achine byte-orde
c0e0: 72 2e 20 54 68 65 20 65 78 61 63 74 20 6e 75 6d  r. The exact num
c0f0: 62 65 72 0a 20 20 6f 66 20 69 6e 74 65 67 65 72  ber.  of integer
c100: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
c110: 64 20 61 72 72 61 79 20 64 65 70 65 6e 64 73 20  d array depends 
c120: 6f 6e 20 62 6f 74 68 20 74 68 65 20 71 75 65 72  on both the quer
c130: 79 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 0a  y and the value.
c140: 20 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20    of the second 
c150: 61 72 67 75 6d 65 6e 74 20 28 69 66 20 61 6e 79  argument (if any
c160: 29 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  ) passed to the 
c170: 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
c180: 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  on...<p>.  The m
c190: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
c1a0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
c1b0: 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
c1c0: 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 41 73  wo arguments. As
c1d0: 20 66 6f 72 0a 20 20 61 6c 6c 20 61 75 78 69 6c   for.  all auxil
c1e0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2c 20  iary functions, 
c1f0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
c200: 6e 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  nt must be the s
c210: 70 65 63 69 61 6c 20 0a 20 20 5b 46 54 53 20 68  pecial .  [FTS h
c220: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 2e 20 54  idden column]. T
c230: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c240: 6e 74 2c 20 69 66 20 69 74 20 69 73 20 73 70 65  nt, if it is spe
c250: 63 69 66 69 65 64 2c 20 6d 75 73 74 20 62 65 20  cified, must be 
c260: 61 20 74 65 78 74 20 76 61 6c 75 65 0a 20 20 63  a text value.  c
c270: 6f 6d 70 72 69 73 65 64 20 6f 6e 6c 79 20 6f 66  omprised only of
c280: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20   the characters 
c290: 27 70 27 2c 20 27 63 27 2c 20 27 6e 27 2c 20 27  'p', 'c', 'n', '
c2a0: 61 27 2c 20 27 6c 27 2c 20 27 73 27 20 61 6e 64  a', 'l', 's' and
c2b0: 20 27 78 27 2e 0a 20 20 49 66 20 6e 6f 20 73 65   'x'..  If no se
c2c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
c2d0: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 75 70 70   explicitly supp
c2e0: 6c 69 65 64 2c 20 69 74 20 64 65 66 61 75 6c 74  lied, it default
c2f0: 73 20 74 6f 20 22 70 63 78 22 2e 20 54 68 65 0a  s to "pcx". The.
c300: 20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e    second argumen
c310: 74 20 69 73 20 72 65 66 65 72 65 64 20 74 6f 20  t is refered to 
c320: 61 73 20 74 68 65 20 22 66 6f 72 6d 61 74 20 73  as the "format s
c330: 74 72 69 6e 67 22 20 62 65 6c 6f 77 2e 0a 0a 3c  tring" below...<
c340: 70 3e 0a 20 20 43 68 61 72 61 63 74 65 72 73 20  p>.  Characters 
c350: 69 6e 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  in the matchinfo
c360: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61   format string a
c370: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 72 6f  re processed fro
c380: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
c390: 20 0a 20 20 45 61 63 68 20 63 68 61 72 61 63 74   .  Each charact
c3a0: 65 72 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74  er in the format
c3b0: 20 73 74 72 69 6e 67 20 63 61 75 73 65 73 20 6f   string causes o
c3c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 33 32 2d 62 69  ne or more 32-bi
c3d0: 74 20 75 6e 73 69 67 6e 65 64 0a 20 20 69 6e 74  t unsigned.  int
c3e0: 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20 62  eger values to b
c3f0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 72  e added to the r
c400: 65 74 75 72 6e 65 64 20 61 72 72 61 79 2e 20 54  eturned array. T
c410: 68 65 20 22 76 61 6c 75 65 73 22 20 63 6f 6c 75  he "values" colu
c420: 6d 6e 20 69 6e 0a 20 20 74 68 65 20 66 6f 6c 6c  mn in.  the foll
c430: 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74  owing table cont
c440: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
c450: 6f 66 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  of integer value
c460: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
c470: 65 0a 20 20 6f 75 74 70 75 74 20 62 75 66 66 65  e.  output buffe
c480: 72 20 66 6f 72 20 65 61 63 68 20 73 75 70 70 6f  r for each suppo
c490: 72 74 65 64 20 66 6f 72 6d 61 74 20 73 74 72 69  rted format stri
c4a0: 6e 67 20 63 68 61 72 61 63 74 65 72 2e 20 49 6e  ng character. In
c4b0: 20 74 68 65 20 66 6f 72 6d 75 6c 61 0a 20 20 67   the formula.  g
c4c0: 69 76 65 6e 2c 20 3c 69 3e 63 6f 6c 73 3c 2f 69  iven, <i>cols</i
c4d0: 3e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  > is the number 
c4e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
c4f0: 65 20 46 54 53 20 74 61 62 6c 65 2c 20 61 6e 64  e FTS table, and
c500: 20 0a 20 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f   .  <i>phrases</
c510: 69 3e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  i> is the number
c520: 20 6f 66 20 3c 61 20 68 72 65 66 3d 23 6d 61 74   of <a href=#mat
c530: 63 68 61 62 6c 65 3e 6d 61 74 63 68 61 62 6c 65  chable>matchable
c540: 20 70 68 72 61 73 65 73 3c 2f 61 3e 20 69 6e 20   phrases</a> in 
c550: 0a 20 20 74 68 65 20 71 75 65 72 79 2e 20 0a 0a  .  the query. ..
c560: 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31  <table striped=1
c570: 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 68 61 72  >.  <tr><th>Char
c580: 61 63 74 65 72 3c 74 68 3e 56 61 6c 75 65 73 3c  acter<th>Values<
c590: 74 68 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a 20  th>Description. 
c5a0: 20 3c 74 72 3e 3c 74 64 3e 70 20 3c 74 64 3e 31   <tr><td>p <td>1
c5b0: 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20   <td>The number 
c5c0: 6f 66 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72  of matchable phr
c5d0: 61 73 65 73 20 69 6e 20 74 68 65 20 71 75 65 72  ases in the quer
c5e0: 79 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 20 3c  y..  <tr><td>c <
c5f0: 74 64 3e 31 20 3c 74 64 3e 54 68 65 20 6e 75 6d  td>1 <td>The num
c600: 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
c610: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
c620: 68 65 20 46 54 53 0a 20 20 20 20 74 61 62 6c 65  he FTS.    table
c630: 20 28 69 2e 65 2e 20 6e 6f 74 20 69 6e 63 6c 75   (i.e. not inclu
c640: 64 69 6e 67 20 74 68 65 20 64 6f 63 69 64 20 6f  ding the docid o
c650: 72 20 74 68 65 20 5b 46 54 53 20 68 69 64 64 65  r the [FTS hidde
c660: 6e 20 63 6f 6c 75 6d 6e 5d 29 2e 0a 20 20 3c 74  n column])..  <t
c670: 72 3e 3c 74 64 3e 78 20 3c 74 64 20 73 74 79 6c  r><td>x <td styl
c680: 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a 6e  e="white-space:n
c690: 6f 77 72 61 70 22 3e 33 20 2a 20 3c 69 3e 63 6f  owrap">3 * <i>co
c6a0: 6c 73 3c 2f 69 3e 20 2a 20 3c 69 3e 70 68 72 61  ls</i> * <i>phra
c6b0: 73 65 73 3c 2f 69 3e 20 0a 20 20 20 20 3c 74 64  ses</i> .    <td
c6c0: 3e 0a 20 20 20 20 20 20 46 6f 72 20 65 61 63 68  >.      For each
c6d0: 20 64 69 73 74 69 6e 63 74 20 63 6f 6d 62 69 6e   distinct combin
c6e0: 61 74 69 6f 6e 20 6f 66 20 61 20 70 68 72 61 73  ation of a phras
c6f0: 65 20 61 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75  e and table colu
c700: 6d 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 66 6f  mn, the.      fo
c710: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 76 61  llowing three va
c720: 6c 75 65 73 3a 0a 20 20 20 20 20 20 3c 75 6c 3e  lues:.      <ul>
c730: 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 49 6e  .        <li> In
c740: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
c750: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
c760: 74 69 6d 65 73 20 74 68 65 20 70 68 72 61 73 65  times the phrase
c770: 20 61 70 70 65 61 72 73 20 69 6e 20 0a 20 20 20   appears in .   
c780: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f            the co
c790: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 20 20 3c 6c  lumn..        <l
c7a0: 69 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  i> The total num
c7b0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65  ber of times the
c7c0: 20 70 68 72 61 73 65 20 61 70 70 65 61 72 73 20   phrase appears 
c7d0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  in the column in
c7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c  .             al
c7f0: 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54  l rows in the FT
c800: 53 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  S table..       
c810: 20 3c 6c 69 3e 20 54 68 65 20 74 6f 74 61 6c 20   <li> The total 
c820: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c830: 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  n the FTS table 
c840: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 20  for which the . 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
c860: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  mn contains at l
c870: 65 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63  east one instanc
c880: 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e  e of the phrase.
c890: 0a 20 20 20 20 20 20 3c 2f 75 6c 3e 0a 20 20 20  .      </ul>.   
c8a0: 20 20 20 54 68 65 20 66 69 72 73 74 20 73 65 74     The first set
c8b0: 20 6f 66 20 74 68 72 65 65 20 76 61 6c 75 65 73   of three values
c8c0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
c8d0: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  the left-most co
c8e0: 6c 75 6d 6e 0a 20 20 20 20 20 20 6f 66 20 74 68  lumn.      of th
c8f0: 65 20 74 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 20  e table (column 
c900: 30 29 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d  0) and the left-
c910: 6d 6f 73 74 20 6d 61 74 63 68 61 62 6c 65 20 70  most matchable p
c920: 68 72 61 73 65 20 69 6e 20 74 68 65 0a 20 20 20  hrase in the.   
c930: 20 20 20 71 75 65 72 79 20 28 70 68 72 61 73 65     query (phrase
c940: 20 30 29 2e 20 49 66 20 74 68 65 20 74 61 62 6c   0). If the tabl
c950: 65 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  e has more than 
c960: 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  one column, the 
c970: 73 65 63 6f 6e 64 0a 20 20 20 20 20 20 73 65 74  second.      set
c980: 20 6f 66 20 74 68 72 65 65 20 76 61 6c 75 65 73   of three values
c990: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 61   in the output a
c9a0: 72 72 61 79 20 63 6f 72 72 65 73 70 6f 6e 64 20  rray correspond 
c9b0: 74 6f 20 70 68 72 61 73 65 20 30 20 61 6e 64 0a  to phrase 0 and.
c9c0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 31 2e 20        column 1. 
c9d0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61  Followed by phra
c9e0: 73 65 20 30 2c 20 63 6f 6c 75 6d 6e 20 32 20 61  se 0, column 2 a
c9f0: 6e 64 20 73 6f 20 6f 6e 20 66 6f 72 20 61 6c 6c  nd so on for all
ca00: 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
ca10: 20 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6e 64    the table. And
ca20: 20 73 6f 20 6f 6e 20 66 6f 72 20 70 68 72 61 73   so on for phras
ca30: 65 20 31 2c 20 63 6f 6c 75 6d 6e 20 30 2c 20 74  e 1, column 0, t
ca40: 68 65 6e 20 70 68 72 61 73 65 20 31 2c 20 63 6f  hen phrase 1, co
ca50: 6c 75 6d 6e 20 31 0a 20 20 20 20 20 20 65 74 63  lumn 1.      etc
ca60: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
ca70: 2c 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 6f  , the data for o
ca80: 63 63 75 72 65 6e 63 65 73 20 6f 66 20 70 68 72  ccurences of phr
ca90: 61 73 65 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a  ase <i>p</i> in.
caa0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e        column <i>
cab0: 63 3c 2f 69 3e 20 6d 61 79 20 62 65 20 66 6f 75  c</i> may be fou
cac0: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  nd using the fol
cad0: 6c 6f 77 69 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a  lowing formula:.
cae0: 3c 70 72 65 3e 0a 20 20 20 20 20 20 20 20 20 20  <pre>.          
caf0: 68 69 74 73 5f 74 68 69 73 5f 72 6f 77 20 20 3d  hits_this_row  =
cb00: 20 61 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28   array&#91;3 * (
cb10: 63 20 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 30 26  c + p*cols) + 0&
cb20: 23 39 33 3b 0a 20 20 20 20 20 20 20 20 20 20 68  #93;.          h
cb30: 69 74 73 5f 61 6c 6c 5f 72 6f 77 73 20 20 3d 20  its_all_rows  = 
cb40: 61 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63  array&#91;3 * (c
cb50: 20 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 31 26 23   + p*cols) + 1&#
cb60: 39 33 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  93;.          do
cb70: 63 73 5f 77 69 74 68 5f 68 69 74 73 20 3d 20 61  cs_with_hits = a
cb80: 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20  rray&#91;3 * (c 
cb90: 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 32 26 23 39  + p*cols) + 2&#9
cba0: 33 3b 0a 3c 2f 70 72 65 3e 0a 0a 20 20 3c 74 72  3;.</pre>..  <tr
cbb0: 3e 3c 74 64 3e 6e 20 3c 74 64 3e 31 20 3c 74 64  ><td>n <td>1 <td
cbc0: 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  >The number of r
cbd0: 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53 34 20  ows in the FTS4 
cbe0: 74 61 62 6c 65 2e 20 54 68 69 73 20 76 61 6c 75  table. This valu
cbf0: 65 20 69 73 0a 20 20 20 20 6f 6e 6c 79 20 61 76  e is.    only av
cc00: 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 71 75 65  ailable when que
cc10: 72 79 69 6e 67 20 46 54 53 34 20 74 61 62 6c 65  rying FTS4 table
cc20: 73 2c 20 6e 6f 74 20 46 54 53 33 2e 0a 20 20 3c  s, not FTS3..  <
cc30: 74 72 3e 3c 74 64 3e 61 20 3c 74 64 3e 3c 69 3e  tr><td>a <td><i>
cc40: 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72  cols</i> <td>For
cc50: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68   each column, th
cc60: 65 20 61 76 65 72 61 67 65 20 6e 75 6d 62 65 72  e average number
cc70: 20 6f 66 0a 20 20 20 20 74 6f 6b 65 6e 73 20 69   of.    tokens i
cc80: 6e 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65  n the text value
cc90: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
cca0: 63 6f 6c 75 6d 6e 20 28 63 6f 6e 73 69 64 65 72  column (consider
ccb0: 69 6e 67 20 61 6c 6c 20 72 6f 77 73 20 69 6e 0a  ing all rows in.
ccc0: 20 20 20 20 74 68 65 20 46 54 53 34 20 74 61 62      the FTS4 tab
ccd0: 6c 65 29 2e 20 54 68 69 73 20 76 61 6c 75 65 20  le). This value 
cce0: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
ccf0: 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20  e when querying 
cd00: 46 54 53 34 20 74 61 62 6c 65 73 2c 0a 20 20 20  FTS4 tables,.   
cd10: 20 6e 6f 74 20 46 54 53 33 2e 20 20 0a 20 20 3c   not FTS3.  .  <
cd20: 74 72 3e 3c 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e  tr><td>l <td><i>
cd30: 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20  cols</i> <td>.  
cd40: 20 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d    For each colum
cd50: 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  n, the length of
cd60: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
cd70: 64 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d in the current
cd80: 20 72 6f 77 20 6f 66 20 74 68 65 0a 20 20 20 20   row of the.    
cd90: 46 54 53 34 20 74 61 62 6c 65 2c 20 69 6e 20 74  FTS4 table, in t
cda0: 6f 6b 65 6e 73 2e 20 20 54 68 69 73 20 76 61 6c  okens.  This val
cdb0: 75 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ue is only avail
cdc0: 61 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69  able when queryi
cdd0: 6e 67 0a 20 20 20 20 46 54 53 34 20 74 61 62 6c  ng.    FTS4 tabl
cde0: 65 73 2c 20 6e 6f 74 20 46 54 53 33 2e 20 41 6e  es, not FTS3. An
cdf0: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 22 6d  d only if the "m
ce00: 61 74 63 68 69 6e 66 6f 3d 66 74 73 33 22 20 64  atchinfo=fts3" d
ce10: 69 72 65 63 74 69 76 65 20 77 61 73 20 6e 6f 74  irective was not
ce20: 0a 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61  .    specified a
ce30: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 43  s part of the "C
ce40: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
ce50: 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20 75  BLE" statement u
ce60: 73 65 64 20 74 6f 20 63 72 65 61 74 65 0a 20 20  sed to create.  
ce70: 20 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65    the FTS4 table
ce80: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 73 20 3c 74  ..  <tr><td>s <t
ce90: 64 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74  d><i>cols</i> <t
cea0: 64 3e 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d>For each colum
ceb0: 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  n, the length of
cec0: 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 0a 20 20   the longest .  
ced0: 20 20 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66    subsequence of
cee0: 20 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20   phrase matches 
cef0: 74 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  that the column 
cf00: 76 61 6c 75 65 20 68 61 73 20 69 6e 20 63 6f 6d  value has in com
cf10: 6d 6f 6e 0a 20 20 20 20 77 69 74 68 20 74 68 65  mon.    with the
cf20: 20 71 75 65 72 79 20 74 65 78 74 2e 20 46 6f 72   query text. For
cf30: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 74   example, if a t
cf40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  able column cont
cf50: 61 69 6e 73 20 74 68 65 20 74 65 78 74 0a 20 20  ains the text.  
cf60: 20 20 27 61 20 62 20 63 20 64 20 65 27 20 61 6e    'a b c d e' an
cf70: 64 20 74 68 65 20 71 75 65 72 79 20 69 73 20 27  d the query is '
cf80: 61 20 63 20 22 64 20 65 22 27 2c 20 74 68 65 6e  a c "d e"', then
cf90: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
cfa0: 68 65 20 6c 6f 6e 67 65 73 74 0a 20 20 20 20 63  he longest.    c
cfb0: 6f 6d 6d 6f 6e 20 73 75 62 73 65 71 75 65 6e 63  ommon subsequenc
cfc0: 65 20 69 73 20 32 20 28 70 68 72 61 73 65 20 22  e is 2 (phrase "
cfd0: 63 22 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 70  c" followed by p
cfe0: 68 72 61 73 65 20 22 64 20 65 22 29 2e 0a 20 20  hrase "d e")..  
cff0: 20 20 0a 20 20 20 20 0a 3c 2f 74 61 62 6c 65 3e    .    .</table>
d000: 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d  ..<p>.  For exam
d010: 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
d020: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
d030: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
d040: 20 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68   FTS4 table with
d050: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69   two columns:</i
d060: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
d070: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
d080: 47 20 66 74 73 34 28 61 2c 20 62 29 3b 0a 20 20  G fts4(a, b);.  
d090: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
d0a0: 41 4c 55 45 53 28 27 74 72 61 6e 73 61 63 74 69  ALUES('transacti
d0b0: 6f 6e 20 64 65 66 61 75 6c 74 20 6d 6f 64 65 6c  on default model
d0c0: 73 20 64 65 66 61 75 6c 74 27 2c 20 27 4e 6f 6e  s default', 'Non
d0d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 61   transaction rea
d0e0: 64 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ds');.  INSERT I
d0f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74  NTO t1 VALUES('t
d100: 68 65 20 64 65 66 61 75 6c 74 20 74 72 61 6e 73  he default trans
d110: 61 63 74 69 6f 6e 27 2c 20 27 74 68 65 73 65 20  action', 'these 
d120: 73 65 6d 61 6e 74 69 63 73 20 70 72 65 73 65 6e  semantics presen
d130: 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  t');.  INSERT IN
d140: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 73 69  TO t1 VALUES('si
d150: 6e 67 6c 65 20 72 65 71 75 65 73 74 27 2c 20 27  ngle request', '
d160: 64 65 66 61 75 6c 74 20 64 61 74 61 27 29 3b 0a  default data');.
d170: 0a 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 65 20  .  <i>-- In the 
d180: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 2c  following query,
d190: 20 6e 6f 20 66 6f 72 6d 61 74 20 73 74 72 69 6e   no format strin
d1a0: 67 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  g is specified a
d1b0: 6e 64 20 73 6f 20 69 74 20 64 65 66 61 75 6c 74  nd so it default
d1c0: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f  s</i>.  <i>-- to
d1d0: 20 22 70 63 78 22 2e 20 49 74 20 74 68 65 72 65   "pcx". It there
d1e0: 66 6f 72 65 20 72 65 74 75 72 6e 73 20 61 20 73  fore returns a s
d1f0: 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 73 69 73  ingle row consis
d200: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
d210: 20 62 6c 6f 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   blob</i>.  <i>-
d220: 2d 20 76 61 6c 75 65 20 38 30 20 62 79 74 65 73  - value 80 bytes
d230: 20 69 6e 20 73 69 7a 65 20 28 32 30 20 33 32 2d   in size (20 32-
d240: 62 69 74 20 69 6e 74 65 67 65 72 73 20 2d 20 31  bit integers - 1
d250: 20 66 6f 72 20 22 70 22 2c 20 31 20 66 6f 72 20   for "p", 1 for 
d260: 22 63 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69  "c" and</i>.  <i
d270: 3e 2d 2d 20 33 2a 32 2a 33 20 66 6f 72 20 22 78  >-- 3*2*3 for "x
d280: 22 29 2e 20 49 66 20 65 61 63 68 20 62 6c 6f 63  "). If each bloc
d290: 6b 20 6f 66 20 34 20 62 79 74 65 73 20 69 6e 3c  k of 4 bytes in<
d2a0: 2f 69 3e 20 74 68 65 20 62 6c 6f 62 20 69 73 20  /i> the blob is 
d2b0: 69 6e 74 65 72 70 72 65 74 65 64 3c 2f 69 3e 20  interpreted</i> 
d2c0: 0a 20 20 3c 69 3e 2d 2d 20 61 73 20 61 6e 20 75  .  <i>-- as an u
d2d0: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
d2e0: 69 6e 20 6d 61 63 68 69 6e 65 20 62 79 74 65 2d  in machine byte-
d2f0: 6f 72 64 65 72 2c 20 74 68 65 20 76 61 6c 75 65  order, the value
d300: 73 20 77 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20  s will be:</i>. 
d310: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
d320: 2d 2d 20 20 20 20 20 33 20 32 20 20 31 20 33 20  --     3 2  1 3 
d330: 32 20 20 30 20 31 20 31 20 20 31 20 32 20 32 20  2  0 1 1  1 2 2 
d340: 20 30 20 31 20 31 20 20 30 20 30 20 30 20 20 31   0 1 1  0 0 0  1
d350: 20 31 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   1 1</i>.  <i>--
d360: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  </i>.  <i>-- The
d370: 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 63 6f   row returned co
d380: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
d390: 20 73 65 63 6f 6e 64 20 65 6e 74 72 79 20 69 6e   second entry in
d3a0: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 61 62 6c  serted into tabl
d3b0: 65 20 74 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  e t1.</i>.  <i>-
d3c0: 2d 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  - The first two 
d3d0: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
d3e0: 62 6c 6f 62 20 73 68 6f 77 20 74 68 61 74 20 74  blob show that t
d3f0: 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
d400: 65 64 20 74 68 72 65 65 3c 2f 69 3e 0a 20 20 3c  ed three</i>.  <
d410: 69 3e 2d 2d 20 70 68 72 61 73 65 73 20 61 6e 64  i>-- phrases and
d420: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
d430: 20 71 75 65 72 69 65 64 20 68 61 73 20 74 77 6f   queried has two
d440: 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 6e 65   columns. The ne
d450: 78 74 20 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a  xt block of</i>.
d460: 20 20 3c 69 3e 2d 2d 20 74 68 72 65 65 20 69 6e    <i>-- three in
d470: 74 65 67 65 72 73 20 64 65 73 63 72 69 62 65 73  tegers describes
d480: 20 63 6f 6c 75 6d 6e 20 30 20 28 69 6e 20 74 68   column 0 (in th
d490: 69 73 20 63 61 73 65 20 63 6f 6c 75 6d 6e 20 22  is case column "
d4a0: 61 22 29 20 61 6e 64 20 70 68 72 61 73 65 3c 2f  a") and phrase</
d4b0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 28 69 6e  i>.  <i>-- 0 (in
d4c0: 20 74 68 69 73 20 63 61 73 65 20 22 64 65 66 61   this case "defa
d4d0: 75 6c 74 22 29 2e 20 54 68 65 20 63 75 72 72 65  ult"). The curre
d4e0: 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20  nt row contains 
d4f0: 31 20 68 69 74 20 66 6f 72 20 22 64 65 66 61 75  1 hit for "defau
d500: 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  lt"</i>.  <i>-- 
d510: 69 6e 20 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20  in column 0, of 
d520: 61 20 74 6f 74 61 6c 20 6f 66 20 33 20 68 69 74  a total of 3 hit
d530: 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22 20  s for "default" 
d540: 74 68 61 74 20 6f 63 63 75 72 20 69 6e 20 63 6f  that occur in co
d550: 6c 75 6d 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  lumn</i>.  <i>--
d560: 20 30 20 6f 66 20 61 6e 79 20 74 61 62 6c 65 20   0 of any table 
d570: 72 6f 77 2e 20 54 68 65 20 33 20 68 69 74 73 20  row. The 3 hits 
d580: 61 72 65 20 73 70 72 65 61 64 20 61 63 72 6f 73  are spread acros
d590: 73 20 32 20 64 69 66 66 65 72 65 6e 74 20 72 6f  s 2 different ro
d5a0: 77 73 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ws.</i>.  <i>--<
d5b0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  /i>.  <i>-- The 
d5c0: 6e 65 78 74 20 73 65 74 20 6f 66 20 74 68 72 65  next set of thre
d5d0: 65 20 69 6e 74 65 67 65 72 73 20 28 30 20 31 20  e integers (0 1 
d5e0: 31 29 20 70 65 72 74 61 69 6e 20 74 6f 20 74 68  1) pertain to th
d5f0: 65 20 68 69 74 73 20 66 6f 72 20 22 64 65 66 61  e hits for "defa
d600: 75 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ult"</i>.  <i>--
d610: 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 20 6f 66 20   in column 1 of 
d620: 74 68 65 20 74 61 62 6c 65 20 28 30 20 69 6e 20  the table (0 in 
d630: 74 68 69 73 20 72 6f 77 2c 20 31 20 69 6e 20 61  this row, 1 in a
d640: 6c 6c 20 72 6f 77 73 2c 20 73 70 72 65 61 64 20  ll rows, spread 
d650: 61 63 72 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c 69  across </i>.  <i
d660: 3e 2d 2d 20 31 20 72 6f 77 73 29 2e 3c 2f 69 3e  >-- 1 rows).</i>
d670: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53  .  <i>--</i>.  S
d680: 45 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28  ELECT matchinfo(
d690: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
d6a0: 45 20 74 31 20 4d 41 54 43 48 20 27 64 65 66 61  E t1 MATCH 'defa
d6b0: 75 6c 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ult transaction 
d6c0: 22 74 68 65 73 65 20 73 65 6d 61 6e 74 69 63 73  "these semantics
d6d0: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  "';..  <i>-- The
d6e0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66   format string f
d6f0: 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 69 73  or this query is
d700: 20 22 6e 6c 22 2e 20 54 68 65 20 6f 75 74 70 75   "nl". The outpu
d710: 74 20 61 72 72 61 79 20 77 69 6c 6c 20 74 68 65  t array will the
d720: 72 65 66 6f 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e  refore</i>.  <i>
d730: 2d 2d 20 63 6f 6e 74 61 69 6e 20 33 20 69 6e 74  -- contain 3 int
d740: 65 67 65 72 20 76 61 6c 75 65 73 20 2d 20 31 20  eger values - 1 
d750: 66 6f 72 20 22 6e 22 20 61 6e 64 20 32 20 66 6f  for "n" and 2 fo
d760: 72 20 22 6c 22 2e 20 54 68 65 20 71 75 65 72 79  r "l". The query
d770: 20 72 65 74 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c   returns</i>.  <
d780: 69 3e 2d 2d 20 74 77 6f 20 72 6f 77 73 20 28 74  i>-- two rows (t
d790: 68 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f 77  he first two row
d7a0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6d  s in the table m
d7b0: 61 74 63 68 29 2e 20 54 68 65 20 76 61 6c 75 65  atch). The value
d7c0: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 3a 3c  s returned are:<
d7d0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
d7e0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 33 20 20 31    <i>--     3  1
d7f0: 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   1</i>.  <i>--  
d800: 20 20 20 33 20 20 32 20 30 3c 2f 69 3e 0a 20 20     3  2 0</i>.  
d810: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
d820: 2d 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75  - The first valu
d830: 65 20 69 6e 20 74 68 65 20 6d 61 74 63 68 69 6e  e in the matchin
d840: 66 6f 20 61 72 72 61 79 20 72 65 74 75 72 6e 65  fo array returne
d850: 64 20 66 6f 72 20 62 6f 74 68 20 72 6f 77 73 20  d for both rows 
d860: 69 73 20 33 20 28 74 68 65 20 3c 2f 69 3e 0a 20  is 3 (the </i>. 
d870: 20 3c 69 3e 2d 2d 20 6e 75 6d 62 65 72 20 6f 66   <i>-- number of
d880: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
d890: 6c 65 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le). The followi
d8a0: 6e 67 20 74 77 6f 20 76 61 6c 75 65 73 20 61 72  ng two values ar
d8b0: 65 20 74 68 65 20 6c 65 6e 67 74 68 73 20 3c 2f  e the lengths </
d8c0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68  i>.  <i>-- of th
d8d0: 65 20 6c 6f 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e  e longest common
d8e0: 20 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20   subsequence of 
d8f0: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 69  phrase matches i
d900: 6e 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f  n each column.</
d910: 69 3e 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63  i>.  SELECT matc
d920: 68 69 6e 66 6f 28 74 31 2c 20 27 6e 6c 27 29 20  hinfo(t1, 'nl') 
d930: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
d940: 20 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74 20   MATCH 'default 
d950: 74 72 61 6e 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f  transaction';.</
d960: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
d970: 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20    The matchinfo 
d980: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63 68  function is much
d990: 20 66 61 73 74 65 72 20 74 68 61 6e 20 65 69 74   faster than eit
d9a0: 68 65 72 20 74 68 65 20 73 6e 69 70 70 65 74 20  her the snippet 
d9b0: 6f 72 20 6f 66 66 73 65 74 73 0a 20 20 66 75 6e  or offsets.  fun
d9c0: 63 74 69 6f 6e 73 2e 20 54 68 69 73 20 69 73 20  ctions. This is 
d9d0: 62 65 63 61 75 73 65 20 74 68 65 20 69 6d 70 6c  because the impl
d9e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
d9f0: 74 68 20 73 6e 69 70 70 65 74 20 61 6e 64 20 6f  th snippet and o
da00: 66 66 73 65 74 73 0a 20 20 69 73 20 72 65 71 75  ffsets.  is requ
da10: 69 72 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  ired to retrieve
da20: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 62   the documents b
da30: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 66 72  eing analyzed fr
da40: 6f 6d 20 64 69 73 6b 2c 20 77 68 65 72 65 61 73  om disk, whereas
da50: 0a 20 20 61 6c 6c 20 64 61 74 61 20 72 65 71 75  .  all data requ
da60: 69 72 65 64 20 62 79 20 6d 61 74 63 68 69 6e 66  ired by matchinf
da70: 6f 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  o is available a
da80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61  s part of the sa
da90: 6d 65 20 70 6f 72 74 69 6f 6e 73 0a 20 20 6f 66  me portions.  of
daa0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
dab0: 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 72 65  ndex that are re
dac0: 71 75 69 72 65 64 20 74 6f 20 69 6d 70 6c 65 6d  quired to implem
dad0: 65 6e 74 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ent the full-tex
dae0: 74 20 71 75 65 72 79 0a 20 20 69 74 73 65 6c 66  t query.  itself
daf0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
db00: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
db10: 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73 2c 20  ng two queries, 
db20: 74 68 65 20 66 69 72 73 74 20 6d 61 79 20 62 65  the first may be
db30: 0a 20 20 61 6e 20 6f 72 64 65 72 20 6f 66 20 6d  .  an order of m
db40: 61 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 20  agnitude faster 
db50: 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 3a  than the second:
db60: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
db70: 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6d 61  SELECT docid, ma
db80: 74 63 68 69 6e 66 6f 28 74 62 6c 29 20 46 52 4f  tchinfo(tbl) FRO
db90: 4d 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20  M tbl WHERE tbl 
dba0: 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20  MATCH &lt;query 
dbb0: 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a  expression&gt;;.
dbc0: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20    SELECT docid, 
dbd0: 6f 66 66 73 65 74 73 28 74 62 6c 29 20 46 52 4f  offsets(tbl) FRO
dbe0: 4d 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20  M tbl WHERE tbl 
dbf0: 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20  MATCH &lt;query 
dc00: 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a  expression&gt;;.
dc10: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
dc20: 3e 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66  >.  The matchinf
dc30: 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69  o function provi
dc40: 64 65 73 20 61 6c 6c 20 74 68 65 20 69 6e 66 6f  des all the info
dc50: 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  rmation required
dc60: 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 0a 20 20   to calculate.  
dc70: 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 22 62  probabilistic "b
dc80: 61 67 2d 6f 66 2d 77 6f 72 64 73 22 20 72 65 6c  ag-of-words" rel
dc90: 65 76 61 6e 63 79 20 73 63 6f 72 65 73 20 73 75  evancy scores su
dca0: 63 68 20 61 73 20 0a 20 20 3c 61 20 68 72 65 66  ch as .  <a href
dcb0: 3d 68 74 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70  =http://en.wikip
dcc0: 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b  edia.org/wiki/Ok
dcd0: 61 70 69 5f 42 4d 32 35 3e 4f 6b 61 70 69 20 42  api_BM25>Okapi B
dce0: 4d 32 35 2f 42 4d 32 35 46 3c 2f 61 3e 20 74 68  M25/BM25F</a> th
dcf0: 61 74 20 6d 61 79 0a 20 20 62 65 20 75 73 65 64  at may.  be used
dd00: 20 74 6f 20 6f 72 64 65 72 20 72 65 73 75 6c 74   to order result
dd10: 73 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74  s in a full-text
dd20: 20 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74   search applicat
dd30: 69 6f 6e 2e 20 41 70 70 65 6e 64 69 78 20 41 20  ion. Appendix A 
dd40: 6f 66 20 74 68 69 73 20 0a 20 20 64 6f 63 75 6d  of this .  docum
dd50: 65 6e 74 2c 20 22 5b 73 65 61 72 63 68 20 61 70  ent, "[search ap
dd60: 70 6c 69 63 61 74 69 6f 6e 20 74 69 70 73 5d 22  plication tips]"
dd70: 2c 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78  , contains an ex
dd80: 61 6d 70 6c 65 20 6f 66 20 75 73 69 6e 67 20 74  ample of using t
dd90: 68 65 0a 20 20 6d 61 74 63 68 69 6e 66 6f 28 29  he.  matchinfo()
dda0: 20 66 75 6e 63 74 69 6f 6e 20 65 66 66 69 63 69   function effici
ddb0: 65 6e 74 6c 79 2e 0a 0a 3c 68 31 20 69 64 3d 66  ently...<h1 id=f
ddc0: 74 73 34 61 75 78 20 74 61 67 73 3d 22 66 74 73  ts4aux tags="fts
ddd0: 34 61 75 78 22 3e 46 74 73 34 61 75 78 20 2d 20  4aux">Fts4aux - 
dde0: 44 69 72 65 63 74 20 41 63 63 65 73 73 20 74 6f  Direct Access to
ddf0: 20 74 68 65 20 46 75 6c 6c 2d 54 65 78 74 20 49   the Full-Text I
de00: 6e 64 65 78 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20  ndex</h1>..<p>. 
de10: 20 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20 33   As of version 3
de20: 2e 37 2e 36 2c 20 53 51 4c 69 74 65 20 69 6e 63  .7.6, SQLite inc
de30: 6c 75 64 65 73 20 61 20 6e 65 77 20 76 69 72 74  ludes a new virt
de40: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
de50: 20 63 61 6c 6c 65 64 20 0a 20 20 22 66 74 73 34   called .  "fts4
de60: 61 75 78 22 2c 20 77 68 69 63 68 20 63 61 6e 20  aux", which can 
de70: 62 65 20 75 73 65 64 20 74 6f 20 69 6e 73 70 65  be used to inspe
de80: 63 74 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ct the full-text
de90: 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 78 69   index of an exi
dea0: 74 69 6e 67 0a 20 20 46 54 53 20 74 61 62 6c 65  ting.  FTS table
deb0: 20 64 69 72 65 63 74 6c 79 2e 20 44 65 73 70 69   directly. Despi
dec0: 74 65 20 69 74 73 20 6e 61 6d 65 2c 20 66 74 73  te its name, fts
ded0: 34 61 75 78 20 77 6f 72 6b 73 20 6a 75 73 74 20  4aux works just 
dee0: 61 73 20 77 65 6c 6c 20 77 69 74 68 20 46 54 53  as well with FTS
def0: 33 0a 20 20 74 61 62 6c 65 73 20 61 73 20 69 74  3.  tables as it
df00: 20 64 6f 65 73 20 77 69 74 68 20 46 54 53 34 20   does with FTS4 
df10: 74 61 62 6c 65 73 2e 20 46 74 73 34 61 75 78 20  tables. Fts4aux 
df20: 74 61 62 6c 65 73 20 61 72 65 20 72 65 61 64 2d  tables are read-
df30: 6f 6e 6c 79 2e 20 54 68 65 20 6f 6e 6c 79 0a 20  only. The only. 
df40: 20 77 61 79 20 74 6f 20 6d 6f 64 69 66 79 20 74   way to modify t
df50: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
df60: 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20  n fts4aux table 
df70: 69 73 20 62 79 20 6d 6f 64 69 66 79 69 6e 67 20  is by modifying 
df80: 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f  the.  contents o
df90: 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  f the associated
dfa0: 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20   FTS table. The 
dfb0: 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 20 69  fts4aux module i
dfc0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
dfd0: 20 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 61 6c    included in al
dfe0: 6c 20 5b 63 6f 6d 70 69 6c 65 20 66 74 73 7c 62  l [compile fts|b
dff0: 75 69 6c 64 73 20 74 68 61 74 20 69 6e 63 6c 75  uilds that inclu
e000: 64 65 20 46 54 53 5d 2e 0a 0a 3c 70 3e 0a 20 20  de FTS]...<p>.  
e010: 41 6e 20 66 74 73 34 61 75 78 20 76 69 72 74 75  An fts4aux virtu
e020: 61 6c 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73  al table is cons
e030: 74 72 75 63 74 65 64 20 77 69 74 68 20 61 20 73  tructed with a s
e040: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d  ingle argument -
e050: 20 74 68 65 20 0a 20 20 75 6e 71 75 61 6c 69 66   the .  unqualif
e060: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
e070: 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20 69  FTS table that i
e080: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
e090: 6f 20 61 63 63 65 73 73 2e 0a 20 20 46 6f 72 20  o access..  For 
e0a0: 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
e0b0: 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72  lock>.  <i>-- Cr
e0c0: 65 61 74 65 20 61 6e 20 46 54 53 34 20 74 61 62  eate an FTS4 tab
e0d0: 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  le</i>.  CREATE 
e0e0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 66 74  VIRTUAL TABLE ft
e0f0: 20 55 53 49 4e 47 20 66 74 73 34 28 78 2c 20 79   USING fts4(x, y
e100: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61  );..  <i>-- Crea
e110: 74 65 20 61 6e 20 66 74 73 34 61 75 78 20 74 61  te an fts4aux ta
e120: 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ble to access th
e130: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
e140: 78 20 66 6f 72 20 74 61 62 6c 65 20 22 66 74 22  x for table "ft"
e150: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
e160: 52 54 55 41 4c 20 54 41 42 4c 45 20 66 74 5f 74  RTUAL TABLE ft_t
e170: 65 72 6d 73 20 55 53 49 4e 47 20 66 74 73 34 61  erms USING fts4a
e180: 75 78 28 66 74 29 3b 0a 3c 2f 63 6f 64 65 62 6c  ux(ft);.</codebl
e190: 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  ock>..<p>.  For 
e1a0: 65 61 63 68 20 74 65 72 6d 20 70 72 65 73 65 6e  each term presen
e1b0: 74 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  t in the FTS tab
e1c0: 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 62 65  le, there are be
e1d0: 74 77 65 65 6e 20 32 20 61 6e 64 20 4e 2b 31 20  tween 2 and N+1 
e1e0: 72 6f 77 73 0a 20 20 69 6e 20 74 68 65 20 66 74  rows.  in the ft
e1f0: 73 34 61 75 78 20 74 61 62 6c 65 2c 20 77 68 65  s4aux table, whe
e200: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
e210: 65 72 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  er of user-defin
e220: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  ed columns in.  
e230: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 46  the associated F
e240: 54 53 20 74 61 62 6c 65 2e 20 41 6e 20 66 74 73  TS table. An fts
e250: 34 61 75 78 20 74 61 62 6c 65 20 61 6c 77 61 79  4aux table alway
e260: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 66  s has the same f
e270: 6f 75 72 20 63 6f 6c 75 6d 6e 73 2c 20 0a 20 20  our columns, .  
e280: 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 66 72 6f 6d  as follows, from
e290: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 3a 0a   left to right:.
e2a0: 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d  .<table striped=
e2b0: 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c  1>.  <tr><th>Col
e2c0: 75 6d 6e 20 4e 61 6d 65 3c 74 68 3e 43 6f 6c 75  umn Name<th>Colu
e2d0: 6d 6e 20 43 6f 6e 74 65 6e 74 73 0a 20 20 3c 74  mn Contents.  <t
e2e0: 72 3e 3c 74 64 3e 74 65 72 6d 3c 74 64 3e 20 0a  r><td>term<td> .
e2f0: 20 20 20 20 43 6f 6e 74 61 69 6e 73 20 74 68 65      Contains the
e300: 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 65 72   text of the ter
e310: 6d 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 0a  m for this row..
e320: 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6c 3c 74 64    <tr><td>col<td
e330: 3e 20 0a 20 20 20 20 54 68 69 73 20 63 6f 6c 75  > .    This colu
e340: 6d 6e 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  mn may contain e
e350: 69 74 68 65 72 20 74 68 65 20 74 65 78 74 20 76  ither the text v
e360: 61 6c 75 65 20 27 2a 27 20 28 69 2e 65 2e 20 61  alue '*' (i.e. a
e370: 20 73 69 6e 67 6c 65 20 0a 20 20 20 20 63 68 61   single .    cha
e380: 72 61 63 74 65 72 2c 20 55 54 46 20 63 6f 64 65  racter, UTF code
e390: 70 6f 69 6e 74 20 34 32 29 20 6f 72 20 61 6e 20  point 42) or an 
e3a0: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
e3b0: 30 20 61 6e 64 20 4e 2d 31 2c 20 77 68 65 72 65  0 and N-1, where
e3c0: 20 4e 20 69 73 0a 20 20 20 20 61 67 61 69 6e 20   N is.    again 
e3d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
e3e0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er-defined colum
e3f0: 6e 73 20 69 6e 20 74 68 65 20 63 6f 72 72 65 73  ns in the corres
e400: 70 6f 6e 64 69 6e 67 20 46 54 53 20 74 61 62 6c  ponding FTS tabl
e410: 65 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 64 6f  e...  <tr><td>do
e420: 63 75 6d 65 6e 74 73 3c 74 64 3e 0a 20 20 20 20  cuments<td>.    
e430: 54 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6c 77 61  This column alwa
e440: 79 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ys contains an i
e450: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 67 72 65  nteger value gre
e460: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a  ater than zero..
e470: 20 20 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20      <br><br>.   
e480: 20 49 66 20 74 68 65 20 22 63 6f 6c 22 20 63 6f   If the "col" co
e490: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  lumn contains th
e4a0: 65 20 76 61 6c 75 65 20 27 2a 27 2c 20 74 68 65  e value '*', the
e4b0: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 0a 20 20  n this column.  
e4c0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
e4d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66  umber of rows of
e4e0: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 74   the FTS table t
e4f0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c  hat contain at l
e500: 65 61 73 74 20 6f 6e 65 0a 20 20 20 20 69 6e 73  east one.    ins
e510: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72  tance of the ter
e520: 6d 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e  m (in any column
e530: 29 2e 20 49 66 20 63 6f 6c 20 63 6f 6e 74 61 69  ). If col contai
e540: 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 20 20  ns an integer.  
e550: 20 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68    value, then th
e560: 69 73 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  is column contai
e570: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
e580: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53   rows of the FTS
e590: 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
e5a0: 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
e5b0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
e5c0: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
e5d0: 20 63 6f 6c 75 6d 6e 20 69 64 65 6e 74 69 66 69   column identifi
e5e0: 65 64 20 62 79 0a 20 20 20 20 74 68 65 20 63 6f  ed by.    the co
e5f0: 6c 20 76 61 6c 75 65 2e 20 41 73 20 75 73 75 61  l value. As usua
e600: 6c 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  l, the columns o
e610: 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  f the FTS table 
e620: 61 72 65 20 6e 75 6d 62 65 72 65 64 0a 20 20 20  are numbered.   
e630: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
e640: 67 68 74 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ght, starting wi
e650: 74 68 20 7a 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e  th zero...  <tr>
e660: 3c 74 64 3e 6f 63 63 75 72 72 65 6e 63 65 73 3c  <td>occurrences<
e670: 74 64 3e 0a 20 20 20 20 54 68 69 73 20 63 6f 6c  td>.    This col
e680: 75 6d 6e 20 61 6c 73 6f 20 61 6c 77 61 79 73 20  umn also always 
e690: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65  contains an inte
e6a0: 67 65 72 20 76 61 6c 75 65 20 67 72 65 61 74 65  ger value greate
e6b0: 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20  r than zero..   
e6c0: 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66   <br><br>.    If
e6d0: 20 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d   the "col" colum
e6e0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  n contains the v
e6f0: 61 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74  alue '*', then t
e700: 68 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63  his column.    c
e710: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 74 61  ontains the tota
e720: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74  l number of inst
e730: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72  ances of the ter
e740: 6d 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66  m in all rows of
e750: 20 74 68 65 20 0a 20 20 20 20 46 54 53 20 74 61   the .    FTS ta
e760: 62 6c 65 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75  ble (in any colu
e770: 6d 6e 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  mn). Otherwise, 
e780: 69 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20  if col contains 
e790: 61 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76  an integer.    v
e7a0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20  alue, then this 
e7b0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
e7c0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
e7d0: 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
e7e0: 20 74 68 65 0a 20 20 20 20 74 65 72 6d 20 74 68   the.    term th
e7f0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
e800: 20 46 54 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d   FTS table colum
e810: 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  n identified by 
e820: 74 68 65 20 63 6f 6c 0a 20 20 20 20 76 61 6c 75  the col.    valu
e830: 65 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e  e..</table>..<p>
e840: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e850: 75 73 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  using the tables
e860: 20 63 72 65 61 74 65 64 20 61 62 6f 76 65 3a 0a   created above:.
e870: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 49  .<codeblock>.  I
e880: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 28 78 2c  NSERT INTO ft(x,
e890: 20 79 29 20 56 41 4c 55 45 53 28 27 41 70 70 6c   y) VALUES('Appl
e8a0: 65 20 62 61 6e 61 6e 61 27 2c 20 27 43 68 65 72  e banana', 'Cher
e8b0: 72 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ry');.  INSERT I
e8c0: 4e 54 4f 20 66 74 28 78 2c 20 79 29 20 56 41 4c  NTO ft(x, y) VAL
e8d0: 55 45 53 28 27 42 61 6e 61 6e 61 20 44 61 74 65  UES('Banana Date
e8e0: 20 44 61 74 65 27 2c 20 27 63 68 65 72 72 79 27   Date', 'cherry'
e8f0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
e900: 20 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53   ft(x, y) VALUES
e910: 28 27 43 68 65 72 72 79 20 45 6c 64 65 72 62 65  ('Cherry Elderbe
e920: 72 72 79 27 2c 20 27 45 6c 64 65 72 62 65 72 72  rry', 'Elderberr
e930: 79 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  y');..  <i>-- Th
e940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
e950: 79 20 72 65 74 75 72 6e 73 20 74 68 69 73 20 64  y returns this d
e960: 61 74 61 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ata:</i>.  <i>--
e970: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
e980: 20 61 70 70 6c 65 20 20 20 20 20 20 20 7c 20 20   apple       |  
e990: 2a 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69  *  |  1  |  1</i
e9a0: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70  >.  <i>--     ap
e9b0: 70 6c 65 20 20 20 20 20 20 20 7c 20 20 30 20 20  ple       |  0  
e9c0: 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
e9d0: 20 3c 69 3e 2d 2d 20 20 20 20 20 62 61 6e 61 6e   <i>--     banan
e9e0: 61 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20  a      |  *  |  
e9f0: 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69  2  |  2</i>.  <i
ea00: 3e 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20  >--     banana  
ea10: 20 20 20 20 7c 20 20 30 20 20 7c 20 20 32 20 20      |  0  |  2  
ea20: 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  |  2</i>.  <i>--
ea30: 20 20 20 20 20 63 68 65 72 72 79 20 20 20 20 20       cherry     
ea40: 20 7c 20 20 2a 20 20 7c 20 20 33 20 20 7c 20 20   |  *  |  3  |  
ea50: 33 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  3</i>.  <i>--   
ea60: 20 20 63 68 65 72 72 79 20 20 20 20 20 20 7c 20    cherry      | 
ea70: 20 30 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f   0  |  1  |  1</
ea80: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63  i>.  <i>--     c
ea90: 68 65 72 72 79 20 20 20 20 20 20 7c 20 20 31 20  herry      |  1 
eaa0: 20 7c 20 20 32 20 20 7c 20 20 32 3c 2f 69 3e 0a   |  2  |  2</i>.
eab0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 64 61 74 65    <i>--     date
eac0: 20 20 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20          |  *  | 
ead0: 20 31 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c   1  |  2</i>.  <
eae0: 69 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20  i>--     date   
eaf0: 20 20 20 20 20 7c 20 20 30 20 20 7c 20 20 31 20       |  0  |  1 
eb00: 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   |  2</i>.  <i>-
eb10: 2d 20 20 20 20 20 65 6c 64 65 72 62 65 72 72 79  -     elderberry
eb20: 20 20 7c 20 20 2a 20 20 7c 20 20 31 20 20 7c 20    |  *  |  1  | 
eb30: 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   2</i>.  <i>--  
eb40: 20 20 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c     elderberry  |
eb50: 20 20 31 20 20 7c 20 20 31 20 20 7c 20 20 31 3c    1  |  1  |  1<
eb60: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
eb70: 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20 31  elderberry  |  1
eb80: 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e    |  1  |  1</i>
eb90: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53  .  <i>--</i>.  S
eba0: 45 4c 45 43 54 20 74 65 72 6d 2c 20 63 6f 6c 2c  ELECT term, col,
ebb0: 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75   documents, occu
ebc0: 72 72 65 6e 63 65 73 20 46 52 4f 4d 20 66 74 5f  rrences FROM ft_
ebd0: 74 65 72 6d 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  terms;.</codeblo
ebe0: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 74 68  ck>..<p>.  In th
ebf0: 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76  e example, the v
ec00: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 22 74 65  alues in the "te
ec10: 72 6d 22 20 63 6f 6c 75 6d 6e 20 61 72 65 20 61  rm" column are a
ec20: 6c 6c 20 6c 6f 77 65 72 20 63 61 73 65 2c 20 0a  ll lower case, .
ec30: 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68    even though th
ec40: 65 79 20 77 65 72 65 20 69 6e 73 65 72 74 65 64  ey were inserted
ec50: 20 69 6e 74 6f 20 74 61 62 6c 65 20 22 66 74 22   into table "ft"
ec60: 20 69 6e 20 6d 69 78 65 64 20 63 61 73 65 2e 20   in mixed case. 
ec70: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a  This is because.
ec80: 20 20 61 6e 20 66 74 73 33 61 75 78 20 74 61 62    an fts3aux tab
ec90: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
eca0: 74 65 72 6d 73 20 61 73 20 65 78 74 72 61 63 74  terms as extract
ecb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75  ed from the docu
ecc0: 6d 65 6e 74 20 74 65 78 74 0a 20 20 62 79 20 74  ment text.  by t
ecd0: 68 65 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20  he [tokenizer]. 
ece0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 69  In this case, si
ecf0: 6e 63 65 20 74 61 62 6c 65 20 22 66 74 22 20 75  nce table "ft" u
ed00: 73 65 73 20 74 68 65 20 0a 20 20 5b 74 6f 6b 65  ses the .  [toke
ed10: 6e 69 7a 65 72 7c 73 69 6d 70 6c 65 20 74 6f 6b  nizer|simple tok
ed20: 65 6e 69 7a 65 72 5d 2c 20 74 68 69 73 20 6d 65  enizer], this me
ed30: 61 6e 73 20 61 6c 6c 20 74 65 72 6d 73 20 68 61  ans all terms ha
ed40: 76 65 20 62 65 65 6e 20 66 6f 6c 64 65 64 20 74  ve been folded t
ed50: 6f 0a 20 20 6c 6f 77 65 72 20 63 61 73 65 2e 20  o.  lower case. 
ed60: 41 6c 73 6f 2c 20 74 68 65 72 65 20 69 73 20 28  Also, there is (
ed70: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 6e 6f 20  for example) no 
ed80: 72 6f 77 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  row with column 
ed90: 22 74 65 72 6d 22 0a 20 20 73 65 74 20 74 6f 20  "term".  set to 
eda0: 22 61 70 70 6c 65 22 20 61 6e 64 20 63 6f 6c 75  "apple" and colu
edb0: 6d 6e 20 22 63 6f 6c 22 20 73 65 74 20 74 6f 20  mn "col" set to 
edc0: 31 2e 20 53 69 6e 63 65 20 74 68 65 72 65 20 61  1. Since there a
edd0: 72 65 20 6e 6f 20 69 6e 73 74 61 6e 63 65 73 0a  re no instances.
ede0: 20 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61    of the term "a
edf0: 70 70 6c 65 22 20 69 6e 20 63 6f 6c 75 6d 6e 20  pple" in column 
ee00: 31 2c 20 6e 6f 20 72 6f 77 20 69 73 20 70 72 65  1, no row is pre
ee10: 73 65 6e 74 20 69 6e 20 74 68 65 20 66 74 73 34  sent in the fts4
ee20: 61 75 78 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a  aux table...<p>.
ee30: 20 20 44 75 72 69 6e 67 20 61 20 74 72 61 6e 73    During a trans
ee40: 61 63 74 69 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20  action, some of 
ee50: 74 68 65 20 64 61 74 61 20 77 72 69 74 74 65 6e  the data written
ee60: 20 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65   to an FTS table
ee70: 20 6d 61 79 20 62 65 20 0a 20 20 63 61 63 68 65   may be .  cache
ee80: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
ee90: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
eea0: 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 77 68 65  atabase only whe
eeb0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
eec0: 6e 20 69 73 20 0a 20 20 63 6f 6d 6d 69 74 74 65  n is .  committe
eed0: 64 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 69  d. However the i
eee0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
eef0: 20 74 68 65 20 66 74 73 34 61 75 78 20 6d 6f 64   the fts4aux mod
ef00: 75 6c 65 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65  ule is only able
ef10: 20 0a 20 20 74 6f 20 72 65 61 64 20 64 61 74 61   .  to read data
ef20: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
ef30: 73 65 2e 20 49 6e 20 70 72 61 63 74 69 63 65 20  se. In practice 
ef40: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
ef50: 69 66 20 61 6e 20 66 74 73 34 61 75 78 20 0a 20  if an fts4aux . 
ef60: 20 74 61 62 6c 65 20 69 73 20 71 75 65 72 69 65   table is querie
ef70: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
ef80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 77  transaction in w
ef90: 68 69 63 68 20 74 68 65 20 61 73 73 6f 63 69 61  hich the associa
efa0: 74 65 64 20 0a 20 20 46 54 53 20 74 61 62 6c 65  ted .  FTS table
efb0: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
efc0: 65 64 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20  ed, the results 
efd0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65  of the query are
efe0: 20 6c 69 6b 65 6c 79 20 74 6f 20 72 65 66 6c 65   likely to refle
eff0: 63 74 20 0a 20 20 6f 6e 6c 79 20 61 20 28 70 6f  ct .  only a (po
f000: 73 73 69 62 6c 79 20 65 6d 70 74 79 29 20 73 75  ssibly empty) su
f010: 62 73 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e  bset of the chan
f020: 67 65 73 20 6d 61 64 65 2e 0a 0a 3c 68 31 20 69  ges made...<h1 i
f030: 64 3d 66 74 73 34 5f 6f 70 74 69 6f 6e 73 20 74  d=fts4_options t
f040: 61 67 73 3d 22 46 54 53 34 20 6f 70 74 69 6f 6e  ags="FTS4 option
f050: 73 22 3e 46 54 53 34 20 4f 70 74 69 6f 6e 73 3c  s">FTS4 Options<
f060: 2f 68 31 3e 0a 0a 3c 70 3e 0a 3c 74 63 6c 3e 68  /h1>..<p>.<tcl>h
f070: 64 5f 66 72 61 67 6d 65 6e 74 20 2a 6d 61 74 63  d_fragment *matc
f080: 68 69 6e 66 6f 5f 66 74 73 33 20 7b 6d 61 74 63  hinfo_fts3 {matc
f090: 68 69 6e 66 6f 5f 66 74 73 33 7d 3c 2f 74 63 6c  hinfo_fts3}</tcl
f0a0: 3e 0a 0a 20 20 49 66 20 74 68 65 20 22 43 52 45  >..  If the "CRE
f0b0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
f0c0: 45 22 20 73 74 61 74 65 6d 65 6e 74 20 73 70 65  E" statement spe
f0d0: 63 69 66 69 65 73 20 6d 6f 64 75 6c 65 20 46 54  cifies module FT
f0e0: 53 34 20 28 6e 6f 74 20 46 54 53 33 29 2c 20 0a  S4 (not FTS3), .
f0f0: 20 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 64    then special d
f100: 69 72 65 63 74 69 76 65 73 20 2d 20 46 54 53 34  irectives - FTS4
f110: 20 6f 70 74 69 6f 6e 73 20 2d 20 73 69 6d 69 6c   options - simil
f120: 61 72 20 74 6f 20 74 68 65 20 22 74 6f 6b 65 6e  ar to the "token
f130: 69 7a 65 3d 2a 22 20 6f 70 74 69 6f 6e 0a 20 20  ize=*" option.  
f140: 6d 61 79 20 61 6c 73 6f 20 61 70 70 65 61 72 20  may also appear 
f150: 69 6e 20 70 6c 61 63 65 20 6f 66 20 63 6f 6c 75  in place of colu
f160: 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e 20 46 54 53  mn names. An FTS
f170: 34 20 6f 70 74 69 6f 6e 20 63 6f 6e 73 69 73 74  4 option consist
f180: 73 20 6f 66 20 74 68 65 0a 20 20 6f 70 74 69 6f  s of the.  optio
f190: 6e 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f 77 65 64  n name, followed
f1a0: 20 62 79 20 61 6e 20 22 3d 22 20 63 68 61 72 61   by an "=" chara
f1b0: 63 74 65 72 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  cter, followed b
f1c0: 79 20 74 68 65 20 6f 70 74 69 6f 6e 20 76 61 6c  y the option val
f1d0: 75 65 2e 0a 20 20 54 68 65 20 6f 70 74 69 6f 6e  ue..  The option
f1e0: 20 76 61 6c 75 65 20 6d 61 79 20 6f 70 74 69 6f   value may optio
f1f0: 6e 61 6c 6c 79 20 62 65 20 65 6e 63 6c 6f 73 65  nally be enclose
f200: 64 20 69 6e 20 73 69 6e 67 6c 65 20 6f 72 20 64  d in single or d
f210: 6f 75 62 6c 65 20 71 75 6f 74 65 73 2c 20 77 69  ouble quotes, wi
f220: 74 68 0a 20 20 65 6d 62 65 64 64 65 64 20 71 75  th.  embedded qu
f230: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 65  ote characters e
f240: 73 63 61 70 65 64 20 69 6e 20 74 68 65 20 73 61  scaped in the sa
f250: 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20 53 51  me way as for SQ
f260: 4c 20 6c 69 74 65 72 61 6c 73 2e 20 54 68 65 72  L literals. Ther
f270: 65 0a 20 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  e.  may not be w
f280: 68 69 74 65 73 70 61 63 65 20 6f 6e 20 65 69 74  hitespace on eit
f290: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
f2a0: 22 3d 22 20 63 68 61 72 61 63 74 65 72 2e 20 46  "=" character. F
f2b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 20 20 74 6f  or example,.  to
f2c0: 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 34 20   create an FTS4 
f2d0: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 76  table with the v
f2e0: 61 6c 75 65 20 6f 66 20 6f 70 74 69 6f 6e 20 22  alue of option "
f2f0: 6d 61 74 63 68 69 6e 66 6f 22 20 73 65 74 20 74  matchinfo" set t
f300: 6f 20 22 66 74 73 33 22 3a 0a 0a 3c 63 6f 64 65  o "fts3":..<code
f310: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
f320: 72 65 61 74 65 20 61 20 72 65 64 75 63 65 64 2d  reate a reduced-
f330: 66 6f 6f 74 70 72 69 6e 74 20 46 54 53 34 20 74  footprint FTS4 t
f340: 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  able.</i>.  CREA
f350: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
f360: 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74   papers USING ft
f370: 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d  s4(author, docum
f380: 65 6e 74 2c 20 6d 61 74 63 68 69 6e 66 6f 3d 66  ent, matchinfo=f
f390: 74 73 33 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  ts3);.</codebloc
f3a0: 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 34 20 63  k>..<p>.  FTS4 c
f3b0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
f3c0: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
f3d0: 74 68 72 65 65 20 6f 70 74 69 6f 6e 73 3a 0a 0a  three options:..
f3e0: 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31  <table striped=1
f3f0: 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 74 69  >.  <tr><th>Opti
f400: 6f 6e 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61  on<th>Interpreta
f410: 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6d  tion.  <tr><td>m
f420: 61 74 63 68 69 6e 66 6f 3c 74 64 3e 20 54 68 69  atchinfo<td> Thi
f430: 73 20 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  s option may onl
f440: 79 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  y be set to the 
f450: 76 61 6c 75 65 20 22 66 74 73 33 22 2e 0a 20 20  value "fts3"..  
f460: 20 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20    Attempting to 
f470: 73 65 74 20 69 74 20 6f 74 68 65 72 77 69 73 65  set it otherwise
f480: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 66   is an error. If
f490: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20   this option is 
f4a0: 73 70 65 63 69 66 69 65 64 2c 0a 20 20 20 20 74  specified,.    t
f4b0: 68 65 6e 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  hen some of the 
f4c0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
f4d0: 6e 20 73 74 6f 72 65 64 20 62 79 20 46 54 53 34  n stored by FTS4
f4e0: 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 54 68 69   is omitted. Thi
f4f0: 73 20 72 65 64 75 63 65 73 0a 20 20 20 20 74 68  s reduces.    th
f500: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
f510: 20 73 70 61 63 65 20 63 6f 6e 73 75 6d 65 64 20   space consumed 
f520: 62 79 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65  by an FTS4 table
f530: 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 6c 6d   until it is alm
f540: 6f 73 74 20 74 68 65 0a 20 20 20 20 73 61 6d 65  ost the.    same
f550: 20 61 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 74   as the amount t
f560: 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73 65  hat would be use
f570: 64 20 62 79 20 74 68 65 20 65 71 75 69 76 61 6c  d by the equival
f580: 65 6e 74 20 46 54 53 33 20 74 61 62 6c 65 2c 20  ent FTS3 table, 
f590: 62 75 74 20 0a 20 20 20 20 61 6c 73 6f 20 6d 65  but .    also me
f5a0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
f5b0: 61 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  a accessed by pa
f5c0: 73 73 69 6e 67 20 74 68 65 20 27 6c 27 20 66 6c  ssing the 'l' fl
f5d0: 61 67 20 74 6f 20 74 68 65 20 0a 20 20 20 20 5b  ag to the .    [
f5e0: 6d 61 74 63 68 69 6e 66 6f 28 29 5d 20 66 75 6e  matchinfo()] fun
f5f0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61  ction is not ava
f600: 69 6c 61 62 6c 65 2e 0a 0a 20 20 3c 74 72 3e 3c  ilable...  <tr><
f610: 74 64 3e 63 6f 6d 70 72 65 73 73 3c 74 64 3e 0a  td>compress<td>.
f620: 20 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20      This option 
f630: 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
f640: 66 79 20 74 68 65 20 63 6f 6d 70 72 65 73 73 20  fy the compress 
f650: 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
f660: 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20  an error to.    
f670: 73 70 65 63 69 66 79 20 61 20 63 6f 6d 70 72 65  specify a compre
f680: 73 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ss function with
f690: 6f 75 74 20 61 6c 73 6f 20 73 70 65 63 69 66 79  out also specify
f6a0: 69 6e 67 20 61 6e 20 75 6e 63 6f 6d 70 72 65 73  ing an uncompres
f6b0: 73 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 20  s.    function. 
f6c0: 5b 66 74 73 34 20 63 6f 6d 70 72 65 73 73 20 6f  [fts4 compress o
f6d0: 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d  ption|See below]
f6e0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
f6f0: 20 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 75 6e 63    .  <tr><td>unc
f700: 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20 20 20  ompress<td>.    
f710: 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 75  This option is u
f720: 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74  sed to specify t
f730: 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
f740: 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 61 6e  nction. It is an
f750: 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20 73 70   error to.    sp
f760: 65 63 69 66 79 20 61 6e 20 75 6e 63 6f 6d 70 72  ecify an uncompr
f770: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ess function wit
f780: 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63 69 66  hout also specif
f790: 79 69 6e 67 20 61 20 63 6f 6d 70 72 65 73 73 0a  ying a compress.
f7a0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 20 5b 66      function. [f
f7b0: 74 73 34 20 63 6f 6d 70 72 65 73 73 20 6f 70 74  ts4 compress opt
f7c0: 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d 20 66  ion|See below] f
f7d0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 20 20 3c  or details...  <
f7e0: 74 72 3e 3c 74 64 3e 6f 72 64 65 72 3c 74 64 3e  tr><td>order<td>
f7f0: 0a 20 20 20 20 54 68 65 20 22 6f 72 64 65 72 22  .    The "order"
f800: 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65 20 73   option may be s
f810: 65 74 20 74 6f 20 65 69 74 68 65 72 20 22 44 45  et to either "DE
f820: 53 43 22 20 6f 72 20 22 41 53 43 22 20 28 69 6e  SC" or "ASC" (in
f830: 20 75 70 70 65 72 20 6f 72 0a 20 20 20 20 6c 6f   upper or.    lo
f840: 77 65 72 20 63 61 73 65 29 2e 20 49 66 20 69 74  wer case). If it
f850: 20 69 73 20 73 65 74 20 74 6f 20 22 44 45 53 43   is set to "DESC
f860: 22 2c 20 74 68 65 6e 20 46 54 53 34 20 73 74 6f  ", then FTS4 sto
f870: 72 65 73 20 69 74 73 20 64 61 74 61 20 69 6e 20  res its data in 
f880: 73 75 63 68 0a 20 20 20 20 61 20 77 61 79 20 61  such.    a way a
f890: 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 72 65  s to optimize re
f8a0: 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 73 20  turning results 
f8b0: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
f8c0: 64 65 72 20 62 79 20 64 6f 63 69 64 2e 0a 20 20  der by docid..  
f8d0: 20 20 49 66 20 69 74 20 69 73 20 73 65 74 20 74    If it is set t
f8e0: 6f 20 22 41 53 43 22 20 28 74 68 65 20 64 65 66  o "ASC" (the def
f8f0: 61 75 6c 74 29 2c 20 74 68 65 6e 20 74 68 65 20  ault), then the 
f900: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
f910: 61 72 65 20 0a 20 20 20 20 6f 70 74 69 6d 69 7a  are .    optimiz
f920: 65 64 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67  ed for returning
f930: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 73 63 65   results in asce
f940: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 64  nding order by d
f950: 6f 63 69 64 2e 20 49 6e 20 6f 74 68 65 72 0a 20  ocid. In other. 
f960: 20 20 20 77 6f 72 64 73 2c 20 69 66 20 6d 61 6e     words, if man
f970: 79 20 6f 66 20 74 68 65 20 71 75 65 72 69 65 73  y of the queries
f980: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 74 68 65   run against the
f990: 20 46 54 53 34 20 74 61 62 6c 65 20 75 73 65 20   FTS4 table use 
f9a0: 22 4f 52 44 45 52 20 42 59 0a 20 20 20 20 64 6f  "ORDER BY.    do
f9b0: 63 69 64 20 44 45 53 43 22 2c 20 74 68 65 6e 20  cid DESC", then 
f9c0: 69 74 20 6d 61 79 20 69 6d 70 72 6f 76 65 20 70  it may improve p
f9d0: 65 72 66 6f 72 6d 61 6e 63 65 20 74 6f 20 61 64  erformance to ad
f9e0: 64 20 74 68 65 20 22 6f 72 64 65 72 3d 64 65 73  d the "order=des
f9f0: 63 22 20 0a 20 20 20 20 6f 70 74 69 6f 6e 20 74  c" .    option t
fa00: 6f 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52  o the CREATE VIR
fa10: 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
fa20: 6d 65 6e 74 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64  ment...  <tr><td
fa30: 3e 70 72 65 66 69 78 3c 74 64 3e 0a 20 20 20 20  >prefix<td>.    
fa40: 54 68 69 73 20 6f 70 74 69 6f 6e 20 6d 61 79 20  This option may 
fa50: 62 65 20 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d  be set to a comm
fa60: 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a-separated list
fa70: 20 6f 66 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e   of positive non
fa80: 2d 7a 65 72 6f 20 0a 20 20 20 20 69 6e 74 65 67  -zero .    integ
fa90: 65 72 73 2e 20 46 6f 72 20 65 61 63 68 20 69 6e  ers. For each in
faa0: 74 65 67 65 72 20 4e 20 69 6e 20 74 68 65 20 6c  teger N in the l
fab0: 69 73 74 2c 20 61 20 73 65 70 61 72 61 74 65 20  ist, a separate 
fac0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
fad0: 0a 20 20 20 20 69 6e 20 74 68 65 20 64 61 74 61  .    in the data
fae0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 74  base file to opt
faf0: 69 6d 69 7a 65 20 5b 46 54 53 20 4d 41 54 43 48  imize [FTS MATCH
fb00: 7c 74 65 72 6d 20 70 72 65 66 69 78 5d 20 71 75  |term prefix] qu
fb10: 65 72 69 65 73 20 77 68 65 72 65 0a 20 20 20 20  eries where.    
fb20: 74 68 65 20 71 75 65 72 79 20 74 65 72 6d 20 69  the query term i
fb30: 73 20 4e 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  s N bytes in len
fb40: 67 74 68 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  gth, not includi
fb50: 6e 67 20 74 68 65 20 27 2a 27 20 63 68 61 72 61  ng the '*' chara
fb60: 63 74 65 72 2c 0a 20 20 20 20 77 68 65 6e 20 65  cter,.    when e
fb70: 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46  ncoded using UTF
fb80: 2d 38 2e 20 5b 66 74 73 34 20 70 72 65 66 69 78  -8. [fts4 prefix
fb90: 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c 6f   option|See belo
fba0: 77 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  w] for details..
fbb0: 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20  .</table>..<p>. 
fbc0: 20 57 68 65 6e 20 75 73 69 6e 67 20 46 54 53 34   When using FTS4
fbd0: 2c 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 63  , specifying a c
fbe0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 68 61 74 20  olumn name that 
fbf0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3d 22 20  contains an "=" 
fc00: 63 68 61 72 61 63 74 65 72 0a 20 20 61 6e 64 20  character.  and 
fc10: 69 73 20 6e 6f 74 20 65 69 74 68 65 72 20 61 20  is not either a 
fc20: 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22 20 73 70 65  "tokenize=*" spe
fc30: 63 69 66 69 63 61 74 69 6f 6e 20 6f 72 20 61 20  cification or a 
fc40: 72 65 63 6f 67 6e 69 7a 65 64 20 46 54 53 34 20  recognized FTS4 
fc50: 6f 70 74 69 6f 6e 0a 20 20 69 73 20 61 6e 20 65  option.  is an e
fc60: 72 72 6f 72 2e 20 57 69 74 68 20 46 54 53 33 2c  rror. With FTS3,
fc70: 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e   the first token
fc80: 20 69 6e 20 74 68 65 20 75 6e 72 65 63 6f 67 6e   in the unrecogn
fc90: 69 7a 65 64 20 64 69 72 65 63 74 69 76 65 20 69  ized directive i
fca0: 73 20 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64  s .  interpreted
fcb0: 20 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d   as a column nam
fcc0: 65 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 73 70  e. Similarly, sp
fcd0: 65 63 69 66 79 69 6e 67 20 6d 75 6c 74 69 70 6c  ecifying multipl
fce0: 65 20 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22 0a 20  e "tokenize=*". 
fcf0: 20 64 69 72 65 63 74 69 76 65 73 20 69 6e 20 61   directives in a
fd00: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 64 65   single table de
fd10: 63 6c 61 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  claration is an 
fd20: 65 72 72 6f 72 20 77 68 65 6e 20 75 73 69 6e 67  error when using
fd30: 20 46 54 53 34 2c 20 77 68 65 72 65 61 73 0a 20   FTS4, whereas. 
fd40: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
fd50: 73 75 62 73 65 71 75 65 6e 74 20 22 74 6f 6b 65  subsequent "toke
fd60: 6e 69 7a 65 3d 2a 22 20 64 69 72 65 63 74 69 76  nize=*" directiv
fd70: 65 73 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  es are interpret
fd80: 65 64 20 61 73 20 63 6f 6c 75 6d 6e 0a 20 20 6e  ed as column.  n
fd90: 61 6d 65 73 20 62 79 20 46 54 53 33 2e 20 46 6f  ames by FTS3. Fo
fda0: 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
fdb0: 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
fdc0: 41 6e 20 65 72 72 6f 72 2e 20 46 54 53 34 20 64  An error. FTS4 d
fdd0: 6f 65 73 20 6e 6f 74 20 72 65 63 6f 67 6e 69 7a  oes not recogniz
fde0: 65 20 74 68 65 20 64 69 72 65 63 74 69 76 65 20  e the directive 
fdf0: 22 78 79 7a 3d 61 62 63 22 2e 3c 2f 69 3e 0a 20  "xyz=abc".</i>. 
fe00: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
fe10: 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49  TABLE papers USI
fe20: 4e 47 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20  NG fts4(author, 
fe30: 64 6f 63 75 6d 65 6e 74 2c 20 78 79 7a 3d 61 62  document, xyz=ab
fe40: 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  c);..  <i>-- Cre
fe50: 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c  ate an FTS3 tabl
fe60: 65 20 77 69 74 68 20 74 68 72 65 65 20 63 6f 6c  e with three col
fe70: 75 6d 6e 73 20 2d 20 22 61 75 74 68 6f 72 22 2c  umns - "author",
fe80: 20 22 64 6f 63 75 6d 65 6e 74 22 3c 2f 69 3e 0a   "document"</i>.
fe90: 20 20 3c 69 3e 2d 2d 20 61 6e 64 20 22 78 79 7a    <i>-- and "xyz
fea0: 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  ".</i>.  CREATE 
feb0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
fec0: 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33 28  pers USING fts3(
fed0: 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74  author, document
fee0: 2c 20 78 79 7a 3d 61 62 63 29 3b 0a 0a 20 20 3c  , xyz=abc);..  <
fef0: 69 3e 2d 2d 20 41 6e 20 65 72 72 6f 72 2e 20 46  i>-- An error. F
ff00: 54 53 34 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  TS4 does not all
ff10: 6f 77 20 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65  ow multiple toke
ff20: 6e 69 7a 65 3d 2a 20 64 69 72 65 63 74 69 76 65  nize=* directive
ff30: 73 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  s</i>.  CREATE V
ff40: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70  IRTUAL TABLE pap
ff50: 65 72 73 20 55 53 49 4e 47 20 66 74 73 34 28 74  ers USING fts4(t
ff60: 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20  okenize=porter, 
ff70: 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29  tokenize=simple)
ff80: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
ff90: 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20  e an FTS3 table 
ffa0: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 6f  with a single co
ffb0: 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 74 6f 6b 65  lumn named "toke
ffc0: 6e 69 7a 65 22 2e 20 54 68 65 3c 2f 69 3e 0a 20  nize". The</i>. 
ffd0: 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 75 73 65   <i>-- table use
ffe0: 73 20 74 68 65 20 22 70 6f 72 74 65 72 22 20 74  s the "porter" t
fff0: 6f 6b 65 6e 69 7a 65 72 2e 3c 2f 69 3e 0a 20 20  okenizer.</i>.  
10000 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
10010 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e  ABLE papers USIN
10020 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d  G fts3(tokenize=
10030 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e 69 7a 65  porter, tokenize
10040 3d 73 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e  =simple);..  <i>
10050 2d 2d 20 41 6e 20 65 72 72 6f 72 2e 20 43 61 6e  -- An error. Can
10060 6e 6f 74 20 63 72 65 61 74 65 20 61 20 74 61 62  not create a tab
10070 6c 65 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75  le with two colu
10080 6d 6e 73 20 6e 61 6d 65 64 20 22 74 6f 6b 65 6e  mns named "token
10090 69 7a 65 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  ize".</i>.  CREA
100a0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
100b0 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74   papers USING ft
100c0 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74  s3(tokenize=port
100d0 65 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d  er, tokenize=sim
100e0 70 6c 65 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63  ple, tokenize=ic
100f0 75 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  u);.</codeblock>
10100 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65  ..<tcl>hd_fragme
10110 6e 74 20 2a 66 74 73 34 63 6f 6d 70 72 65 73 73  nt *fts4compress
10120 69 6f 6e 20 7b 63 6f 6d 70 72 65 73 73 65 64 20  ion {compressed 
10130 46 54 53 34 20 63 6f 6e 74 65 6e 74 7d 3c 2f 74  FTS4 content}</t
10140 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22 66 74  cl>.<h2 tags="ft
10150 73 34 20 63 6f 6d 70 72 65 73 73 20 6f 70 74 69  s4 compress opti
10160 6f 6e 22 3e 20 43 6f 6d 70 72 65 73 73 2f 55 6e  on"> Compress/Un
10170 63 6f 6d 70 72 65 73 73 20 3c 2f 68 32 3e 0a 0a  compress </h2>..
10180 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6d 70 72 65  <p>.  The compre
10190 73 73 20 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73  ss and uncompres
101a0 73 20 6f 70 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  s options allow 
101b0 46 54 53 34 20 63 6f 6e 74 65 6e 74 20 74 6f 20  FTS4 content to 
101c0 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 74  be stored in.  t
101d0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61  he database in a
101e0 20 63 6f 6d 70 72 65 73 73 65 64 20 66 6f 72 6d   compressed form
101f0 2e 20 42 6f 74 68 20 6f 70 74 69 6f 6e 73 20 73  . Both options s
10200 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
10210 74 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 61 6e  the name.  of an
10220 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
10230 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20  tion registered 
10240 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63  using [sqlite3_c
10250 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
10260 5d 0a 20 20 74 68 61 74 20 61 63 63 65 70 74 73  ].  that accepts
10270 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
10280 6e 74 2e 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  nt. ..<p>.  The 
10290 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f  compress functio
102a0 6e 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  n should return 
102b0 61 20 63 6f 6d 70 72 65 73 73 65 64 20 76 65 72  a compressed ver
102c0 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 6c 75  sion of the valu
102d0 65 20 0a 20 20 70 61 73 73 65 64 20 74 6f 20 69  e .  passed to i
102e0 74 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  t as an argument
102f0 2e 20 45 61 63 68 20 74 69 6d 65 20 64 61 74 61  . Each time data
10300 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
10310 68 65 20 46 54 53 34 20 74 61 62 6c 65 2c 20 0a  he FTS4 table, .
10320 20 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 76 61    each column va
10330 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
10340 20 74 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75   the compress fu
10350 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 72  nction and the r
10360 65 73 75 6c 74 20 76 61 6c 75 65 20 0a 20 20 73  esult value .  s
10370 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
10380 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6d 70 72  abase. The compr
10390 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ess function may
103a0 20 72 65 74 75 72 6e 20 61 6e 79 20 74 79 70 65   return any type
103b0 20 6f 66 20 53 51 4c 69 74 65 20 0a 20 20 76 61   of SQLite .  va
103c0 6c 75 65 20 28 62 6c 6f 62 2c 20 74 65 78 74 2c  lue (blob, text,
103d0 20 72 65 61 6c 2c 20 69 6e 74 65 67 65 72 20 6f   real, integer o
103e0 72 20 6e 75 6c 6c 29 2e 0a 0a 3c 70 3e 0a 20 20  r null)...<p>.  
103f0 54 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66  The uncompress f
10400 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 75  unction should u
10410 6e 63 6f 6d 70 72 65 73 73 20 64 61 74 61 20 70  ncompress data p
10420 72 65 76 69 6f 75 73 6c 79 20 63 6f 6d 70 72 65  reviously compre
10430 73 73 65 64 20 62 79 0a 20 20 74 68 65 20 63 6f  ssed by.  the co
10440 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 2e  mpress function.
10450 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
10460 20 66 6f 72 20 61 6c 6c 20 53 51 4c 69 74 65 20   for all SQLite 
10470 76 61 6c 75 65 73 20 58 2c 20 69 74 20 73 68 6f  values X, it sho
10480 75 6c 64 0a 20 20 62 65 20 74 72 75 65 20 74 68  uld.  be true th
10490 61 74 20 75 6e 63 6f 6d 70 72 65 73 73 28 63 6f  at uncompress(co
104a0 6d 70 72 65 73 73 28 58 29 29 20 65 71 75 61 6c  mpress(X)) equal
104b0 73 20 58 2e 20 57 68 65 6e 20 64 61 74 61 20 74  s X. When data t
104c0 68 61 74 20 68 61 73 20 62 65 65 6e 0a 20 20 63  hat has been.  c
104d0 6f 6d 70 72 65 73 73 65 64 20 62 79 20 74 68 65  ompressed by the
104e0 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69   compress functi
104f0 6f 6e 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  on is read from 
10500 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20  the database by 
10510 46 54 53 34 2c 20 69 74 0a 20 20 69 73 20 70 61  FTS4, it.  is pa
10520 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 63 6f  ssed to the unco
10530 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
10540 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65  before it is use
10550 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65  d...<p>.  If the
10560 20 73 70 65 63 69 66 69 65 64 20 63 6f 6d 70 72   specified compr
10570 65 73 73 20 6f 72 20 75 6e 63 6f 6d 70 72 65 73  ess or uncompres
10580 73 20 66 75 6e 63 74 69 6f 6e 73 20 64 6f 20 6e  s functions do n
10590 6f 74 20 65 78 69 73 74 2c 20 74 68 65 20 74 61  ot exist, the ta
105a0 62 6c 65 0a 20 20 6d 61 79 20 73 74 69 6c 6c 20  ble.  may still 
105b0 62 65 20 63 72 65 61 74 65 64 2e 20 41 6e 20 65  be created. An e
105c0 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
105d0 72 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20 46  rned until the F
105e0 54 53 34 20 74 61 62 6c 65 20 69 73 0a 20 20 72  TS4 table is.  r
105f0 65 61 64 20 28 69 66 20 74 68 65 20 75 6e 63 6f  ead (if the unco
10600 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
10610 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 29 20  does not exist) 
10620 6f 72 20 77 72 69 74 74 65 6e 20 28 69 66 20 69  or written (if i
10630 74 20 69 73 20 74 68 65 20 0a 20 20 63 6f 6d 70  t is the .  comp
10640 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  ress function th
10650 61 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  at does not exis
10660 74 29 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  t)...<codeblock>
10670 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
10680 61 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68  an FTS4 table th
10690 61 74 20 73 74 6f 72 65 73 20 64 61 74 61 20 69  at stores data i
106a0 6e 20 63 6f 6d 70 72 65 73 73 65 64 20 66 6f 72  n compressed for
106b0 6d 2e 20 54 68 69 73 3c 2f 69 3e 0a 20 20 3c 69  m. This</i>.  <i
106c0 3e 2d 2d 20 61 73 73 75 6d 65 73 20 74 68 61 74  >-- assumes that
106d0 20 74 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63   the scalar func
106e0 74 69 6f 6e 73 20 7a 69 70 28 29 20 61 6e 64 20  tions zip() and 
106f0 75 6e 7a 69 70 28 29 20 68 61 76 65 20 62 65 65  unzip() have bee
10700 6e 20 28 6f 72 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  n (or</i>.  <i>-
10710 2d 20 77 69 6c 6c 20 62 65 29 20 61 64 64 65 64  - will be) added
10720 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10730 20 68 61 6e 64 6c 65 2e 3c 2f 69 3e 0a 20 20 43   handle.</i>.  C
10740 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
10750 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
10760 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20 64 6f   fts4(author, do
10770 63 75 6d 65 6e 74 2c 20 63 6f 6d 70 72 65 73 73  cument, compress
10780 3d 7a 69 70 2c 20 75 6e 63 6f 6d 70 72 65 73 73  =zip, uncompress
10790 3d 75 6e 7a 69 70 29 3b 0a 3c 2f 63 6f 64 65 62  =unzip);.</codeb
107a0 6c 6f 63 6b 3e 0a 0a 3c 68 32 20 74 61 67 73 3d  lock>..<h2 tags=
107b0 22 66 74 73 34 20 70 72 65 66 69 78 20 6f 70 74  "fts4 prefix opt
107c0 69 6f 6e 22 3e 50 72 65 66 69 78 3c 2f 68 32 3e  ion">Prefix</h2>
107d0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 34  ..<p>.  The FTS4
107e0 20 70 72 65 66 69 78 20 6f 70 74 69 6f 6e 20 63   prefix option c
107f0 61 75 73 65 73 20 46 54 53 20 74 6f 20 69 6e 64  auses FTS to ind
10800 65 78 20 74 65 72 6d 20 70 72 65 66 69 78 65 73  ex term prefixes
10810 20 6f 66 20 73 70 65 63 69 66 69 65 64 20 6c 65   of specified le
10820 6e 67 74 68 73 0a 20 20 69 6e 20 74 68 65 20 73  ngths.  in the s
10830 61 6d 65 20 77 61 79 20 74 68 61 74 20 69 74 20  ame way that it 
10840 61 6c 77 61 79 73 20 69 6e 64 65 78 65 73 20 63  always indexes c
10850 6f 6d 70 6c 65 74 65 20 74 65 72 6d 73 2e 20 54  omplete terms. T
10860 68 65 20 70 72 65 66 69 78 20 6f 70 74 69 6f 6e  he prefix option
10870 20 6d 75 73 74 20 62 65 20 73 65 74 20 0a 20 20   must be set .  
10880 74 6f 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72  to a comma separ
10890 61 74 65 64 20 6c 69 73 74 20 6f 66 20 70 6f 73  ated list of pos
108a0 69 74 69 76 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  itive non-zero i
108b0 6e 74 65 67 65 72 73 2e 20 46 6f 72 20 65 61 63  ntegers. For eac
108c0 68 20 76 61 6c 75 65 20 4e 20 69 6e 20 74 68 65  h value N in the
108d0 20 0a 20 20 6c 69 73 74 2c 20 70 72 65 66 69 78   .  list, prefix
108e0 65 73 20 6f 66 20 6c 65 6e 67 74 68 20 4e 20 62  es of length N b
108f0 79 74 65 73 20 28 77 68 65 6e 20 65 6e 63 6f 64  ytes (when encod
10900 65 64 20 75 73 69 6e 67 20 55 54 46 2d 38 29 20  ed using UTF-8) 
10910 61 72 65 20 69 6e 64 65 78 65 64 2e 20 46 54 53  are indexed. FTS
10920 34 20 75 73 65 73 0a 20 20 74 65 72 6d 20 70 72  4 uses.  term pr
10930 65 66 69 78 20 69 6e 64 65 78 65 73 20 74 6f 20  efix indexes to 
10940 73 70 65 65 64 20 75 70 20 74 65 72 6d 20 70 72  speed up term pr
10950 65 66 69 78 20 71 75 65 72 69 65 73 2e 20 54 68  efix queries. Th
10960 65 20 63 6f 73 74 2c 20 6f 66 20 63 6f 75 72 73  e cost, of cours
10970 65 2c 20 69 73 20 74 68 61 74 0a 20 20 69 6e 64  e, is that.  ind
10980 65 78 69 6e 67 20 74 65 72 6d 20 70 72 65 66 69  exing term prefi
10990 78 65 73 20 61 73 20 77 65 6c 6c 20 61 73 20 63  xes as well as c
109a0 6f 6d 70 6c 65 74 65 20 74 65 72 6d 73 20 69 6e  omplete terms in
109b0 63 72 65 61 73 65 73 20 74 68 65 20 64 61 74 61  creases the data
109c0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 0a 20 20  base size and.  
109d0 73 6c 6f 77 73 20 64 6f 77 6e 20 77 72 69 74 65  slows down write
109e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
109f0 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e 0a 0a  he FTS4 table...
10a00 3c 70 3e 0a 20 20 50 72 65 66 69 78 20 69 6e 64  <p>.  Prefix ind
10a10 65 78 65 73 20 6d 61 79 20 62 65 20 75 73 65 64  exes may be used
10a20 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 65 72   to optimize ter
10a30 6d 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73  m prefix queries
10a40 20 69 6e 20 74 77 6f 20 63 61 73 65 73 2e 20 49   in two cases. I
10a50 66 20 74 68 65 0a 20 20 71 75 65 72 79 20 69 73  f the.  query is
10a60 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 6f 66   for a prefix of
10a70 20 4e 20 62 79 74 65 73 2c 20 74 68 65 6e 20 61   N bytes, then a
10a80 20 70 72 65 66 69 78 20 69 6e 64 65 78 20 63 72   prefix index cr
10a90 65 61 74 65 64 20 77 69 74 68 20 22 70 72 65 66  eated with "pref
10aa0 69 78 3d 4e 22 20 0a 20 20 70 72 6f 76 69 64 65  ix=N" .  provide
10ab0 73 20 74 68 65 20 62 65 73 74 20 6f 70 74 69 6d  s the best optim
10ac0 69 7a 61 74 69 6f 6e 2e 20 4f 72 2c 20 69 66 20  ization. Or, if 
10ad0 6e 6f 20 22 70 72 65 66 69 78 3d 4e 22 20 69 6e  no "prefix=N" in
10ae0 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
10af0 2c 20 61 0a 20 20 22 70 72 65 66 69 78 3d 4e 2b  , a.  "prefix=N+
10b00 31 22 20 69 6e 64 65 78 20 69 6d 61 79 20 62 65  1" index imay be
10b10 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 20 55   used instead. U
10b20 73 69 6e 67 20 61 20 22 70 72 65 66 69 78 3d 4e  sing a "prefix=N
10b30 2b 31 22 20 69 6e 64 65 78 20 69 73 20 6c 65 73  +1" index is les
10b40 73 0a 20 20 65 66 66 69 63 69 65 6e 74 20 74 68  s.  efficient th
10b50 61 6e 20 61 20 22 70 72 65 66 69 78 3d 4e 22 20  an a "prefix=N" 
10b60 69 6e 64 65 78 2c 20 62 75 74 20 69 73 20 62 65  index, but is be
10b70 74 74 65 72 20 74 68 61 6e 20 6e 6f 20 70 72 65  tter than no pre
10b80 66 69 78 20 69 6e 64 65 78 20 61 74 20 61 6c 6c  fix index at all
10b90 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
10ba0 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e   <i>-- Create an
10bb0 20 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68   FTS4 table with
10bc0 20 69 6e 64 65 78 65 73 20 74 6f 20 6f 70 74 69   indexes to opti
10bd0 6d 69 7a 65 20 32 20 61 6e 64 20 34 20 62 79 74  mize 2 and 4 byt
10be0 65 20 74 65 72 6d 20 70 72 65 66 69 78 20 71 75  e term prefix qu
10bf0 65 72 69 65 73 2e 3c 2f 69 3e 0a 20 20 43 52 45  eries.</i>.  CRE
10c00 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
10c10 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 28  E t1 USING fts4(
10c20 63 31 2c 20 63 32 2c 20 70 72 65 66 69 78 3d 22  c1, c2, prefix="
10c30 32 2c 34 22 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  2,4");..  <i>-- 
10c40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
10c50 6f 20 71 75 65 72 69 65 73 20 61 72 65 20 62 6f  o queries are bo
10c60 74 68 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  th optimized usi
10c70 6e 67 20 74 68 65 20 70 72 65 66 69 78 20 69 6e  ng the prefix in
10c80 64 65 78 65 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c  dexes.</i>.  SEL
10c90 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
10ca0 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 62  ERE t1 MATCH 'ab
10cb0 2a 27 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  *';.  SELECT * F
10cc0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
10cd0 4d 41 54 43 48 20 27 61 62 63 64 2a 27 3b 0a 0a  MATCH 'abcd*';..
10ce0 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
10cf0 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65  owing two querie
10d00 73 20 61 72 65 20 62 6f 74 68 20 70 61 72 74 69  s are both parti
10d10 61 6c 6c 79 20 6f 70 74 69 6d 69 7a 65 64 20 75  ally optimized u
10d20 73 69 6e 67 20 74 68 65 20 70 72 65 66 69 78 3c  sing the prefix<
10d30 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 64 65  /i>.  <i>-- inde
10d40 78 65 73 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  xes. The optimiz
10d50 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 73 20  ation is not as 
10d60 70 72 6f 6e 6f 75 6e 63 65 64 20 61 73 20 69 74  pronounced as it
10d70 20 69 73 20 66 6f 72 20 74 68 65 20 71 75 65 72   is for the quer
10d80 69 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ies</i>.  <i>-- 
10d90 61 62 6f 76 65 2c 20 62 75 74 20 73 74 69 6c 6c  above, but still
10da0 20 61 6e 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20   an improvement 
10db0 6f 76 65 72 20 6e 6f 20 70 72 65 66 69 78 20 69  over no prefix i
10dc0 6e 64 65 78 65 73 20 61 74 20 61 6c 6c 2e 3c 2f  ndexes at all.</
10dd0 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
10de0 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
10df0 41 54 43 48 20 27 61 2a 27 3b 0a 20 20 53 45 4c  ATCH 'a*';.  SEL
10e00 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
10e10 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 62  ERE t1 MATCH 'ab
10e20 63 2a 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  c*';.</codeblock
10e30 3e 0a 0a 3c 68 31 20 69 64 3d 74 6f 6b 65 6e 69  >..<h1 id=tokeni
10e40 7a 65 72 20 74 61 67 73 3d 22 74 6f 6b 65 6e 69  zer tags="tokeni
10e50 7a 65 72 22 3e 54 6f 6b 65 6e 69 7a 65 72 73 3c  zer">Tokenizers<
10e60 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 46  /h1>..<p>.  An F
10e70 54 53 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20  TS tokenizer is 
10e80 61 20 73 65 74 20 6f 66 20 72 75 6c 65 73 20 66  a set of rules f
10e90 6f 72 20 65 78 74 72 61 63 74 69 6e 67 20 74 65  or extracting te
10ea0 72 6d 73 20 66 72 6f 6d 20 61 20 64 6f 63 75 6d  rms from a docum
10eb0 65 6e 74 20 0a 20 20 6f 72 20 62 61 73 69 63 20  ent .  or basic 
10ec0 46 54 53 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  FTS full-text qu
10ed0 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e 6c  ery. ..<p>.  Unl
10ee0 65 73 73 20 61 20 73 70 65 63 69 66 69 63 20 74  ess a specific t
10ef0 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 70 65 63  okenizer is spec
10f00 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
10f10 20 74 68 65 20 43 52 45 41 54 45 20 0a 20 20 56   the CREATE .  V
10f20 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61  IRTUAL TABLE sta
10f30 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 63  tement used to c
10f40 72 65 61 74 65 20 74 68 65 20 46 54 53 20 74 61  reate the FTS ta
10f50 62 6c 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74  ble, the default
10f60 20 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 22   .  tokenizer, "
10f70 73 69 6d 70 6c 65 22 2c 20 69 73 20 75 73 65 64  simple", is used
10f80 2e 20 54 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b  . The simple tok
10f90 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73 20  enizer extracts 
10fa0 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20 20 61 20  tokens from.  a 
10fb0 64 6f 63 75 6d 65 6e 74 20 6f 72 20 62 61 73 69  document or basi
10fc0 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78 74 20  c FTS full-text 
10fd0 71 75 65 72 79 20 61 63 63 6f 72 64 69 6e 67 20  query according 
10fe0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
10ff0 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c 75 6c 3e   .  rules:..<ul>
11000 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74 65 72  .  <li><p> A ter
11010 6d 20 69 73 20 61 20 63 6f 6e 74 69 67 75 6f 75  m is a contiguou
11020 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 6c  s sequence of el
11030 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65 72  igible character
11040 73 2c 20 77 68 65 72 65 20 0a 20 20 20 20 65 6c  s, where .    el
11050 69 67 69 62 6c 65 20 63 68 61 72 61 63 74 65 72  igible character
11060 73 20 61 72 65 20 61 6c 6c 20 61 6c 70 68 61 6e  s are all alphan
11070 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
11080 73 2c 20 74 68 65 20 22 5f 22 20 63 68 61 72 61  s, the "_" chara
11090 63 74 65 72 2c 0a 20 20 20 20 61 6e 64 20 61 6c  cter,.    and al
110a0 6c 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74  l characters wit
110b0 68 20 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73  h UTF codepoints
110c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
110d0 20 65 71 75 61 6c 20 74 6f 20 31 32 38 2e 0a 20   equal to 128.. 
110e0 20 20 20 41 6c 6c 20 6f 74 68 65 72 20 63 68 61     All other cha
110f0 72 61 63 74 65 72 73 20 61 72 65 20 64 69 73 63  racters are disc
11100 61 72 64 65 64 20 77 68 65 6e 20 73 70 6c 69 74  arded when split
11110 74 69 6e 67 20 61 20 64 6f 63 75 6d 65 6e 74 20  ting a document 
11120 69 6e 74 6f 20 74 65 72 6d 73 2e 0a 20 20 20 20  into terms..    
11130 54 68 65 69 72 20 6f 6e 6c 79 20 63 6f 6e 74 72  Their only contr
11140 69 62 75 74 69 6f 6e 20 69 73 20 74 6f 20 73 65  ibution is to se
11150 70 61 72 61 74 65 20 61 64 6a 61 63 65 6e 74 20  parate adjacent 
11160 74 65 72 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  terms...  <li><p
11170 3e 20 41 6c 6c 20 75 70 70 65 72 63 61 73 65 20  > All uppercase 
11180 63 68 61 72 61 63 74 65 72 73 20 77 69 74 68 69  characters withi
11190 6e 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67  n the ASCII rang
111a0 65 20 28 55 54 46 20 63 6f 64 65 70 6f 69 6e 74  e (UTF codepoint
111b0 73 20 6c 65 73 73 20 0a 20 20 20 20 74 68 61 6e  s less .    than
111c0 20 31 32 38 29 2c 20 61 72 65 20 74 72 61 6e 73   128), are trans
111d0 66 6f 72 6d 65 64 20 74 6f 20 74 68 65 69 72 20  formed to their 
111e0 6c 6f 77 65 72 63 61 73 65 20 65 71 75 69 76 61  lowercase equiva
111f0 6c 65 6e 74 73 20 61 73 20 70 61 72 74 20 6f 66  lents as part of
11200 20 74 68 65 0a 20 20 20 20 74 6f 6b 65 6e 69 7a   the.    tokeniz
11210 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 54  ation process. T
11220 68 75 73 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71  hus, full-text q
11230 75 65 72 69 65 73 20 61 72 65 20 63 61 73 65 2d  ueries are case-
11240 69 6e 73 65 6e 73 69 74 69 76 65 20 77 68 65 6e  insensitive when
11250 0a 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 73  .    using the s
11260 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e  imple tokenizer.
11270 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f  .</ul>..<p>.  Fo
11280 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
11290 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 74 61  a document conta
112a0 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20 22  ining the text "
112b0 52 69 67 68 74 20 6e 6f 77 2c 20 74 68 65 79 27  Right now, they'
112c0 72 65 20 76 65 72 79 0a 20 20 66 72 75 73 74 72  re very.  frustr
112d0 61 74 65 64 2e 22 2c 20 74 68 65 20 74 65 72 6d  ated.", the term
112e0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
112f0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 61 6e   the document an
11300 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 0a  d added to the .
11310 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65    full-text inde
11320 78 20 61 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c  x are, in order,
11330 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65 79   "right now they
11340 20 72 65 20 76 65 72 79 20 66 72 75 73 74 72 61   re very frustra
11350 74 65 64 22 2e 20 53 75 63 68 0a 20 20 61 20 64  ted". Such.  a d
11360 6f 63 75 6d 65 6e 74 20 77 6f 75 6c 64 20 6d 61  ocument would ma
11370 74 63 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20  tch a full-text 
11380 71 75 65 72 79 20 73 75 63 68 20 61 73 20 22 4d  query such as "M
11390 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65 64  ATCH 'Frustrated
113a0 27 22 2c 20 0a 20 20 61 73 20 74 68 65 20 73 69  '", .  as the si
113b0 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 74  mple tokenizer t
113c0 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 74 65  ransforms the te
113d0 72 6d 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  rm in the query 
113e0 74 6f 20 6c 6f 77 65 72 63 61 73 65 0a 20 20 62  to lowercase.  b
113f0 65 66 6f 72 65 20 73 65 61 72 63 68 69 6e 67 20  efore searching 
11400 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
11410 64 65 78 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77  dex...<p>.  As w
11420 65 6c 6c 20 61 73 20 74 68 65 20 22 73 69 6d 70  ell as the "simp
11430 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74  le" tokenizer, t
11440 68 65 20 46 54 53 20 73 6f 75 72 63 65 20 63 6f  he FTS source co
11450 64 65 20 66 65 61 74 75 72 65 73 20 61 20 74 6f  de features a to
11460 6b 65 6e 69 7a 65 72 20 0a 20 20 74 68 61 74 20  kenizer .  that 
11470 75 73 65 73 20 74 68 65 20 3c 61 20 68 72 65 66  uses the <a href
11480 3d 22 68 74 74 70 3a 2f 2f 74 61 72 74 61 72 75  ="http://tartaru
11490 73 2e 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f  s.org/~martin/Po
114a0 72 74 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f  rterStemmer/">Po
114b0 72 74 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67  rter .  Stemming
114c0 20 61 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20   algorithm</a>. 
114d0 54 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75  This tokenizer u
114e0 73 65 73 20 74 68 65 20 73 61 6d 65 20 72 75 6c  ses the same rul
114f0 65 73 20 74 6f 20 73 65 70 61 72 61 74 65 0a 20  es to separate. 
11500 20 74 68 65 20 69 6e 70 75 74 20 64 6f 63 75 6d   the input docum
11510 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 2c 20  ent into terms, 
11520 62 75 74 20 61 73 20 77 65 6c 6c 20 61 73 20 66  but as well as f
11530 6f 6c 64 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73  olding all terms
11540 20 74 6f 20 6c 6f 77 65 72 0a 20 20 63 61 73 65   to lower.  case
11550 20 69 74 20 75 73 65 73 20 74 68 65 20 50 6f 72   it uses the Por
11560 74 65 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67  ter Stemming alg
11570 6f 72 69 74 68 6d 20 74 6f 20 72 65 64 75 63 65  orithm to reduce
11580 20 72 65 6c 61 74 65 64 20 45 6e 67 6c 69 73 68   related English
11590 20 6c 61 6e 67 75 61 67 65 0a 20 20 77 6f 72 64   language.  word
115a0 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f  s to a common ro
115b0 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ot. For example,
115c0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
115d0 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 61  input document a
115e0 73 20 69 6e 20 74 68 65 0a 20 20 70 61 72 61 67  s in the.  parag
115f0 72 61 70 68 20 61 62 6f 76 65 2c 20 74 68 65 20  raph above, the 
11600 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72  porter tokenizer
11610 20 65 78 74 72 61 63 74 73 20 74 68 65 20 66 6f   extracts the fo
11620 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a  llowing tokens:.
11630 20 20 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65    "right now the
11640 69 20 76 65 72 69 20 66 72 75 73 74 72 61 74 22  i veri frustrat"
11650 2e 20 45 76 65 6e 20 74 68 6f 75 67 68 20 73 6f  . Even though so
11660 6d 65 20 6f 66 20 74 68 65 73 65 20 74 65 72 6d  me of these term
11670 73 20 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20  s are not even. 
11680 20 45 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c 20   English words, 
11690 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 75 73  in some cases us
116a0 69 6e 67 20 74 68 65 6d 20 74 6f 20 62 75 69 6c  ing them to buil
116b0 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  d the full-text 
116c0 69 6e 64 65 78 20 69 73 20 6d 6f 72 65 0a 20 20  index is more.  
116d0 75 73 65 66 75 6c 20 74 68 61 6e 20 74 68 65 20  useful than the 
116e0 6d 6f 72 65 20 69 6e 74 65 6c 6c 69 67 69 62 6c  more intelligibl
116f0 65 20 6f 75 74 70 75 74 20 70 72 6f 64 75 63 65  e output produce
11700 64 20 62 79 20 74 68 65 20 73 69 6d 70 6c 65 20  d by the simple 
11710 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69  tokenizer..  Usi
11720 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f  ng the porter to
11730 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f 63  kenizer, the doc
11740 75 6d 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d  ument not only m
11750 61 74 63 68 65 73 20 66 75 6c 6c 2d 74 65 78 74  atches full-text
11760 20 71 75 65 72 69 65 73 0a 20 20 73 75 63 68 20   queries.  such 
11770 61 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74  as "MATCH 'Frust
11780 72 61 74 65 64 27 22 2c 20 62 75 74 20 61 6c 73  rated'", but als
11790 6f 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  o queries such a
117a0 73 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72  s "MATCH 'Frustr
117b0 61 74 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68  ation'",.  as th
117c0 65 20 74 65 72 6d 20 22 46 72 75 73 74 72 61 74  e term "Frustrat
117d0 69 6f 6e 22 20 69 73 20 72 65 64 75 63 65 64 20  ion" is reduced 
117e0 62 79 20 74 68 65 20 50 6f 72 74 65 72 20 73 74  by the Porter st
117f0 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 20  emmer algorithm 
11800 74 6f 20 0a 20 20 22 66 72 75 73 74 72 61 74 22  to .  "frustrat"
11810 20 2d 20 6a 75 73 74 20 61 73 20 22 46 72 75 73   - just as "Frus
11820 74 72 61 74 65 64 22 20 69 73 2e 20 53 6f 2c 20  trated" is. So, 
11830 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70  when using the p
11840 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c  orter tokenizer,
11850 0a 20 20 46 54 53 20 69 73 20 61 62 6c 65 20 74  .  FTS is able t
11860 6f 20 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20  o find not just 
11870 65 78 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f  exact matches fo
11880 72 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c  r queried terms,
11890 20 62 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61   but matches.  a
118a0 67 61 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45  gainst similar E
118b0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
118c0 74 65 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20  terms. For more 
118d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  information on t
118e0 68 65 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65  he .  Porter Ste
118f0 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20  mmer algorithm, 
11900 70 6c 65 61 73 65 20 72 65 66 65 72 20 74 6f 20  please refer to 
11910 74 68 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20  the page linked 
11920 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78  above...<p>.  Ex
11930 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69  ample illustrati
11940 6e 67 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ng the differenc
11950 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 22 73  e between the "s
11960 69 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74  imple" and "port
11970 65 72 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73  er".  tokenizers
11980 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
11990 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20   <i>-- Create a 
119a0 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
119b0 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72  simple tokenizer
119c0 2e 20 49 6e 73 65 72 74 20 61 20 64 6f 63 75 6d  . Insert a docum
119d0 65 6e 74 20 69 6e 74 6f 20 69 74 2e 3c 2f 69 3e  ent into it.</i>
119e0 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
119f0 4c 20 54 41 42 4c 45 20 73 69 6d 70 6c 65 20 55  L TABLE simple U
11a00 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69  SING fts3(tokeni
11a10 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 20 20 49 4e  ze=simple);.  IN
11a20 53 45 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c 65  SERT INTO simple
11a30 20 56 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e   VALUES('Right n
11a40 6f 77 20 74 68 65 79 27 27 72 65 20 76 65 72 79  ow they''re very
11a50 20 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a 0a   frustrated');..
11a60 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72 73    <i>-- The firs
11a70 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
11a80 6e 67 20 74 77 6f 20 71 75 65 72 69 65 73 20 6d  ng two queries m
11a90 61 74 63 68 65 73 20 74 68 65 20 64 6f 63 75 6d  atches the docum
11aa0 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 3c 2f 69  ent stored in</i
11ab0 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20  >.  <i>-- table 
11ac0 22 73 69 6d 70 6c 65 22 2e 20 54 68 65 20 73 65  "simple". The se
11ad0 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 3c 2f  cond does not.</
11ae0 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
11af0 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45 52 45 20  OM simple WHERE 
11b00 73 69 6d 70 6c 65 20 4d 41 54 43 48 20 27 46 72  simple MATCH 'Fr
11b10 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c  ustrated';.  SEL
11b20 45 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70 6c  ECT * FROM simpl
11b30 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20 4d  e WHERE simple M
11b40 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69 6f  ATCH 'Frustratio
11b50 6e 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  n';..  <i>-- Cre
11b60 61 74 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e  ate a table usin
11b70 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b  g the porter tok
11b80 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 74  enizer. Insert t
11b90 68 65 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e 74  he same document
11ba0 20 69 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20 43   into it</i>.  C
11bb0 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
11bc0 42 4c 45 20 70 6f 72 74 65 72 20 55 53 49 4e 47  BLE porter USING
11bd0 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70   fts3(tokenize=p
11be0 6f 72 74 65 72 29 3b 0a 20 20 49 4e 53 45 52 54  orter);.  INSERT
11bf0 20 49 4e 54 4f 20 70 6f 72 74 65 72 20 56 41 4c   INTO porter VAL
11c00 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74  UES('Right now t
11c10 68 65 79 27 27 72 65 20 76 65 72 79 20 66 72 75  hey''re very fru
11c20 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69  strated');..  <i
11c30 3e 2d 2d 20 42 6f 74 68 20 6f 66 20 74 68 65 20  >-- Both of the 
11c40 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
11c50 73 20 6d 61 74 63 68 20 74 68 65 20 64 6f 63 75  s match the docu
11c60 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74  ment stored in t
11c70 61 62 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c 2f  able "porter".</
11c80 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
11c90 4f 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45 20  OM porter WHERE 
11ca0 70 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46 72  porter MATCH 'Fr
11cb0 75 73 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c  ustrated';.  SEL
11cc0 45 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65  ECT * FROM porte
11cd0 72 20 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d  r WHERE porter M
11ce0 41 54 43 48 20 27 46 72 75 73 74 72 61 74 69 6f  ATCH 'Frustratio
11cf0 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  n';.</codeblock>
11d00 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 69 73 20  ..<p>.  If this 
11d10 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f 6d  extension is com
11d20 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
11d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
11d40 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a 20   pre-processor. 
11d50 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2c   symbol defined,
11d60 20 74 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   then there exis
11d70 74 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 74 6f  ts a built-in to
11d80 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22 69  kenizer named "i
11d90 63 75 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65  cu".  implemente
11da0 64 20 75 73 69 6e 67 20 74 68 65 20 49 43 55 20  d using the ICU 
11db0 6c 69 62 72 61 72 79 2e 20 54 68 65 20 66 69 72  library. The fir
11dc0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
11dd0 65 64 20 74 6f 20 74 68 65 0a 20 20 78 43 72 65  ed to the.  xCre
11de0 61 74 65 28 29 20 6d 65 74 68 6f 64 20 28 73 65  ate() method (se
11df0 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
11e00 2e 68 29 20 6f 66 20 74 68 69 73 20 74 6f 6b 65  .h) of this toke
11e10 6e 69 7a 65 72 20 6d 61 79 20 62 65 0a 20 20 61  nizer may be.  a
11e20 6e 20 49 43 55 20 6c 6f 63 61 6c 65 20 69 64 65  n ICU locale ide
11e30 6e 74 69 66 69 65 72 2e 20 46 6f 72 20 65 78 61  ntifier. For exa
11e40 6d 70 6c 65 20 22 74 72 5f 54 52 22 20 66 6f 72  mple "tr_TR" for
11e50 20 54 75 72 6b 69 73 68 20 61 73 20 75 73 65 64   Turkish as used
11e60 0a 20 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f 72  .  in Turkey, or
11e70 20 22 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e 67   "en_AU" for Eng
11e80 6c 69 73 68 20 61 73 20 75 73 65 64 20 69 6e 20  lish as used in 
11e90 41 75 73 74 72 61 6c 69 61 2e 20 46 6f 72 20 65  Australia. For e
11ea0 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
11eb0 6f 63 6b 3e 0a 20 20 20 20 43 52 45 41 54 45 20  ock>.    CREATE 
11ec0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68  VIRTUAL TABLE th
11ed0 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20 66 74  ai_text USING ft
11ee0 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69 7a  s3(text, tokeniz
11ef0 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 3c 2f 63  e=icu th_TH).</c
11f00 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
11f10 20 54 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a   The ICU tokeniz
11f20 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
11f30 6e 20 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65  n is very simple
11f40 2e 20 49 74 20 73 70 6c 69 74 73 20 74 68 65 20  . It splits the 
11f50 69 6e 70 75 74 0a 20 20 74 65 78 74 20 61 63 63  input.  text acc
11f60 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 49 43  ording to the IC
11f70 55 20 72 75 6c 65 73 20 66 6f 72 20 66 69 6e 64  U rules for find
11f80 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61 72  ing word boundar
11f90 69 65 73 20 61 6e 64 20 64 69 73 63 61 72 64 73  ies and discards
11fa0 0a 20 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74 68  .  any tokens th
11fb0 61 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72  at consist entir
11fc0 65 6c 79 20 6f 66 20 77 68 69 74 65 2d 73 70 61  ely of white-spa
11fd0 63 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  ce. This may be 
11fe0 73 75 69 74 61 62 6c 65 0a 20 20 66 6f 72 20 73  suitable.  for s
11ff0 6f 6d 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ome applications
12000 20 69 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73   in some locales
12010 2c 20 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20 49  , but not all. I
12020 66 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a 20  f more complex. 
12030 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
12040 65 71 75 69 72 65 64 2c 20 66 6f 72 20 65 78 61  equired, for exa
12050 6d 70 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  mple to implemen
12060 74 20 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20 20  t stemming or.  
12070 64 69 73 63 61 72 64 20 70 75 6e 63 74 75 61 74  discard punctuat
12080 69 6f 6e 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ion, this can be
12090 20 64 6f 6e 65 20 62 79 20 63 72 65 61 74 69 6e   done by creatin
120a0 67 20 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20  g a tokenizer.  
120b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
120c0 68 61 74 20 75 73 65 73 20 74 68 65 20 49 43 55  hat uses the ICU
120d0 20 74 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70 61   tokenizer as pa
120e0 72 74 20 6f 66 20 69 74 73 20 69 6d 70 6c 65 6d  rt of its implem
120f0 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c 68 32 3e 43  entation...<h2>C
12100 75 73 74 6f 6d 20 28 55 73 65 72 20 49 6d 70 6c  ustom (User Impl
12110 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69 7a  emented) Tokeniz
12120 65 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ers</h2>..<p>.  
12130 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  As well as the b
12140 75 69 6c 74 2d 69 6e 20 22 73 69 6d 70 6c 65 22  uilt-in "simple"
12150 2c 20 22 70 6f 72 74 65 72 22 20 61 6e 64 20 28  , "porter" and (
12160 70 6f 73 73 69 62 6c 79 29 20 22 69 63 75 22 20  possibly) "icu" 
12170 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 46 54  tokenizers,.  FT
12180 53 20 65 78 70 6f 72 74 73 20 61 6e 20 69 6e 74  S exports an int
12190 65 72 66 61 63 65 20 74 68 61 74 20 61 6c 6c 6f  erface that allo
121a0 77 73 20 75 73 65 72 73 20 74 6f 20 69 6d 70 6c  ws users to impl
121b0 65 6d 65 6e 74 20 63 75 73 74 6f 6d 20 74 6f 6b  ement custom tok
121c0 65 6e 69 7a 65 72 73 0a 20 20 75 73 69 6e 67 20  enizers.  using 
121d0 43 2e 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  C. The interface
121e0 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
121f0 61 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20  a new tokenizer 
12200 69 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20 0a  is defined and .
12210 20 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74    described in t
12220 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  he fts3_tokenize
12230 72 2e 68 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  r.h source file.
12240 0a 0a 3c 70 3e 0a 20 20 52 65 67 69 73 74 65 72  ..<p>.  Register
12250 69 6e 67 20 61 20 6e 65 77 20 46 54 53 20 74 6f  ing a new FTS to
12260 6b 65 6e 69 7a 65 72 20 69 73 20 73 69 6d 69 6c  kenizer is simil
12270 61 72 20 74 6f 20 72 65 67 69 73 74 65 72 69 6e  ar to registerin
12280 67 20 61 20 6e 65 77 0a 20 20 76 69 72 74 75 61  g a new.  virtua
12290 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77  l table module w
122a0 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68 65 20  ith SQLite. The 
122b0 75 73 65 72 20 70 61 73 73 65 73 20 61 20 70 6f  user passes a po
122c0 69 6e 74 65 72 20 74 6f 20 61 0a 20 20 73 74 72  inter to a.  str
122d0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
122e0 67 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 76 61  g pointers to va
122f0 72 69 6f 75 73 20 63 61 6c 6c 62 61 63 6b 20 66  rious callback f
12300 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  unctions that.  
12310 6d 61 6b 65 20 75 70 20 74 68 65 20 69 6d 70 6c  make up the impl
12320 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
12330 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20  e new tokenizer 
12340 74 79 70 65 2e 20 46 6f 72 20 74 6f 6b 65 6e 69  type. For tokeni
12350 7a 65 72 73 2c 0a 20 20 74 68 65 20 73 74 72 75  zers,.  the stru
12360 63 74 75 72 65 20 28 64 65 66 69 6e 65 64 20 69  cture (defined i
12370 6e 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  n fts3_tokenizer
12380 2e 68 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  .h) is called.  
12390 22 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a  "sqlite3_tokeniz
123a0 65 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c 70 3e  er_module"...<p>
123b0 0a 20 20 46 54 53 20 64 6f 65 73 20 6e 6f 74 20  .  FTS does not 
123c0 65 78 70 6f 73 65 20 61 20 43 2d 66 75 6e 63 74  expose a C-funct
123d0 69 6f 6e 20 74 68 61 74 20 75 73 65 72 73 20 63  ion that users c
123e0 61 6c 6c 20 74 6f 20 72 65 67 69 73 74 65 72 20  all to register 
123f0 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 20  new.  tokenizer 
12400 74 79 70 65 73 20 77 69 74 68 20 61 20 64 61 74  types with a dat
12410 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 6e  abase handle. In
12420 73 74 65 61 64 2c 20 74 68 65 20 70 6f 69 6e 74  stead, the point
12430 65 72 20 6d 75 73 74 0a 20 20 62 65 20 65 6e 63  er must.  be enc
12440 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20 62  oded as an SQL b
12450 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64 20 70 61  lob value and pa
12460 73 73 65 64 20 74 6f 20 46 54 53 20 74 68 72 6f  ssed to FTS thro
12470 75 67 68 20 74 68 65 20 53 51 4c 0a 20 20 65 6e  ugh the SQL.  en
12480 67 69 6e 65 20 62 79 20 65 76 61 6c 75 61 74 69  gine by evaluati
12490 6e 67 20 61 20 73 70 65 63 69 61 6c 20 73 63 61  ng a special sca
124a0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c 20 22 66  lar function, "f
124b0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 22  ts3_tokenizer()"
124c0 2e 0a 20 20 54 68 65 20 66 74 73 33 5f 74 6f 6b  ..  The fts3_tok
124d0 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f  enizer() functio
124e0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
124f0 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f 20  with one or two 
12500 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20 61 73 20  arguments,.  as 
12510 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62  follows:..<codeb
12520 6c 6f 63 6b 3e 0a 20 20 20 20 53 45 4c 45 43 54  lock>.    SELECT
12530 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
12540 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61  &lt;tokenizer-na
12550 6d 65 26 67 74 3b 29 3b 0a 20 20 20 20 53 45 4c  me&gt;);.    SEL
12560 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  ECT fts3_tokeniz
12570 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  er(&lt;tokenizer
12580 2d 6e 61 6d 65 26 67 74 3b 2c 20 26 6c 74 3b 73  -name&gt;, &lt;s
12590 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
125a0 5f 6d 6f 64 75 6c 65 20 70 74 72 26 67 74 3b 29  _module ptr&gt;)
125b0 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
125c0 3c 70 3e 0a 20 20 57 68 65 72 65 20 3c 74 6f 6b  <p>.  Where <tok
125d0 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 69 73 20  enizer-name> is 
125e0 61 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66  a string identif
125f0 79 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a  ying the tokeniz
12600 65 72 20 61 6e 64 0a 20 20 3c 73 71 6c 69 74 65  er and.  <sqlite
12610 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
12620 6c 65 20 70 74 72 3e 20 69 73 20 61 20 70 6f 69  le ptr> is a poi
12630 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
12640 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
12650 75 6c 65 0a 20 20 73 74 72 75 63 74 75 72 65 20  ule.  structure 
12660 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51  encoded as an SQ
12670 4c 20 62 6c 6f 62 2e 20 49 66 20 74 68 65 20 73  L blob. If the s
12680 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12690 73 20 70 72 65 73 65 6e 74 2c 0a 20 20 69 74 20  s present,.  it 
126a0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73  is registered as
126b0 20 74 6f 6b 65 6e 69 7a 65 72 20 3c 74 6f 6b 65   tokenizer <toke
126c0 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 61 6e 64 20  nizer-name> and 
126d0 61 20 63 6f 70 79 20 6f 66 20 69 74 0a 20 20 72  a copy of it.  r
126e0 65 74 75 72 6e 65 64 2e 20 49 66 20 6f 6e 6c 79  eturned. If only
126f0 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 69 73   one argument is
12700 20 70 61 73 73 65 64 2c 20 61 20 70 6f 69 6e 74   passed, a point
12710 65 72 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 69  er to the tokeni
12720 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61  zer.  implementa
12730 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 72  tion currently r
12740 65 67 69 73 74 65 72 65 64 20 61 73 20 3c 74 6f  egistered as <to
12750 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 69 73  kenizer-name> is
12760 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 65 6e 63   returned,.  enc
12770 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e 20  oded as a blob. 
12780 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63 68 20 74  Or, if no such t
12790 6f 6b 65 6e 69 7a 65 72 20 65 78 69 73 74 73 2c  okenizer exists,
127a0 20 61 6e 20 53 51 4c 20 65 78 63 65 70 74 69 6f   an SQL exceptio
127b0 6e 0a 20 20 28 65 72 72 6f 72 29 20 69 73 20 72  n.  (error) is r
127c0 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a 20 20 3c 62  aised...<p>.  <b
127d0 3e 53 45 43 55 52 49 54 59 20 57 41 52 4e 49 4e  >SECURITY WARNIN
127e0 47 3c 2f 62 3e 3a 20 49 66 20 74 68 65 20 66 74  G</b>: If the ft
127f0 73 33 2f 34 20 65 78 74 65 6e 73 69 6f 6e 20 69  s3/4 extension i
12800 73 20 75 73 65 64 20 69 6e 20 61 6e 20 65 6e 76  s used in an env
12810 69 72 6f 6e 6d 65 6e 74 0a 20 20 77 68 65 72 65  ironment.  where
12820 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 61 6c   potentially mal
12830 69 63 69 6f 75 73 20 75 73 65 72 73 20 6d 61 79  icious users may
12840 20 65 78 65 63 75 74 65 20 61 72 62 69 74 72 61   execute arbitra
12850 72 79 20 53 51 4c 2c 20 74 68 65 79 20 73 68 6f  ry SQL, they sho
12860 75 6c 64 20 0a 20 20 62 65 20 70 72 65 76 65 6e  uld .  be preven
12870 74 65 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 69 6e  ted from invokin
12880 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e  g the fts3_token
12890 69 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 2c  izer() function,
128a0 20 70 6f 73 73 69 62 6c 79 20 75 73 69 6e 67 20   possibly using 
128b0 0a 20 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f  .  the [sqlite3_
128c0 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29  set_authorizer()
128d0 7c 61 75 74 68 6f 72 69 73 61 74 69 6f 6e 20 63  |authorisation c
128e0 61 6c 6c 62 61 63 6b 5d 2e 0a 0a 3c 70 3e 0a 20  allback]...<p>. 
128f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
12900 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lock contains an
12910 20 65 78 61 6d 70 6c 65 20 6f 66 20 63 61 6c 6c   example of call
12920 69 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f 6b  ing the fts3_tok
12930 65 6e 69 7a 65 72 28 29 0a 20 20 66 75 6e 63 74  enizer().  funct
12940 69 6f 6e 20 66 72 6f 6d 20 43 20 63 6f 64 65 3a  ion from C code:
12950 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
12960 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 52 65 67 69 73  <i>/*.  ** Regis
12970 74 65 72 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20  ter a tokenizer 
12980 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
12990 69 74 68 20 46 54 53 33 20 6f 72 20 46 54 53 34  ith FTS3 or FTS4
129a0 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74  ..  */</i>.  int
129b0 20 72 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a   registerTokeniz
129c0 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20  er(.    sqlite3 
129d0 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a  *db,.    char *z
129e0 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20  Name,.    const 
129f0 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
12a00 72 5f 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b  r_module *p.  ){
12a10 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
12a20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12a30 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Stmt;.    const 
12a40 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45  char *zSql = "SE
12a50 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69  LECT fts3_tokeni
12a60 7a 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20  zer(?, ?)";..   
12a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
12a80 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
12a90 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
12aa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12ad0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
12ae0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12af0 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53   1, zName, -1, S
12b00 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12b10 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
12b20 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26  blob(pStmt, 2, &
12b30 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51  p, sizeof(p), SQ
12b40 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
12b50 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
12b60 53 74 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75  Stmt);..    retu
12b70 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
12b80 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  ize(pStmt);.  }.
12b90 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75  .  <i>/*.  ** Qu
12ba0 65 72 79 20 46 54 53 20 66 6f 72 20 74 68 65 20  ery FTS for the 
12bb0 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
12bc0 65 6e 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20 7a  entation named z
12bd0 4e 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20  Name..  */</i>. 
12be0 20 69 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e 69   int queryTokeni
12bf0 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33  zer(.    sqlite3
12c00 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a   *db,.    char *
12c10 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74  zName,.    const
12c20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
12c30 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 20  er_module **pp. 
12c40 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
12c50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12c60 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e   *pStmt;.    con
12c70 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
12c80 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b  "SELECT fts3_tok
12c90 65 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 20  enizer(?)";..   
12ca0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 72 63   *pp = 0;.    rc
12cb0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
12cc0 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
12cd0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
12ce0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12d10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
12d20 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
12d30 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
12d40 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
12d50 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
12d60 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
12d70 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  mt) ){.      if(
12d80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12d90 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d  type(pStmt, 0)==
12da0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
12db0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 70         memcpy(pp
12dc0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
12dd0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c  _blob(pStmt, 0),
12de0 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20   sizeof(*pp));. 
12df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12e00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12e10 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12e20 3b 0a 20 20 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63  ;.  }.</codebloc
12e30 6b 3e 0a 0a 20 20 0a 3c 68 31 20 74 61 67 73 3d  k>..  .<h1 tags=
12e40 22 73 65 67 6d 65 6e 74 20 62 74 72 65 65 22 3e  "segment btree">
12e50 44 61 74 61 20 53 74 72 75 63 74 75 72 65 73 3c  Data Structures<
12e60 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73  /h1>..<p>.  This
12e70 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62   section describ
12e80 65 73 20 61 74 20 61 20 68 69 67 68 2d 6c 65 76  es at a high-lev
12e90 65 6c 20 74 68 65 20 77 61 79 20 74 68 65 20 46  el the way the F
12ea0 54 53 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73  TS module stores
12eb0 20 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e 64   its.  index and
12ec0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
12ed0 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
12ee0 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  <b>not necessary
12ef0 20 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20 75   to read or .  u
12f00 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61  nderstand the ma
12f10 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20 73  terial in this s
12f20 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20  ection in order 
12f30 74 6f 20 75 73 65 20 46 54 53 3c 2f 62 3e 20 69  to use FTS</b> i
12f40 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61 74  n an .  applicat
12f50 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ion. However, it
12f60 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20 74   may be useful t
12f70 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65  o application de
12f80 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70 74  velopers attempt
12f90 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79 7a  ing .  to analyz
12fa0 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64  e and understand
12fb0 20 46 54 53 20 70 65 72 66 6f 72 6d 61 6e 63 65   FTS performance
12fc0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
12fd0 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70 65  , or to develope
12fe0 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61 74  rs .  contemplat
12ff0 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73  ing enhancements
13000 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e 67   to the existing
13010 20 46 54 53 20 66 65 61 74 75 72 65 20 73 65 74   FTS feature set
13020 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
13030 65 6e 74 20 2a 73 68 61 64 6f 77 74 61 62 20 7b  ent *shadowtab {
13040 46 54 53 20 73 68 61 64 6f 77 20 74 61 62 6c 65  FTS shadow table
13050 73 7d 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20 46  s}</tcl>.<p>.  F
13060 6f 72 20 65 61 63 68 20 46 54 53 20 76 69 72 74  or each FTS virt
13070 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 61 20 64  ual table in a d
13080 61 74 61 62 61 73 65 2c 20 74 68 72 65 65 20 74  atabase, three t
13090 6f 20 66 69 76 65 20 72 65 61 6c 20 28 6e 6f 6e  o five real (non
130a0 2d 76 69 72 74 75 61 6c 29 20 74 61 62 6c 65 73  -virtual) tables
130b0 0a 20 20 61 72 65 20 63 72 65 61 74 65 64 20 74  .  are created t
130c0 6f 20 73 74 6f 72 65 20 74 68 65 20 75 6e 64 65  o store the unde
130d0 72 6c 79 69 6e 67 20 64 61 74 61 2e 20 20 54 68  rlying data.  Th
130e0 65 73 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20  ese real tables 
130f0 61 72 65 20 63 61 6c 6c 65 64 20 22 73 68 61 64  are called "shad
13100 6f 77 20 74 61 62 6c 65 73 22 2e 0a 20 20 54 68  ow tables"..  Th
13110 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20 61 72  e real tables ar
13120 65 20 6e 61 6d 65 64 20 22 25 5f 63 6f 6e 74 65  e named "%_conte
13130 6e 74 22 2c 0a 20 20 22 25 5f 73 65 67 64 69 72  nt",.  "%_segdir
13140 22 2c 20 22 25 5f 73 65 67 6d 65 6e 74 73 22 2c  ", "%_segments",
13150 20 22 25 5f 73 74 61 74 22 2c 20 61 6e 64 20 22   "%_stat", and "
13160 25 5f 64 6f 63 73 69 7a 65 22 2c 20 77 68 65 72  %_docsize", wher
13170 65 20 22 25 22 20 69 73 20 72 65 70 6c 61 63 65  e "%" is replace
13180 64 20 62 79 20 74 68 65 20 6e 61 6d 65 0a 20 20  d by the name.  
13190 6f 66 20 74 68 65 20 46 54 53 20 76 69 72 74 75  of the FTS virtu
131a0 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  al table...<p>. 
131b0 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f   The leftmost co
131c0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22 25 5f 63  lumn of the "%_c
131d0 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 20 69 73  ontent" table is
131e0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
131f0 41 52 59 20 4b 45 59 20 66 69 65 6c 64 0a 20 20  ARY KEY field.  
13200 6e 61 6d 65 64 20 22 64 6f 63 69 64 22 2e 20 46  named "docid". F
13210 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 69 73  ollowing this is
13220 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   one column for 
13230 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
13240 68 65 20 46 54 53 0a 20 20 76 69 72 74 75 61 6c  he FTS.  virtual
13250 20 74 61 62 6c 65 20 61 73 20 64 65 63 6c 61 72   table as declar
13260 65 64 20 62 79 20 74 68 65 20 75 73 65 72 2c 20  ed by the user, 
13270 6e 61 6d 65 64 20 62 79 20 70 72 65 70 65 6e 64  named by prepend
13280 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ing the column n
13290 61 6d 65 0a 20 20 73 75 70 70 6c 69 65 64 20 62  ame.  supplied b
132a0 79 20 74 68 65 20 75 73 65 72 20 77 69 74 68 20  y the user with 
132b0 22 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65  "c<i>N</i>", whe
132c0 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74  re <i>N</i> is t
132d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
132e0 0a 20 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e  .  column within
132f0 20 74 68 65 20 74 61 62 6c 65 2c 20 6e 75 6d 62   the table, numb
13300 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74  ered from left t
13310 6f 20 72 69 67 68 74 20 73 74 61 72 74 69 6e 67  o right starting
13320 20 77 69 74 68 20 30 2e 20 44 61 74 61 0a 20 20   with 0. Data.  
13330 74 79 70 65 73 20 73 75 70 70 6c 69 65 64 20 61  types supplied a
13340 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 76 69  s part of the vi
13350 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c  rtual table decl
13360 61 72 61 74 69 6f 6e 20 61 72 65 20 6e 6f 74 20  aration are not 
13370 75 73 65 64 20 61 73 0a 20 20 70 61 72 74 20 6f  used as.  part o
13380 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  f the %_content 
13390 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  table declaratio
133a0 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  n. For example:.
133b0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
133c0 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62  i>-- Virtual tab
133d0 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f  le declaration</
133e0 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
133f0 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20 55 53  UAL TABLE abc US
13400 49 4e 47 20 66 74 73 34 28 61 20 4e 55 4d 42 45  ING fts4(a NUMBE
13410 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b 0a 0a  R, b TEXT, c);..
13420 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73 70 6f    <i>-- Correspo
13430 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e 74 20  nding %_content 
13440 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  table declaratio
13450 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54  n</i>.  CREATE T
13460 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65 6e 74  ABLE abc_content
13470 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50  (docid INTEGER P
13480 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 30 61 2c  RIMARY KEY, c0a,
13490 20 63 31 62 2c 20 63 32 63 29 3b 0a 3c 2f 63 6f   c1b, c2c);.</co
134a0 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
134b0 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  The %_content ta
134c0 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
134d0 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64   unadulterated d
134e0 61 74 61 20 69 6e 73 65 72 74 65 64 20 62 79 20  ata inserted by 
134f0 74 68 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f  the user .  into
13500 20 74 68 65 20 46 54 53 20 76 69 72 74 75 61 6c   the FTS virtual
13510 20 74 61 62 6c 65 20 62 79 20 74 68 65 20 75 73   table by the us
13520 65 72 2e 20 49 66 20 74 68 65 20 75 73 65 72 20  er. If the user 
13530 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
13540 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20 22  tly.  supply a "
13550 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68 65  docid" value whe
13560 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f  n inserting reco
13570 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c 65  rds, one is sele
13580 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  cted automatical
13590 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79 73 74  ly.  by the syst
135a0 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25  em...<p>.  The %
135b0 5f 73 74 61 74 20 61 6e 64 20 25 5f 64 6f 63 73  _stat and %_docs
135c0 69 7a 65 20 74 61 62 6c 65 73 20 61 72 65 20 6f  ize tables are o
135d0 6e 6c 79 20 63 72 65 61 74 65 64 20 69 66 20 74  nly created if t
135e0 68 65 20 46 54 53 20 74 61 62 6c 65 20 75 73 65  he FTS table use
135f0 73 20 74 68 65 0a 20 20 46 54 53 34 20 6d 6f 64  s the.  FTS4 mod
13600 75 6c 65 2c 20 6e 6f 74 20 46 54 53 33 2e 20 46  ule, not FTS3. F
13610 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20  urthermore, the 
13620 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20  %_docsize table 
13630 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
13640 65 0a 20 20 46 54 53 34 20 74 61 62 6c 65 20 69  e.  FTS4 table i
13650 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74  s created with t
13660 68 65 20 5b 6d 61 74 63 68 69 6e 66 6f 5f 66 74  he [matchinfo_ft
13670 73 33 7c 22 6d 61 74 63 68 69 6e 66 6f 3d 66 74  s3|"matchinfo=ft
13680 73 33 22 5d 20 64 69 72 65 63 74 69 76 65 0a 20  s3"] directive. 
13690 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
136a0 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  rt of the CREATE
136b0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
136c0 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
136d0 79 20 61 72 65 20 63 72 65 61 74 65 64 2c 0a 20  y are created,. 
136e0 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
136f0 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 69 73  he two tables is
13700 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 3c 63 6f   as follows:.<co
13710 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54  deblock>.  CREAT
13720 45 20 54 41 42 4c 45 20 25 5f 73 74 61 74 28 0a  E TABLE %_stat(.
13730 20 20 20 20 69 64 20 49 4e 54 45 47 45 52 20 50      id INTEGER P
13740 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
13750 20 76 61 6c 75 65 20 42 4c 4f 42 0a 20 20 29 3b   value BLOB.  );
13760 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
13770 20 25 5f 64 6f 63 73 69 7a 65 28 0a 20 20 20 20   %_docsize(.    
13780 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52  docid INTEGER PR
13790 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 73  IMARY KEY,.    s
137a0 69 7a 65 20 42 4c 4f 42 0a 20 20 29 3b 0a 3c 2f  ize BLOB.  );.</
137b0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
137c0 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 69    For each row i
137d0 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c  n the FTS table,
137e0 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 74   the %_docsize t
137f0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
13800 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20  corresponding.  
13810 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61 6d  row with the sam
13820 65 20 22 64 6f 63 69 64 22 20 76 61 6c 75 65 2e  e "docid" value.
13830 20 54 68 65 20 22 73 69 7a 65 22 20 66 69 65 6c   The "size" fiel
13840 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f  d contains a blo
13850 62 20 63 6f 6e 73 69 73 74 69 6e 67 0a 20 20 6f  b consisting.  o
13860 66 20 3c 69 3e 4e 3c 2f 69 3e 20 46 54 53 20 76  f <i>N</i> FTS v
13870 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20 3c 69  arints, where <i
13880 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20 6e 75  >N</i> is the nu
13890 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64 65 66  mber of user-def
138a0 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 69  ined columns.  i
138b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45 61 63  n the table. Eac
138c0 68 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  h varint in the 
138d0 22 73 69 7a 65 22 20 62 6c 6f 62 20 69 73 20 74  "size" blob is t
138e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  he number of tok
138f0 65 6e 73 20 69 6e 20 74 68 65 0a 20 20 63 6f 72  ens in the.  cor
13900 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
13910 6e 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61  n of the associa
13920 74 65 64 20 72 6f 77 20 69 6e 20 74 68 65 20 46  ted row in the F
13930 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 25 5f  TS table. The %_
13940 73 74 61 74 20 74 61 62 6c 65 0a 20 20 61 6c 77  stat table.  alw
13950 61 79 73 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ays contains a s
13960 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68 20 74  ingle row with t
13970 68 65 20 22 69 64 22 20 63 6f 6c 75 6d 6e 20 73  he "id" column s
13980 65 74 20 74 6f 20 30 2e 20 54 68 65 20 22 76 61  et to 0. The "va
13990 6c 75 65 22 20 0a 20 20 63 6f 6c 75 6d 6e 20 63  lue" .  column c
139a0 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63  ontains a blob c
139b0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 3c 69 3e  onsisting of <i>
139c0 4e 2b 31 3c 2f 69 3e 20 46 54 53 20 76 61 72 69  N+1</i> FTS vari
139d0 6e 74 73 2c 20 77 68 65 72 65 20 3c 69 3e 4e 3c  nts, where <i>N<
139e0 2f 69 3e 0a 20 20 69 73 20 61 67 61 69 6e 20 74  /i>.  is again t
139f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
13a00 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
13a10 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
13a20 6c 65 2e 20 54 68 65 20 66 69 72 73 74 0a 20 20  le. The first.  
13a30 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20 62 6c  varint in the bl
13a40 6f 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ob is set to the
13a50 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
13a60 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53   rows in the FTS
13a70 20 74 61 62 6c 65 2e 20 54 68 65 0a 20 20 73 65   table. The.  se
13a80 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
13a90 65 6e 74 20 76 61 72 69 6e 74 73 20 63 6f 6e 74  ent varints cont
13aa0 61 69 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ain the total nu
13ab0 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 73  mber of tokens s
13ac0 74 6f 72 65 64 20 69 6e 0a 20 20 74 68 65 20 63  tored in.  the c
13ad0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
13ae0 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73  umn for all rows
13af0 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
13b00 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74 77  e...<p>.  The tw
13b10 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61 62 6c  o remaining tabl
13b20 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  es, %_segments a
13b30 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61 72 65  nd %_segdir, are
13b40 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
13b50 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20  he .  full-text 
13b60 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74 75 61  index. Conceptua
13b70 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65 78 20  lly, this index 
13b80 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c  is a lookup tabl
13b90 65 20 74 68 61 74 20 6d 61 70 73 20 65 61 63 68  e that maps each
13ba0 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64 29 20   .  term (word) 
13bb0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  to the set of do
13bc0 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72 72 65  cid values corre
13bd0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65 63 6f  sponding to reco
13be0 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20 25 5f  rds in the .  %_
13bf0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74 68  content table th
13c00 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20 6f  at contain one o
13c10 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65 6e 63  r more occurrenc
13c20 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  es of the term. 
13c30 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20 61 6c  To.  retrieve al
13c40 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
13c50 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69   contain a speci
13c60 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65 20 46  fied term, the F
13c70 54 53 20 6d 6f 64 75 6c 65 0a 20 20 71 75 65 72  TS module.  quer
13c80 69 65 73 20 74 68 69 73 20 69 6e 64 65 78 20 74  ies this index t
13c90 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
13ca0 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c  set of docid val
13cb0 75 65 73 20 66 6f 72 20 72 65 63 6f 72 64 73 20  ues for records 
13cc0 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20 74  that.  contain t
13cd0 68 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 72 65  he term, then re
13ce0 74 72 69 65 76 65 73 20 74 68 65 20 72 65 71 75  trieves the requ
13cf0 69 72 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 66  ired documents f
13d00 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  rom the %_conten
13d10 74 0a 20 20 74 61 62 6c 65 2e 20 52 65 67 61 72  t.  table. Regar
13d20 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 63 68  dless of the sch
13d30 65 6d 61 20 6f 66 20 74 68 65 20 46 54 53 20 76  ema of the FTS v
13d40 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68  irtual table, th
13d50 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20 20 61  e %_segments.  a
13d60 6e 64 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  nd %_segdir tabl
13d70 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 72  es are always cr
13d80 65 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  eated as follows
13d90 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
13da0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f   CREATE TABLE %_
13db0 73 65 67 6d 65 6e 74 73 28 0a 20 20 20 20 62 6c  segments(.    bl
13dc0 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52  ockid INTEGER PR
13dd0 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 20 20 20  IMARY KEY,      
13de0 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
13df0 64 65 20 69 64 3c 2f 69 3e 0a 20 20 20 20 62 6c  de id</i>.    bl
13e00 6f 63 6b 20 62 6c 6f 62 20 20 20 20 20 20 20 20  ock blob        
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
13e30 64 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 29 3b  de data</i>.  );
13e40 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
13e50 20 25 5f 73 65 67 64 69 72 28 0a 20 20 20 20 6c   %_segdir(.    l
13e60 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 0a 20 20  evel INTEGER,.  
13e70 20 20 69 64 78 20 49 4e 54 45 47 45 52 2c 0a 20    idx INTEGER,. 
13e80 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49     start_block I
13e90 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
13ea0 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63        <i>-- Bloc
13eb0 6b 69 64 20 6f 66 20 66 69 72 73 74 20 6e 6f 64  kid of first nod
13ec0 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
13ed0 2f 69 3e 0a 20 20 20 20 6c 65 61 76 65 73 5f 65  /i>.    leaves_e
13ee0 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52  nd_block INTEGER
13ef0 2c 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d  ,          <i>--
13f00 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74   Blockid of last
13f10 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20 25 5f   leaf node in %_
13f20 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20  segments</i>.   
13f30 20 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47   end_block INTEG
13f40 45 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ER,             
13f50 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
13f60 64 20 6f 66 20 6c 61 73 74 20 6e 6f 64 65 20 69  d of last node i
13f70 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e  n %_segments</i>
13f80 0a 20 20 20 20 72 6f 6f 74 20 42 4c 4f 42 2c 20  .    root BLOB, 
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d          <i>-- B-
13fb0 74 72 65 65 20 72 6f 6f 74 20 6e 6f 64 65 3c 2f  tree root node</
13fc0 69 3e 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b  i>.    PRIMARY K
13fd0 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 0a 20  EY(level, idx). 
13fe0 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e   );.</codeblock>
13ff0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 63 68 65  ..<p>.  The sche
14000 6d 61 20 64 65 70 69 63 74 65 64 20 61 62 6f 76  ma depicted abov
14010 65 20 69 73 20 6e 6f 74 20 64 65 73 69 67 6e 65  e is not designe
14020 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  d to store the f
14030 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 0a  ull-text index .
14040 20 20 64 69 72 65 63 74 6c 79 2e 20 49 6e 73 74    directly. Inst
14050 65 61 64 2c 20 69 74 20 69 73 20 75 73 65 64 20  ead, it is used 
14060 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62  to one or more b
14070 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
14080 2e 20 54 68 65 72 65 0a 20 20 69 73 20 6f 6e 65  . There.  is one
14090 20 62 2d 74 72 65 65 20 66 6f 72 20 65 61 63 68   b-tree for each
140a0 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65   row in the %_se
140b0 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 65 20  gdir table. The 
140c0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 0a 20  %_segdir table. 
140d0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68   row contains th
140e0 65 20 72 6f 6f 74 20 6e 6f 64 65 20 61 6e 64 20  e root node and 
140f0 76 61 72 69 6f 75 73 20 6d 65 74 61 2d 64 61 74  various meta-dat
14100 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
14110 68 20 74 68 65 0a 20 20 62 2d 74 72 65 65 20 73  h the.  b-tree s
14120 74 72 75 63 74 75 72 65 2c 20 61 6e 64 20 74 68  tructure, and th
14130 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
14140 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  le contains all 
14150 6f 74 68 65 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29  other (non-root)
14160 0a 20 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 2e  .  b-tree nodes.
14170 20 45 61 63 68 20 62 2d 74 72 65 65 20 69 73 20   Each b-tree is 
14180 72 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 61  referred to as a
14190 20 22 73 65 67 6d 65 6e 74 22 2e 20 4f 6e 63 65   "segment". Once
141a0 20 69 74 20 68 61 73 0a 20 20 62 65 65 6e 20 63   it has.  been c
141b0 72 65 61 74 65 64 2c 20 61 20 73 65 67 6d 65 6e  reated, a segmen
141c0 74 20 62 2d 74 72 65 65 20 69 73 20 6e 65 76 65  t b-tree is neve
141d0 72 20 75 70 64 61 74 65 64 20 28 61 6c 74 68 6f  r updated (altho
141e0 75 67 68 20 69 74 20 6d 61 79 20 62 65 0a 20 20  ugh it may be.  
141f0 64 65 6c 65 74 65 64 20 61 6c 74 6f 67 65 74 68  deleted altogeth
14200 65 72 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  er)...<p>.  The 
14210 6b 65 79 73 20 75 73 65 64 20 62 79 20 65 61 63  keys used by eac
14220 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  h segment b-tree
14230 20 61 72 65 20 74 65 72 6d 73 20 28 77 6f 72 64   are terms (word
14240 73 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74  s). As well as t
14250 68 65 0a 20 20 6b 65 79 2c 20 65 61 63 68 20 73  he.  key, each s
14260 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 65 6e  egment b-tree en
14270 74 72 79 20 68 61 73 20 61 6e 20 61 73 73 6f 63  try has an assoc
14280 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 22 20  iated "doclist" 
14290 28 64 6f 63 75 6d 65 6e 74 20 6c 69 73 74 29 2e  (document list).
142a0 0a 20 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e  .  A doclist con
142b0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 6f 72  sists of zero or
142c0 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 2c 20 77   more entries, w
142d0 68 65 72 65 20 65 61 63 68 20 65 6e 74 72 79 20  here each entry 
142e0 63 6f 6e 73 69 73 74 73 20 6f 66 3a 0a 0a 3c 75  consists of:..<u
142f0 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20 64 6f 63 69  l>.  <li> A doci
14300 64 20 28 64 6f 63 75 6d 65 6e 74 20 69 64 29 2c  d (document id),
14310 20 61 6e 64 0a 20 20 3c 6c 69 3e 20 41 20 6c 69   and.  <li> A li
14320 73 74 20 6f 66 20 74 65 72 6d 20 6f 66 66 73 65  st of term offse
14330 74 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  ts, one for each
14340 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74   occurrence of t
14350 68 65 20 74 65 72 6d 20 77 69 74 68 69 6e 0a 20  he term within. 
14360 20 20 20 20 20 20 74 68 65 20 64 6f 63 75 6d 65        the docume
14370 6e 74 2e 20 41 20 74 65 72 6d 20 6f 66 66 73 65  nt. A term offse
14380 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  t indicates the 
14390 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
143a0 20 28 77 6f 72 64 73 29 0a 20 20 20 20 20 20 20   (words).       
143b0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
143c0 65 20 74 68 65 20 74 65 72 6d 20 69 6e 20 71 75  e the term in qu
143d0 65 73 74 69 6f 6e 2c 20 6e 6f 74 20 74 68 65 20  estion, not the 
143e0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
143f0 74 65 72 73 0a 20 20 20 20 20 20 20 6f 72 20 62  ters.       or b
14400 79 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ytes. For exampl
14410 65 2c 20 74 68 65 20 74 65 72 6d 20 6f 66 66 73  e, the term offs
14420 65 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  et of the term "
14430 77 61 72 22 20 69 6e 20 74 68 65 0a 20 20 20 20  war" in the.    
14440 20 20 20 70 68 72 61 73 65 20 22 41 6e 63 65 73     phrase "Ances
14450 74 72 61 6c 20 76 6f 69 63 65 73 20 70 72 6f 70  tral voices prop
14460 68 65 73 79 69 6e 67 20 77 61 72 21 22 20 69 73  hesying war!" is
14470 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20   3..</ul>..<p>. 
14480 20 45 6e 74 72 69 65 73 20 77 69 74 68 69 6e 20   Entries within 
14490 61 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73 6f  a doclist are so
144a0 72 74 65 64 20 62 79 20 64 6f 63 69 64 2e 20 50  rted by docid. P
144b0 6f 73 69 74 69 6f 6e 73 20 77 69 74 68 69 6e 20  ositions within 
144c0 61 20 64 6f 63 6c 69 73 74 0a 20 20 65 6e 74 72  a doclist.  entr
144d0 79 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  y are stored in 
144e0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
144f0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74  ..<p>.  The cont
14500 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 6f 67 69  ents of the logi
14510 63 61 6c 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  cal full-text in
14520 64 65 78 20 69 73 20 66 6f 75 6e 64 20 62 79 20  dex is found by 
14530 6d 65 72 67 69 6e 67 20 74 68 65 0a 20 20 63 6f  merging the.  co
14540 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 73 65  ntents of all se
14550 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 49  gment b-trees. I
14560 66 20 61 20 74 65 72 6d 20 69 73 20 70 72 65 73  f a term is pres
14570 65 6e 74 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ent in more than
14580 20 6f 6e 65 0a 20 20 73 65 67 6d 65 6e 74 20 62   one.  segment b
14590 2d 74 72 65 65 2c 20 74 68 65 6e 20 69 74 20 6d  -tree, then it m
145a0 61 70 73 20 74 6f 20 74 68 65 20 75 6e 69 6f 6e  aps to the union
145b0 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64   of each individ
145c0 75 61 6c 20 64 6f 63 6c 69 73 74 2e 20 49 66 2c  ual doclist. If,
145d0 0a 20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  .  for a single 
145e0 74 65 72 6d 2c 20 74 68 65 20 73 61 6d 65 20 64  term, the same d
145f0 6f 63 69 64 20 6f 63 63 75 72 73 20 69 6e 20 6d  ocid occurs in m
14600 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 6f 63  ore than one doc
14610 6c 69 73 74 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  list, then only.
14620 20 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68    the doclist th
14630 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  at is part of th
14640 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
14650 63 72 65 61 74 65 64 20 73 65 67 6d 65 6e 74 20  created segment 
14660 62 2d 74 72 65 65 20 69 73 20 0a 20 20 63 6f 6e  b-tree is .  con
14670 73 69 64 65 72 65 64 20 76 61 6c 69 64 2e 20 0a  sidered valid. .
14680 0a 3c 70 3e 0a 20 20 4d 75 6c 74 69 70 6c 65 20  .<p>.  Multiple 
14690 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
146a0 73 20 61 72 65 20 75 73 65 64 20 69 6e 73 74 65  s are used inste
146b0 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62  ad of a single b
146c0 2d 74 72 65 65 20 74 6f 20 72 65 64 75 63 65 0a  -tree to reduce.
146d0 20 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e    the cost of in
146e0 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20  serting records 
146f0 69 6e 74 6f 20 46 54 53 20 74 61 62 6c 65 73 2e  into FTS tables.
14700 20 57 68 65 6e 20 61 20 6e 65 77 20 72 65 63 6f   When a new reco
14710 72 64 20 69 73 20 0a 20 20 69 6e 73 65 72 74 65  rd is .  inserte
14720 64 20 69 6e 74 6f 20 61 6e 20 46 54 53 20 74 61  d into an FTS ta
14730 62 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79  ble that already
14740 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20   contains a lot 
14750 6f 66 20 64 61 74 61 2c 20 69 74 20 69 73 0a 20  of data, it is. 
14760 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 6d 61 6e   likely that man
14770 79 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 69  y of the terms i
14780 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
14790 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
147a0 73 65 6e 74 20 69 6e 0a 20 20 61 20 6c 61 72 67  sent in.  a larg
147b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 69 73  e number of exis
147c0 74 69 6e 67 20 72 65 63 6f 72 64 73 2e 20 49 66  ting records. If
147d0 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65   a single b-tree
147e0 20 77 65 72 65 20 75 73 65 64 2c 20 74 68 65 6e   were used, then
147f0 0a 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74  .  large doclist
14800 20 73 74 72 75 63 74 75 72 65 73 20 77 6f 75 6c   structures woul
14810 64 20 68 61 76 65 20 74 6f 20 62 65 20 6c 6f 61  d have to be loa
14820 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
14830 61 62 61 73 65 2c 0a 20 20 61 6d 65 6e 64 65 64  abase,.  amended
14840 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
14850 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 65  new docid and te
14860 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 2c 20  rm-offset list, 
14870 74 68 65 6e 20 77 72 69 74 74 65 6e 20 62 61 63  then written bac
14880 6b 0a 20 20 74 6f 20 74 68 65 20 64 61 74 61 62  k.  to the datab
14890 61 73 65 2e 20 55 73 69 6e 67 20 6d 75 6c 74 69  ase. Using multi
148a0 70 6c 65 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ple b-tree table
148b0 73 20 61 6c 6c 6f 77 73 20 74 68 69 73 20 74 6f  s allows this to
148c0 20 62 65 20 61 76 6f 69 64 65 64 0a 20 20 62 79   be avoided.  by
148d0 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
148e0 62 2d 74 72 65 65 20 77 68 69 63 68 20 63 61 6e  b-tree which can
148f0 20 62 65 20 6d 65 72 67 65 64 20 77 69 74 68 20   be merged with 
14900 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 2d 74  the existing b-t
14910 72 65 65 0a 20 20 28 6f 72 20 62 2d 74 72 65 65  ree.  (or b-tree
14920 73 29 20 6c 61 74 65 72 20 6f 6e 2e 20 4d 65 72  s) later on. Mer
14930 67 69 6e 67 20 6f 66 20 62 2d 74 72 65 65 20 73  ging of b-tree s
14940 74 72 75 63 74 75 72 65 73 20 63 61 6e 20 62 65  tructures can be
14950 20 70 65 72 66 6f 72 6d 65 64 20 61 73 0a 20 20   performed as.  
14960 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 61 73  a background tas
14970 6b 2c 20 6f 72 20 6f 6e 63 65 20 61 20 63 65 72  k, or once a cer
14980 74 61 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73  tain number of s
14990 65 70 61 72 61 74 65 20 62 2d 74 72 65 65 20 73  eparate b-tree s
149a0 74 72 75 63 74 75 72 65 73 0a 20 20 68 61 76 65  tructures.  have
149b0 20 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 65   been accumulate
149c0 64 2e 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68  d. Of course, th
149d0 69 73 20 73 63 68 65 6d 65 20 6d 61 6b 65 73 20  is scheme makes 
149e0 71 75 65 72 69 65 73 20 6d 6f 72 65 20 65 78 70  queries more exp
149f0 65 6e 73 69 76 65 0a 20 20 28 61 73 20 74 68 65  ensive.  (as the
14a00 20 46 54 53 20 63 6f 64 65 20 6d 61 79 20 68 61   FTS code may ha
14a10 76 65 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  ve to look up in
14a20 64 69 76 69 64 75 61 6c 20 74 65 72 6d 73 20 69  dividual terms i
14a30 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  n more than one.
14a40 20 20 62 2d 74 72 65 65 20 61 6e 64 20 6d 65 72    b-tree and mer
14a50 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 29 2c  ge the results),
14a60 20 62 75 74 20 69 74 20 68 61 73 20 62 65 65 6e   but it has been
14a70 20 66 6f 75 6e 64 20 74 68 61 74 20 69 6e 20 70   found that in p
14a80 72 61 63 74 69 63 65 20 74 68 69 73 0a 20 20 6f  ractice this.  o
14a90 76 65 72 68 65 61 64 20 69 73 20 6f 66 74 65 6e  verhead is often
14aa0 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20 0a   negligible..  .
14ab0 3c 68 32 3e 56 61 72 69 61 62 6c 65 20 4c 65 6e  <h2>Variable Len
14ac0 67 74 68 20 49 6e 74 65 67 65 72 20 28 76 61 72  gth Integer (var
14ad0 69 6e 74 29 20 46 6f 72 6d 61 74 3c 2f 68 32 3e  int) Format</h2>
14ae0 0a 0a 3c 70 3e 0a 20 20 49 6e 74 65 67 65 72 20  ..<p>.  Integer 
14af0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73  values stored as
14b00 20 70 61 72 74 20 6f 66 20 73 65 67 6d 65 6e 74   part of segment
14b10 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 61 72   b-tree nodes ar
14b20 65 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20  e encoded using 
14b30 74 68 65 0a 20 20 46 54 53 20 76 61 72 69 6e 74  the.  FTS varint
14b40 20 66 6f 72 6d 61 74 2e 20 54 68 69 73 20 65 6e   format. This en
14b50 63 6f 64 69 6e 67 20 69 73 20 73 69 6d 69 6c 61  coding is simila
14b60 72 2c 20 62 75 74 20 3c 62 3e 6e 6f 74 20 69 64  r, but <b>not id
14b70 65 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20 74 6f 20  entical</b>, to 
14b80 74 68 65 0a 20 20 74 68 65 20 3c 61 20 68 72 65  the.  the <a hre
14b90 66 3d 22 66 69 6c 65 66 6f 72 6d 61 74 2e 68 74  f="fileformat.ht
14ba0 6d 6c 23 76 61 72 69 6e 74 5f 66 6f 72 6d 61 74  ml#varint_format
14bb0 22 3e 53 51 4c 69 74 65 20 76 61 72 69 6e 74 20  ">SQLite varint 
14bc0 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a 0a 3c 70 3e  format</a>...<p>
14bd0 0a 20 20 41 6e 20 65 6e 63 6f 64 65 64 20 46 54  .  An encoded FT
14be0 53 20 76 61 72 69 6e 74 20 63 6f 6e 73 75 6d 65  S varint consume
14bf0 73 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 61 6e  s between one an
14c00 64 20 74 65 6e 20 62 79 74 65 73 20 6f 66 20 73  d ten bytes of s
14c10 70 61 63 65 2e 20 54 68 65 0a 20 20 6e 75 6d 62  pace. The.  numb
14c20 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
14c30 69 72 65 64 20 69 73 20 64 65 74 65 72 6d 69 6e  ired is determin
14c40 65 64 20 62 79 20 74 68 65 20 73 69 67 6e 20 61  ed by the sign a
14c50 6e 64 20 6d 61 67 6e 69 74 75 64 65 20 6f 66 20  nd magnitude of 
14c60 74 68 65 0a 20 20 69 6e 74 65 67 65 72 20 76 61  the.  integer va
14c70 6c 75 65 20 65 6e 63 6f 64 65 64 2e 20 4d 6f 72  lue encoded. Mor
14c80 65 20 61 63 63 75 72 61 74 65 6c 79 2c 20 74 68  e accurately, th
14c90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14ca0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  s used to store.
14cb0 20 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69 6e    the encoded in
14cc0 74 65 67 65 72 20 64 65 70 65 6e 64 73 20 6f 6e  teger depends on
14cd0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66   the position of
14ce0 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   the most signif
14cf0 69 63 61 6e 74 20 73 65 74 20 62 69 74 0a 20 20  icant set bit.  
14d00 69 6e 20 74 68 65 20 36 34 2d 62 69 74 20 74 77  in the 64-bit tw
14d10 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 72 65  os-complement re
14d20 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
14d30 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
14d40 65 2e 20 4e 65 67 61 74 69 76 65 0a 20 20 76 61  e. Negative.  va
14d50 6c 75 65 73 20 61 6c 77 61 79 73 20 68 61 76 65  lues always have
14d60 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   the most signif
14d70 69 63 61 6e 74 20 62 69 74 20 73 65 74 20 28 74  icant bit set (t
14d80 68 65 20 73 69 67 6e 20 62 69 74 29 2c 20 61 6e  he sign bit), an
14d90 64 20 73 6f 20 61 72 65 0a 20 20 61 6c 77 61 79  d so are.  alway
14da0 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 74  s stored using t
14db0 68 65 20 66 75 6c 6c 20 74 65 6e 20 62 79 74 65  he full ten byte
14dc0 73 2e 20 50 6f 73 69 74 69 76 65 20 69 6e 74 65  s. Positive inte
14dd0 67 65 72 20 76 61 6c 75 65 73 20 6d 61 79 20 62  ger values may b
14de0 65 0a 20 20 73 74 6f 72 65 64 20 75 73 69 6e 67  e.  stored using
14df0 20 6c 65 73 73 20 73 70 61 63 65 2e 0a 0a 3c 70   less space...<p
14e00 3e 0a 20 20 54 68 65 20 66 69 6e 61 6c 20 62 79  >.  The final by
14e10 74 65 20 6f 66 20 61 6e 20 65 6e 63 6f 64 65 64  te of an encoded
14e20 20 46 54 53 20 76 61 72 69 6e 74 20 68 61 73 20   FTS varint has 
14e30 69 74 73 20 6d 6f 73 74 20 73 69 67 6e 69 66 69  its most signifi
14e40 63 61 6e 74 20 62 69 74 20 0a 20 20 63 6c 65 61  cant bit .  clea
14e50 72 65 64 2e 20 41 6c 6c 20 70 72 65 63 65 64 69  red. All precedi
14e60 6e 67 20 62 79 74 65 73 20 68 61 76 65 20 74 68  ng bytes have th
14e70 65 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61  e most significa
14e80 6e 74 20 62 69 74 20 73 65 74 2e 20 44 61 74 61  nt bit set. Data
14e90 0a 20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  .  is stored in 
14ea0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65  the remaining se
14eb0 76 65 6e 20 6c 65 61 73 74 20 73 69 67 6e 69 66  ven least signif
14ec0 69 63 61 6e 74 20 62 69 74 73 20 6f 66 20 65 61  icant bits of ea
14ed0 63 68 20 62 79 74 65 2e 0a 20 20 54 68 65 20 66  ch byte..  The f
14ee0 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
14ef0 20 65 6e 63 6f 64 65 64 20 72 65 70 72 65 73 65   encoded represe
14f00 6e 74 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ntation contains
14f10 20 74 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69   the least signi
14f20 66 69 63 61 6e 74 0a 20 20 73 65 76 65 6e 20 62  ficant.  seven b
14f30 69 74 73 20 6f 66 20 74 68 65 20 65 6e 63 6f 64  its of the encod
14f40 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
14f50 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 62 79 74  . The second byt
14f60 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64  e of the encoded
14f70 0a 20 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  .  representatio
14f80 6e 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  n, if it is pres
14f90 65 6e 74 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68  ent, contains th
14fa0 65 20 73 65 76 65 6e 20 6e 65 78 74 20 6c 65 61  e seven next lea
14fb0 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20  st significant. 
14fc0 20 62 69 74 73 20 6f 66 20 74 68 65 20 69 6e 74   bits of the int
14fd0 65 67 65 72 20 76 61 6c 75 65 2c 20 61 6e 64 20  eger value, and 
14fe0 73 6f 20 6f 6e 2e 20 54 68 65 20 66 6f 6c 6c 6f  so on. The follo
14ff0 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61  wing table conta
15000 69 6e 73 20 65 78 61 6d 70 6c 65 73 0a 20 20 6f  ins examples.  o
15010 66 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65  f encoded intege
15020 72 20 76 61 6c 75 65 73 3a 0a 0a 3c 74 61 62 6c  r values:..<tabl
15030 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c  e striped=1>.  <
15040 74 72 3e 3c 74 68 3e 44 65 63 69 6d 61 6c 3c 74  tr><th>Decimal<t
15050 68 3e 48 65 78 61 64 65 63 69 6d 61 6c 3c 74 68  h>Hexadecimal<th
15060 20 77 69 64 74 68 3d 31 30 30 25 3e 45 6e 63 6f   width=100%>Enco
15070 64 65 64 20 52 65 70 72 65 73 65 6e 74 61 74 69  ded Representati
15080 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 34 33 3c  on.  <tr><td>43<
15090 74 64 3e 30 78 30 30 30 30 30 30 30 30 30 30 30  td>0x00000000000
150a0 30 30 30 32 42 3c 74 64 3e 30 78 32 42 20 0a 20  0002B<td>0x2B . 
150b0 20 3c 74 72 3e 3c 74 64 3e 32 30 30 38 31 35 3c   <tr><td>200815<
150c0 74 64 3e 30 78 30 30 30 30 30 30 30 30 30 30 30  td>0x00000000000
150d0 33 31 30 36 46 3c 74 64 3e 30 78 39 43 20 30 78  3106F<td>0x9C 0x
150e0 41 30 20 30 78 30 43 0a 20 20 3c 74 72 3e 3c 74  A0 0x0C.  <tr><t
150f0 64 3e 2d 31 3c 74 64 3e 30 78 46 46 46 46 46 46  d>-1<td>0xFFFFFF
15100 46 46 46 46 46 46 46 46 46 46 3c 74 64 3e 30 78  FFFFFFFFFF<td>0x
15110 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
15120 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46  F 0xFF 0xFF 0xFF
15130 20 30 78 46 46 20 30 78 46 46 20 30 78 30 31 0a   0xFF 0xFF 0x01.
15140 3c 2f 74 61 62 6c 65 3e 0a 20 20 0a 0a 3c 68 32  </table>.  ..<h2
15150 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20  >Segment B-Tree 
15160 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e  Format</h2>..<p>
15170 0a 20 20 53 65 67 6d 65 6e 74 20 62 2d 74 72 65  .  Segment b-tre
15180 65 73 20 61 72 65 20 70 72 65 66 69 78 2d 63 6f  es are prefix-co
15190 6d 70 72 65 73 73 65 64 20 62 2b 2d 74 72 65 65  mpressed b+-tree
151a0 73 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  s. There is one 
151b0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20  segment b-tree. 
151c0 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
151d0 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
151e0 62 6c 65 20 28 73 65 65 20 61 62 6f 76 65 29 2e  ble (see above).
151f0 20 54 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f   The root node o
15200 66 20 74 68 65 20 73 65 67 6d 65 6e 74 0a 20 20  f the segment.  
15210 62 2d 74 72 65 65 20 69 73 20 73 74 6f 72 65 64  b-tree is stored
15220 20 61 73 20 61 20 62 6c 6f 62 20 69 6e 20 74 68   as a blob in th
15230 65 20 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 6f  e "root" field o
15240 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
15250 69 6e 67 20 72 6f 77 0a 20 20 6f 66 20 74 68 65  ing row.  of the
15260 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
15270 20 41 6c 6c 20 6f 74 68 65 72 20 6e 6f 64 65 73   All other nodes
15280 20 28 69 66 20 61 6e 79 20 65 78 69 73 74 29 20   (if any exist) 
15290 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
152a0 65 20 0a 20 20 22 62 6c 6f 62 22 20 63 6f 6c 75  e .  "blob" colu
152b0 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 6d  mn of the %_segm
152c0 65 6e 74 73 20 74 61 62 6c 65 2e 20 4e 6f 64 65  ents table. Node
152d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 25 5f 73  s within the %_s
152e0 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 61 72  egments table ar
152f0 65 0a 20 20 69 64 65 6e 74 69 66 69 65 64 20 62  e.  identified b
15300 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  y the integer va
15310 6c 75 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  lue in the block
15320 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
15330 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20  corresponding.  
15340 72 6f 77 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  row. The followi
15350 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
15360 65 73 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  es the fields of
15370 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
15380 62 6c 65 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ble:..<table str
15390 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
153a0 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20  h>Column        
153b0 20 20 20 3c 74 68 20 77 69 64 74 68 3d 31 30 30     <th width=100
153c0 25 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  %>Interpretation
153d0 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 65 76 65 6c  .  <tr><td>level
153e0 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e              <td>
153f0 20 0a 20 20 20 20 42 65 74 77 65 65 6e 20 74 68   .    Between th
15400 65 6d 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  em, the contents
15410 20 6f 66 20 74 68 65 20 22 6c 65 76 65 6c 22 20   of the "level" 
15420 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64 73  and "idx" fields
15430 20 64 65 66 69 6e 65 20 74 68 65 0a 20 20 20 20   define the.    
15440 72 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66 20  relative age of 
15450 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
15460 65 65 2e 20 54 68 65 20 73 6d 61 6c 6c 65 72 20  ee. The smaller 
15470 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
15480 20 69 6e 20 74 68 65 0a 20 20 20 20 22 6c 65 76   in the.    "lev
15490 65 6c 22 20 66 69 65 6c 64 2c 20 74 68 65 20 6d  el" field, the m
154a0 6f 72 65 20 72 65 63 65 6e 74 6c 79 20 74 68 65  ore recently the
154b0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
154c0 77 61 73 20 63 72 65 61 74 65 64 2e 20 49 66 20  was created. If 
154d0 74 77 6f 0a 20 20 20 20 73 65 67 6d 65 6e 74 20  two.    segment 
154e0 62 2d 74 72 65 65 73 20 61 72 65 20 6f 66 20 74  b-trees are of t
154f0 68 65 20 73 61 6d 65 20 22 6c 65 76 65 6c 22 2c  he same "level",
15500 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69 74   the segment wit
15510 68 20 74 68 65 20 6c 61 72 67 65 72 0a 20 20 20  h the larger.   
15520 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
15530 20 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75 6d   the "idx" colum
15540 6e 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e 74  n is more recent
15550 2e 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45  . The PRIMARY KE
15560 59 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  Y constraint.   
15570 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   on the %_segdir
15580 20 74 61 62 6c 65 20 70 72 65 76 65 6e 74 73 20   table prevents 
15590 61 6e 79 20 74 77 6f 20 73 65 67 6d 65 6e 74 73  any two segments
155a0 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 68 65   from having the
155b0 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20 20   same value.    
155c0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 22 6c 65  for both the "le
155d0 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66  vel" and "idx" f
155e0 69 65 6c 64 73 2e 0a 20 20 3c 74 72 3e 3c 74 64  ields..  <tr><td
155f0 3e 69 64 78 20 20 20 20 20 20 20 20 20 20 20 20  >idx            
15600 20 20 3c 74 64 3e 20 53 65 65 20 61 62 6f 76 65    <td> See above
15610 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 73 74 61 72  ..  <tr><td>star
15620 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20 3c 74 64  t_block      <td
15630 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69  >.    The blocki
15640 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  d that correspon
15650 64 73 20 74 6f 20 74 68 65 20 6e 6f 64 65 20 77  ds to the node w
15660 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
15670 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 0a 20   blockid that . 
15680 20 20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68     belongs to th
15690 69 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  is segment b-tre
156a0 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68  e. Or zero if th
156b0 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74  e entire segment
156c0 20 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74 73   b-tree.    fits
156d0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
156e0 65 2e 20 49 66 20 69 74 20 65 78 69 73 74 73 2c  e. If it exists,
156f0 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c   this node is al
15700 77 61 79 73 20 61 20 6c 65 61 66 20 6e 6f 64 65  ways a leaf node
15710 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 65 61 76  ..  <tr><td>leav
15720 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64  es_end_block <td
15730 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69  >.    The blocki
15740 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  d that correspon
15750 64 73 20 74 6f 20 74 68 65 20 6c 65 61 66 20 6e  ds to the leaf n
15760 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ode with the lar
15770 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 0a 20 20  gest blockid .  
15780 20 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20 74    that belongs t
15790 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62  o this segment b
157a0 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69  -tree. Or zero i
157b0 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67  f the entire seg
157c0 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20  ment b-tree.    
157d0 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74  fits on the root
157e0 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64   node..  <tr><td
157f0 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a  >end_block <td>.
15800 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64 20      The blockid 
15810 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
15820 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72   to the interior
15830 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c   node with the l
15840 61 72 67 65 73 74 20 0a 20 20 20 20 62 6c 6f 63  argest .    bloc
15850 6b 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67 73  kid that belongs
15860 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74   to this segment
15870 20 62 2d 74 72 65 65 2e 20 20 4f 72 20 7a 65 72   b-tree.  Or zer
15880 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  o if the entire 
15890 73 65 67 6d 65 6e 74 0a 20 20 20 20 62 2d 74 72  segment.    b-tr
158a0 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
158b0 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20  oot node. If it 
158c0 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64  exists, this nod
158d0 65 20 69 73 20 61 6c 77 61 79 73 20 61 6e 0a 20  e is always an. 
158e0 20 20 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65     interior node
158f0 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 72 6f 6f 74  ..  <tr><td>root
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64               <td
15910 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 61  >.    Blob conta
15920 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 6e  ining the root n
15930 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ode of the segme
15940 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61 62  nt b-tree..</tab
15950 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72 74  le>..<p>.  Apart
15960 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6e   from the root n
15970 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20 74  ode, the nodes t
15980 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69  hat make up a si
15990 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  ngle segment b-t
159a0 72 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79 73  ree are.  always
159b0 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61 20   stored using a 
159c0 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
159d0 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 2e  nce of blockids.
159e0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
159f0 65 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  e.  nodes that m
15a00 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20  ake up a single 
15a10 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
15a20 72 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c 76  ree are themselv
15a30 65 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20 61  es stored as.  a
15a40 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
15a50 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72 64  k, in b-tree ord
15a60 65 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f  er. The contiguo
15a70 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  us sequence of b
15a80 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20 74  lockids.  used t
15a90 6f 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74 72  o store the b-tr
15aa0 65 65 20 6c 65 61 76 65 73 20 61 72 65 20 61 6c  ee leaves are al
15ab0 6c 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e 67  located starting
15ac0 20 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 69   with the blocki
15ad0 64 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64  d.  value stored
15ae0 20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f 62   in the "start_b
15af0 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  lock" column of 
15b00 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15b10 67 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c 0a  g %_segdir row,.
15b20 20 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67 20    and finishing 
15b30 61 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 76  at the blockid v
15b40 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
15b50 68 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62  he "leaves_end_b
15b60 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f 66  lock".  field of
15b70 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 49   the same row. I
15b80 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 70  t is therefore p
15b90 6f 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61  ossible to itera
15ba0 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  te through all t
15bb0 68 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20 61  he.  leaves of a
15bc0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c   segment b-tree,
15bd0 20 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20 62   in key order, b
15be0 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68 65  y traversing the
15bf0 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 74   %_segments .  t
15c00 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64 20  able in blockid 
15c10 6f 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61 72  order from "star
15c20 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65 61  t_block" to "lea
15c30 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20  ves_end_block". 
15c40 20 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42   ..<h3>Segment B
15c50 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 73  -Tree Leaf Nodes
15c60 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h3>..<p>.  The
15c70 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72   following diagr
15c80 61 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66  am depicts the f
15c90 6f 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65  ormat of a segme
15ca0 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e  nt b-tree leaf n
15cb0 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20  ode...<center>. 
15cc0 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73   <img src=images
15cd0 2f 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65 2e  /fts3_leaf_node.
15ce0 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65 67 6d 65  png>.  <p> Segme
15cf0 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e  nt B-Tree Leaf N
15d00 6f 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e  ode Format.</cen
15d10 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ter>..<p>.  The 
15d20 66 69 72 73 74 20 74 65 72 6d 20 73 74 6f 72 65  first term store
15d30 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64 65 20 28  d on each node (
15d40 22 54 65 72 6d 20 31 22 20 69 6e 20 74 68 65 20  "Term 1" in the 
15d50 66 69 67 75 72 65 20 61 62 6f 76 65 29 20 69 73  figure above) is
15d60 0a 20 20 73 74 6f 72 65 64 20 76 65 72 62 61 74  .  stored verbat
15d70 69 6d 2e 20 45 61 63 68 20 73 75 62 73 65 71 75  im. Each subsequ
15d80 65 6e 74 20 74 65 72 6d 20 69 73 20 70 72 65 66  ent term is pref
15d90 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 77 69  ix-compressed wi
15da0 74 68 20 72 65 73 70 65 63 74 0a 20 20 74 6f 20  th respect.  to 
15db0 69 74 73 20 70 72 65 64 65 63 65 73 73 6f 72 2e  its predecessor.
15dc0 20 54 65 72 6d 73 20 61 72 65 20 73 74 6f 72 65   Terms are store
15dd0 64 20 77 69 74 68 69 6e 20 61 20 70 61 67 65 20  d within a page 
15de0 69 6e 20 73 6f 72 74 65 64 20 28 6d 65 6d 63 6d  in sorted (memcm
15df0 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a 3c 68 33  p).  order...<h3
15e00 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20  >Segment B-Tree 
15e10 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 73 3c 2f  Interior Nodes</
15e20 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  h3>..<p>.  The f
15e30 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d  ollowing diagram
15e40 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72   depicts the for
15e50 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  mat of a segment
15e60 20 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f 72   b-tree interior
15e70 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 6e   .  (non-leaf) n
15e80 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20  ode...<center>. 
15e90 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73   <img src=images
15ea0 2f 66 74 73 33 5f 69 6e 74 65 72 69 6f 72 5f 6e  /fts3_interior_n
15eb0 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53  ode.png>.  <p> S
15ec0 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 49 6e  egment B-Tree In
15ed0 74 65 72 69 6f 72 20 4e 6f 64 65 20 46 6f 72 6d  terior Node Form
15ee0 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 0a 3c  at.</center>...<
15ef0 68 32 3e 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61  h2>Doclist Forma
15f00 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41 20  t</h2>..<p>.  A 
15f10 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74 73  doclist consists
15f20 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20   of an array of 
15f30 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
15f40 74 65 67 65 72 73 2c 20 73 65 72 69 61 6c 69 7a  tegers, serializ
15f50 65 64 20 75 73 69 6e 67 0a 20 20 74 68 65 20 46  ed using.  the F
15f60 54 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74  TS varint format
15f70 2e 20 45 61 63 68 20 64 6f 63 6c 69 73 74 20 65  . Each doclist e
15f80 6e 74 72 79 20 69 73 20 6d 61 64 65 20 75 70 20  ntry is made up 
15f90 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 74  of a series of t
15fa0 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65 20 69 6e  wo .  or more in
15fb0 74 65 67 65 72 73 2c 20 61 73 20 66 6f 6c 6c 6f  tegers, as follo
15fc0 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e  ws:..<ol>.  <li>
15fd0 20 54 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65   The docid value
15fe0 2e 20 54 68 65 20 66 69 72 73 74 20 65 6e 74 72  . The first entr
15ff0 79 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 63  y in a doclist c
16000 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 69 74 65  ontains the lite
16010 72 61 6c 20 64 6f 63 69 64 0a 20 20 20 20 20 20  ral docid.      
16020 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73   value. The firs
16030 74 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20  t field of each 
16040 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63 6c 69  subsequent docli
16050 73 74 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e  st entry contain
16060 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 64 69  s the .       di
16070 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
16080 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20 61   the new docid a
16090 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
160a0 6f 6e 65 20 28 61 6c 77 61 79 73 20 61 20 70 6f  one (always a po
160b0 73 69 74 69 76 65 20 0a 20 20 20 20 20 20 20 6e  sitive .       n
160c0 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69 3e 20 5a  umber)..  <li> Z
160d0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  ero or more term
160e0 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 2e 20 41  -offset lists. A
160f0 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
16100 74 20 69 73 20 70 72 65 73 65 6e 74 20 66 6f 72  t is present for
16110 20 65 61 63 68 0a 20 20 20 20 20 20 20 63 6f 6c   each.       col
16120 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 76  umn of the FTS v
16130 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
16140 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
16150 65 72 6d 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73  erm. A term-offs
16160 65 74 0a 20 20 20 20 20 20 20 6c 69 73 74 20 63  et.       list c
16170 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66  onsists of the f
16180 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 3c  ollowing:.     <
16190 6f 6c 3e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20  ol>.       <li> 
161a0 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 31  Constant value 1
161b0 2e 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20  . This field is 
161c0 6f 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20  omitted for any 
161d0 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
161e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
161f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c  ociated with col
16200 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c  umn 0..       <l
16210 69 3e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  i> The column nu
16220 6d 62 65 72 20 28 31 20 66 6f 72 20 74 68 65 20  mber (1 for the 
16230 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74 20  second leftmost 
16240 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29 2e 20 54  column, etc.). T
16250 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
16260 66 69 65 6c 64 20 69 73 20 6f 6d 69 74 74 65 64  field is omitted
16270 20 66 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66   for any term-of
16280 66 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69  fset list associ
16290 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ated with column
162a0 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20   0..       <li> 
162b0 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 2d 6f  A list of term-o
162c0 66 66 73 65 74 73 2c 20 73 6f 72 74 65 64 20 66  ffsets, sorted f
162d0 72 6f 6d 20 73 6d 61 6c 6c 65 73 74 20 74 6f 20  rom smallest to 
162e0 6c 61 72 67 65 73 74 2e 20 49 6e 73 74 65 61 64  largest. Instead
162f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20  .            of 
16300 73 74 6f 72 69 6e 67 20 74 68 65 20 74 65 72 6d  storing the term
16310 2d 6f 66 66 73 65 74 20 76 61 6c 75 65 20 6c 69  -offset value li
16320 74 65 72 61 6c 6c 79 2c 20 65 61 63 68 20 69 6e  terally, each in
16330 74 65 67 65 72 20 73 74 6f 72 65 64 20 0a 20 20  teger stored .  
16340 20 20 20 20 20 20 20 20 20 20 69 73 20 74 68 65            is the
16350 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16360 65 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  een the current 
16370 74 65 72 6d 2d 6f 66 66 73 65 74 20 61 6e 64 20  term-offset and 
16380 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
16390 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 28 6f            one (o
163a0 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 63 75  r zero if the cu
163b0 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65  rrent term-offse
163c0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 29 2c  t is the first),
163d0 20 70 6c 75 73 20 32 2e 0a 20 20 20 20 20 3c 2f   plus 2..     </
163e0 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f 6e 73 74  ol>.  <li> Const
163f0 61 6e 74 20 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f  ant value 0..</o
16400 6c 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c  l>..<center>.  <
16410 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66  img src=images/f
16420 74 73 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67  ts3_doclist2.png
16430 3e 0a 20 20 3c 70 3e 20 46 54 53 33 20 44 6f 63  >.  <p> FTS3 Doc
16440 6c 69 73 74 20 46 6f 72 6d 61 74 0a 3c 2f 63 65  list Format.</ce
16450 6e 74 65 72 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a  nter>..<center>.
16460 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65    <img src=image
16470 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 2e 70  s/fts3_doclist.p
16480 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53 20 44 6f  ng>.  <p> FTS Do
16490 63 6c 69 73 74 20 45 6e 74 72 79 20 46 6f 72 6d  clist Entry Form
164a0 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70  at.</center>..<p
164b0 3e 0a 20 20 46 6f 72 20 64 6f 63 6c 69 73 74 73  >.  For doclists
164c0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74   for which the t
164d0 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 6d  erm appears in m
164e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
164f0 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a 20  umn of the FTS. 
16500 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
16510 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
16520 73 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63  s within the doc
16530 6c 69 73 74 20 61 72 65 20 73 74 6f 72 65 64 20  list are stored 
16540 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d  in column .  num
16550 62 65 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20  ber order. This 
16560 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
16570 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
16580 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
16590 68 20 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69  h .  column 0 (i
165a0 66 20 61 6e 79 29 20 69 73 20 61 6c 77 61 79 73  f any) is always
165b0 20 66 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67   first, allowing
165c0 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   the first two f
165d0 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 20 20 74  ields of the.  t
165e0 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20  erm-offset list 
165f0 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 69 6e  to be omitted in
16600 20 74 68 69 73 20 63 61 73 65 2e 0a 0a 3c 68 31   this case...<h1
16610 20 69 64 3d 61 70 70 65 6e 64 69 78 5f 61 20 6e   id=appendix_a n
16620 6f 6e 75 6d 62 65 72 20 74 61 67 73 3d 22 73 65  onumber tags="se
16630 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
16640 20 74 69 70 73 22 3e 0a 20 20 41 70 70 65 6e 64   tips">.  Append
16650 69 78 20 41 3a 20 53 65 61 72 63 68 20 41 70 70  ix A: Search App
16660 6c 69 63 61 74 69 6f 6e 20 54 69 70 73 0a 3c 2f  lication Tips.</
16670 68 31 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 69  h1>..<p>.  FTS i
16680 73 20 70 72 69 6d 61 72 69 6c 79 20 64 65 73 69  s primarily desi
16690 67 6e 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  gned to support 
166a0 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d 74 65 78  Boolean full-tex
166b0 74 20 71 75 65 72 69 65 73 20 2d 20 71 75 65 72  t queries - quer
166c0 69 65 73 0a 20 20 74 6f 20 66 69 6e 64 20 74 68  ies.  to find th
166d0 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
166e0 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 20  ts that match a 
166f0 73 70 65 63 69 66 69 65 64 20 63 72 69 74 65 72  specified criter
16700 69 61 2e 20 48 6f 77 65 76 65 72 2c 20 6d 61 6e  ia. However, man
16710 79 20 0a 20 20 28 6d 6f 73 74 3f 29 20 73 65 61  y .  (most?) sea
16720 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  rch applications
16730 20 72 65 71 75 69 72 65 20 74 68 61 74 20 72 65   require that re
16740 73 75 6c 74 73 20 61 72 65 20 73 6f 6d 65 68 6f  sults are someho
16750 77 20 72 61 6e 6b 65 64 20 69 6e 20 6f 72 64 65  w ranked in orde
16760 72 0a 20 20 6f 66 20 22 72 65 6c 65 76 61 6e 63  r.  of "relevanc
16770 65 22 2c 20 77 68 65 72 65 20 22 72 65 6c 65 76  e", where "relev
16780 61 6e 63 65 22 20 69 73 20 64 65 66 69 6e 65 64  ance" is defined
16790 20 61 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   as the likeliho
167a0 6f 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72  od that the user
167b0 0a 20 20 77 68 6f 20 70 65 72 66 6f 72 6d 65 64  .  who performed
167c0 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20 69   the search is i
167d0 6e 74 65 72 65 73 74 65 64 20 69 6e 20 61 20 73  nterested in a s
167e0 70 65 63 69 66 69 63 20 65 6c 65 6d 65 6e 74 20  pecific element 
167f0 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  of the returned.
16800 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e    set of documen
16810 74 73 2e 20 57 68 65 6e 20 75 73 69 6e 67 20 61  ts. When using a
16820 20 73 65 61 72 63 68 20 65 6e 67 69 6e 65 20 74   search engine t
16830 6f 20 66 69 6e 64 20 64 6f 63 75 6d 65 6e 74 73  o find documents
16840 20 6f 6e 20 74 68 65 20 77 6f 72 6c 64 0a 20 20   on the world.  
16850 77 69 64 65 20 77 65 62 2c 20 74 68 65 20 75 73  wide web, the us
16860 65 72 20 65 78 70 65 63 74 73 20 74 68 61 74 20  er expects that 
16870 74 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 2c  the most useful,
16880 20 6f 72 20 22 72 65 6c 65 76 61 6e 74 22 2c 20   or "relevant", 
16890 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 77 69 6c  documents .  wil
168a0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 73  l be returned as
168b0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
168c0 6f 66 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  of results, and 
168d0 74 68 61 74 20 65 61 63 68 20 73 75 62 73 65 71  that each subseq
168e0 75 65 6e 74 20 70 61 67 65 20 0a 20 20 63 6f 6e  uent page .  con
168f0 74 61 69 6e 73 20 70 72 6f 67 72 65 73 73 69 76  tains progressiv
16900 65 6c 79 20 6c 65 73 73 20 72 65 6c 65 76 61 6e  ely less relevan
16910 74 20 72 65 73 75 6c 74 73 2e 20 45 78 61 63 74  t results. Exact
16920 6c 79 20 68 6f 77 20 61 20 6d 61 63 68 69 6e 65  ly how a machine
16930 20 63 61 6e 20 0a 20 20 64 65 74 65 72 6d 69 6e   can .  determin
16940 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 6c 65 76  e document relev
16950 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 61 20  ance based on a 
16960 75 73 65 72 73 20 71 75 65 72 79 20 69 73 20 61  users query is a
16970 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 72 6f   complicated pro
16980 62 6c 65 6d 0a 20 20 61 6e 64 20 74 68 65 20 73  blem.  and the s
16990 75 62 6a 65 63 74 20 6f 66 20 6d 75 63 68 20 6f  ubject of much o
169a0 6e 67 6f 69 6e 67 20 72 65 73 65 61 72 63 68 2e  ngoing research.
169b0 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76 65 72 79  ..<p>.  One very
169c0 20 73 69 6d 70 6c 65 20 73 63 68 65 6d 65 20 6d   simple scheme m
169d0 69 67 68 74 20 62 65 20 74 6f 20 63 6f 75 6e 74  ight be to count
169e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
169f0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
16a00 0a 20 20 75 73 65 72 73 20 73 65 61 72 63 68 20  .  users search 
16a10 74 65 72 6d 73 20 69 6e 20 65 61 63 68 20 72 65  terms in each re
16a20 73 75 6c 74 20 64 6f 63 75 6d 65 6e 74 2e 20 54  sult document. T
16a30 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 74  hose documents t
16a40 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 6d 61  hat contain.  ma
16a50 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ny instances of 
16a60 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 63 6f  the terms are co
16a70 6e 73 69 64 65 72 65 64 20 6d 6f 72 65 20 72 65  nsidered more re
16a80 6c 65 76 61 6e 74 20 74 68 61 6e 20 74 68 6f 73  levant than thos
16a90 65 20 77 69 74 68 0a 20 20 61 20 73 6d 61 6c 6c  e with.  a small
16aa0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
16ab0 6e 63 65 73 20 6f 66 20 65 61 63 68 20 74 65 72  nces of each ter
16ac0 6d 2e 20 49 6e 20 61 6e 20 46 54 53 20 61 70 70  m. In an FTS app
16ad0 6c 69 63 61 74 69 6f 6e 2c 20 74 68 65 20 0a 20  lication, the . 
16ae0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 20   number of term 
16af0 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 65 61 63  instances in eac
16b00 68 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  h result could b
16b10 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
16b20 63 6f 75 6e 74 69 6e 67 0a 20 20 74 68 65 20 6e  counting.  the n
16b30 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
16b40 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  s in the return 
16b50 76 61 6c 75 65 20 6f 66 20 74 68 65 20 5b 6f 66  value of the [of
16b60 66 73 65 74 73 5d 20 66 75 6e 63 74 69 6f 6e 2e  fsets] function.
16b70 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
16b80 20 65 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 61   example shows a
16b90 20 71 75 65 72 79 20 74 68 61 74 20 63 6f 75 6c   query that coul
16ba0 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74  d be used to obt
16bb0 61 69 6e 20 74 68 65 0a 20 20 74 65 6e 20 6d 6f  ain the.  ten mo
16bc0 73 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75  st relevant resu
16bd0 6c 74 73 20 66 6f 72 20 61 20 71 75 65 72 79 20  lts for a query 
16be0 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 75  entered by the u
16bf0 73 65 72 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ser:..<codeblock
16c00 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 65  >.  <i>-- This e
16c10 78 61 6d 70 6c 65 20 28 61 6e 64 20 61 6c 6c 20  xample (and all 
16c20 6f 74 68 65 72 73 20 69 6e 20 74 68 69 73 20 73  others in this s
16c30 65 63 74 69 6f 6e 29 20 61 73 73 75 6d 65 73 20  ection) assumes 
16c40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
16c50 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54  hema</i>.  CREAT
16c60 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
16c70 64 6f 63 75 6d 65 6e 74 73 20 55 53 49 4e 47 20  documents USING 
16c80 66 74 73 33 28 74 69 74 6c 65 2c 20 63 6f 6e 74  fts3(title, cont
16c90 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41  ent);..  <i>-- A
16ca0 73 73 75 6d 69 6e 67 20 74 68 65 20 61 70 70 6c  ssuming the appl
16cb0 69 63 61 74 69 6f 6e 20 68 61 73 20 73 75 70 70  ication has supp
16cc0 6c 69 65 64 20 61 6e 20 53 51 4c 69 74 65 20 75  lied an SQLite u
16cd0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ser function nam
16ce0 65 64 20 22 63 6f 75 6e 74 69 6e 74 65 67 65 72  ed "countinteger
16cf0 73 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  s"</i>.  <i>-- t
16d00 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  hat returns the 
16d10 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 2d  number of space-
16d20 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65  separated intege
16d30 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  rs contained in 
16d40 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
16d50 74 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  t,</i>.  <i>-- t
16d60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
16d70 72 79 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ry could be used
16d80 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 74   to return the t
16d90 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20  itles of the 10 
16da0 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
16db0 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  ontain</i>.  <i>
16dc0 2d 2d 20 74 68 65 20 67 72 65 61 74 65 73 74 20  -- the greatest 
16dd0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e  number of instan
16de0 63 65 73 20 6f 66 20 74 68 65 20 75 73 65 72 73  ces of the users
16df0 20 71 75 65 72 79 20 74 65 72 6d 73 2e 20 48 6f   query terms. Ho
16e00 70 65 66 75 6c 6c 79 2c 20 74 68 65 73 65 20 31  pefully, these 1
16e10 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f  0</i>.  <i>-- do
16e20 63 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  cuments will be 
16e30 74 68 6f 73 65 20 74 68 61 74 20 74 68 65 20 75  those that the u
16e40 73 65 72 73 20 63 6f 6e 73 69 64 65 72 73 20 6d  sers considers m
16e50 6f 72 65 20 6f 72 20 6c 65 73 73 20 74 68 65 20  ore or less the 
16e60 6d 6f 73 74 20 22 72 65 6c 65 76 61 6e 74 22 2e  most "relevant".
16e70 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69  </i>.  SELECT ti
16e80 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e  tle FROM documen
16e90 74 73 20 0a 20 20 20 20 57 48 45 52 45 20 64 6f  ts .    WHERE do
16ea0 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c  cuments MATCH &l
16eb0 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20  t;query&gt;.    
16ec0 4f 52 44 45 52 20 42 59 20 63 6f 75 6e 74 69 6e  ORDER BY countin
16ed0 74 65 67 65 72 73 28 6f 66 66 73 65 74 73 28 64  tegers(offsets(d
16ee0 6f 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a  ocuments)) DESC.
16ef0 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46      LIMIT 10 OFF
16f00 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63  SET 0.</codebloc
16f10 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 71 75  k>..<p>.  The qu
16f20 65 72 79 20 61 62 6f 76 65 20 63 6f 75 6c 64 20  ery above could 
16f30 62 65 20 6d 61 64 65 20 74 6f 20 72 75 6e 20 66  be made to run f
16f40 61 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 74  aster by using t
16f50 68 65 20 46 54 53 20 5b 6d 61 74 63 68 69 6e 66  he FTS [matchinf
16f60 6f 5d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 74 6f  o].  function to
16f70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
16f80 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
16f90 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 74 68  erm instances th
16fa0 61 74 20 61 70 70 65 61 72 20 69 6e 20 65 61 63  at appear in eac
16fb0 68 0a 20 20 72 65 73 75 6c 74 2e 20 54 68 65 20  h.  result. The 
16fc0 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
16fd0 6f 6e 20 69 73 20 6d 75 63 68 20 6d 6f 72 65 20  on is much more 
16fe0 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20 74  efficient than t
16ff0 68 65 20 6f 66 66 73 65 74 73 20 0a 20 20 66 75  he offsets .  fu
17000 6e 63 74 69 6f 6e 2e 20 46 75 72 74 68 65 72 6d  nction. Furtherm
17010 6f 72 65 2c 20 74 68 65 20 6d 61 74 63 68 69 6e  ore, the matchin
17020 66 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76  fo function prov
17030 69 64 65 73 20 65 78 74 72 61 20 69 6e 66 6f 72  ides extra infor
17040 6d 61 74 69 6f 6e 0a 20 20 72 65 67 61 72 64 69  mation.  regardi
17050 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 6e  ng the overall n
17060 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65  umber of occurre
17070 6e 63 65 73 20 6f 66 20 65 61 63 68 20 71 75 65  nces of each que
17080 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 65  ry term in the e
17090 6e 74 69 72 65 0a 20 20 64 6f 63 75 6d 65 6e 74  ntire.  document
170a0 20 73 65 74 20 28 6e 6f 74 20 6a 75 73 74 20 74   set (not just t
170b0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 29 20  he current row) 
170c0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
170d0 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 77  f documents in w
170e0 68 69 63 68 20 0a 20 20 65 61 63 68 20 71 75 65  hich .  each que
170f0 72 79 20 74 65 72 6d 20 61 70 70 65 61 72 73 2e  ry term appears.
17100 20 54 68 69 73 20 6d 61 79 20 62 65 20 75 73 65   This may be use
17110 64 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20  d (for example) 
17120 74 6f 20 61 74 74 61 63 68 20 61 20 68 69 67 68  to attach a high
17130 65 72 0a 20 20 77 65 69 67 68 74 20 74 6f 20 6c  er.  weight to l
17140 65 73 73 20 63 6f 6d 6d 6f 6e 20 74 65 72 6d 73  ess common terms
17150 20 77 68 69 63 68 20 6d 61 79 20 69 6e 63 72 65   which may incre
17160 61 73 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ase the overall 
17170 63 6f 6d 70 75 74 65 64 20 72 65 6c 65 76 61 6e  computed relevan
17180 63 79 20 0a 20 20 6f 66 20 74 68 6f 73 65 20 72  cy .  of those r
17190 65 73 75 6c 74 73 20 74 68 65 20 75 73 65 72 20  esults the user 
171a0 63 6f 6e 73 69 64 65 72 73 20 6d 6f 72 65 20 69  considers more i
171b0 6e 74 65 72 65 73 74 69 6e 67 2e 0a 0a 3c 63 6f  nteresting...<co
171c0 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
171d0 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
171e0 69 6f 6e 20 73 75 70 70 6c 69 65 73 20 61 6e 20  ion supplies an 
171f0 53 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e 63  SQLite user func
17200 74 69 6f 6e 20 63 61 6c 6c 65 64 20 22 72 61 6e  tion called "ran
17210 6b 22 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69  k" that</i>.  <i
17220 3e 2d 2d 20 69 6e 74 65 72 70 72 65 74 73 20 74  >-- interprets t
17230 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
17240 72 65 74 75 72 6e 65 64 20 62 79 20 6d 61 74 63  returned by matc
17250 68 69 6e 66 6f 20 61 6e 64 20 72 65 74 75 72 6e  hinfo and return
17260 73 20 61 20 6e 75 6d 65 72 69 63 3c 2f 69 3e 0a  s a numeric</i>.
17270 20 20 3c 69 3e 2d 2d 20 72 65 6c 65 76 61 6e 63    <i>-- relevanc
17280 79 20 62 61 73 65 64 20 6f 6e 20 69 74 2c 20 74  y based on it, t
17290 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
172a0 67 20 53 51 4c 20 6d 61 79 20 62 65 20 75 73 65  g SQL may be use
172b0 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 3c  d to return the<
172c0 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 69 74 6c  /i>.  <i>-- titl
172d0 65 73 20 6f 66 20 74 68 65 20 31 30 20 6d 6f 73  es of the 10 mos
172e0 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  t relevant docum
172f0 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
17300 73 65 74 20 66 6f 72 20 61 20 75 73 65 72 73 20  set for a users 
17310 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c  query.</i>.  SEL
17320 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64  ECT title FROM d
17330 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57 48  ocuments .    WH
17340 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
17350 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
17360 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 72  ;.    ORDER BY r
17370 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f  ank(matchinfo(do
17380 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a 20  cuments)) DESC. 
17390 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53     LIMIT 10 OFFS
173a0 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ET 0.</codeblock
173b0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c  >..<p>.  The SQL
173c0 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 65 78   query in the ex
173d0 61 6d 70 6c 65 20 61 62 6f 76 65 20 75 73 65 73  ample above uses
173e0 20 6c 65 73 73 20 43 50 55 20 74 68 61 6e 20 74   less CPU than t
173f0 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65  he first example
17400 0a 20 20 69 6e 20 74 68 69 73 20 73 65 63 74 69  .  in this secti
17410 6f 6e 2c 20 62 75 74 20 73 74 69 6c 6c 20 68 61  on, but still ha
17420 73 20 61 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20  s a non-obvious 
17430 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 72 6f 62  performance prob
17440 6c 65 6d 2e 20 53 51 4c 69 74 65 0a 20 20 73 61  lem. SQLite.  sa
17450 74 69 73 66 69 65 73 20 74 68 69 73 20 71 75 65  tisfies this que
17460 72 79 20 62 79 20 72 65 74 72 69 65 76 69 6e 67  ry by retrieving
17470 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17480 65 20 22 74 69 74 6c 65 22 20 63 6f 6c 75 6d 6e  e "title" column
17490 20 61 6e 64 0a 20 20 6d 61 74 63 68 69 6e 66 6f   and.  matchinfo
174a0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 46   data from the F
174b0 54 53 20 6d 6f 64 75 6c 65 20 66 6f 72 20 65 76  TS module for ev
174c0 65 72 79 20 72 6f 77 20 6d 61 74 63 68 65 64 20  ery row matched 
174d0 62 79 20 74 68 65 20 75 73 65 72 73 0a 20 20 71  by the users.  q
174e0 75 65 72 79 20 62 65 66 6f 72 65 20 69 74 20 73  uery before it s
174f0 6f 72 74 73 20 61 6e 64 20 6c 69 6d 69 74 73 20  orts and limits 
17500 74 68 65 20 72 65 73 75 6c 74 73 2e 20 42 65 63  the results. Bec
17510 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
17520 53 51 4c 69 74 65 27 73 0a 20 20 76 69 72 74 75  SQLite's.  virtu
17530 61 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61  al table interfa
17540 63 65 20 77 6f 72 6b 73 2c 20 72 65 74 72 69 65  ce works, retrie
17550 76 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f  ving the value o
17560 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 63 6f  f the "title" co
17570 6c 75 6d 6e 0a 20 20 72 65 71 75 69 72 65 73 20  lumn.  requires 
17580 6c 6f 61 64 69 6e 67 20 74 68 65 20 65 6e 74 69  loading the enti
17590 72 65 20 72 6f 77 20 66 72 6f 6d 20 64 69 73 6b  re row from disk
175a0 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20   (including the 
175b0 22 63 6f 6e 74 65 6e 74 22 20 66 69 65 6c 64 2c  "content" field,
175c0 0a 20 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  .  which may be 
175d0 71 75 69 74 65 20 6c 61 72 67 65 29 2e 20 54 68  quite large). Th
175e0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  is means that if
175f0 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79   the users query
17600 20 6d 61 74 63 68 65 73 0a 20 20 73 65 76 65 72   matches.  sever
17610 61 6c 20 74 68 6f 75 73 61 6e 64 20 64 6f 63 75  al thousand docu
17620 6d 65 6e 74 73 2c 20 6d 61 6e 79 20 6d 65 67 61  ments, many mega
17630 62 79 74 65 73 20 6f 66 20 22 74 69 74 6c 65 22  bytes of "title"
17640 20 61 6e 64 20 22 63 6f 6e 74 65 6e 74 22 20 64   and "content" d
17650 61 74 61 0a 20 20 6d 61 79 20 62 65 20 6c 6f 61  ata.  may be loa
17660 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69 6e  ded from disk in
17670 74 6f 20 6d 65 6d 6f 72 79 20 65 76 65 6e 20 74  to memory even t
17680 68 6f 75 67 68 20 74 68 65 79 20 77 69 6c 6c 20  hough they will 
17690 6e 65 76 65 72 20 62 65 20 75 73 65 64 0a 20 20  never be used.  
176a0 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e  for any purpose.
176b0 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c   ..<p>.  The SQL
176c0 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 66 6f   query in the fo
176d0 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20  llowing example 
176e0 62 6c 6f 63 6b 20 69 73 20 6f 6e 65 20 73 6f 6c  block is one sol
176f0 75 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 0a 20  ution to this . 
17700 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 20 53 51 4c   problem. In SQL
17710 69 74 65 2c 20 77 68 65 6e 20 61 20 3c 61 20 68  ite, when a <a h
17720 72 65 66 3d 22 6f 70 74 6f 76 65 72 76 69 65 77  ref="optoverview
17730 2e 68 74 6d 6c 23 66 6c 61 74 74 65 6e 69 6e 67  .html#flattening
17740 22 3e 73 75 62 2d 71 75 65 72 79 20 0a 20 20 75  ">sub-query .  u
17750 73 65 64 20 69 6e 20 61 20 6a 6f 69 6e 20 63 6f  sed in a join co
17760 6e 74 61 69 6e 73 20 61 20 4c 49 4d 49 54 20 63  ntains a LIMIT c
17770 6c 61 75 73 65 3c 2f 61 3e 2c 20 74 68 65 20 72  lause</a>, the r
17780 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75  esults of the su
17790 62 2d 71 75 65 72 79 20 61 72 65 0a 20 20 63 61  b-query are.  ca
177a0 6c 63 75 6c 61 74 65 64 20 61 6e 64 20 73 74 6f  lculated and sto
177b0 72 65 64 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  red in temporary
177c0 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68   table before th
177d0 65 20 6d 61 69 6e 20 71 75 65 72 79 20 69 73 20  e main query is 
177e0 65 78 65 63 75 74 65 64 2e 0a 20 20 54 68 69 73  executed..  This
177f0 20 6d 65 61 6e 73 20 74 68 61 74 20 53 51 4c 69   means that SQLi
17800 74 65 20 77 69 6c 6c 20 6c 6f 61 64 20 6f 6e 6c  te will load onl
17810 79 20 74 68 65 20 64 6f 63 69 64 20 61 6e 64 20  y the docid and 
17820 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66  matchinfo data f
17830 6f 72 20 65 61 63 68 0a 20 20 72 6f 77 20 6d 61  or each.  row ma
17840 74 63 68 69 6e 67 20 74 68 65 20 75 73 65 72 73  tching the users
17850 20 71 75 65 72 79 20 69 6e 74 6f 20 6d 65 6d 6f   query into memo
17860 72 79 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ry, determine th
17870 65 20 64 6f 63 69 64 20 76 61 6c 75 65 73 0a 20  e docid values. 
17880 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
17890 6f 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20 72  o the ten most r
178a0 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e 74  elevant document
178b0 73 2c 20 74 68 65 6e 20 6c 6f 61 64 20 6f 6e 6c  s, then load onl
178c0 79 20 74 68 65 20 74 69 74 6c 65 0a 20 20 61 6e  y the title.  an
178d0 64 20 63 6f 6e 74 65 6e 74 20 69 6e 66 6f 72 6d  d content inform
178e0 61 74 69 6f 6e 20 66 6f 72 20 74 68 6f 73 65 20  ation for those 
178f0 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 6f 6e 6c  10 documents onl
17900 79 2e 20 42 65 63 61 75 73 65 20 62 6f 74 68 20  y. Because both 
17910 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 0a 20 20  the matchinfo.  
17920 61 6e 64 20 64 6f 63 69 64 20 76 61 6c 75 65 73  and docid values
17930 20 61 72 65 20 67 6c 65 61 6e 65 64 20 65 6e 74   are gleaned ent
17940 69 72 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 66  irely from the f
17950 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20  ull-text index, 
17960 74 68 69 73 20 72 65 73 75 6c 74 73 0a 20 20 69  this results.  i
17970 6e 20 64 72 61 6d 61 74 69 63 61 6c 6c 79 20 6c  n dramatically l
17980 65 73 73 20 64 61 74 61 20 62 65 69 6e 67 20 6c  ess data being l
17990 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
179a0 61 74 61 62 61 73 65 20 69 6e 74 6f 20 6d 65 6d  atabase into mem
179b0 6f 72 79 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ory...<codeblock
179c0 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65  >.  SELECT title
179d0 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
179e0 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20 20 53 45  JOIN ( .      SE
179f0 4c 45 43 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b  LECT docid, rank
17a00 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d  (matchinfo(docum
17a10 65 6e 74 73 29 29 20 41 53 20 72 61 6e 6b 20 0a  ents)) AS rank .
17a20 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d        FROM docum
17a30 65 6e 74 73 0a 20 20 20 20 20 20 57 48 45 52 45  ents.      WHERE
17a40 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
17a50 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20   &lt;query&gt;. 
17a60 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61       ORDER BY ra
17a70 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20 4c  nk DESC .      L
17a80 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 30  IMIT 10 OFFSET 0
17a90 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62 6c  .  ) AS ranktabl
17aa0 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20  e USING(docid). 
17ab0 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 74 61   ORDER BY rankta
17ac0 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a 3c 2f  ble.rank DESC.</
17ad0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
17ae0 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b    The next block
17af0 20 6f 66 20 53 51 4c 20 65 6e 68 61 6e 63 65 73   of SQL enhances
17b00 20 74 68 65 20 71 75 65 72 79 20 77 69 74 68 20   the query with 
17b10 73 6f 6c 75 74 69 6f 6e 73 20 74 6f 20 74 77 6f  solutions to two
17b20 20 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 73 0a   other problems.
17b30 20 20 74 68 61 74 20 6d 61 79 20 61 72 69 73 65    that may arise
17b40 20 69 6e 20 64 65 76 65 6c 6f 70 69 6e 67 20 73   in developing s
17b50 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
17b60 6e 73 20 75 73 69 6e 67 20 46 54 53 3a 0a 0a 3c  ns using FTS:..<
17b70 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20  ol>.  <li> <p>. 
17b80 20 20 20 20 20 20 54 68 65 20 5b 73 6e 69 70 70        The [snipp
17b90 65 74 5d 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  et] function can
17ba0 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
17bb0 20 74 68 65 20 61 62 6f 76 65 20 71 75 65 72 79   the above query
17bc0 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 20 20  . Because.      
17bd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17be0 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
17bf0 65 20 61 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d  e a "WHERE ... M
17c00 41 54 43 48 22 20 63 6c 61 75 73 65 2c 20 74 68  ATCH" clause, th
17c10 65 20 73 6e 69 70 70 65 74 20 0a 20 20 20 20 20  e snippet .     
17c20 20 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e    function may n
17c30 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
17c40 69 74 2e 20 4f 6e 65 20 73 6f 6c 75 74 69 6f 6e  it. One solution
17c50 20 69 73 20 74 6f 20 64 75 70 6c 69 63 61 74 65   is to duplicate
17c60 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 20   the WHERE.     
17c70 20 20 63 6c 61 75 73 65 20 75 73 65 64 20 62 79    clause used by
17c80 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
17c90 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17ca0 79 2e 20 54 68 65 20 6f 76 65 72 68 65 61 64 20  y. The overhead 
17cb0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20  associated.     
17cc0 20 20 77 69 74 68 20 74 68 69 73 20 69 73 20 75    with this is u
17cd0 73 75 61 6c 6c 79 20 6e 65 67 6c 69 67 69 62 6c  sually negligibl
17ce0 65 2e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20  e..  <li> <p>.  
17cf0 20 20 20 20 20 54 68 65 20 72 65 6c 65 76 61 6e       The relevan
17d00 63 79 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74  cy of a document
17d10 20 6d 61 79 20 64 65 70 65 6e 64 20 6f 6e 20 73   may depend on s
17d20 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
17d30 68 61 6e 20 6a 75 73 74 0a 20 20 20 20 20 20 20  han just.       
17d40 74 68 65 20 64 61 74 61 20 61 76 61 69 6c 61 62  the data availab
17d50 6c 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  le in the return
17d60 20 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69   value of matchi
17d70 6e 66 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  nfo. For example
17d80 0a 20 20 20 20 20 20 20 65 61 63 68 20 64 6f 63  .       each doc
17d90 75 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  ument in the dat
17da0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 73 73  abase may be ass
17db0 69 67 6e 65 64 20 61 20 73 74 61 74 69 63 20 77  igned a static w
17dc0 65 69 67 68 74 20 62 61 73 65 64 0a 20 20 20 20  eight based.    
17dd0 20 20 20 6f 6e 20 66 61 63 74 6f 72 73 20 75 6e     on factors un
17de0 72 65 6c 61 74 65 64 20 74 6f 20 69 74 73 20 63  related to its c
17df0 6f 6e 74 65 6e 74 20 28 6f 72 69 67 69 6e 2c 20  ontent (origin, 
17e00 61 75 74 68 6f 72 2c 20 61 67 65 2c 20 6e 75 6d  author, age, num
17e10 62 65 72 0a 20 20 20 20 20 20 20 6f 66 20 72 65  ber.       of re
17e20 66 65 72 65 6e 63 65 73 20 65 74 63 2e 29 2e 20  ferences etc.). 
17e30 54 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  These values can
17e40 20 62 65 20 73 74 6f 72 65 64 20 62 79 20 74 68   be stored by th
17e50 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 20  e application.  
17e60 20 20 20 20 20 69 6e 20 61 20 73 65 70 61 72 61       in a separa
17e70 74 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  te table that ca
17e80 6e 20 62 65 20 6a 6f 69 6e 65 64 20 61 67 61 69  n be joined agai
17e90 6e 73 74 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  nst the document
17ea0 73 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 69  s table.       i
17eb0 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
17ec0 73 6f 20 74 68 61 74 20 74 68 65 20 72 61 6e 6b  so that the rank
17ed0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 63   function may ac
17ee0 63 65 73 73 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e  cess them..</ol>
17ef0 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 76 65 72  ..<p>.  This ver
17f00 73 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  sion of the quer
17f10 79 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  y is very simila
17f20 72 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  r to that used b
17f30 79 20 74 68 65 20 0a 20 20 3c 61 20 68 72 65 66  y the .  <a href
17f40 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  ="http://www.sql
17f50 69 74 65 2e 6f 72 67 2f 73 65 61 72 63 68 3f 71  ite.org/search?q
17f60 3d 66 74 73 33 22 3e 73 71 6c 69 74 65 2e 6f 72  =fts3">sqlite.or
17f70 67 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  g documentation 
17f80 73 65 61 72 63 68 3c 2f 61 3e 20 0a 20 20 61 70  search</a> .  ap
17f90 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c 63 6f 64  plication...<cod
17fa0 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
17fb0 54 68 69 73 20 74 61 62 6c 65 20 73 74 6f 72 65  This table store
17fc0 73 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69  s the static wei
17fd0 67 68 74 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ght assigned to 
17fe0 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e  each document in
17ff0 20 46 54 53 20 74 61 62 6c 65 3c 2f 69 3e 0a 20   FTS table</i>. 
18000 20 3c 69 3e 2d 2d 20 22 64 6f 63 75 6d 65 6e 74   <i>-- "document
18010 73 22 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77  s". For each row
18020 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
18030 73 20 74 61 62 6c 65 20 74 68 65 72 65 20 69 73  s table there is
18040 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67   a corresponding
18050 20 72 6f 77 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   row</i>.  <i>--
18060 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 64   with the same d
18070 6f 63 69 64 20 76 61 6c 75 65 20 69 6e 20 74 68  ocid value in th
18080 69 73 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20  is table.</i>.  
18090 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f 63  CREATE TABLE doc
180a0 75 6d 65 6e 74 73 5f 64 61 74 61 28 64 6f 63 69  uments_data(doci
180b0 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
180c0 59 20 4b 45 59 2c 20 77 65 69 67 68 74 29 3b 0a  Y KEY, weight);.
180d0 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75  .  <i>-- This qu
180e0 65 72 79 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ery is similar t
180f0 6f 20 74 68 65 20 6f 6e 65 20 69 6e 20 74 68 65  o the one in the
18100 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 65 78   block above, ex
18110 63 65 70 74 20 74 68 61 74 3a 3c 2f 69 3e 0a 20  cept that:</i>. 
18120 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
18130 2d 2d 20 20 20 31 2e 20 49 74 20 72 65 74 75 72  --   1. It retur
18140 6e 73 20 61 20 22 73 6e 69 70 70 65 74 22 20 6f  ns a "snippet" o
18150 66 20 74 65 78 74 20 61 6c 6f 6e 67 20 77 69 74  f text along wit
18160 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74  h the document t
18170 69 74 6c 65 20 66 6f 72 20 64 69 73 70 6c 61 79  itle for display
18180 2e 20 53 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  . So</i>.  <i>--
18190 20 20 20 20 20 20 74 68 61 74 20 74 68 65 20 73        that the s
181a0 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20  nippet function 
181b0 6d 61 79 20 62 65 20 75 73 65 64 2c 20 74 68 65  may be used, the
181c0 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43   "WHERE ... MATC
181d0 48 20 2e 2e 2e 22 20 63 6c 61 75 73 65 20 66 72  H ..." clause fr
181e0 6f 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  om</i>.  <i>--  
181f0 20 20 20 20 74 68 65 20 73 75 62 2d 71 75 65 72      the sub-quer
18200 79 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 20  y is duplicated 
18210 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
18220 72 79 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ry.</i>.  <i>--<
18230 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 32 2e  /i>.  <i>--   2.
18240 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 6a   The sub-query j
18250 6f 69 6e 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  oins the documen
18260 74 73 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  ts table with th
18270 65 20 64 6f 63 75 6d 65 6e 74 5f 64 61 74 61 20  e document_data 
18280 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 3c 2f  table, so that</
18290 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20  i>.  <i>--      
182a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
182b0 66 20 74 68 65 20 72 61 6e 6b 20 66 75 6e 63 74  f the rank funct
182c0 69 6f 6e 20 68 61 73 20 61 63 63 65 73 73 20 74  ion has access t
182d0 6f 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69  o the static wei
182e0 67 68 74 20 61 73 73 69 67 6e 65 64 3c 2f 69 3e  ght assigned</i>
182f0 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 6f  .  <i>--      to
18300 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 3c   each document.<
18310 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74  /i>.  SELECT tit
18320 6c 65 2c 20 73 6e 69 70 70 65 74 28 64 6f 63 75  le, snippet(docu
18330 6d 65 6e 74 73 29 20 46 52 4f 4d 20 64 6f 63 75  ments) FROM docu
18340 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20  ments JOIN ( .  
18350 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64      SELECT docid
18360 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f  , rank(matchinfo
18370 28 64 6f 63 75 6d 65 6e 74 73 29 2c 20 64 6f 63  (documents), doc
18380 75 6d 65 6e 74 73 5f 64 61 74 61 2e 77 65 69 67  uments_data.weig
18390 68 74 29 20 41 53 20 72 61 6e 6b 0a 20 20 20 20  ht) AS rank.    
183a0 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73    FROM documents
183b0 20 4a 4f 49 4e 20 64 6f 63 75 6d 65 6e 74 73 5f   JOIN documents_
183c0 64 61 74 61 20 55 53 49 4e 47 28 64 6f 63 69 64  data USING(docid
183d0 29 0a 20 20 20 20 20 20 57 48 45 52 45 20 64 6f  ).      WHERE do
183e0 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c  cuments MATCH &l
183f0 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20  t;query&gt;.    
18400 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20    ORDER BY rank 
18410 44 45 53 43 20 0a 20 20 20 20 20 20 4c 49 4d 49  DESC .      LIMI
18420 54 20 31 30 20 4f 46 46 53 45 54 20 30 0a 20 20  T 10 OFFSET 0.  
18430 29 20 41 53 20 72 61 6e 6b 74 61 62 6c 65 20 55  ) AS ranktable U
18440 53 49 4e 47 28 64 6f 63 69 64 29 0a 20 20 57 48  SING(docid).  WH
18450 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
18460 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
18470 3b 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e  ;.  ORDER BY ran
18480 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43  ktable.rank DESC
18490 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
184a0 70 3e 0a 20 20 41 6c 6c 20 74 68 65 20 65 78 61  p>.  All the exa
184b0 6d 70 6c 65 20 71 75 65 72 69 65 73 20 61 62 6f  mple queries abo
184c0 76 65 20 72 65 74 75 72 6e 20 74 68 65 20 74 65  ve return the te
184d0 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20  n most relevant 
184e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 0a 20  query results.. 
184f0 20 42 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   By modifying th
18500 65 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 69  e values used wi
18510 74 68 20 74 68 65 20 4f 46 46 53 45 54 20 61 6e  th the OFFSET an
18520 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2c  d LIMIT clauses,
18530 20 61 20 71 75 65 72 79 20 0a 20 20 74 6f 20 72   a query .  to r
18540 65 74 75 72 6e 20 28 73 61 79 29 20 74 68 65 20  eturn (say) the 
18550 6e 65 78 74 20 74 65 6e 20 6d 6f 73 74 20 72 65  next ten most re
18560 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73 20 69  levant results i
18570 73 20 65 61 73 79 20 74 6f 20 63 6f 6e 73 74 72  s easy to constr
18580 75 63 74 2e 20 0a 20 20 54 68 69 73 20 6d 61 79  uct. .  This may
18590 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61   be used to obta
185a0 69 6e 20 74 68 65 20 64 61 74 61 20 72 65 71 75  in the data requ
185b0 69 72 65 64 20 66 6f 72 20 61 20 73 65 61 72 63  ired for a searc
185c0 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  h applications s
185d0 65 63 6f 6e 64 0a 20 20 61 6e 64 20 73 75 62 73  econd.  and subs
185e0 65 71 75 65 6e 74 20 70 61 67 65 73 20 6f 66 20  equent pages of 
185f0 72 65 73 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20 20  results...<p>.  
18600 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 63  The next block c
18610 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70  ontains an examp
18620 6c 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  le rank function
18630 20 74 68 61 74 20 75 73 65 73 20 6d 61 74 63 68   that uses match
18640 69 6e 66 6f 20 64 61 74 61 20 0a 20 20 69 6d 70  info data .  imp
18650 6c 65 6d 65 6e 74 65 64 20 69 6e 20 43 2e 20 49  lemented in C. I
18660 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67  nstead of a sing
18670 6c 65 20 77 65 69 67 68 74 2c 20 69 74 20 61 6c  le weight, it al
18680 6c 6f 77 73 20 61 20 77 65 69 67 68 74 20 74 6f  lows a weight to
18690 20 62 65 20 0a 20 20 65 78 74 65 72 6e 61 6c 6c   be .  externall
186a0 79 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61  y assigned to ea
186b0 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63  ch column of eac
186c0 68 20 64 6f 63 75 6d 65 6e 74 2e 20 49 74 20 6d  h document. It m
186d0 61 79 20 62 65 20 72 65 67 69 73 74 65 72 65 64  ay be registered
186e0 0a 20 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  .  with SQLite l
186f0 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 75 73  ike any other us
18700 65 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  er function usin
18710 67 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74  g [sqlite3_creat
18720 65 5f 66 75 6e 63 74 69 6f 6e 5d 2e 0a 0a 3c 63  e_function]...<c
18730 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69 3e 2f 2a 3c  odeblock>.<i>/*<
18740 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51 4c 69 74 65  /i>.<i>** SQLite
18750 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 66 75   user defined fu
18760 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65 20 77 69  nction to use wi
18770 74 68 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 74  th matchinfo() t
18780 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 3c  o calculate the<
18790 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61  /i>.<i>** releva
187a0 6e 63 79 20 6f 66 20 61 6e 20 46 54 53 20 6d 61  ncy of an FTS ma
187b0 74 63 68 2e 20 54 68 65 20 76 61 6c 75 65 20 72  tch. The value r
187c0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 72  eturned is the r
187d0 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 3c 2f  elevancy score</
187e0 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20 72 65 61 6c  i>.<i>** (a real
187f0 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
18800 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
18810 7a 65 72 6f 29 2e 20 41 20 6c 61 72 67 65 72 20  zero). A larger 
18820 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
18830 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61 20 6d 6f 72  </i>.<i>** a mor
18840 65 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  e relevant docum
18850 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ent.</i>.<i>**</
18860 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 6f 76 65  i>.<i>** The ove
18870 72 61 6c 6c 20 72 65 6c 65 76 61 6e 63 79 20 72  rall relevancy r
18880 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
18890 75 6d 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  um of the releva
188a0 6e 63 69 65 73 20 6f 66 20 65 61 63 68 20 3c 2f  ncies of each </
188b0 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20  i>.<i>** column 
188c0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 46 54 53  value in the FTS
188d0 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 6c 65   table. The rele
188e0 76 61 6e 63 79 20 6f 66 20 61 20 63 6f 6c 75 6d  vancy of a colum
188f0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 3c 2f  n value is the</
18900 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20 6f 66 20  i>.<i>** sum of 
18910 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
18920 72 20 65 61 63 68 20 72 65 70 6f 72 74 61 62 6c  r each reportabl
18930 65 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  e phrase in the 
18940 46 54 53 20 71 75 65 72 79 3a 3c 2f 69 3e 0a 3c  FTS query:</i>.<
18950 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
18960 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
18970 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
18980 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
18990 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
189a0 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ht&gt;</i>.<i>**
189b0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68 65 72 65  </i>.<i>** where
189c0 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67   &lt;hit count&g
189d0 74 3b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  t; is the number
189e0 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
189f0 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 74   the phrase in t
18a00 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  he</i>.<i>** col
18a10 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  umn value of the
18a20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 6e 64   current row and
18a30 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69 74 20   &lt;global hit 
18a40 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
18a50 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c 69 3e 2a   number</i>.<i>*
18a60 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  * of instances o
18a70 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
18a80 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
18a90 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  of all rows in t
18aa0 68 65 20 46 54 53 3c 2f 69 3e 0a 3c 69 3e 2a 2a  he FTS</i>.<i>**
18ab0 20 74 61 62 6c 65 2e 20 54 68 65 20 26 6c 74 3b   table. The &lt;
18ac0 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26 67 74  column weight&gt
18ad0 3b 20 69 73 20 61 20 77 65 69 67 68 74 69 6e 67  ; is a weighting
18ae0 20 66 61 63 74 6f 72 20 61 73 73 69 67 6e 65 64   factor assigned
18af0 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a 3c 69 3e   to each</i>.<i>
18b00 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 65  ** column by the
18b10 20 63 61 6c 6c 65 72 20 28 73 65 65 20 62 65 6c   caller (see bel
18b20 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ow).</i>.<i>**</
18b30 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 66 69 72  i>.<i>** The fir
18b40 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
18b50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
18b60 74 20 62 65 20 74 68 65 20 72 65 74 75 72 6e 20  t be the return 
18b70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 46 54 53  value of the FTS
18b80 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d 61 74 63   </i>.<i>** matc
18b90 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e  hinfo() function
18ba0 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  . Following this
18bb0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 61 72 67   must be one arg
18bc0 75 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ument for each c
18bd0 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn </i>.<i>**
18be0 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
18bf0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  e containing a n
18c00 75 6d 65 72 69 63 20 77 65 69 67 68 74 20 66 61  umeric weight fa
18c10 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 72  ctor for the cor
18c20 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f 69 3e 0a  responding </i>.
18c30 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 45 78  <i>** column. Ex
18c40 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ample:</i>.<i>**
18c50 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 43  </i>.<i>**     C
18c60 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
18c70 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55 53  BLE documents US
18c80 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20  ING fts3(title, 
18c90 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a 3c 69 3e  content)</i>.<i>
18ca0 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65  **</i>.<i>** The
18cb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
18cc0 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 6f 63   returns the doc
18cd0 69 64 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ids of documents
18ce0 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
18cf0 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69  full-text</i>.<i
18d00 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74 3b 71 75  >** query &lt;qu
18d10 65 72 79 26 67 74 3b 20 73 6f 72 74 65 64 20 66  ery&gt; sorted f
18d20 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65 61 73  rom most to leas
18d30 74 20 72 65 6c 65 76 61 6e 74 2e 20 57 68 65 6e  t relevant. When
18d40 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c 2f 69 3e   calculating</i>
18d50 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61 6e 63 65  .<i>** relevance
18d60 2c 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73  , query term ins
18d70 74 61 6e 63 65 73 20 69 6e 20 74 68 65 20 27 74  tances in the 't
18d80 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20 61 72 65  itle' column are
18d90 20 67 69 76 65 6e 20 74 77 69 63 65 20 74 68 65   given twice the
18da0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65 69 67 68  </i>.<i>** weigh
18db0 74 69 6e 67 20 6f 66 20 74 68 6f 73 65 20 69 6e  ting of those in
18dc0 20 74 68 65 20 27 63 6f 6e 74 65 6e 74 27 20 63   the 'content' c
18dd0 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn.</i>.<i>**
18de0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 53  </i>.<i>**     S
18df0 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
18e00 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f 69 3e 0a   documents </i>.
18e10 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45 52 45 20  <i>**     WHERE 
18e20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20  documents MATCH 
18e30 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 3c 2f  &lt;query&gt; </
18e40 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 4f 52 44  i>.<i>**     ORD
18e50 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63 68  ER BY rank(match
18e60 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c  info(documents),
18e70 20 31 2e 30 2c 20 30 2e 35 29 20 44 45 53 43 3c   1.0, 0.5) DESC<
18e80 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e 0a 73 74  /i>.<i>*/</i>.st
18e90 61 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 66 75  atic void rankfu
18ea0 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
18eb0 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 56  xt *pCtx, int nV
18ec0 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  al, sqlite3_valu
18ed0 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 69 6e  e **apVal){.  in
18ee0 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f 3b 20 20  t *aMatchinfo;  
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
18f00 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  >/* Return value
18f10 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 28 29 20   of matchinfo() 
18f20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 43 6f  */</i>.  int nCo
18f30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18f40 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e           <i>/* N
18f50 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18f60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
18f70 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50 68 72 61  </i>.  int nPhra
18f80 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
18f90 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e 75 6d         <i>/* Num
18fa0 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69  ber of phrases i
18fb0 6e 20 74 68 65 20 71 75 65 72 79 20 2a 2f 3c 2f  n the query */</
18fc0 69 3e 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65  i>.  int iPhrase
18fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18fe0 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72 65       <i>/* Curre
18ff0 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c 2f 69 3e  nt phrase */</i>
19000 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f 72 65 20  .  double score 
19010 3d 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20  = 0.0;          
19020 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75 65 20 74     <i>/* Value t
19030 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f 69 3e 0a  o return */</i>.
19040 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
19050 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a 0a 3c 69  f(int)==4 );..<i
19060 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  >  /* Check that
19070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19080 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
19090 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
190a0 20 69 73 20 63 6f 72 72 65 63 74 2e 3c 2f 69 3e   is correct.</i>
190b0 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  .<i>  ** If not,
190c0 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e 67 5f 6e   jump to wrong_n
190d0 75 6d 62 65 72 5f 61 72 67 73 2e 20 53 65 74 20  umber_args. Set 
190e0 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f 20 70 6f  aMatchinfo to po
190f0 69 6e 74 20 74 6f 20 74 68 65 20 61 72 72 61 79  int to the array
19100 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6f 66 20  </i>.<i>  ** of 
19110 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
19120 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
19130 20 62 79 20 46 54 53 20 66 75 6e 63 74 69 6f 6e   by FTS function
19140 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53 65 74 3c   matchinfo. Set<
19150 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e 50 68 72  /i>.<i>  ** nPhr
19160 61 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ase to contain t
19170 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  he number of rep
19180 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 73 20  ortable phrases 
19190 69 6e 20 74 68 65 20 75 73 65 72 73 20 66 75 6c  in the users ful
191a0 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69 3e 20 20  l-text</i>.<i>  
191b0 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64 20 6e 43  ** query, and nC
191c0 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ol to the number
191d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
191e0 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 3c 69  he table.</i>.<i
191f0 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 66 28 20  >  */</i>.  if( 
19200 6e 56 61 6c 26 6c 74 3b 31 20 29 20 67 6f 74 6f  nVal&lt;1 ) goto
19210 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72   wrong_number_ar
19220 67 73 3b 0a 20 20 61 4d 61 74 63 68 69 6e 66 6f  gs;.  aMatchinfo
19230 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74   = (unsigned int
19240 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
19250 5f 62 6c 6f 62 28 61 70 56 61 6c 26 23 78 35 42  _blob(apVal&#x5B
19260 3b 30 26 23 78 35 44 3b 29 3b 0a 20 20 6e 50 68  ;0&#x5D;);.  nPh
19270 72 61 73 65 20 3d 20 61 4d 61 74 63 68 69 6e 66  rase = aMatchinf
19280 6f 26 23 78 35 42 3b 30 26 23 78 35 44 3b 3b 0a  o&#x5B;0&#x5D;;.
19290 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68 69    nCol = aMatchi
192a0 6e 66 6f 26 23 78 35 42 3b 31 26 23 78 35 44 3b  nfo&#x5B;1&#x5D;
192b0 3b 0a 20 20 69 66 28 20 6e 56 61 6c 21 3d 28 31  ;.  if( nVal!=(1
192c0 2b 6e 43 6f 6c 29 20 29 20 67 6f 74 6f 20 77 72  +nCol) ) goto wr
192d0 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3b  ong_number_args;
192e0 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74 65 72 61 74  ..<i>  /* Iterat
192f0 65 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 70  e through each p
19300 68 72 61 73 65 20 69 6e 20 74 68 65 20 75 73 65  hrase in the use
19310 72 73 20 71 75 65 72 79 2e 20 2a 2f 3c 2f 69 3e  rs query. */</i>
19320 0a 20 20 66 6f 72 28 69 50 68 72 61 73 65 3d 30  .  for(iPhrase=0
19330 3b 20 69 50 68 72 61 73 65 26 6c 74 3b 6e 50 68  ; iPhrase&lt;nPh
19340 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b 29  rase; iPhrase++)
19350 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20  {.    int iCol; 
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72 65 6e      <i>/* Curren
19380 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c 2f 69 3e 0a  t column */</i>.
19390 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e 6f 77 20 69  .<i>    /* Now i
193a0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
193b0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
193c0 65 20 75 73 65 72 73 20 71 75 65 72 79 2e 20 46  e users query. F
193d0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 3c  or each column,<
193e0 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 69 6e  /i>.<i>    ** in
193f0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 6c 65  crement the rele
19400 76 61 6e 63 79 20 73 63 6f 72 65 20 62 79 3a 3c  vancy score by:<
19410 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 3c 2f 69  /i>.<i>    **</i
19420 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 20 20 28 26  >.<i>    **   (&
19430 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67 74 3b  lt;hit count&gt;
19440 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69   / &lt;global hi
19450 74 20 63 6f 75 6e 74 26 67 74 29 20 2a 20 26 6c  t count&gt) * &l
19460 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26  t;column weight&
19470 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a  gt;</i>.<i>    *
19480 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20  *</i>.<i>    ** 
19490 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
194a0 3b 26 23 78 35 44 3b 20 70 6f 69 6e 74 73 20 74  ;&#x5D; points t
194b0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
194c0 68 65 20 64 61 74 61 20 66 6f 72 20 70 68 72 61  he data for phra
194d0 73 65 20 69 50 68 72 61 73 65 2e 20 53 6f 3c 2f  se iPhrase. So</
194e0 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 74 68 65  i>.<i>    ** the
194f0 20 68 69 74 20 63 6f 75 6e 74 20 61 6e 64 20 67   hit count and g
19500 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 73  lobal hit counts
19510 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
19520 20 61 72 65 20 66 6f 75 6e 64 20 69 6e 20 3c 2f   are found in </
19530 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 61 50 68  i>.<i>    ** aPh
19540 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 69 43  raseinfo&#x5B;iC
19550 6f 6c 2a 33 26 23 78 35 44 3b 20 61 6e 64 20 61  ol*3&#x5D; and a
19560 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b  Phraseinfo&#x5B;
19570 69 43 6f 6c 2a 33 2b 31 26 23 78 35 44 3b 2c 20  iCol*3+1&#x5D;, 
19580 72 65 73 70 65 63 74 69 76 65 6c 79 2e 3c 2f 69  respectively.</i
19590 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c 2f 69 3e 0a  >.<i>    */</i>.
195a0 20 20 20 20 69 6e 74 20 2a 61 50 68 72 61 73 65      int *aPhrase
195b0 69 6e 66 6f 20 3d 20 26 61 4d 61 74 63 68 69 6e  info = &aMatchin
195c0 66 6f 26 23 78 35 42 3b 32 20 2b 20 69 50 68 72  fo&#x5B;2 + iPhr
195d0 61 73 65 2a 6e 43 6f 6c 2a 33 26 23 78 35 44 3b  ase*nCol*3&#x5D;
195e0 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  ;.    for(iCol=0
195f0 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43 6f 6c 3b 20  ; iCol&lt;nCol; 
19600 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
19610 6e 74 20 6e 48 69 74 43 6f 75 6e 74 20 3d 20 61  nt nHitCount = a
19620 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b  Phraseinfo&#x5B;
19630 33 2a 69 43 6f 6c 26 23 78 35 44 3b 3b 0a 20 20  3*iCol&#x5D;;.  
19640 20 20 20 20 69 6e 74 20 6e 47 6c 6f 62 61 6c 48      int nGlobalH
19650 69 74 43 6f 75 6e 74 20 3d 20 61 50 68 72 61 73  itCount = aPhras
19660 65 69 6e 66 6f 26 23 78 35 42 3b 33 2a 69 43 6f  einfo&#x5B;3*iCo
19670 6c 2b 31 26 23 78 35 44 3b 3b 0a 20 20 20 20 20  l+1&#x5D;;.     
19680 20 64 6f 75 62 6c 65 20 77 65 69 67 68 74 20 3d   double weight =
19690 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
196a0 6f 75 62 6c 65 28 61 70 56 61 6c 26 23 78 35 42  ouble(apVal&#x5B
196b0 3b 69 43 6f 6c 2b 31 26 23 78 35 44 3b 29 3b 0a  ;iCol+1&#x5D;);.
196c0 20 20 20 20 20 20 69 66 28 20 6e 48 69 74 43 6f        if( nHitCo
196d0 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unt>0 ){.       
196e0 20 73 63 6f 72 65 20 2b 3d 20 28 28 64 6f 75 62   score += ((doub
196f0 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20 2f 20 28  le)nHitCount / (
19700 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61 6c 48 69  double)nGlobalHi
19710 74 43 6f 75 6e 74 29 20 2a 20 77 65 69 67 68 74  tCount) * weight
19720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19730 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
19740 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
19750 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20 72 65 74  x, score);.  ret
19760 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 4a 75  urn;..<i>  /* Ju
19770 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 77  mp here if the w
19780 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
19790 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 61 73  rguments are pas
197a0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
197b0 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77 72 6f 6e  tion */</i>.wron
197c0 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3a 0a 20  g_number_args:. 
197d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
197e0 65 72 72 6f 72 28 70 43 74 78 2c 20 22 77 72 6f  error(pCtx, "wro
197f0 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
19800 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
19810 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d 31 29 3b  on rank()", -1);
19820 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  .}.</codeblock>.