/ Hex Artifact Content
Login

Artifact 1de9a61acfa2a0445ed989310c31839c57f6b6086dd9d5c97177ae734a17fd8b:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 20 41 70 72 20 32  /*.** 2013 Apr 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 66 6f 72 20 74 68 65 20 22 66 74 73  ode for the "fts
01a0: 33 74 6f 6b 65 6e 69 7a 65 22 20 76 69 72 74 75  3tokenize" virtu
01b0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  al table module.
01c0: 0a 2a 2a 20 41 6e 20 66 74 73 33 74 6f 6b 65 6e  .** An fts3token
01d0: 69 7a 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ize virtual tabl
01e0: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 73 20  e is created as 
01f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
0200: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0210: 54 41 42 4c 45 20 3c 74 62 6c 3e 20 55 53 49 4e  TABLE <tbl> USIN
0220: 47 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 28 0a  G fts3tokenize(.
0230: 2a 2a 20 20 20 20 20 20 20 3c 74 6f 6b 65 6e 69  **       <tokeni
0240: 7a 65 72 2d 6e 61 6d 65 3e 2c 20 3c 61 72 67 2d  zer-name>, <arg-
0250: 31 3e 2c 20 2e 2e 2e 0a 2a 2a 20 20 20 29 3b 0a  1>, ....**   );.
0260: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
0270: 63 72 65 61 74 65 64 20 68 61 73 20 74 68 65 20  created has the 
0280: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d 61  following schema
0290: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
02a0: 20 54 41 42 4c 45 20 3c 74 62 6c 3e 28 69 6e 70   TABLE <tbl>(inp
02b0: 75 74 2c 20 74 6f 6b 65 6e 2c 20 73 74 61 72 74  ut, token, start
02c0: 2c 20 65 6e 64 2c 20 70 6f 73 69 74 69 6f 6e 29  , end, position)
02d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 71 75 65 72  .**.** When quer
02e0: 69 65 64 2c 20 74 68 65 20 71 75 65 72 79 20 6d  ied, the query m
02f0: 75 73 74 20 69 6e 63 6c 75 64 65 20 61 20 57 48  ust include a WH
0300: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 79  ERE clause of ty
0310: 70 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 70 75  pe:.**.**   inpu
0320: 74 20 3d 20 3c 73 74 72 69 6e 67 3e 0a 2a 2a 0a  t = <string>.**.
0330: 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74  ** The virtual t
0340: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 6f 6b 65  able module toke
0350: 6e 69 7a 65 73 20 74 68 69 73 20 3c 73 74 72 69  nizes this <stri
0360: 6e 67 3e 2c 20 75 73 69 6e 67 20 74 68 65 20 46  ng>, using the F
0370: 54 53 33 20 0a 2a 2a 20 74 6f 6b 65 6e 69 7a 65  TS3 .** tokenize
0380: 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  r specified by t
0390: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
03a0: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
03b0: 41 4c 20 54 41 42 4c 45 20 0a 2a 2a 20 73 74 61  AL TABLE .** sta
03c0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
03d0: 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
03e0: 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
03f0: 20 72 65 73 75 6c 74 2e 20 57 69 74 68 0a 2a 2a   result. With.**
0400: 20 66 69 65 6c 64 73 20 73 65 74 20 61 73 20 66   fields set as f
0410: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0420: 69 6e 70 75 74 3a 20 20 20 41 6c 77 61 79 73 20  input:   Always 
0430: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
0440: 20 3c 73 74 72 69 6e 67 3e 0a 2a 2a 20 20 20 74   <string>.**   t
0450: 6f 6b 65 6e 3a 20 20 20 41 20 74 6f 6b 65 6e 20  oken:   A token 
0460: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e 0a  from the input..
0470: 2a 2a 20 20 20 73 74 61 72 74 3a 20 20 20 42 79  **   start:   By
0480: 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  te offset of the
0490: 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 74 68   token within th
04a0: 65 20 69 6e 70 75 74 20 3c 73 74 72 69 6e 67 3e  e input <string>
04b0: 2e 0a 2a 2a 20 20 20 65 6e 64 3a 20 20 20 20 20  ..**   end:     
04c0: 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  Byte offset of t
04d0: 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
04e0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
04f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
0500: 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e             token
0510: 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 70 75   within the inpu
0520: 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 20 20 70  t string..**   p
0530: 6f 73 3a 20 20 20 20 20 54 6f 6b 65 6e 20 6f 66  os:     Token of
0540: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69  fset of token wi
0550: 74 68 69 6e 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a  thin input..**.*
0560: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33  /.#include "fts3
0570: 49 6e 74 2e 68 22 0a 23 69 66 20 21 64 65 66 69  Int.h".#if !defi
0580: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
0590: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
05a0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 0a  TE_ENABLE_FTS3).
05b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
05c0: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  g.h>.#include <a
05d0: 73 73 65 72 74 2e 68 3e 0a 0a 74 79 70 65 64 65  ssert.h>..typede
05e0: 66 20 73 74 72 75 63 74 20 46 74 73 33 74 6f 6b  f struct Fts3tok
05f0: 54 61 62 6c 65 20 46 74 73 33 74 6f 6b 54 61 62  Table Fts3tokTab
0600: 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  le;.typedef stru
0610: 63 74 20 46 74 73 33 74 6f 6b 43 75 72 73 6f 72  ct Fts3tokCursor
0620: 20 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 3b 0a   Fts3tokCursor;.
0630: 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74  ./*.** Virtual t
0640: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  able structure..
0650: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 33 74 6f  */.struct Fts3to
0660: 6b 54 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74  kTable {.  sqlit
0670: 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20  e3_vtab base;   
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
0690: 73 65 20 63 6c 61 73 73 20 75 73 65 64 20 62 79  se class used by
06a0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
06b0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
06c0: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
06d0: 20 2a 70 4d 6f 64 3b 0a 20 20 73 71 6c 69 74 65   *pMod;.  sqlite
06e0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  3_tokenizer *pTo
06f0: 6b 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69 72  k;.};../*.** Vir
0700: 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
0710: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  r structure..*/.
0720: 73 74 72 75 63 74 20 46 74 73 33 74 6f 6b 43 75  struct Fts3tokCu
0730: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
0740: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
0750: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65  e;       /* Base
0760: 20 63 6c 61 73 73 20 75 73 65 64 20 62 79 20 53   class used by S
0770: 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20  QLite core */.  
0780: 63 68 61 72 20 2a 7a 49 6e 70 75 74 3b 20 20 20  char *zInput;   
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
07b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  */.  sqlite3_tok
07c0: 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
07d0: 43 73 72 3b 20 2f 2a 20 43 75 72 73 6f 72 20 74  Csr; /* Cursor t
07e0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
07f0: 68 20 7a 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e  h zInput */.  in
0800: 74 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  t iRowid;       
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0820: 20 43 75 72 72 65 6e 74 20 27 72 6f 77 69 64 27   Current 'rowid'
0830: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73   value */.  cons
0840: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b 20  t char *zToken; 
0850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
0860: 75 72 72 65 6e 74 20 27 74 6f 6b 65 6e 27 20 76  urrent 'token' v
0870: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  alue */.  int nT
0880: 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  oken;           
0890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
08a0: 65 20 6f 66 20 7a 54 6f 6b 65 6e 20 69 6e 20 62  e of zToken in b
08b0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 53  ytes */.  int iS
08c0: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
08d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
08e0: 72 65 6e 74 20 27 73 74 61 72 74 27 20 76 61 6c  rent 'start' val
08f0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  ue */.  int iEnd
0900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0910: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0920: 6e 74 20 27 65 6e 64 27 20 76 61 6c 75 65 20 2a  nt 'end' value *
0930: 2f 0a 20 20 69 6e 74 20 69 50 6f 73 3b 20 20 20  /.  int iPos;   
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
0960: 70 6f 73 27 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b  pos' value */.};
0970: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 46 54  ../*.** Query FT
0980: 53 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69  S for the tokeni
0990: 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  zer implementati
09a0: 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  on named zName..
09b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
09c0: 73 33 74 6f 6b 51 75 65 72 79 54 6f 6b 65 6e 69  s3tokQueryTokeni
09d0: 7a 65 72 28 0a 20 20 46 74 73 33 48 61 73 68 20  zer(.  Fts3Hash 
09e0: 2a 70 48 61 73 68 2c 0a 20 20 63 6f 6e 73 74 20  *pHash,.  const 
09f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63  char *zName,.  c
0a00: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b  onst sqlite3_tok
0a10: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a  enizer_module **
0a20: 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  pp,.  char **pzE
0a30: 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rr.){.  sqlite3_
0a40: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
0a50: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65   *p;.  int nName
0a60: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
0a70: 4e 61 6d 65 29 3b 0a 0a 20 20 70 20 3d 20 28 73  Name);..  p = (s
0a80: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
0a90: 5f 6d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  _module *)sqlite
0aa0: 33 46 74 73 33 48 61 73 68 46 69 6e 64 28 70 48  3Fts3HashFind(pH
0ab0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ash, zName, nNam
0ac0: 65 2b 31 29 3b 0a 20 20 69 66 28 20 21 70 20 29  e+1);.  if( !p )
0ad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
0ae0: 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c 20 22  3ErrMsg(pzErr, "
0af0: 75 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 69 7a 65  unknown tokenize
0b00: 72 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  r: %s", zName);.
0b10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0b20: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
0b30: 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72  *pp = p;.  retur
0b40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
0b50: 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
0b60: 20 61 72 67 75 6d 65 6e 74 2c 20 61 72 67 76 5b   argument, argv[
0b70: 5d 2c 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ], is an array o
0b80: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 75  f pointers to nu
0b90: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
0ba0: 73 74 72 69 6e 67 73 2e 20 54 68 69 73 20 66 75  strings. This fu
0bb0: 6e 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 63  nction makes a c
0bc0: 6f 70 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  opy of the array
0bd0: 20 61 6e 64 20 73 74 72 69 6e 67 73 20 69 6e 74   and strings int
0be0: 6f 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 62  o a .** single b
0bf0: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 2e 20  lock of memory. 
0c00: 49 74 20 74 68 65 6e 20 64 65 71 75 6f 74 65 73  It then dequotes
0c10: 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69   any of the stri
0c20: 6e 67 73 20 74 68 61 74 20 61 70 70 65 61 72 0a  ngs that appear.
0c30: 2a 2a 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ** to be quoted.
0c40: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
0c50: 73 66 75 6c 2c 20 6f 75 74 70 75 74 20 70 61 72  sful, output par
0c60: 61 6d 65 74 65 72 20 2a 70 61 7a 44 65 71 75 6f  ameter *pazDequo
0c70: 74 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  te is set to poi
0c80: 6e 74 20 61 74 20 74 68 65 0a 2a 2a 20 61 72 72  nt at the.** arr
0c90: 61 79 20 6f 66 20 64 65 71 75 6f 74 65 64 20 73  ay of dequoted s
0ca0: 74 72 69 6e 67 73 20 61 6e 64 20 53 51 4c 49 54  trings and SQLIT
0cb0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
0cc0: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 0a  . The caller is.
0cd0: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
0ce0: 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  or eventually ca
0cf0: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
0d00: 65 65 28 29 20 74 6f 20 66 72 65 65 20 74 68 65  ee() to free the
0d10: 20 61 72 72 61 79 0a 2a 2a 20 69 6e 20 74 68 69   array.** in thi
0d20: 73 20 63 61 73 65 2e 20 4f 72 2c 20 69 66 20 61  s case. Or, if a
0d30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
0d40: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
0d50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
0d60: 2e 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 76  ..** The final v
0d70: 61 6c 75 65 20 6f 66 20 2a 70 61 7a 44 65 71 75  alue of *pazDequ
0d80: 6f 74 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ote is undefined
0d90: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
0da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
0db0: 33 74 6f 6b 44 65 71 75 6f 74 65 41 72 72 61 79  3tokDequoteArray
0dc0: 28 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  (.  int argc,   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0df0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67   elements in arg
0e00: 76 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  v[] */.  const c
0e10: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
0e20: 76 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75  v,       /* Inpu
0e30: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61  t array */.  cha
0e40: 72 20 2a 2a 2a 70 61 7a 44 65 71 75 6f 74 65 20  r ***pazDequote 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 4f 75 74 70 75 74 20 61 72 72 61 79 20 2a 2f 0a  Output array */.
0e70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
0e80: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
0e90: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
0ea0: 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 61 72 67  ode */.  if( arg
0eb0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 61 7a  c==0 ){.    *paz
0ec0: 44 65 71 75 6f 74 65 20 3d 20 30 3b 0a 20 20 7d  Dequote = 0;.  }
0ed0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
0ee0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
0ef0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   0;.    char **a
0f00: 7a 44 65 71 75 6f 74 65 3b 0a 0a 20 20 20 20 66  zDequote;..    f
0f10: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
0f20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
0f30: 65 20 2b 3d 20 28 69 6e 74 29 28 73 74 72 6c 65  e += (int)(strle
0f40: 6e 28 61 72 67 76 5b 69 5d 29 20 2b 20 31 29 3b  n(argv[i]) + 1);
0f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 61 7a  .    }..    *paz
0f60: 44 65 71 75 6f 74 65 20 3d 20 61 7a 44 65 71 75  Dequote = azDequ
0f70: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ote = sqlite3_ma
0f80: 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 63 68  lloc64(sizeof(ch
0f90: 61 72 20 2a 29 2a 61 72 67 63 20 2b 20 6e 42 79  ar *)*argc + nBy
0fa0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 44  te);.    if( azD
0fb0: 65 71 75 6f 74 65 3d 3d 30 20 29 7b 0a 20 20 20  equote==0 ){.   
0fc0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
0fd0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
0fe0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 53 70  .      char *pSp
0ff0: 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29 26 61  ace = (char *)&a
1000: 7a 44 65 71 75 6f 74 65 5b 61 72 67 63 5d 3b 0a  zDequote[argc];.
1010: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1020: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1030: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1040: 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d  t)strlen(argv[i]
1050: 29 3b 0a 20 20 20 20 20 20 20 20 61 7a 44 65 71  );.        azDeq
1060: 75 6f 74 65 5b 69 5d 20 3d 20 70 53 70 61 63 65  uote[i] = pSpace
1070: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1080: 28 70 53 70 61 63 65 2c 20 61 72 67 76 5b 69 5d  (pSpace, argv[i]
1090: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
10a0: 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f  sqlite3Fts3Dequo
10b0: 74 65 28 70 53 70 61 63 65 29 3b 0a 20 20 20 20  te(pSpace);.    
10c0: 20 20 20 20 70 53 70 61 63 65 20 2b 3d 20 28 6e      pSpace += (n
10d0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
10e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
10f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63   rc;.}../*.** Sc
1100: 68 65 6d 61 20 6f 66 20 74 68 65 20 74 6f 6b 65  hema of the toke
1110: 6e 69 7a 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a  nizer table..*/.
1120: 23 64 65 66 69 6e 65 20 46 54 53 33 5f 54 4f 4b  #define FTS3_TOK
1130: 5f 53 43 48 45 4d 41 20 22 43 52 45 41 54 45 20  _SCHEMA "CREATE 
1140: 54 41 42 4c 45 20 78 28 69 6e 70 75 74 2c 20 74  TABLE x(input, t
1150: 6f 6b 65 6e 2c 20 73 74 61 72 74 2c 20 65 6e 64  oken, start, end
1160: 2c 20 70 6f 73 69 74 69 6f 6e 29 22 0a 0a 2f 2a  , position)"../*
1170: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1180: 6e 20 64 6f 65 73 20 61 6c 6c 20 74 68 65 20 77  n does all the w
1190: 6f 72 6b 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ork for both the
11a0: 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43   xConnect and xC
11b0: 72 65 61 74 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  reate methods..*
11c0: 2a 20 54 68 65 73 65 20 74 61 62 6c 65 73 20 68  * These tables h
11d0: 61 76 65 20 6e 6f 20 70 65 72 73 69 73 74 65 6e  ave no persisten
11e0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
11f0: 20 6f 66 20 74 68 65 69 72 20 6f 77 6e 2c 20 73   of their own, s
1200: 6f 20 78 43 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e  o xConnect.** an
1210: 64 20 78 43 72 65 61 74 65 20 61 72 65 20 69 64  d xCreate are id
1220: 65 6e 74 69 63 61 6c 20 6f 70 65 72 61 74 69 6f  entical operatio
1230: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76  ns..**.**   argv
1240: 5b 30 5d 3a 20 6d 6f 64 75 6c 65 20 6e 61 6d 65  [0]: module name
1250: 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 3a 20 64  .**   argv[1]: d
1260: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 0a 2a 2a  atabase name .**
1270: 20 20 20 61 72 67 76 5b 32 5d 3a 20 74 61 62 6c     argv[2]: tabl
1280: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
1290: 5b 33 5d 3a 20 66 69 72 73 74 20 61 72 67 75 6d  [3]: first argum
12a0: 65 6e 74 20 28 74 6f 6b 65 6e 69 7a 65 72 20 6e  ent (tokenizer n
12b0: 61 6d 65 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame).*/.static i
12c0: 6e 74 20 66 74 73 33 74 6f 6b 43 6f 6e 6e 65 63  nt fts3tokConnec
12d0: 74 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  tMethod(.  sqlit
12e0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1300: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1310: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 48 61  n */.  void *pHa
1320: 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sh,             
1330: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
1340: 61 62 6c 65 20 6f 66 20 74 6f 6b 65 6e 69 7a 65  able of tokenize
1350: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  rs */.  int argc
1360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1370: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1380: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1390: 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20   argv array */. 
13a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
13b0: 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20  nst *argv,      
13c0: 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e   /* xCreate/xCon
13d0: 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72  nect argument ar
13e0: 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
13f0: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20  _vtab **ppVtab, 
1400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1410: 20 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61   New sqlite3_vta
1420: 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  b object */.  ch
1430: 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20  ar **pzErr      
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1450: 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61   OUT: sqlite3_ma
1460: 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65 73  lloc'd error mes
1470: 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  sage */.){.  Fts
1480: 33 74 6f 6b 54 61 62 6c 65 20 2a 70 54 61 62 20  3tokTable *pTab 
1490: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  = 0;.  const sql
14a0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
14b0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 30 3b  odule *pMod = 0;
14c0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
14d0: 69 7a 65 72 20 2a 70 54 6f 6b 20 3d 20 30 3b 0a  izer *pTok = 0;.
14e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
14f0: 20 2a 2a 61 7a 44 65 71 75 6f 74 65 20 3d 20 30   **azDequote = 0
1500: 3b 0a 20 20 69 6e 74 20 6e 44 65 71 75 6f 74 65  ;.  int nDequote
1510: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1520: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
1530: 62 2c 20 46 54 53 33 5f 54 4f 4b 5f 53 43 48 45  b, FTS3_TOK_SCHE
1540: 4d 41 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  MA);.  if( rc!=S
1550: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1560: 6e 20 72 63 3b 0a 0a 20 20 6e 44 65 71 75 6f 74  n rc;..  nDequot
1570: 65 20 3d 20 61 72 67 63 2d 33 3b 0a 20 20 72 63  e = argc-3;.  rc
1580: 20 3d 20 66 74 73 33 74 6f 6b 44 65 71 75 6f 74   = fts3tokDequot
1590: 65 41 72 72 61 79 28 6e 44 65 71 75 6f 74 65 2c  eArray(nDequote,
15a0: 20 26 61 72 67 76 5b 33 5d 2c 20 26 61 7a 44 65   &argv[3], &azDe
15b0: 71 75 6f 74 65 29 3b 0a 0a 20 20 69 66 28 20 72  quote);..  if( r
15c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15e0: 7a 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 69 66 28  zModule;.    if(
15f0: 20 6e 44 65 71 75 6f 74 65 3c 31 20 29 7b 0a 20   nDequote<1 ){. 
1600: 20 20 20 20 20 7a 4d 6f 64 75 6c 65 20 3d 20 22       zModule = "
1610: 73 69 6d 70 6c 65 22 3b 0a 20 20 20 20 7d 65 6c  simple";.    }el
1620: 73 65 7b 0a 20 20 20 20 20 20 7a 4d 6f 64 75 6c  se{.      zModul
1630: 65 20 3d 20 61 7a 44 65 71 75 6f 74 65 5b 30 5d  e = azDequote[0]
1640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1650: 20 66 74 73 33 74 6f 6b 51 75 65 72 79 54 6f 6b   fts3tokQueryTok
1660: 65 6e 69 7a 65 72 28 28 46 74 73 33 48 61 73 68  enizer((Fts3Hash
1670: 2a 29 70 48 61 73 68 2c 20 7a 4d 6f 64 75 6c 65  *)pHash, zModule
1680: 2c 20 26 70 4d 6f 64 2c 20 70 7a 45 72 72 29 3b  , &pMod, pzErr);
1690: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
16a0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3d  (rc==SQLITE_OK)=
16b0: 3d 28 70 4d 6f 64 21 3d 30 29 20 29 3b 0a 20 20  =(pMod!=0) );.  
16c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d0: 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
16e0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 7a 41  har * const *azA
16f0: 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rg = (const char
1700: 20 2a 20 63 6f 6e 73 74 20 2a 29 26 61 7a 44 65   * const *)&azDe
1710: 71 75 6f 74 65 5b 31 5d 3b 0a 20 20 20 20 72 63  quote[1];.    rc
1720: 20 3d 20 70 4d 6f 64 2d 3e 78 43 72 65 61 74 65   = pMod->xCreate
1730: 28 28 6e 44 65 71 75 6f 74 65 3e 31 20 3f 20 6e  ((nDequote>1 ? n
1740: 44 65 71 75 6f 74 65 2d 31 20 3a 20 30 29 2c 20  Dequote-1 : 0), 
1750: 61 7a 41 72 67 2c 20 26 70 54 6f 6b 29 3b 0a 20  azArg, &pTok);. 
1760: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1770: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1780: 54 61 62 20 3d 20 28 46 74 73 33 74 6f 6b 54 61  Tab = (Fts3tokTa
1790: 62 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ble *)sqlite3_ma
17a0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33  lloc(sizeof(Fts3
17b0: 74 6f 6b 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  tokTable));.    
17c0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
17d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
17f0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
1800: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
1810: 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69  mset(pTab, 0, si
1820: 7a 65 6f 66 28 46 74 73 33 74 6f 6b 54 61 62 6c  zeof(Fts3tokTabl
1830: 65 29 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  e));.    pTab->p
1840: 4d 6f 64 20 3d 20 70 4d 6f 64 3b 0a 20 20 20 20  Mod = pMod;.    
1850: 70 54 61 62 2d 3e 70 54 6f 6b 20 3d 20 70 54 6f  pTab->pTok = pTo
1860: 6b 3b 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d  k;.    *ppVtab =
1870: 20 26 70 54 61 62 2d 3e 62 61 73 65 3b 0a 20 20   &pTab->base;.  
1880: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1890: 54 6f 6b 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  Tok ){.      pMo
18a0: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 54 6f 6b  d->xDestroy(pTok
18b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 44  sqlite3_free(azD
18d0: 65 71 75 6f 74 65 29 3b 0a 20 20 72 65 74 75 72  equote);.  retur
18e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
18f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
1900: 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 62  s the work for b
1910: 6f 74 68 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  oth the xDisconn
1920: 65 63 74 20 61 6e 64 20 78 44 65 73 74 72 6f 79  ect and xDestroy
1930: 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65   methods..** The
1940: 73 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e  se tables have n
1950: 6f 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  o persistent rep
1960: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1970: 68 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 44 69  heir own, so xDi
1980: 73 63 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e 64 20  sconnect.** and 
1990: 78 44 65 73 74 72 6f 79 20 61 72 65 20 69 64 65  xDestroy are ide
19a0: 6e 74 69 63 61 6c 20 6f 70 65 72 61 74 69 6f 6e  ntical operation
19b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19c0: 20 66 74 73 33 74 6f 6b 44 69 73 63 6f 6e 6e 65   fts3tokDisconne
19d0: 63 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ctMethod(sqlite3
19e0: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
19f0: 20 46 74 73 33 74 6f 6b 54 61 62 6c 65 20 2a 70   Fts3tokTable *p
1a00: 54 61 62 20 3d 20 28 46 74 73 33 74 6f 6b 54 61  Tab = (Fts3tokTa
1a10: 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 0a 20 20  ble *)pVtab;..  
1a20: 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 78 44 65 73  pTab->pMod->xDes
1a30: 74 72 6f 79 28 70 54 61 62 2d 3e 70 54 6f 6b 29  troy(pTab->pTok)
1a40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1a50: 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pTab);.  return
1a60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a70: 2a 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20  *.** xBestIndex 
1a80: 2d 20 41 6e 61 6c 79 7a 65 20 61 20 57 48 45 52  - Analyze a WHER
1a90: 45 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  E and ORDER BY c
1aa0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
1ab0: 20 69 6e 74 20 66 74 73 33 74 6f 6b 42 65 73 74   int fts3tokBest
1ac0: 49 6e 64 65 78 4d 65 74 68 6f 64 28 0a 20 20 73  IndexMethod(.  s
1ad0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
1ae0: 61 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69  ab, .  sqlite3_i
1af0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
1b00: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55  .){.  int i;.  U
1b10: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b20: 70 56 54 61 62 29 3b 0a 0a 20 20 66 6f 72 28 69  pVTab);..  for(i
1b30: 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f  =0; i<pInfo->nCo
1b40: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
1b50: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 61      if( pInfo->a
1b60: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
1b70: 61 62 6c 65 20 0a 20 20 20 20 20 26 26 20 70 49  able .     && pI
1b80: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
1b90: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 0a  [i].iColumn==0 .
1ba0: 20 20 20 20 20 26 26 20 70 49 6e 66 6f 2d 3e 61       && pInfo->a
1bb0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
1bc0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
1bd0: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 0a 20 20  ONSTRAINT_EQ .  
1be0: 20 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f    ){.      pInfo
1bf0: 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20  ->idxNum = 1;.  
1c00: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
1c10: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
1c20: 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
1c30: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
1c40: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
1c50: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  mit = 1;.      p
1c60: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1c70: 6f 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ost = 1;.      r
1c80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49  .    }.  }..  pI
1ca0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
1cb0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f  .  assert( pInfo
1cc0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3e  ->estimatedCost>
1cd0: 31 30 30 30 30 30 30 2e 30 20 29 3b 0a 0a 20 20  1000000.0 );..  
1ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4f 70 65 6e  ;.}../*.** xOpen
1d00: 20 2d 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72   - Open a cursor
1d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d20: 66 74 73 33 74 6f 6b 4f 70 65 6e 4d 65 74 68 6f  fts3tokOpenMetho
1d30: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  d(sqlite3_vtab *
1d40: 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
1d50: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
1d60: 73 72 29 7b 0a 20 20 46 74 73 33 74 6f 6b 43 75  sr){.  Fts3tokCu
1d70: 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 55 4e  rsor *pCsr;.  UN
1d80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1d90: 56 54 61 62 29 3b 0a 0a 20 20 70 43 73 72 20 3d  VTab);..  pCsr =
1da0: 20 28 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 20   (Fts3tokCursor 
1db0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1dc0: 28 73 69 7a 65 6f 66 28 46 74 73 33 74 6f 6b 43  (sizeof(Fts3tokC
1dd0: 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70  ursor));.  if( p
1de0: 43 73 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Csr==0 ){.    re
1df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e00: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
1e10: 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCsr, 0, sizeof(
1e20: 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 29 29 3b  Fts3tokCursor));
1e30: 0a 0a 20 20 2a 70 70 43 73 72 20 3d 20 28 73 71  ..  *ppCsr = (sq
1e40: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1e50: 72 20 2a 29 70 43 73 72 3b 0a 20 20 72 65 74 75  r *)pCsr;.  retu
1e60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e70: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
1e80: 20 74 6f 6b 65 6e 69 7a 65 72 20 63 75 72 73 6f   tokenizer curso
1e90: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1ea0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 41  only argument. A
1eb0: 73 20 69 66 20 69 74 20 68 61 64 0a 2a 2a 20 6a  s if it had.** j
1ec0: 75 73 74 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ust been returne
1ed0: 64 20 62 79 20 66 74 73 33 74 6f 6b 4f 70 65 6e  d by fts3tokOpen
1ee0: 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73 74 61  Method()..*/.sta
1ef0: 74 69 63 20 76 6f 69 64 20 66 74 73 33 74 6f 6b  tic void fts3tok
1f00: 52 65 73 65 74 43 75 72 73 6f 72 28 46 74 73 33  ResetCursor(Fts3
1f10: 74 6f 6b 43 75 72 73 6f 72 20 2a 70 43 73 72 29  tokCursor *pCsr)
1f20: 7b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 43  {.  if( pCsr->pC
1f30: 73 72 20 29 7b 0a 20 20 20 20 46 74 73 33 74 6f  sr ){.    Fts3to
1f40: 6b 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  kTable *pTab = (
1f50: 46 74 73 33 74 6f 6b 54 61 62 6c 65 20 2a 29 28  Fts3tokTable *)(
1f60: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
1f70: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 4d 6f  );.    pTab->pMo
1f80: 64 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 2d 3e  d->xClose(pCsr->
1f90: 70 43 73 72 29 3b 0a 20 20 20 20 70 43 73 72 2d  pCsr);.    pCsr-
1fa0: 3e 70 43 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  >pCsr = 0;.  }. 
1fb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1fc0: 73 72 2d 3e 7a 49 6e 70 75 74 29 3b 0a 20 20 70  sr->zInput);.  p
1fd0: 43 73 72 2d 3e 7a 49 6e 70 75 74 20 3d 20 30 3b  Csr->zInput = 0;
1fe0: 0a 20 20 70 43 73 72 2d 3e 7a 54 6f 6b 65 6e 20  .  pCsr->zToken 
1ff0: 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 6e 54 6f  = 0;.  pCsr->nTo
2000: 6b 65 6e 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d  ken = 0;.  pCsr-
2010: 3e 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 70  >iStart = 0;.  p
2020: 43 73 72 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20  Csr->iEnd = 0;. 
2030: 20 70 43 73 72 2d 3e 69 50 6f 73 20 3d 20 30 3b   pCsr->iPos = 0;
2040: 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 20  .  pCsr->iRowid 
2050: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 43  = 0;.}../*.** xC
2060: 6c 6f 73 65 20 2d 20 43 6c 6f 73 65 20 61 20 63  lose - Close a c
2070: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
2080: 20 69 6e 74 20 66 74 73 33 74 6f 6b 43 6c 6f 73   int fts3tokClos
2090: 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  eMethod(sqlite3_
20a0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
20b0: 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 74 6f 6b  rsor){.  Fts3tok
20c0: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
20d0: 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 20 2a 29  Fts3tokCursor *)
20e0: 70 43 75 72 73 6f 72 3b 0a 0a 20 20 66 74 73 33  pCursor;..  fts3
20f0: 74 6f 6b 52 65 73 65 74 43 75 72 73 6f 72 28 70  tokResetCursor(p
2100: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Csr);.  sqlite3_
2110: 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65  free(pCsr);.  re
2120: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2130: 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4e 65 78 74 20 2d  }../*.** xNext -
2140: 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
2150: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
2160: 72 6f 77 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  row, if any..*/.
2170: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 74  static int fts3t
2180: 6f 6b 4e 65 78 74 4d 65 74 68 6f 64 28 73 71 6c  okNextMethod(sql
2190: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
21a0: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74   *pCursor){.  Ft
21b0: 73 33 74 6f 6b 43 75 72 73 6f 72 20 2a 70 43 73  s3tokCursor *pCs
21c0: 72 20 3d 20 28 46 74 73 33 74 6f 6b 43 75 72 73  r = (Fts3tokCurs
21d0: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  or *)pCursor;.  
21e0: 46 74 73 33 74 6f 6b 54 61 62 6c 65 20 2a 70 54  Fts3tokTable *pT
21f0: 61 62 20 3d 20 28 46 74 73 33 74 6f 6b 54 61 62  ab = (Fts3tokTab
2200: 6c 65 20 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70  le *)(pCursor->p
2210: 56 74 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b  Vtab);.  int rc;
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2240: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 70 43  rn code */..  pC
2250: 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20  sr->iRowid++;.  
2260: 72 63 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d  rc = pTab->pMod-
2270: 3e 78 4e 65 78 74 28 70 43 73 72 2d 3e 70 43 73  >xNext(pCsr->pCs
2280: 72 2c 0a 20 20 20 20 20 20 26 70 43 73 72 2d 3e  r,.      &pCsr->
2290: 7a 54 6f 6b 65 6e 2c 20 26 70 43 73 72 2d 3e 6e  zToken, &pCsr->n
22a0: 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 26 70 43  Token,.      &pC
22b0: 73 72 2d 3e 69 53 74 61 72 74 2c 20 26 70 43 73  sr->iStart, &pCs
22c0: 72 2d 3e 69 45 6e 64 2c 20 26 70 43 73 72 2d 3e  r->iEnd, &pCsr->
22d0: 69 50 6f 73 0a 20 20 29 3b 0a 0a 20 20 69 66 28  iPos.  );..  if(
22e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22f0: 7b 0a 20 20 20 20 66 74 73 33 74 6f 6b 52 65 73  {.    fts3tokRes
2300: 65 74 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  etCursor(pCsr);.
2310: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2320: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
2330: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2340: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2350: 2a 0a 2a 2a 20 78 46 69 6c 74 65 72 20 2d 20 49  *.** xFilter - I
2360: 6e 69 74 69 61 6c 69 7a 65 20 61 20 63 75 72 73  nitialize a curs
2370: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  or to point at t
2380: 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 73 20  he start of its 
2390: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
23a0: 69 6e 74 20 66 74 73 33 74 6f 6b 46 69 6c 74 65  int fts3tokFilte
23b0: 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  rMethod(.  sqlit
23c0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
23d0: 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68  pCursor,   /* Th
23e0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
23f0: 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
2400: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20    int idxNum,   
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20 69 6e    /* Strategy in
2430: 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
2440: 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20 20  har *idxStr,    
2450: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
2460: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  ed */.  int nVal
2470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2490: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
24a0: 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69   apVal */.  sqli
24b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
24c0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
24d0: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
24e0: 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65 6d 65   indexing scheme
24f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2500: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2510: 20 20 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 20    Fts3tokCursor 
2520: 2a 70 43 73 72 20 3d 20 28 46 74 73 33 74 6f 6b  *pCsr = (Fts3tok
2530: 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
2540: 3b 0a 20 20 46 74 73 33 74 6f 6b 54 61 62 6c 65  ;.  Fts3tokTable
2550: 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 74 6f   *pTab = (Fts3to
2560: 6b 54 61 62 6c 65 20 2a 29 28 70 43 75 72 73 6f  kTable *)(pCurso
2570: 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 55 4e 55  r->pVtab);.  UNU
2580: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
2590: 78 53 74 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  xStr);.  UNUSED_
25a0: 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
25b0: 0a 0a 20 20 66 74 73 33 74 6f 6b 52 65 73 65 74  ..  fts3tokReset
25c0: 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a 20 20  Cursor(pCsr);.  
25d0: 69 66 28 20 69 64 78 4e 75 6d 3d 3d 31 20 29 7b  if( idxNum==1 ){
25e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
25f0: 2a 7a 42 79 74 65 20 3d 20 28 63 6f 6e 73 74 20  *zByte = (const 
2600: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
2610: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
2620: 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  0]);.    int nBy
2630: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  te = sqlite3_val
2640: 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 30  ue_bytes(apVal[0
2650: 5d 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a 49  ]);.    pCsr->zI
2660: 6e 70 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  nput = sqlite3_m
2670: 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 2b 31 29  alloc64(nByte+1)
2680: 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  ;.    if( pCsr->
2690: 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20 20 20  zInput==0 ){.   
26a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26b0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
26c0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
26d0: 73 72 2d 3e 7a 49 6e 70 75 74 2c 20 7a 42 79 74  sr->zInput, zByt
26e0: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
26f0: 20 70 43 73 72 2d 3e 7a 49 6e 70 75 74 5b 6e 42   pCsr->zInput[nB
2700: 79 74 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  yte] = 0;.      
2710: 72 63 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d  rc = pTab->pMod-
2720: 3e 78 4f 70 65 6e 28 70 54 61 62 2d 3e 70 54 6f  >xOpen(pTab->pTo
2730: 6b 2c 20 70 43 73 72 2d 3e 7a 49 6e 70 75 74 2c  k, pCsr->zInput,
2740: 20 6e 42 79 74 65 2c 20 26 70 43 73 72 2d 3e 70   nByte, &pCsr->p
2750: 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Csr);.      if( 
2760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2770: 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 70  .        pCsr->p
2780: 43 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20  Csr->pTokenizer 
2790: 3d 20 70 54 61 62 2d 3e 70 54 6f 6b 3b 0a 20 20  = pTab->pTok;.  
27a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27d0: 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 74  ;.  return fts3t
27e0: 6f 6b 4e 65 78 74 4d 65 74 68 6f 64 28 70 43 75  okNextMethod(pCu
27f0: 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsor);.}../*.** 
2800: 78 45 6f 66 20 2d 20 52 65 74 75 72 6e 20 74 72  xEof - Return tr
2810: 75 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ue if the cursor
2820: 20 69 73 20 61 74 20 45 4f 46 2c 20 6f 72 20 66   is at EOF, or f
2830: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2850: 73 33 74 6f 6b 45 6f 66 4d 65 74 68 6f 64 28 73  s3tokEofMethod(s
2860: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2870: 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
2880: 46 74 73 33 74 6f 6b 43 75 72 73 6f 72 20 2a 70  Fts3tokCursor *p
2890: 43 73 72 20 3d 20 28 46 74 73 33 74 6f 6b 43 75  Csr = (Fts3tokCu
28a0: 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a  rsor *)pCursor;.
28b0: 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e    return (pCsr->
28c0: 7a 54 6f 6b 65 6e 3d 3d 30 29 3b 0a 7d 0a 0a 2f  zToken==0);.}../
28d0: 2a 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 52  *.** xColumn - R
28e0: 65 74 75 72 6e 20 61 20 63 6f 6c 75 6d 6e 20 76  eturn a column v
28f0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2900: 69 6e 74 20 66 74 73 33 74 6f 6b 43 6f 6c 75 6d  int fts3tokColum
2910: 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  nMethod(.  sqlit
2920: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2930: 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 43 75  pCursor,   /* Cu
2940: 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65 76 65  rsor to retrieve
2950: 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20   value from */. 
2960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2970: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
2980: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
2990: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78  sqlite3_result_x
29a0: 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 20 20  xx() calls */.  
29b0: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
29e0: 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c 75 65  mn to read value
29f0: 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74   from */.){.  Ft
2a00: 73 33 74 6f 6b 43 75 72 73 6f 72 20 2a 70 43 73  s3tokCursor *pCs
2a10: 72 20 3d 20 28 46 74 73 33 74 6f 6b 43 75 72 73  r = (Fts3tokCurs
2a20: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  or *)pCursor;.. 
2a30: 20 2f 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   /* CREATE TABLE
2a40: 20 78 28 69 6e 70 75 74 2c 20 74 6f 6b 65 6e 2c   x(input, token,
2a50: 20 73 74 61 72 74 2c 20 65 6e 64 2c 20 70 6f 73   start, end, pos
2a60: 69 74 69 6f 6e 29 20 2a 2f 0a 20 20 73 77 69 74  ition) */.  swit
2a70: 63 68 28 20 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ch( iCol ){.    
2a80: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 73 71  case 0:.      sq
2a90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2aa0: 74 28 70 43 74 78 2c 20 70 43 73 72 2d 3e 7a 49  t(pCtx, pCsr->zI
2ab0: 6e 70 75 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45  nput, -1, SQLITE
2ac0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
2ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2ae0: 73 65 20 31 3a 0a 20 20 20 20 20 20 73 71 6c 69  se 1:.      sqli
2af0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2b00: 70 43 74 78 2c 20 70 43 73 72 2d 3e 7a 54 6f 6b  pCtx, pCsr->zTok
2b10: 65 6e 2c 20 70 43 73 72 2d 3e 6e 54 6f 6b 65 6e  en, pCsr->nToken
2b20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2b30: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
2b40: 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
2b50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2b60: 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 70 43 73  lt_int(pCtx, pCs
2b70: 72 2d 3e 69 53 74 61 72 74 29 3b 0a 20 20 20 20  r->iStart);.    
2b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2b90: 65 20 33 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  e 3:.      sqlit
2ba0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
2bb0: 74 78 2c 20 70 43 73 72 2d 3e 69 45 6e 64 29 3b  tx, pCsr->iEnd);
2bc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2bd0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2be0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 34   assert( iCol==4
2bf0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2c00: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74  3_result_int(pCt
2c10: 78 2c 20 70 43 73 72 2d 3e 69 50 6f 73 29 3b 0a  x, pCsr->iPos);.
2c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
2c30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 52  _OK;.}../*.** xR
2c50: 6f 77 69 64 20 2d 20 52 65 74 75 72 6e 20 74 68  owid - Return th
2c60: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20  e current rowid 
2c70: 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  for the cursor..
2c80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2c90: 73 33 74 6f 6b 52 6f 77 69 64 4d 65 74 68 6f 64  s3tokRowidMethod
2ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
2cb0: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
2cc0: 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f  ,   /* Cursor to
2cd0: 20 72 65 74 72 69 65 76 65 20 76 61 6c 75 65 20   retrieve value 
2ce0: 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  from */.  sqlite
2cf0: 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20  _int64 *pRowid  
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2d10: 3a 20 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f  : Rowid value */
2d20: 0a 29 7b 0a 20 20 46 74 73 33 74 6f 6b 43 75 72  .){.  Fts3tokCur
2d30: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
2d40: 33 74 6f 6b 43 75 72 73 6f 72 20 2a 29 70 43 75  3tokCursor *)pCu
2d50: 72 73 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20  rsor;.  *pRowid 
2d60: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
2d70: 29 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  )pCsr->iRowid;. 
2d80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
2da0: 73 74 65 72 20 74 68 65 20 66 74 73 33 74 6f 6b  ster the fts3tok
2db0: 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
2dc0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2dd0: 20 64 62 2e 20 52 65 74 75 72 6e 20 53 51 4c 49   db. Return SQLI
2de0: 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
2df0: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 65 72 72  essful or an err
2e00: 6f 72 20 63 6f 64 65 20 69 66 20 73 71 6c 69 74  or code if sqlit
2e10: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
2e20: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
2e30: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
2e40: 54 6f 6b 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Tok(sqlite3 *db,
2e50: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
2e60: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2e70: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
2e80: 20 66 74 73 33 74 6f 6b 5f 6d 6f 64 75 6c 65 20   fts3tok_module 
2e90: 3d 20 7b 0a 20 20 20 20 20 30 2c 20 20 20 20 20  = {.     0,     
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2ec0: 6e 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66  n      */.     f
2ed0: 74 73 33 74 6f 6b 43 6f 6e 6e 65 63 74 4d 65 74  ts3tokConnectMet
2ee0: 68 6f 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  hod,        /* x
2ef0: 43 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 0a  Create       */.
2f00: 20 20 20 20 20 66 74 73 33 74 6f 6b 43 6f 6e 6e       fts3tokConn
2f10: 65 63 74 4d 65 74 68 6f 64 2c 20 20 20 20 20 20  ectMethod,      
2f20: 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20 20    /* xConnect   
2f30: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74     */.     fts3t
2f40: 6f 6b 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f  okBestIndexMetho
2f50: 64 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74  d,      /* xBest
2f60: 49 6e 64 65 78 20 20 20 20 2a 2f 0a 20 20 20 20  Index    */.    
2f70: 20 66 74 73 33 74 6f 6b 44 69 73 63 6f 6e 6e 65   fts3tokDisconne
2f80: 63 74 4d 65 74 68 6f 64 2c 20 20 20 20 20 2f 2a  ctMethod,     /*
2f90: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20 20 2a   xDisconnect   *
2fa0: 2f 0a 20 20 20 20 20 66 74 73 33 74 6f 6b 44 69  /.     fts3tokDi
2fb0: 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20  sconnectMethod, 
2fc0: 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20      /* xDestroy 
2fd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
2fe0: 33 74 6f 6b 4f 70 65 6e 4d 65 74 68 6f 64 2c 20  3tokOpenMethod, 
2ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
3000: 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  en         */.  
3010: 20 20 20 66 74 73 33 74 6f 6b 43 6c 6f 73 65 4d     fts3tokCloseM
3020: 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20  ethod,          
3030: 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20 20  /* xClose       
3040: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74 6f 6b   */.     fts3tok
3050: 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 20 20 20  FilterMethod,   
3060: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
3070: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66         */.     f
3080: 74 73 33 74 6f 6b 4e 65 78 74 4d 65 74 68 6f 64  ts3tokNextMethod
3090: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
30a0: 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a 2f 0a  Next         */.
30b0: 20 20 20 20 20 66 74 73 33 74 6f 6b 45 6f 66 4d       fts3tokEofM
30c0: 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20  ethod,          
30d0: 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20 20 20    /* xEof       
30e0: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74     */.     fts3t
30f0: 6f 6b 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 2c 20  okColumnMethod, 
3100: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
3110: 6d 6e 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  mn       */.    
3120: 20 66 74 73 33 74 6f 6b 52 6f 77 69 64 4d 65 74   fts3tokRowidMet
3130: 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  hod,          /*
3140: 20 78 52 6f 77 69 64 20 20 20 20 20 20 20 20 2a   xRowid        *
3150: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 20      /* xUpdate  
3180: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20       */.     0, 
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
31b0: 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  gin        */.  
31c0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20 20 20  /* xSync        
31f0: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
3220: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30         */.     0
3230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3250: 52 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f 0a  Rollback     */.
3260: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
3290: 6f 6e 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20  on */.     0,   
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
32c0: 6d 65 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  me       */.    
32d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32f0: 20 78 53 61 76 65 70 6f 69 6e 74 20 20 20 20 2a   xSavepoint    *
3300: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
3330: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20       */.     0, 
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
3360: 6c 6c 62 61 63 6b 54 6f 20 20 20 2a 2f 0a 20 20  llbackTo   */.  
3370: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20 20  /* xShadowName  
33a0: 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72   */.  };.  int r
33b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33d0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
33e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
33f0: 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22  ate_module(db, "
3400: 66 74 73 33 74 6f 6b 65 6e 69 7a 65 22 2c 20 26  fts3tokenize", &
3410: 66 74 73 33 74 6f 6b 5f 6d 6f 64 75 6c 65 2c 20  fts3tok_module, 
3420: 28 76 6f 69 64 2a 29 70 48 61 73 68 29 3b 0a 20  (void*)pHash);. 
3430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
3440: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3450: 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
3460: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
3470: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 2a 2f  _ENABLE_FTS3) */
3480: 0a                                               .