/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fdc666a70d5257a64fee209f97cf89e0e6e32b51:


0000: 0a 46 54 53 34 20 43 4f 4e 54 45 4e 54 20 4f 50  .FTS4 CONTENT OP
0010: 54 49 4f 4e 0a 0a 20 20 4e 6f 72 6d 61 6c 6c 79  TION..  Normally
0020: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  , in order to cr
0030: 65 61 74 65 20 61 20 66 75 6c 6c 2d 74 65 78 74  eate a full-text
0040: 20 69 6e 64 65 78 20 6f 6e 20 61 20 64 61 74 61   index on a data
0050: 73 65 74 2c 20 74 68 65 20 46 54 53 34 20 0a 20  set, the FTS4 . 
0060: 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73 20 61   module stores a
0070: 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 69 6e 64   copy of all ind
0080: 65 78 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 69  exed documents i
0090: 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
00a0: 65 61 74 65 64 20 0a 20 20 64 61 74 61 62 61 73  eated .  databas
00b0: 65 20 74 61 62 6c 65 2e 0a 0a 20 20 41 73 20 6f  e table...  As o
00c0: 66 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  f SQLite version
00d0: 20 33 2e 37 2e 39 2c 20 46 54 53 34 20 73 75 70   3.7.9, FTS4 sup
00e0: 70 6f 72 74 73 20 61 20 6e 65 77 20 6f 70 74 69  ports a new opti
00f0: 6f 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22 20 2d  on - "content" -
0100: 0a 20 20 64 65 73 69 67 6e 65 64 20 74 6f 20 65  .  designed to e
0110: 78 74 65 6e 64 20 46 54 53 34 20 74 6f 20 73 75  xtend FTS4 to su
0120: 70 70 6f 72 74 20 74 68 65 20 63 72 65 61 74 69  pport the creati
0130: 6f 6e 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20  on of full-text 
0140: 69 6e 64 65 78 65 73 20 77 68 65 72 65 3a 0a 0a  indexes where:..
0150: 20 20 20 20 2a 20 54 68 65 20 69 6e 64 65 78 65      * The indexe
0160: 64 20 64 6f 63 75 6d 65 6e 74 73 20 61 72 65 20  d documents are 
0170: 6e 6f 74 20 73 74 6f 72 65 64 20 77 69 74 68 69  not stored withi
0180: 6e 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74  n the SQLite dat
0190: 61 62 61 73 65 20 0a 20 20 20 20 20 20 61 74 20  abase .      at 
01a0: 61 6c 6c 20 28 61 20 22 63 6f 6e 74 65 6e 74 6c  all (a "contentl
01b0: 65 73 73 22 20 46 54 53 34 20 74 61 62 6c 65 29  ess" FTS4 table)
01c0: 2c 20 6f 72 0a 0a 20 20 20 20 2a 20 54 68 65 20  , or..    * The 
01d0: 69 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74  indexed document
01e0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
01f0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
0200: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 20 20 20   created and.   
0210: 20 20 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68     managed by th
0220: 65 20 75 73 65 72 20 28 61 6e 20 22 65 78 74 65  e user (an "exte
0230: 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 22 20 46 54  rnal content" FT
0240: 53 34 20 74 61 62 6c 65 29 2e 0a 0a 20 20 42 65  S4 table)...  Be
0250: 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 65  cause the indexe
0260: 64 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 65 6d  d documents them
0270: 73 65 6c 76 65 73 20 61 72 65 20 75 73 75 61 6c  selves are usual
0280: 6c 79 20 6d 75 63 68 20 6c 61 72 67 65 72 20 74  ly much larger t
0290: 68 61 6e 20 0a 20 20 74 68 65 20 66 75 6c 6c 2d  han .  the full-
02a0: 74 65 78 74 20 69 6e 64 65 78 2c 20 74 68 65 20  text index, the 
02b0: 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 20 63  content option c
02c0: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
02d0: 75 73 65 64 20 74 6f 20 61 63 68 69 65 76 65 20  used to achieve 
02e0: 0a 20 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73  .  significant s
02f0: 70 61 63 65 20 73 61 76 69 6e 67 73 2e 0a 0a 43  pace savings...C
0300: 4f 4e 54 45 4e 54 4c 45 53 53 20 46 54 53 34 20  ONTENTLESS FTS4 
0310: 54 41 42 4c 45 53 0a 0a 20 20 49 6e 20 6f 72 64  TABLES..  In ord
0320: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  er to create an 
0330: 46 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20  FTS4 table that 
0340: 64 6f 65 73 20 6e 6f 74 20 73 74 6f 72 65 20 61  does not store a
0350: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 64   copy of the ind
0360: 65 78 65 64 0a 20 20 64 6f 63 75 6d 65 6e 74 73  exed.  documents
0370: 20 61 74 20 61 6c 6c 2c 20 74 68 65 20 63 6f 6e   at all, the con
0380: 74 65 6e 74 20 6f 70 74 69 6f 6e 20 73 68 6f 75  tent option shou
0390: 6c 64 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ld be set to an 
03a0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  empty string..  
03b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
03c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 63   following SQL c
03d0: 72 65 61 74 65 73 20 73 75 63 68 20 61 6e 20 46  reates such an F
03e0: 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74  TS4 table with t
03f0: 68 72 65 65 0a 20 20 63 6f 6c 75 6d 6e 73 20 2d  hree.  columns -
0400: 20 22 61 22 2c 20 22 62 22 2c 20 61 6e 64 20 22   "a", "b", and "
0410: 63 22 3a 0a 0a 20 20 20 20 43 52 45 41 54 45 20  c":..    CREATE 
0420: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31  VIRTUAL TABLE t1
0430: 20 55 53 49 4e 47 20 66 74 73 34 28 63 6f 6e 74   USING fts4(cont
0440: 65 6e 74 3d 22 22 2c 20 61 2c 20 62 2c 20 63 29  ent="", a, b, c)
0450: 3b 0a 0a 20 20 44 61 74 61 20 63 61 6e 20 62 65  ;..  Data can be
0460: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 73   inserted into s
0470: 75 63 68 20 61 6e 20 46 54 53 34 20 74 61 62 6c  uch an FTS4 tabl
0480: 65 20 75 73 69 6e 67 20 61 6e 20 49 4e 53 45 52  e using an INSER
0490: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
04a0: 48 6f 77 65 76 65 72 2c 20 75 6e 6c 69 6b 65 20  However, unlike 
04b0: 6f 72 64 69 6e 61 72 79 20 46 54 53 34 20 74 61  ordinary FTS4 ta
04c0: 62 6c 65 73 2c 20 74 68 65 20 75 73 65 72 20 6d  bles, the user m
04d0: 75 73 74 20 73 75 70 70 6c 79 20 61 6e 20 65 78  ust supply an ex
04e0: 70 6c 69 63 69 74 0a 20 20 69 6e 74 65 67 65 72  plicit.  integer
04f0: 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 46 6f   docid value. Fo
0500: 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 20 20 20 20  r example:..    
0510: 2d 2d 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  -- This statemen
0520: 74 20 69 73 20 4f 6b 3a 0a 20 20 20 20 49 4e 53  t is Ok:.    INS
0530: 45 52 54 20 49 4e 54 4f 20 74 31 28 64 6f 63 69  ERT INTO t1(doci
0540: 64 2c 20 61 2c 20 62 2c 20 63 29 20 56 41 4c 55  d, a, b, c) VALU
0550: 45 53 28 31 2c 20 27 61 20 62 20 63 27 2c 20 27  ES(1, 'a b c', '
0560: 64 20 65 20 66 27 2c 20 27 67 20 68 20 69 27 29  d e f', 'g h i')
0570: 3b 0a 0a 20 20 20 20 2d 2d 20 54 68 69 73 20 73  ;..    -- This s
0580: 74 61 74 65 6d 65 6e 74 20 63 61 75 73 65 73 20  tatement causes 
0590: 61 6e 20 65 72 72 6f 72 2c 20 61 73 20 6e 6f 20  an error, as no 
05a0: 64 6f 63 69 64 20 76 61 6c 75 65 20 68 61 73 20  docid value has 
05b0: 62 65 65 6e 20 70 72 6f 76 69 64 65 64 3a 0a 20  been provided:. 
05c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
05d0: 31 28 61 2c 20 62 2c 20 63 29 20 56 41 4c 55 45  1(a, b, c) VALUE
05e0: 53 28 27 6a 20 6b 20 6c 27 2c 20 27 6d 20 6e 20  S('j k l', 'm n 
05f0: 6f 27 2c 20 27 70 20 71 20 72 27 29 3b 0a 0a 20  o', 'p q r');.. 
0600: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
0610: 62 6c 65 20 74 6f 20 55 50 44 41 54 45 20 6f 72  ble to UPDATE or
0620: 20 44 45 4c 45 54 45 20 61 20 72 6f 77 20 73 74   DELETE a row st
0630: 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 6e  ored in a conten
0640: 74 6c 65 73 73 20 46 54 53 34 0a 20 20 74 61 62  tless FTS4.  tab
0650: 6c 65 2e 20 41 74 74 65 6d 70 74 69 6e 67 20 74  le. Attempting t
0660: 6f 20 64 6f 20 73 6f 20 69 73 20 61 6e 20 65 72  o do so is an er
0670: 72 6f 72 2e 0a 0a 20 20 43 6f 6e 74 65 6e 74 6c  ror...  Contentl
0680: 65 73 73 20 46 54 53 34 20 74 61 62 6c 65 73 20  ess FTS4 tables 
0690: 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 53 45 4c  also support SEL
06a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ECT statements. 
06b0: 48 6f 77 65 76 65 72 2c 20 69 74 20 69 73 0a 20  However, it is. 
06c0: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 61 74 74   an error to att
06d0: 65 6d 70 74 20 74 6f 20 72 65 74 72 69 65 76 65  empt to retrieve
06e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e   the value of an
06f0: 79 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6f  y table column o
0700: 74 68 65 72 20 74 68 61 6e 0a 20 20 74 68 65 20  ther than.  the 
0710: 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20 54 68  docid column. Th
0720: 65 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  e auxiliary func
0730: 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 28 29  tion matchinfo()
0740: 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20 62 75   may be used, bu
0750: 74 0a 20 20 73 6e 69 70 70 65 74 28 29 20 61 6e  t.  snippet() an
0760: 64 20 6f 66 66 73 65 74 73 28 29 20 6d 61 79 20  d offsets() may 
0770: 6e 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  not. For example
0780: 3a 0a 0a 20 20 20 20 2d 2d 20 54 68 65 20 66 6f  :..    -- The fo
0790: 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
07a0: 74 73 20 61 72 65 20 4f 6b 3a 0a 20 20 20 20 53  ts are Ok:.    S
07b0: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
07c0: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
07d0: 43 48 20 27 78 78 78 27 3b 0a 20 20 20 20 53 45  CH 'xxx';.    SE
07e0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
07f0: 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48  t1 WHERE a MATCH
0800: 20 27 78 78 78 27 3b 0a 20 20 20 20 53 45 4c 45   'xxx';.    SELE
0810: 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 29  CT matchinfo(t1)
0820: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
0830: 31 20 4d 41 54 43 48 20 27 78 78 78 27 3b 0a 0a  1 MATCH 'xxx';..
0840: 20 20 20 20 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f      -- The follo
0850: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0860: 61 6c 6c 20 63 61 75 73 65 20 65 72 72 6f 72 73  all cause errors
0870: 2c 20 61 73 20 74 68 65 20 76 61 6c 75 65 20 6f  , as the value o
0880: 66 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2d 2d  f columns.    --
0890: 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63 69   other than doci
08a0: 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  d are required t
08b0: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 6d 2e  o evaluate them.
08c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
08d0: 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43  OM t1;.    SELEC
08e0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 57  T a, b FROM t1 W
08f0: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 78  HERE t1 MATCH 'x
0900: 78 78 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  xx';.    SELECT 
0910: 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48  docid FROM t1 WH
0920: 45 52 45 20 61 20 4c 49 4b 45 20 27 78 78 78 25  ERE a LIKE 'xxx%
0930: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 6e  ';.    SELECT sn
0940: 69 70 70 65 74 28 74 31 29 20 46 52 4f 4d 20 74  ippet(t1) FROM t
0950: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
0960: 20 27 78 78 78 27 3b 0a 0a 20 20 45 72 72 6f 72   'xxx';..  Error
0970: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 61 74 74  s related to att
0980: 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 74 72 69  empting to retri
0990: 65 76 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  eve column value
09a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63  s other than doc
09b0: 69 64 0a 20 20 61 72 65 20 72 75 6e 74 69 6d 65  id.  are runtime
09c0: 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
09d0: 75 72 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65  ur within sqlite
09e0: 33 5f 73 74 65 70 28 29 2e 20 49 6e 20 73 6f 6d  3_step(). In som
09f0: 65 20 63 61 73 65 73 2c 20 66 6f 72 0a 20 20 65  e cases, for.  e
0a00: 78 61 6d 70 6c 65 20 69 66 20 74 68 65 20 4d 41  xample if the MA
0a10: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 69  TCH expression i
0a20: 6e 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79  n a SELECT query
0a30: 20 6d 61 74 63 68 65 73 20 7a 65 72 6f 20 72 6f   matches zero ro
0a40: 77 73 2c 20 74 68 65 72 65 0a 20 20 6d 61 79 20  ws, there.  may 
0a50: 62 65 20 6e 6f 20 65 72 72 6f 72 20 61 74 20 61  be no error at a
0a60: 6c 6c 20 65 76 65 6e 20 69 66 20 61 20 73 74 61  ll even if a sta
0a70: 74 65 6d 65 6e 74 20 64 6f 65 73 20 72 65 66 65  tement does refe
0a80: 72 20 74 6f 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  r to column valu
0a90: 65 73 20 0a 20 20 6f 74 68 65 72 20 74 68 61 6e  es .  other than
0aa0: 20 64 6f 63 69 64 2e 0a 0a 45 58 54 45 52 4e 41   docid...EXTERNA
0ab0: 4c 20 43 4f 4e 54 45 4e 54 20 46 54 53 34 20 54  L CONTENT FTS4 T
0ac0: 41 42 4c 45 53 0a 0a 20 20 41 6e 20 22 65 78 74  ABLES..  An "ext
0ad0: 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 22 20 46  ernal content" F
0ae0: 54 53 34 20 74 61 62 6c 65 20 69 73 20 73 69 6d  TS4 table is sim
0af0: 69 6c 61 72 20 74 6f 20 61 20 63 6f 6e 74 65 6e  ilar to a conten
0b00: 74 6c 65 73 73 20 74 61 62 6c 65 2c 20 65 78 63  tless table, exc
0b10: 65 70 74 0a 20 20 74 68 61 74 20 69 66 20 65 76  ept.  that if ev
0b20: 61 6c 75 61 74 69 6f 6e 20 6f 66 20 61 20 71 75  aluation of a qu
0b30: 65 72 79 20 72 65 71 75 69 72 65 73 20 74 68 65  ery requires the
0b40: 20 76 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75   value of a colu
0b50: 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 0a 20  mn other than . 
0b60: 20 64 6f 63 69 64 2c 20 46 54 53 34 20 61 74 74   docid, FTS4 att
0b70: 65 6d 70 74 73 20 74 6f 20 72 65 74 72 69 65 76  empts to retriev
0b80: 65 20 74 68 61 74 20 76 61 6c 75 65 20 66 72 6f  e that value fro
0b90: 6d 20 61 20 74 61 62 6c 65 20 28 6f 72 20 76 69  m a table (or vi
0ba0: 65 77 2c 20 6f 72 20 0a 20 20 76 69 72 74 75 61  ew, or .  virtua
0bb0: 6c 20 74 61 62 6c 65 29 20 6e 6f 6d 69 6e 61 74  l table) nominat
0bc0: 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 28  ed by the user (
0bd0: 68 65 72 65 61 66 74 65 72 20 72 65 66 65 72 72  hereafter referr
0be0: 65 64 20 74 6f 20 61 73 20 74 68 65 20 22 63 6f  ed to as the "co
0bf0: 6e 74 65 6e 74 0a 20 20 74 61 62 6c 65 22 29 2e  ntent.  table").
0c00: 20 54 68 65 20 46 54 53 34 20 6d 6f 64 75 6c 65   The FTS4 module
0c10: 20 6e 65 76 65 72 20 77 72 69 74 65 73 20 74 6f   never writes to
0c20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
0c30: 6c 65 2c 20 61 6e 64 20 77 72 69 74 69 6e 67 0a  le, and writing.
0c40: 20 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74    to the content
0c50: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
0c60: 61 66 66 65 63 74 20 74 68 65 20 66 75 6c 6c 2d  affect the full-
0c70: 74 65 78 74 20 69 6e 64 65 78 2e 20 49 74 20 69  text index. It i
0c80: 73 20 74 68 65 0a 20 20 72 65 73 70 6f 6e 73 69  s the.  responsi
0c90: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 75 73  bility of the us
0ca0: 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  er to ensure tha
0cb0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  t the content ta
0cc0: 62 6c 65 20 61 6e 64 20 74 68 65 20 0a 20 20 66  ble and the .  f
0cd0: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61  ull-text index a
0ce0: 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 0a  re consistent...
0cf0: 20 20 41 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f    An external co
0d00: 6e 74 65 6e 74 20 46 54 53 34 20 74 61 62 6c 65  ntent FTS4 table
0d10: 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20 73   is created by s
0d20: 65 74 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  etting the conte
0d30: 6e 74 20 6f 70 74 69 6f 6e 0a 20 20 74 6f 20 74  nt option.  to t
0d40: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
0d50: 6c 65 20 28 6f 72 20 76 69 65 77 2c 20 6f 72 20  le (or view, or 
0d60: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29 20 74  virtual table) t
0d70: 68 61 74 20 6d 61 79 20 62 65 20 71 75 65 72 69  hat may be queri
0d80: 65 64 20 62 79 0a 20 20 46 54 53 34 20 74 6f 20  ed by.  FTS4 to 
0d90: 72 65 74 72 69 65 76 65 20 63 6f 6c 75 6d 6e 20  retrieve column 
0da0: 76 61 6c 75 65 73 20 77 68 65 6e 20 72 65 71 75  values when requ
0db0: 69 72 65 64 2e 20 49 66 20 74 68 65 20 6e 6f 6d  ired. If the nom
0dc0: 69 6e 61 74 65 64 20 74 61 62 6c 65 20 64 6f 65  inated table doe
0dd0: 73 0a 20 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  s.  not exist, t
0de0: 68 65 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  hen an external 
0df0: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 62 65  content table be
0e00: 68 61 76 65 73 20 69 6e 20 74 68 65 20 73 61 6d  haves in the sam
0e10: 65 20 77 61 79 20 61 73 0a 20 20 61 20 63 6f 6e  e way as.  a con
0e20: 74 65 6e 74 6c 65 73 73 20 74 61 62 6c 65 2e 20  tentless table. 
0e30: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 20 20  For example:..  
0e40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0e50: 32 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  2(id INTEGER PRI
0e60: 4d 41 52 59 20 4b 45 59 2c 20 61 2c 20 62 2c 20  MARY KEY, a, b, 
0e70: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56  c);.    CREATE V
0e80: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20  IRTUAL TABLE t3 
0e90: 55 53 49 4e 47 20 66 74 73 34 28 63 6f 6e 74 65  USING fts4(conte
0ea0: 6e 74 3d 22 74 32 22 2c 20 61 2c 20 63 29 3b 0a  nt="t2", a, c);.
0eb0: 0a 20 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  .  Assuming the 
0ec0: 6e 6f 6d 69 6e 61 74 65 64 20 74 61 62 6c 65 20  nominated table 
0ed0: 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e  does exist, then
0ee0: 20 69 74 73 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   its columns mus
0ef0: 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 0a 20  t be the same . 
0f00: 20 61 73 20 6f 72 20 61 20 73 75 70 65 72 73 65   as or a superse
0f10: 74 20 6f 66 20 74 68 6f 73 65 20 64 65 66 69 6e  t of those defin
0f20: 65 64 20 66 6f 72 20 74 68 65 20 46 54 53 20 74  ed for the FTS t
0f30: 61 62 6c 65 2e 0a 0a 20 20 57 68 65 6e 20 61 20  able...  When a 
0f40: 75 73 65 72 73 20 71 75 65 72 79 20 6f 6e 20 74  users query on t
0f50: 68 65 20 46 54 53 20 74 61 62 6c 65 20 72 65 71  he FTS table req
0f60: 75 69 72 65 73 20 61 20 63 6f 6c 75 6d 6e 20 76  uires a column v
0f70: 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 0a  alue other than.
0f80: 20 20 64 6f 63 69 64 2c 20 46 54 53 20 61 74 74    docid, FTS att
0f90: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 74 68  empts to read th
0fa0: 69 73 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  is value from th
0fb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0fc0: 63 6f 6c 75 6d 6e 20 6f 66 0a 20 20 74 68 65 20  column of.  the 
0fd0: 72 6f 77 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  row in the conte
0fe0: 6e 74 20 74 61 62 6c 65 20 77 69 74 68 20 61 20  nt table with a 
0ff0: 72 6f 77 69 64 20 76 61 6c 75 65 20 65 71 75 61  rowid value equa
1000: 6c 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  l to the current
1010: 20 46 54 53 0a 20 20 64 6f 63 69 64 2e 20 4f 72   FTS.  docid. Or
1020: 2c 20 69 66 20 73 75 63 68 20 61 20 72 6f 77 20  , if such a row 
1030: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20  cannot be found 
1040: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  in the content t
1050: 61 62 6c 65 2c 20 61 20 4e 55 4c 4c 0a 20 20 76  able, a NULL.  v
1060: 61 6c 75 65 20 69 73 20 75 73 65 64 20 69 6e 73  alue is used ins
1070: 74 65 61 64 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tead. For exampl
1080: 65 3a 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  e:..    CREATE T
1090: 41 42 4c 45 20 74 32 28 69 64 20 49 4e 54 45 47  ABLE t2(id INTEG
10a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
10b0: 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20 20 20  a, b, c, d);.   
10c0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
10d0: 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20 66  TABLE t3 USING f
10e0: 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22 74 32 22  ts4(content="t2"
10f0: 2c 20 62 2c 20 63 29 3b 0a 20 20 0a 20 20 20 20  , b, c);.  .    
1100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1110: 41 4c 55 45 53 28 32 2c 20 27 61 20 62 27 2c 20  ALUES(2, 'a b', 
1120: 27 63 20 64 27 2c 20 27 65 20 66 27 29 3b 0a 20  'c d', 'e f');. 
1130: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1140: 32 20 56 41 4c 55 45 53 28 33 2c 20 27 67 20 68  2 VALUES(3, 'g h
1150: 27 2c 20 27 69 20 6a 27 2c 20 27 6b 20 6c 27 29  ', 'i j', 'k l')
1160: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1170: 4f 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20 63  O t3(docid, b, c
1180: 29 20 53 45 4c 45 43 54 20 69 64 2c 20 62 2c 20  ) SELECT id, b, 
1190: 63 20 46 52 4f 4d 20 74 32 3b 0a 0a 20 20 20 20  c FROM t2;..    
11a0: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
11b0: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61   query returns a
11c0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68   single row with
11d0: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e   two columns con
11e0: 74 61 69 6e 69 6e 67 0a 20 20 20 20 2d 2d 20 74  taining.    -- t
11f0: 68 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 22  he text values "
1200: 69 20 6a 22 20 61 6e 64 20 22 6b 20 6c 22 2e 0a  i j" and "k l"..
1210: 20 20 20 20 2d 2d 0a 20 20 20 20 2d 2d 20 54 68      --.    -- Th
1220: 65 20 71 75 65 72 79 20 75 73 65 73 20 74 68 65  e query uses the
1230: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
1240: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 61   to discover tha
1250: 74 20 74 68 65 20 4d 41 54 43 48 20 0a 20 20 20  t the MATCH .   
1260: 20 2d 2d 20 74 65 72 6d 20 6d 61 74 63 68 65 73   -- term matches
1270: 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 64 6f   the row with do
1280: 63 69 64 3d 33 2e 20 49 74 20 74 68 65 6e 20 72  cid=3. It then r
1290: 65 74 72 69 65 76 65 73 20 74 68 65 20 76 61 6c  etrieves the val
12a0: 75 65 73 0a 20 20 20 20 2d 2d 20 6f 66 20 63 6f  ues.    -- of co
12b0: 6c 75 6d 6e 73 20 62 20 61 6e 64 20 63 20 66 72  lumns b and c fr
12c0: 6f 6d 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  om the row with 
12d0: 72 6f 77 69 64 3d 33 20 69 6e 20 74 68 65 20 63  rowid=3 in the c
12e0: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 0a 20 20 20  ontent table.   
12f0: 20 2d 2d 20 74 6f 20 72 65 74 75 72 6e 2e 0a 20   -- to return.. 
1300: 20 20 20 2d 2d 0a 20 20 20 20 53 45 4c 45 43 54     --.    SELECT
1310: 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   * FROM t3 WHERE
1320: 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b 0a 0a   t3 MATCH 'k';..
1330: 20 20 20 20 2d 2d 20 46 6f 6c 6c 6f 77 69 6e 67      -- Following
1340: 20 74 68 65 20 55 50 44 41 54 45 2c 20 74 68 65   the UPDATE, the
1350: 20 71 75 65 72 79 20 73 74 69 6c 6c 20 72 65 74   query still ret
1360: 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  urns a single ro
1370: 77 2c 20 74 68 69 73 0a 20 20 20 20 2d 2d 20 74  w, this.    -- t
1380: 69 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ime containing t
1390: 68 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 22  he text values "
13a0: 78 78 78 22 20 61 6e 64 20 22 79 79 79 22 2e 20  xxx" and "yyy". 
13b0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
13c0: 74 68 65 0a 20 20 20 20 2d 2d 20 66 75 6c 6c 2d  the.    -- full-
13d0: 74 65 78 74 20 69 6e 64 65 78 20 73 74 69 6c 6c  text index still
13e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
13f0: 74 68 65 20 72 6f 77 20 77 69 74 68 20 64 6f 63  the row with doc
1400: 69 64 3d 33 20 6d 61 74 63 68 65 73 0a 20 20 20  id=3 matches.   
1410: 20 2d 2d 20 74 68 65 20 46 54 53 34 20 71 75 65   -- the FTS4 que
1420: 72 79 20 27 6b 27 2c 20 65 76 65 6e 20 74 68 6f  ry 'k', even tho
1430: 75 67 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  ugh the document
1440: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1450: 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2d 2d 20 74  content.    -- t
1460: 61 62 6c 65 20 68 61 76 65 20 62 65 65 6e 20 6d  able have been m
1470: 6f 64 69 66 69 65 64 2e 0a 20 20 20 20 2d 2d 0a  odified..    --.
1480: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
1490: 54 20 62 20 3d 20 27 78 78 78 27 2c 20 63 20 3d  T b = 'xxx', c =
14a0: 20 27 79 79 79 27 20 57 48 45 52 45 20 72 6f 77   'yyy' WHERE row
14b0: 69 64 20 3d 20 33 3b 0a 20 20 20 20 53 45 4c 45  id = 3;.    SELE
14c0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45  CT * FROM t3 WHE
14d0: 52 45 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b  RE t3 MATCH 'k';
14e0: 0a 0a 20 20 20 20 2d 2d 20 46 6f 6c 6c 6f 77 69  ..    -- Followi
14f0: 6e 67 20 74 68 65 20 44 45 4c 45 54 45 20 62 65  ng the DELETE be
1500: 6c 6f 77 2c 20 74 68 65 20 71 75 65 72 79 20 72  low, the query r
1510: 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 63  eturns one row c
1520: 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 20 20  ontaining two.  
1530: 20 20 2d 2d 20 4e 55 4c 4c 20 76 61 6c 75 65 73    -- NULL values
1540: 2e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  . NULL values ar
1550: 65 20 72 65 74 75 72 6e 65 64 20 62 65 63 61 75  e returned becau
1560: 73 65 20 46 54 53 20 69 73 20 75 6e 61 62 6c 65  se FTS is unable
1570: 20 74 6f 20 66 69 6e 64 0a 20 20 20 20 2d 2d 20   to find.    -- 
1580: 61 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64  a row with rowid
1590: 3d 33 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  =3 within the co
15a0: 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20  ntent table..   
15b0: 20 2d 2d 0a 20 20 20 20 44 45 4c 45 54 45 20 46   --.    DELETE F
15c0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45  ROM t2;.    SELE
15d0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45  CT * FROM t3 WHE
15e0: 52 45 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b  RE t3 MATCH 'k';
15f0: 0a 0a 20 20 57 68 65 6e 20 61 20 72 6f 77 20 69  ..  When a row i
1600: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
1610: 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65  n external conte
1620: 6e 74 20 46 54 53 34 20 74 61 62 6c 65 2c 20 46  nt FTS4 table, F
1630: 54 53 34 20 6e 65 65 64 73 20 74 6f 0a 20 20 72  TS4 needs to.  r
1640: 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 75  etrieve the colu
1650: 6d 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  mn values of the
1660: 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
1670: 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 74  ed from the cont
1680: 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 54 68 69  ent table..  Thi
1690: 73 20 69 73 20 73 6f 20 74 68 61 74 20 46 54 53  s is so that FTS
16a0: 34 20 63 61 6e 20 75 70 64 61 74 65 20 74 68 65  4 can update the
16b0: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
16c0: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
16d0: 68 20 74 6f 6b 65 6e 0a 20 20 74 68 61 74 20 6f  h token.  that o
16e0: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
16f0: 20 64 65 6c 65 74 65 64 20 72 6f 77 20 74 6f 20   deleted row to 
1700: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1710: 61 74 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  at row has been 
1720: 0a 20 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  .  deleted. If t
1730: 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
1740: 20 72 6f 77 20 63 61 6e 6e 6f 74 20 62 65 20 66   row cannot be f
1750: 6f 75 6e 64 2c 20 6f 72 20 69 66 20 69 74 20 63  ound, or if it c
1760: 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73 0a 20  ontains values. 
1770: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 77 69   inconsistent wi
1780: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
1790: 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  of the FTS index
17a0: 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 63 61  , the results ca
17b0: 6e 20 62 65 20 64 69 66 66 69 63 75 6c 74 0a 20  n be difficult. 
17c0: 20 74 6f 20 70 72 65 64 69 63 74 2e 20 54 68 65   to predict. The
17d0: 20 46 54 53 20 69 6e 64 65 78 20 6d 61 79 20 62   FTS index may b
17e0: 65 20 6c 65 66 74 20 63 6f 6e 74 61 69 6e 69 6e  e left containin
17f0: 67 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  g entries corres
1800: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 20  ponding to the. 
1810: 20 64 65 6c 65 74 65 64 20 72 6f 77 2c 20 77 68   deleted row, wh
1820: 69 63 68 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ich can lead to 
1830: 73 65 65 6d 69 6e 67 6c 79 20 6e 6f 6e 73 65 6e  seemingly nonsen
1840: 73 69 63 61 6c 20 72 65 73 75 6c 74 73 20 62 65  sical results be
1850: 69 6e 67 20 72 65 74 75 72 6e 65 64 0a 20 20 62  ing returned.  b
1860: 79 20 73 75 62 73 65 71 75 65 6e 74 20 53 45 4c  y subsequent SEL
1870: 45 43 54 20 71 75 65 72 69 65 73 2e 20 54 68 65  ECT queries. The
1880: 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 77 68   same applies wh
1890: 65 6e 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  en a row is upda
18a0: 74 65 64 2c 20 61 73 0a 20 20 69 6e 74 65 72 6e  ted, as.  intern
18b0: 61 6c 6c 79 20 61 6e 20 55 50 44 41 54 45 20 69  ally an UPDATE i
18c0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
18d0: 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64 20  DELETE followed 
18e0: 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 20 20  by an INSERT..  
18f0: 0a 20 20 49 6e 73 74 65 61 64 20 6f 66 20 77 72  .  Instead of wr
1900: 69 74 69 6e 67 20 73 65 70 61 72 61 74 65 6c 79  iting separately
1910: 20 74 6f 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   to the full-tex
1920: 74 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20  t index and the 
1930: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2c 0a 20  content table,. 
1940: 20 73 6f 6d 65 20 75 73 65 72 73 20 6d 61 79 20   some users may 
1950: 77 69 73 68 20 74 6f 20 75 73 65 20 64 61 74 61  wish to use data
1960: 62 61 73 65 20 74 72 69 67 67 65 72 73 20 74 6f  base triggers to
1970: 20 6b 65 65 70 20 74 68 65 20 66 75 6c 6c 2d 74   keep the full-t
1980: 65 78 74 20 69 6e 64 65 78 0a 20 20 75 70 20 74  ext index.  up t
1990: 6f 20 64 61 74 65 20 77 69 74 68 20 72 65 73 70  o date with resp
19a0: 65 63 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f  ect to the set o
19b0: 66 20 64 6f 63 75 6d 65 6e 74 73 20 73 74 6f 72  f documents stor
19c0: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed in the conten
19d0: 74 20 74 61 62 6c 65 2e 0a 20 20 46 6f 72 20 65  t table..  For e
19e0: 78 61 6d 70 6c 65 2c 20 75 73 69 6e 67 20 74 68  xample, using th
19f0: 65 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 65 61  e tables from ea
1a00: 72 6c 69 65 72 20 65 78 61 6d 70 6c 65 73 3a 0a  rlier examples:.
1a10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
1a20: 47 45 52 20 74 32 5f 62 75 20 42 45 46 4f 52 45  GER t2_bu BEFORE
1a30: 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45   UPDATE ON t2 BE
1a40: 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45  GIN.      DELETE
1a50: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 64   FROM t3 WHERE d
1a60: 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a  ocid=old.rowid;.
1a70: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
1a80: 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f 62  ATE TRIGGER t2_b
1a90: 64 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20  d BEFORE DELETE 
1aa0: 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20  ON t2 BEGIN.    
1ab0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33    DELETE FROM t3
1ac0: 20 57 48 45 52 45 20 64 6f 63 69 64 3d 6f 6c 64   WHERE docid=old
1ad0: 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45 4e 44 3b  .rowid;.    END;
1ae0: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ..    CREATE TRI
1af0: 47 47 45 52 20 74 32 5f 62 75 20 41 46 54 45 52  GGER t2_bu AFTER
1b00: 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45   UPDATE ON t2 BE
1b10: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
1b20: 20 49 4e 54 4f 20 74 33 28 64 6f 63 69 64 2c 20   INTO t3(docid, 
1b30: 62 2c 20 63 29 20 56 41 4c 55 45 53 28 6e 65 77  b, c) VALUES(new
1b40: 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 62 2c 20 6e  .rowid, new.b, n
1b50: 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.c);.    END;.
1b60: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
1b70: 45 52 20 74 32 5f 62 64 20 41 46 54 45 52 20 49  ER t2_bd AFTER I
1b80: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
1b90: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1ba0: 4e 54 4f 20 74 33 28 64 6f 63 69 64 2c 20 62 2c  NTO t3(docid, b,
1bb0: 20 63 29 20 56 41 4c 55 45 53 28 6e 65 77 2e 72   c) VALUES(new.r
1bc0: 6f 77 69 64 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  owid, new.b, new
1bd0: 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20  .c);.    END;.. 
1be0: 20 54 68 65 20 44 45 4c 45 54 45 20 74 72 69 67   The DELETE trig
1bf0: 67 65 72 20 6d 75 73 74 20 62 65 20 66 69 72 65  ger must be fire
1c00: 64 20 62 65 66 6f 72 65 20 74 68 65 20 61 63 74  d before the act
1c10: 75 61 6c 20 64 65 6c 65 74 65 20 74 61 6b 65 73  ual delete takes
1c20: 20 70 6c 61 63 65 0a 20 20 6f 6e 20 74 68 65 20   place.  on the 
1c30: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 54  content table. T
1c40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 46  his is so that F
1c50: 54 53 34 20 63 61 6e 20 73 74 69 6c 6c 20 72 65  TS4 can still re
1c60: 74 72 69 65 76 65 20 74 68 65 20 6f 72 69 67 69  trieve the origi
1c70: 6e 61 6c 0a 20 20 76 61 6c 75 65 73 20 69 6e 20  nal.  values in 
1c80: 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 20  order to update 
1c90: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
1ca0: 64 65 78 2e 20 41 6e 64 20 74 68 65 20 49 4e 53  dex. And the INS
1cb0: 45 52 54 20 74 72 69 67 67 65 72 20 6d 75 73 74  ERT trigger must
1cc0: 0a 20 20 62 65 20 66 69 72 65 64 20 61 66 74 65  .  be fired afte
1cd0: 72 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69 73  r the new row is
1ce0: 20 69 6e 73 65 72 74 65 64 2c 20 73 6f 20 61 73   inserted, so as
1cf0: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1d00: 61 73 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ase where the.  
1d10: 72 6f 77 69 64 20 69 73 20 61 73 73 69 67 6e 65  rowid is assigne
1d20: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1d30: 77 69 74 68 69 6e 20 74 68 65 20 73 79 73 74 65  within the syste
1d40: 6d 2e 20 54 68 65 20 55 50 44 41 54 45 20 74 72  m. The UPDATE tr
1d50: 69 67 67 65 72 20 6d 75 73 74 0a 20 20 62 65 20  igger must.  be 
1d60: 73 70 6c 69 74 20 69 6e 74 6f 20 74 77 6f 20 70  split into two p
1d70: 61 72 74 73 2c 20 6f 6e 65 20 66 69 72 65 64 20  arts, one fired 
1d80: 62 65 66 6f 72 65 20 61 6e 64 20 6f 6e 65 20 61  before and one a
1d90: 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65 20  fter the update 
1da0: 6f 66 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74  of the.  content
1db0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 74 68 65 20   table, for the 
1dc0: 73 61 6d 65 20 72 65 61 73 6f 6e 73 2e 0a 0a 20  same reasons... 
1dd0: 20 46 54 53 34 20 66 65 61 74 75 72 65 73 20 61   FTS4 features a
1de0: 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d 61 6e 64   special command
1df0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
1e00: 27 6f 70 74 69 6d 69 7a 65 27 20 63 6f 6d 6d 61  'optimize' comma
1e10: 6e 64 20 74 68 61 74 0a 20 20 64 65 6c 65 74 65  nd that.  delete
1e20: 73 20 74 68 65 20 65 6e 74 69 72 65 20 66 75 6c  s the entire ful
1e30: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 6e 64  l-text index and
1e40: 20 72 65 62 75 69 6c 64 73 20 69 74 20 62 61 73   rebuilds it bas
1e50: 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
1e60: 74 0a 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  t.  set of docum
1e70: 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 74  ents in the cont
1e80: 65 6e 74 20 74 61 62 6c 65 2e 20 41 73 73 75 6d  ent table. Assum
1e90: 69 6e 67 20 61 67 61 69 6e 20 74 68 61 74 20 22  ing again that "
1ea0: 74 33 22 20 69 73 20 74 68 65 0a 20 20 6e 61 6d  t3" is the.  nam
1eb0: 65 20 6f 66 20 74 68 65 20 65 78 74 65 72 6e 61  e of the externa
1ec0: 6c 20 63 6f 6e 74 65 6e 74 20 46 54 53 34 20 74  l content FTS4 t
1ed0: 61 62 6c 65 2c 20 74 68 65 20 63 6f 6d 6d 61 6e  able, the comman
1ee0: 64 20 69 73 3a 0a 0a 20 20 20 20 49 4e 53 45 52  d is:..    INSER
1ef0: 54 20 49 4e 54 4f 20 74 33 28 74 33 29 20 56 41  T INTO t3(t3) VA
1f00: 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27 29 3b  LUES('rebuild');
1f10: 0a 0a 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  ..  This command
1f20: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 75 73 65   may also be use
1f30: 64 20 77 69 74 68 20 6f 72 64 69 6e 61 72 79 20  d with ordinary 
1f40: 46 54 53 34 20 74 61 62 6c 65 73 2c 20 61 6c 74  FTS4 tables, alt
1f50: 68 6f 75 67 68 20 69 74 20 6d 61 79 0a 20 20 6f  hough it may.  o
1f60: 6e 6c 79 20 62 65 20 75 73 65 66 75 6c 20 69 66  nly be useful if
1f70: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
1f80: 6e 64 65 78 20 68 61 73 20 73 6f 6d 65 68 6f 77  ndex has somehow
1f90: 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1fa0: 20 49 74 20 69 73 20 61 6e 0a 20 20 65 72 72 6f   It is an.  erro
1fb0: 72 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  r to attempt to 
1fc0: 72 65 62 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  rebuild the full
1fd0: 2d 74 65 78 74 20 69 6e 64 65 78 20 6d 61 69 6e  -text index main
1fe0: 74 61 69 6e 65 64 20 62 79 20 61 20 63 6f 6e 74  tained by a cont
1ff0: 65 6e 74 6c 65 73 73 0a 20 20 46 54 53 34 20 74  entless.  FTS4 t
2000: 61 62 6c 65 2e 0a 0a 0a                          able....