/ Hex Artifact Content
Login

Artifact 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 44 65 63 20 30  /*.** 2014 Dec 0
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** 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 2f 0a 0a 0a 23 69  *****.**.*/...#i
0180: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0190: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43  .#if defined(INC
01a0: 4c 55 44 45 5f 53 51 4c 49 54 45 5f 54 43 4c 5f  LUDE_SQLITE_TCL_
01b0: 48 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 73  H).#  include "s
01c0: 71 6c 69 74 65 5f 74 63 6c 2e 68 22 0a 23 65 6c  qlite_tcl.h".#el
01d0: 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 74  se.#  include "t
01e0: 63 6c 2e 68 22 0a 23 20 20 69 66 6e 64 65 66 20  cl.h".#  ifndef 
01f0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 0a 23 20  SQLITE_TCLAPI.# 
0200: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
0210: 5f 54 43 4c 41 50 49 0a 23 20 20 65 6e 64 69 66  _TCLAPI.#  endif
0220: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
0230: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
0240: 53 35 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  S5..#include "ft
0250: 73 35 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  s5.h".#include <
0260: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0270: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 65  de <assert.h>..e
0280: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
0290: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
02a0: 72 72 75 70 74 3b 0a 65 78 74 65 72 6e 20 69 6e  rrupt;.extern in
02b0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 73  t sqlite3Fts5Tes
02c0: 74 52 65 67 69 73 74 65 72 4d 61 74 63 68 69 6e  tRegisterMatchin
02d0: 66 6f 28 73 71 6c 69 74 65 33 2a 29 3b 0a 65 78  fo(sqlite3*);.ex
02e0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
02f0: 46 74 73 35 54 65 73 74 52 65 67 69 73 74 65 72  Fts5TestRegister
0300: 54 6f 6b 28 73 71 6c 69 74 65 33 2a 2c 20 66 74  Tok(sqlite3*, ft
0310: 73 35 5f 61 70 69 2a 29 3b 0a 0a 2f 2a 2a 2a 2a  s5_api*);../****
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  *****.** This is
0370: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66   a copy of the f
0380: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
0390: 20 53 71 6c 69 74 65 44 62 20 73 74 72 75 63 74   SqliteDb struct
03a0: 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71  ure in .** tclsq
03b0: 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65 65 64  lite.c.  We need
03c0: 20 69 74 20 68 65 72 65 20 73 6f 20 74 68 61 74   it here so that
03d0: 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74 65 5f   the get_sqlite_
03e0: 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a  pointer routine.
03f0: 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74 20 74  ** can extract t
0400: 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e  he sqlite3* poin
0410: 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78 69 73  ter from an exis
0420: 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74 65 0a  ting Tcl SQLite.
0430: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
0440: 2f 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20  /..extern const 
0450: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
0460: 4e 61 6d 65 28 69 6e 74 29 3b 0a 0a 73 74 72 75  Name(int);..stru
0470: 63 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20  ct SqliteDb {.  
0480: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a  sqlite3 *db;.};.
0490: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
04a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
04b0: 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lite3 object..*/
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 35 74 44  .static int f5tD
04d0: 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
04e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c  erp *interp, Tcl
04f0: 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 20 73 71 6c 69  _Obj *pObj, sqli
0500: 74 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20 73  te3 **ppDb){.  s
0510: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0520: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0530: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0540: 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
0550: 69 6e 67 28 70 4f 62 6a 29 3b 0a 20 20 69 66 28  ing(pObj);.  if(
0560: 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49   Tcl_GetCommandI
0570: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26  nfo(interp, z, &
0580: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
0590: 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c 69  p = (struct Sqli
05a0: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
05b0: 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20  jClientData;.   
05c0: 20 2a 70 70 44 62 20 3d 20 70 2d 3e 64 62 3b 0a   *ppDb = p->db;.
05d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
05e0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
05f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
0600: 20 45 6e 64 20 6f 66 20 63 6f 64 65 20 74 68 61   End of code tha
0610: 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 53  t accesses the S
0620: 71 6c 69 74 65 44 62 20 73 74 72 75 63 74 2e 0a  qliteDb struct..
0630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61  **********/..sta
0680: 74 69 63 20 69 6e 74 20 66 35 74 52 65 73 75 6c  tic int f5tResul
0690: 74 54 6f 45 72 72 6f 72 43 6f 64 65 28 63 6f 6e  tToErrorCode(con
06a0: 73 74 20 63 68 61 72 20 2a 7a 52 65 73 29 7b 0a  st char *zRes){.
06b0: 20 20 73 74 72 75 63 74 20 45 72 72 6f 72 43 6f    struct ErrorCo
06c0: 64 65 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  de {.    int rc;
06d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
06e0: 2a 7a 45 72 72 6f 72 3b 0a 20 20 7d 20 61 45 72  *zError;.  } aEr
06f0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 53 51  r[] = {.    { SQ
0700: 4c 49 54 45 5f 44 4f 4e 45 2c 20 20 22 53 51 4c  LITE_DONE,  "SQL
0710: 49 54 45 5f 44 4f 4e 45 22 20 7d 2c 0a 20 20 20  ITE_DONE" },.   
0720: 20 7b 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c   { SQLITE_ERROR,
0730: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 20   "SQLITE_ERROR" 
0740: 7d 2c 0a 20 20 20 20 7b 20 53 51 4c 49 54 45 5f  },.    { SQLITE_
0750: 4f 4b 2c 20 20 20 20 22 53 51 4c 49 54 45 5f 4f  OK,    "SQLITE_O
0760: 4b 22 20 7d 2c 0a 20 20 20 20 7b 20 53 51 4c 49  K" },.    { SQLI
0770: 54 45 5f 4f 4b 2c 20 20 20 20 22 22 20 7d 2c 0a  TE_OK,    "" },.
0780: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20    };.  int i;.. 
0790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
07a0: 6f 66 28 61 45 72 72 29 2f 73 69 7a 65 6f 66 28  of(aErr)/sizeof(
07b0: 61 45 72 72 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aErr[0]); i++){.
07c0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
07d0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 52 65 73 2c  e3_stricmp(zRes,
07e0: 20 61 45 72 72 5b 69 5d 2e 7a 45 72 72 6f 72 29   aErr[i].zError)
07f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0800: 20 61 45 72 72 5b 69 5d 2e 72 63 3b 0a 20 20 20   aErr[i].rc;.   
0810: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
0820: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
0830: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
0840: 49 54 45 5f 54 43 4c 41 50 49 20 66 35 74 44 62  ITE_TCLAPI f5tDb
0850: 41 6e 64 41 70 69 28 0a 20 20 54 63 6c 5f 49 6e  AndApi(.  Tcl_In
0860: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
0870: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 20   Tcl_Obj *pObj, 
0880: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
0890: 62 2c 20 0a 20 20 66 74 73 35 5f 61 70 69 20 2a  b, .  fts5_api *
08a0: 2a 70 70 41 70 69 0a 29 7b 0a 20 20 73 71 6c 69  *ppApi.){.  sqli
08b0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69  te3 *db = 0;.  i
08c0: 6e 74 20 72 63 20 3d 20 66 35 74 44 62 50 6f 69  nt rc = f5tDbPoi
08d0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 70 4f 62  nter(interp, pOb
08e0: 6a 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72  j, &db);.  if( r
08f0: 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c!=TCL_OK ){.   
0900: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0910: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
0920: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0930: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  tmt = 0;.    fts
0940: 35 5f 61 70 69 20 2a 70 41 70 69 20 3d 20 30 3b  5_api *pApi = 0;
0950: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
0960: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
0970: 2c 20 22 53 45 4c 45 43 54 20 66 74 73 35 28 3f  , "SELECT fts5(?
0980: 31 29 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  1)", -1, &pStmt,
0990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
09a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
09b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
09c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72  sult(interp, "er
09d0: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
09e0: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
09f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
0a00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
0a10: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
0a20: 6f 69 6e 74 65 72 28 70 53 74 6d 74 2c 20 31 2c  ointer(pStmt, 1,
0a30: 20 28 76 6f 69 64 2a 29 26 70 41 70 69 2c 20 22   (void*)&pApi, "
0a40: 66 74 73 35 5f 61 70 69 5f 70 74 72 22 2c 20 30  fts5_api_ptr", 0
0a50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
0a60: 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20  tep(pStmt);..   
0a70: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6e   if( sqlite3_fin
0a80: 61 6c 69 7a 65 28 70 53 74 6d 74 29 21 3d 53 51  alize(pStmt)!=SQ
0a90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
0aa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0ab0: 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  t(interp, "error
0ac0: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
0ad0: 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
0ae0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0af0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
0b00: 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 20 20  *ppDb = db;.    
0b10: 2a 70 70 41 70 69 20 3d 20 70 41 70 69 3b 0a 20  *ppApi = pApi;. 
0b20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
0b30: 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20  _OK;.}..typedef 
0b40: 73 74 72 75 63 74 20 46 35 74 46 75 6e 63 74 69  struct F5tFuncti
0b50: 6f 6e 20 46 35 74 46 75 6e 63 74 69 6f 6e 3b 0a  on F5tFunction;.
0b60: 73 74 72 75 63 74 20 46 35 74 46 75 6e 63 74 69  struct F5tFuncti
0b70: 6f 6e 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  on {.  Tcl_Inter
0b80: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
0b90: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 7d  _Obj *pScript;.}
0ba0: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
0bb0: 74 20 46 35 74 41 70 69 20 46 35 74 41 70 69 3b  t F5tApi F5tApi;
0bc0: 0a 73 74 72 75 63 74 20 46 35 74 41 70 69 20 7b  .struct F5tApi {
0bd0: 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74  .  const Fts5Ext
0be0: 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 3b  ensionApi *pApi;
0bf0: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
0c00: 70 46 74 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pFts;.};../*.** 
0c10: 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 69  An object of thi
0c20: 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20 77  s type is used w
0c30: 69 74 68 20 74 68 65 20 78 53 65 74 41 75 78 64  ith the xSetAuxd
0c40: 61 74 61 28 29 20 61 6e 64 20 78 47 65 74 41 75  ata() and xGetAu
0c50: 78 64 61 74 61 28 29 0a 2a 2a 20 41 50 49 20 74  xdata().** API t
0c60: 65 73 74 20 77 72 61 70 70 65 72 73 2e 20 54 68  est wrappers. Th
0c70: 65 20 74 63 6c 20 69 6e 74 65 72 66 61 63 65 20  e tcl interface 
0c80: 61 6c 6c 6f 77 73 20 61 20 73 69 6e 67 6c 65 20  allows a single 
0c90: 74 63 6c 20 76 61 6c 75 65 20 74 6f 20 62 65 20  tcl value to be 
0ca0: 0a 2a 2a 20 73 61 76 65 64 20 75 73 69 6e 67 20  .** saved using 
0cb0: 78 53 65 74 41 75 78 64 61 74 61 28 29 2e 20 49  xSetAuxdata(). I
0cc0: 6e 73 74 65 61 64 20 6f 66 20 73 69 6d 70 6c 79  nstead of simply
0cd0: 20 73 74 6f 72 69 6e 67 20 61 20 70 6f 69 6e 74   storing a point
0ce0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 63 6c  er to the.** tcl
0cf0: 20 6f 62 6a 65 63 74 2c 20 74 68 65 20 63 6f 64   object, the cod
0d00: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77  e in this file w
0d10: 72 61 70 73 20 69 74 20 69 6e 20 61 6e 20 73 71  raps it in an sq
0d20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 0a  lite3_malloc'd .
0d30: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
0d40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0d50: 75 63 74 20 73 6f 20 74 68 61 74 20 69 66 20 74  uct so that if t
0d60: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
0d70: 20 6e 6f 74 20 0a 2a 2a 20 63 6f 72 72 65 63 74   not .** correct
0d80: 6c 79 20 69 6e 76 6f 6b 65 64 20 69 74 20 77 69  ly invoked it wi
0d90: 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
0da0: 73 20 61 6e 20 53 51 4c 69 74 65 20 6d 65 6d 6f  s an SQLite memo
0db0: 72 79 20 6c 65 61 6b 2e 0a 2a 2f 0a 74 79 70 65  ry leak..*/.type
0dc0: 64 65 66 20 73 74 72 75 63 74 20 46 35 74 41 75  def struct F5tAu
0dd0: 78 44 61 74 61 20 46 35 74 41 75 78 44 61 74 61  xData F5tAuxData
0de0: 3b 0a 73 74 72 75 63 74 20 46 35 74 41 75 78 44  ;.struct F5tAuxD
0df0: 61 74 61 20 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ata {.  Tcl_Obj 
0e00: 2a 70 4f 62 6a 3b 0a 7d 3b 0a 0a 73 74 61 74 69  *pObj;.};..stati
0e10: 63 20 69 6e 74 20 78 54 6f 6b 65 6e 69 7a 65 43  c int xTokenizeC
0e20: 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
0e30: 20 0a 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 0a   .  int tflags,.
0e40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
0e50: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
0e60: 2c 20 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  , .  int iStart,
0e70: 20 69 6e 74 20 69 45 6e 64 0a 29 7b 0a 20 20 46   int iEnd.){.  F
0e80: 35 74 46 75 6e 63 74 69 6f 6e 20 2a 70 20 3d 20  5tFunction *p = 
0e90: 28 46 35 74 46 75 6e 63 74 69 6f 6e 2a 29 70 43  (F5tFunction*)pC
0ea0: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
0eb0: 45 76 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69  Eval = Tcl_Dupli
0ec0: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 53 63 72 69  cateObj(p->pScri
0ed0: 70 74 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pt);.  int rc;..
0ee0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
0ef0: 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20 54 63 6c  nt(pEval);.  Tcl
0f00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0f10: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
0f20: 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77 53   pEval, Tcl_NewS
0f30: 74 72 69 6e 67 4f 62 6a 28 7a 54 6f 6b 65 6e 2c  tringObj(zToken,
0f40: 20 6e 54 6f 6b 65 6e 29 29 3b 0a 20 20 54 63 6c   nToken));.  Tcl
0f50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
0f60: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
0f70: 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77 49   pEval, Tcl_NewI
0f80: 6e 74 4f 62 6a 28 69 53 74 61 72 74 29 29 3b 0a  ntObj(iStart));.
0f90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
0fa0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
0fb0: 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 54 63 6c  terp, pEval, Tcl
0fc0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 45 6e 64 29  _NewIntObj(iEnd)
0fd0: 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  );..  rc = Tcl_E
0fe0: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
0ff0: 72 70 2c 20 70 45 76 61 6c 2c 20 30 29 3b 0a 20  rp, pEval, 0);. 
1000: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1010: 74 28 70 45 76 61 6c 29 3b 0a 20 20 69 66 28 20  t(pEval);.  if( 
1020: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
1030: 20 20 72 63 20 3d 20 66 35 74 52 65 73 75 6c 74    rc = f5tResult
1040: 54 6f 45 72 72 6f 72 43 6f 64 65 28 54 63 6c 5f  ToErrorCode(Tcl_
1050: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
1060: 70 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 20 20 7d  p->interp));.  }
1070: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1080: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
1090: 49 54 45 5f 54 43 4c 41 50 49 20 78 46 35 74 41  ITE_TCLAPI xF5tA
10a0: 70 69 28 76 6f 69 64 2a 2c 20 54 63 6c 5f 49 6e  pi(void*, Tcl_In
10b0: 74 65 72 70 2a 2c 20 69 6e 74 2c 20 54 63 6c 5f  terp*, int, Tcl_
10c0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 5b 5d 29 3b 0a  Obj *CONST []);.
10d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 78 51 75 65  .static int xQue
10e0: 72 79 50 68 72 61 73 65 43 62 28 0a 20 20 63 6f  ryPhraseCb(.  co
10f0: 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
1100: 6e 41 70 69 20 2a 70 41 70 69 2c 20 0a 20 20 46  nApi *pApi, .  F
1110: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73  ts5Context *pFts
1120: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 0a  , .  void *pCtx.
1130: 29 7b 0a 20 20 46 35 74 46 75 6e 63 74 69 6f 6e  ){.  F5tFunction
1140: 20 2a 70 20 3d 20 28 46 35 74 46 75 6e 63 74 69   *p = (F5tFuncti
1150: 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 73 74 61 74  on*)pCtx;.  stat
1160: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
1170: 20 69 43 6d 64 20 3d 20 30 3b 0a 20 20 54 63 6c   iCmd = 0;.  Tcl
1180: 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b 0a 20 20 69  _Obj *pEval;.  i
1190: 6e 74 20 72 63 3b 0a 0a 20 20 63 68 61 72 20 7a  nt rc;..  char z
11a0: 43 6d 64 5b 36 34 5d 3b 0a 20 20 46 35 74 41 70  Cmd[64];.  F5tAp
11b0: 69 20 73 41 70 69 3b 0a 0a 20 20 73 41 70 69 2e  i sApi;..  sApi.
11c0: 70 41 70 69 20 3d 20 70 41 70 69 3b 0a 20 20 73  pApi = pApi;.  s
11d0: 41 70 69 2e 70 46 74 73 20 3d 20 70 46 74 73 3b  Api.pFts = pFts;
11e0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6d 64 2c  .  sprintf(zCmd,
11f0: 20 22 66 35 74 5f 32 5f 25 6c 6c 64 22 2c 20 69   "f5t_2_%lld", i
1200: 43 6d 64 2b 2b 29 3b 0a 20 20 54 63 6c 5f 43 72  Cmd++);.  Tcl_Cr
1210: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 70  eateObjCommand(p
1220: 2d 3e 69 6e 74 65 72 70 2c 20 7a 43 6d 64 2c 20  ->interp, zCmd, 
1230: 78 46 35 74 41 70 69 2c 20 26 73 41 70 69 2c 20  xF5tApi, &sApi, 
1240: 30 29 3b 0a 0a 20 20 70 45 76 61 6c 20 3d 20 54  0);..  pEval = T
1250: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1260: 70 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 54  p->pScript);.  T
1270: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1280: 70 45 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69  pEval);.  Tcl_Li
1290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12a0: 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45  nt(p->interp, pE
12b0: 76 61 6c 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  val, Tcl_NewStri
12c0: 6e 67 4f 62 6a 28 7a 43 6d 64 2c 20 2d 31 29 29  ngObj(zCmd, -1))
12d0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
12e0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
12f0: 2c 20 70 45 76 61 6c 2c 20 30 29 3b 0a 20 20 54  , pEval, 0);.  T
1300: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1310: 70 45 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 44 65  pEval);.  Tcl_De
1320: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 70 2d 3e 69  leteCommand(p->i
1330: 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 0a 20  nterp, zCmd);.. 
1340: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
1350: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 35 74 52  ){.    rc = f5tR
1360: 65 73 75 6c 74 54 6f 45 72 72 6f 72 43 6f 64 65  esultToErrorCode
1370: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
1380: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29  sult(p->interp))
1390: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13a0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rc;.}..static vo
13b0: 69 64 20 78 53 65 74 41 75 78 64 61 74 61 44 65  id xSetAuxdataDe
13c0: 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70  structor(void *p
13d0: 29 7b 0a 20 20 46 35 74 41 75 78 44 61 74 61 20  ){.  F5tAuxData 
13e0: 2a 70 44 61 74 61 20 3d 20 28 46 35 74 41 75 78  *pData = (F5tAux
13f0: 44 61 74 61 2a 29 70 3b 0a 20 20 54 63 6c 5f 44  Data*)p;.  Tcl_D
1400: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 61 74  ecrRefCount(pDat
1410: 61 2d 3e 70 4f 62 6a 29 3b 0a 20 20 73 71 6c 69  a->pObj);.  sqli
1420: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
1430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 61  .}../*.**      a
1440: 70 69 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e 2e  pi sub-command..
1450: 2e 0a 2a 2a 0a 2a 2a 20 44 65 73 63 72 69 70 74  ..**.** Descript
1460: 69 6f 6e 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion....*/.static
1470: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1480: 50 49 20 78 46 35 74 41 70 69 28 0a 20 20 76 6f  PI xF5tApi(.  vo
1490: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14b0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14c0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14d0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14e0: 73 74 72 75 63 74 20 53 75 62 20 7b 0a 20 20 20  struct Sub {.   
14f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1500: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  me;.    int nArg
1510: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1520: 20 2a 7a 4d 73 67 3b 0a 20 20 7d 20 61 53 75 62   *zMsg;.  } aSub
1530: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 78 43  [] = {.    { "xC
1540: 6f 6c 75 6d 6e 43 6f 75 6e 74 22 2c 20 20 20 20  olumnCount",    
1550: 20 20 30 2c 20 22 22 20 7d 2c 20 20 20 20 20 20    0, "" },      
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1570: 20 30 20 2a 2f 0a 20 20 20 20 7b 20 22 78 52 6f   0 */.    { "xRo
1580: 77 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  wCount",        
1590: 20 30 2c 20 22 22 20 7d 2c 20 20 20 20 20 20 20   0, "" },       
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
15b0: 31 20 2a 2f 0a 20 20 20 20 7b 20 22 78 43 6f 6c  1 */.    { "xCol
15c0: 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 22 2c 20 20  umnTotalSize",  
15d0: 31 2c 20 22 43 4f 4c 22 20 7d 2c 20 20 20 20 20  1, "COL" },     
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 32             /*  2
15f0: 20 2a 2f 0a 20 20 20 20 7b 20 22 78 54 6f 6b 65   */.    { "xToke
1600: 6e 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 32  nize",         2
1610: 2c 20 22 54 45 58 54 20 53 43 52 49 50 54 22 20  , "TEXT SCRIPT" 
1620: 7d 2c 20 20 20 20 20 20 20 20 2f 2a 20 20 33 20  },        /*  3 
1630: 2a 2f 0a 20 20 20 20 7b 20 22 78 50 68 72 61 73  */.    { "xPhras
1640: 65 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 30 2c  eCount",      0,
1650: 20 22 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20   "" },          
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a           /*  4 *
1670: 2f 0a 20 20 20 20 7b 20 22 78 50 68 72 61 73 65  /.    { "xPhrase
1680: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 31 2c 20  Size",       1, 
1690: 22 50 48 52 41 53 45 22 20 7d 2c 20 20 20 20 20  "PHRASE" },     
16a0: 20 20 20 20 20 20 20 20 2f 2a 20 20 35 20 2a 2f          /*  5 */
16b0: 0a 20 20 20 20 7b 20 22 78 49 6e 73 74 43 6f 75  .    { "xInstCou
16c0: 6e 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 22  nt",        0, "
16d0: 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20  " },            
16e0: 20 20 20 20 20 20 20 2f 2a 20 20 36 20 2a 2f 0a         /*  6 */.
16f0: 20 20 20 20 7b 20 22 78 49 6e 73 74 22 2c 20 20      { "xInst",  
1700: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 49             1, "I
1710: 44 58 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20  DX" },          
1720: 20 20 20 20 20 20 2f 2a 20 20 37 20 2a 2f 0a 20        /*  7 */. 
1730: 20 20 20 7b 20 22 78 52 6f 77 69 64 22 2c 20 20     { "xRowid",  
1740: 20 20 20 20 20 20 20 20 20 20 30 2c 20 22 22 20            0, "" 
1750: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
1760: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
1770: 20 20 7b 20 22 78 43 6f 6c 75 6d 6e 54 65 78 74    { "xColumnText
1780: 22 2c 20 20 20 20 20 20 20 31 2c 20 22 43 4f 4c  ",       1, "COL
1790: 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20  " },            
17a0: 20 20 20 20 2f 2a 20 20 39 20 2a 2f 0a 20 20 20      /*  9 */.   
17b0: 20 7b 20 22 78 43 6f 6c 75 6d 6e 53 69 7a 65 22   { "xColumnSize"
17c0: 2c 20 20 20 20 20 20 20 31 2c 20 22 43 4f 4c 22  ,       1, "COL"
17d0: 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   },             
17e0: 20 20 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20     /* 10 */.    
17f0: 7b 20 22 78 51 75 65 72 79 50 68 72 61 73 65 22  { "xQueryPhrase"
1800: 2c 20 20 20 20 20 20 32 2c 20 22 50 48 52 41 53  ,      2, "PHRAS
1810: 45 20 53 43 52 49 50 54 22 20 7d 2c 20 20 20 20  E SCRIPT" },    
1820: 20 20 2f 2a 20 31 31 20 2a 2f 0a 20 20 20 20 7b    /* 11 */.    {
1830: 20 22 78 53 65 74 41 75 78 64 61 74 61 22 2c 20   "xSetAuxdata", 
1840: 20 20 20 20 20 20 31 2c 20 22 56 41 4c 55 45 22        1, "VALUE"
1850: 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   },             
1860: 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7b 20   /* 12 */.    { 
1870: 22 78 47 65 74 41 75 78 64 61 74 61 22 2c 20 20  "xGetAuxdata",  
1880: 20 20 20 20 20 31 2c 20 22 43 4c 45 41 52 22 20       1, "CLEAR" 
1890: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
18a0: 2f 2a 20 31 33 20 2a 2f 0a 20 20 20 20 7b 20 22  /* 13 */.    { "
18b0: 78 53 65 74 41 75 78 64 61 74 61 49 6e 74 22 2c  xSetAuxdataInt",
18c0: 20 20 20 20 31 2c 20 22 49 4e 54 45 47 45 52 22      1, "INTEGER"
18d0: 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   },            /
18e0: 2a 20 31 34 20 2a 2f 0a 20 20 20 20 7b 20 22 78  * 14 */.    { "x
18f0: 47 65 74 41 75 78 64 61 74 61 49 6e 74 22 2c 20  GetAuxdataInt", 
1900: 20 20 20 31 2c 20 22 43 4c 45 41 52 22 20 7d 2c     1, "CLEAR" },
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1920: 20 31 35 20 2a 2f 0a 20 20 20 20 7b 20 22 78 50   15 */.    { "xP
1930: 68 72 61 73 65 46 6f 72 65 61 63 68 22 2c 20 20  hraseForeach",  
1940: 20 20 34 2c 20 22 49 50 48 52 41 53 45 20 43 4f    4, "IPHRASE CO
1950: 4c 56 41 52 20 4f 46 46 56 41 52 20 53 43 52 49  LVAR OFFVAR SCRI
1960: 50 54 22 20 7d 2c 20 2f 2a 20 31 36 20 2a 2f 0a  PT" }, /* 16 */.
1970: 20 20 20 20 7b 20 22 78 50 68 72 61 73 65 43 6f      { "xPhraseCo
1980: 6c 75 6d 6e 46 6f 72 65 61 63 68 22 2c 20 33 2c  lumnForeach", 3,
1990: 20 22 49 50 48 52 41 53 45 20 43 4f 4c 56 41 52   "IPHRASE COLVAR
19a0: 20 53 43 52 49 50 54 22 20 7d 2c 20 2f 2a 20 31   SCRIPT" }, /* 1
19b0: 37 20 2a 2f 0a 20 20 20 20 7b 20 30 2c 20 30 2c  7 */.    { 0, 0,
19c0: 20 30 7d 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20   0}.  };..  int 
19d0: 72 63 3b 0a 20 20 69 6e 74 20 69 53 75 62 20 3d  rc;.  int iSub =
19e0: 20 30 3b 0a 20 20 46 35 74 41 70 69 20 2a 70 20   0;.  F5tApi *p 
19f0: 3d 20 28 46 35 74 41 70 69 2a 29 63 6c 69 65 6e  = (F5tApi*)clien
1a00: 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62  tData;..  if( ob
1a10: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
1a20: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1a30: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1a40: 55 42 2d 43 4f 4d 4d 41 4e 44 22 29 3b 0a 20 20  UB-COMMAND");.  
1a50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a60: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
1a70: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
1a80: 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20  ObjStruct(.     
1a90: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
1aa0: 2c 20 61 53 75 62 2c 20 73 69 7a 65 6f 66 28 61  , aSub, sizeof(a
1ab0: 53 75 62 5b 30 5d 29 2c 20 22 53 55 42 2d 43 4f  Sub[0]), "SUB-CO
1ac0: 4d 4d 41 4e 44 22 2c 20 30 2c 20 26 69 53 75 62  MMAND", 0, &iSub
1ad0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
1ae0: 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
1af0: 72 63 3b 0a 20 20 69 66 28 20 61 53 75 62 5b 69  rc;.  if( aSub[i
1b00: 53 75 62 5d 2e 6e 41 72 67 21 3d 6f 62 6a 63 2d  Sub].nArg!=objc-
1b10: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 61 53 75 62 5b  , 1, objv, aSub[
1b40: 69 53 75 62 5d 2e 7a 4d 73 67 29 3b 0a 20 20 20  iSub].zMsg);.   
1b50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b60: 52 3b 0a 20 20 7d 0a 0a 23 64 65 66 69 6e 65 20  R;.  }..#define 
1b70: 43 41 53 45 28 69 2c 73 74 72 29 20 63 61 73 65  CASE(i,str) case
1b80: 20 69 3a 20 61 73 73 65 72 74 28 20 73 74 72 63   i: assert( strc
1b90: 6d 70 28 61 53 75 62 5b 69 5d 2e 7a 4e 61 6d 65  mp(aSub[i].zName
1ba0: 2c 20 73 74 72 29 3d 3d 30 20 29 3b 0a 20 20 73  , str)==0 );.  s
1bb0: 77 69 74 63 68 28 20 69 53 75 62 20 29 7b 0a 20  witch( iSub ){. 
1bc0: 20 20 20 43 41 53 45 28 30 2c 20 22 78 43 6f 6c     CASE(0, "xCol
1bd0: 75 6d 6e 43 6f 75 6e 74 22 29 20 7b 0a 20 20 20  umnCount") {.   
1be0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
1bf0: 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 41 70     nCol = p->pAp
1c00: 69 2d 3e 78 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  i->xColumnCount(
1c10: 70 2d 3e 70 46 74 73 29 3b 0a 20 20 20 20 20 20  p->pFts);.      
1c20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
1c40: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c50: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1c60: 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20  Obj(nCol));.    
1c70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c80: 0a 20 20 20 20 7d 0a 20 20 20 20 43 41 53 45 28  .    }.    CASE(
1c90: 31 2c 20 22 78 52 6f 77 43 6f 75 6e 74 22 29 20  1, "xRowCount") 
1ca0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1cb0: 69 6e 74 36 34 20 6e 52 6f 77 3b 0a 20 20 20 20  int64 nRow;.    
1cc0: 20 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e    rc = p->pApi->
1cd0: 78 52 6f 77 43 6f 75 6e 74 28 70 2d 3e 70 46 74  xRowCount(p->pFt
1ce0: 73 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20  s, &nRow);.     
1cf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
1d10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d20: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
1d30: 64 65 49 6e 74 4f 62 6a 28 6e 52 6f 77 29 29 3b  deIntObj(nRow));
1d40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1d50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d60: 43 41 53 45 28 32 2c 20 22 78 43 6f 6c 75 6d 6e  CASE(2, "xColumn
1d70: 54 6f 74 61 6c 53 69 7a 65 22 29 20 7b 0a 20 20  TotalSize") {.  
1d80: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
1d90: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1da0: 34 20 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  4 nSize;.      i
1db0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1dc0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1dd0: 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29 20 72  v[2], &iCol) ) r
1de0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1df0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  .      rc = p->p
1e00: 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54 6f 74 61  Api->xColumnTota
1e10: 6c 53 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 69  lSize(p->pFts, i
1e20: 43 6f 6c 2c 20 26 6e 53 69 7a 65 29 3b 0a 20 20  Col, &nSize);.  
1e30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e50: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1e60: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1e70: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 53 69 7a  wWideIntObj(nSiz
1e80: 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
1e90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ea0: 20 20 20 20 43 41 53 45 28 33 2c 20 22 78 54 6f      CASE(3, "xTo
1eb0: 6b 65 6e 69 7a 65 22 29 20 7b 0a 20 20 20 20 20  kenize") {.     
1ec0: 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 20 20   int nText;.    
1ed0: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20    char *zText = 
1ee0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1ef0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
1f00: 54 65 78 74 29 3b 0a 20 20 20 20 20 20 46 35 74  Text);.      F5t
1f10: 46 75 6e 63 74 69 6f 6e 20 63 74 78 3b 0a 20 20  Function ctx;.  
1f20: 20 20 20 20 63 74 78 2e 69 6e 74 65 72 70 20 3d      ctx.interp =
1f30: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 63   interp;.      c
1f40: 74 78 2e 70 53 63 72 69 70 74 20 3d 20 6f 62 6a  tx.pScript = obj
1f50: 76 5b 33 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  v[3];.      rc =
1f60: 20 70 2d 3e 70 41 70 69 2d 3e 78 54 6f 6b 65 6e   p->pApi->xToken
1f70: 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 7a 54 65  ize(p->pFts, zTe
1f80: 78 74 2c 20 6e 54 65 78 74 2c 20 26 63 74 78 2c  xt, nText, &ctx,
1f90: 20 78 54 6f 6b 65 6e 69 7a 65 43 62 29 3b 0a 20   xTokenizeCb);. 
1fa0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1fb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fc0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
1fd0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1fe0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1ff0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 41  rc;.    }.    CA
2000: 53 45 28 34 2c 20 22 78 50 68 72 61 73 65 43 6f  SE(4, "xPhraseCo
2010: 75 6e 74 22 29 20 7b 0a 20 20 20 20 20 20 69 6e  unt") {.      in
2020: 74 20 6e 50 68 72 61 73 65 3b 0a 20 20 20 20 20  t nPhrase;.     
2030: 20 6e 50 68 72 61 73 65 20 3d 20 70 2d 3e 70 41   nPhrase = p->pA
2040: 70 69 2d 3e 78 50 68 72 61 73 65 43 6f 75 6e 74  pi->xPhraseCount
2050: 28 70 2d 3e 70 46 74 73 29 3b 0a 20 20 20 20 20  (p->pFts);.     
2060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2070: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
2080: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2090: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
20a0: 74 4f 62 6a 28 6e 50 68 72 61 73 65 29 29 3b 0a  tObj(nPhrase));.
20b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
20c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43  eak;.    }.    C
20d0: 41 53 45 28 35 2c 20 22 78 50 68 72 61 73 65 53  ASE(5, "xPhraseS
20e0: 69 7a 65 22 29 20 7b 0a 20 20 20 20 20 20 69 6e  ize") {.      in
20f0: 74 20 69 50 68 72 61 73 65 3b 0a 20 20 20 20 20  t iPhrase;.     
2100: 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 69   int sz;.      i
2110: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2120: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2130: 76 5b 32 5d 2c 20 26 69 50 68 72 61 73 65 29 20  v[2], &iPhrase) 
2140: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2160: 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20     }.      sz = 
2170: 70 2d 3e 70 41 70 69 2d 3e 78 50 68 72 61 73 65  p->pApi->xPhrase
2180: 53 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 69 50  Size(p->pFts, iP
2190: 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  hrase);.      if
21a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
21c0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21d0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
21e0: 6a 28 73 7a 29 29 3b 0a 20 20 20 20 20 20 7d 0a  j(sz));.      }.
21f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2200: 20 7d 0a 20 20 20 20 43 41 53 45 28 36 2c 20 22   }.    CASE(6, "
2210: 78 49 6e 73 74 43 6f 75 6e 74 22 29 20 7b 0a 20  xInstCount") {. 
2220: 20 20 20 20 20 69 6e 74 20 6e 49 6e 73 74 3b 0a       int nInst;.
2230: 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 41        rc = p->pA
2240: 70 69 2d 3e 78 49 6e 73 74 43 6f 75 6e 74 28 70  pi->xInstCount(p
2250: 2d 3e 70 46 74 73 2c 20 26 6e 49 6e 73 74 29 3b  ->pFts, &nInst);
2260: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2280: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2290: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
22a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 49 6e 73 74  _NewIntObj(nInst
22b0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
22c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22d0: 20 20 20 43 41 53 45 28 37 2c 20 22 78 49 6e 73     CASE(7, "xIns
22e0: 74 22 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  t") {.      int 
22f0: 69 49 64 78 2c 20 69 70 2c 20 69 63 2c 20 69 6f  iIdx, ip, ic, io
2300: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
2310: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2320: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2330: 69 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  iIdx) ){.       
2340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2350: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2360: 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e 78   rc = p->pApi->x
2370: 49 6e 73 74 28 70 2d 3e 70 46 74 73 2c 20 69 49  Inst(p->pFts, iI
2380: 64 78 2c 20 26 69 70 2c 20 26 69 63 2c 20 26 69  dx, &ip, &ic, &i
2390: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
23a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23b0: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
23c0: 70 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  pList = Tcl_NewO
23d0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63  bj();.        Tc
23e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
23f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2400: 4c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  List, Tcl_NewInt
2410: 4f 62 6a 28 69 70 29 29 3b 0a 20 20 20 20 20 20  Obj(ip));.      
2420: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2430: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2440: 70 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65  p, pList, Tcl_Ne
2450: 77 49 6e 74 4f 62 6a 28 69 63 29 29 3b 0a 20 20  wIntObj(ic));.  
2460: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
2470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2480: 6e 74 65 72 70 2c 20 70 4c 69 73 74 2c 20 54 63  nterp, pList, Tc
2490: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 6f 29 29  l_NewIntObj(io))
24a0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
24b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24c0: 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  p, pList);.     
24d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
24e0: 20 20 20 20 7d 0a 20 20 20 20 43 41 53 45 28 38      }.    CASE(8
24f0: 2c 20 22 78 52 6f 77 69 64 22 29 20 7b 0a 20 20  , "xRowid") {.  
2500: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2510: 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 70 41  4 iRowid = p->pA
2520: 70 69 2d 3e 78 52 6f 77 69 64 28 70 2d 3e 70 46  pi->xRowid(p->pF
2530: 74 73 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ts);.      Tcl_S
2540: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2550: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2560: 6e 74 4f 62 6a 28 69 52 6f 77 69 64 29 29 3b 0a  ntObj(iRowid));.
2570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2580: 20 7d 0a 20 20 20 20 43 41 53 45 28 39 2c 20 22   }.    CASE(9, "
2590: 78 43 6f 6c 75 6d 6e 54 65 78 74 22 29 20 7b 0a  xColumnText") {.
25a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25b0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 69   *z = 0;.      i
25c0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
25d0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
25e0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
25f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2600: 6a 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29 7b  jv[2], &iCol) ){
2610: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2620: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2630: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d   }.      rc = p-
2640: 3e 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54 65  >pApi->xColumnTe
2650: 78 74 28 70 2d 3e 70 46 74 73 2c 20 69 43 6f 6c  xt(p->pFts, iCol
2660: 2c 20 26 7a 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &z, &n);.     
2670: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2680: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
2690: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
26a0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
26b0: 72 69 6e 67 4f 62 6a 28 7a 2c 20 6e 29 29 3b 0a  ringObj(z, n));.
26c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
26d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43  eak;.    }.    C
26e0: 41 53 45 28 31 30 2c 20 22 78 43 6f 6c 75 6d 6e  ASE(10, "xColumn
26f0: 53 69 7a 65 22 29 20 7b 0a 20 20 20 20 20 20 69  Size") {.      i
2700: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2710: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
2720: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2730: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2740: 6a 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29 7b  jv[2], &iCol) ){
2750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2770: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d   }.      rc = p-
2780: 3e 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 53 69  >pApi->xColumnSi
2790: 7a 65 28 70 2d 3e 70 46 74 73 2c 20 69 43 6f 6c  ze(p->pFts, iCol
27a0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
27b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27c0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
27d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
27e0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
27f0: 28 6e 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (n));.      }.  
2800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2810: 0a 20 20 20 20 43 41 53 45 28 31 31 2c 20 22 78  .    CASE(11, "x
2820: 51 75 65 72 79 50 68 72 61 73 65 22 29 20 7b 0a  QueryPhrase") {.
2830: 20 20 20 20 20 20 69 6e 74 20 69 50 68 72 61 73        int iPhras
2840: 65 3b 0a 20 20 20 20 20 20 46 35 74 46 75 6e 63  e;.      F5tFunc
2850: 74 69 6f 6e 20 63 74 78 3b 0a 20 20 20 20 20 20  tion ctx;.      
2860: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2870: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2880: 6a 76 5b 32 5d 2c 20 26 69 50 68 72 61 73 65 29  jv[2], &iPhrase)
2890: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
28a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 74 78 2e      }.      ctx.
28c0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
28d0: 0a 20 20 20 20 20 20 63 74 78 2e 70 53 63 72 69  .      ctx.pScri
28e0: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
28f0: 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 41 70 69      rc = p->pApi
2900: 2d 3e 78 51 75 65 72 79 50 68 72 61 73 65 28 70  ->xQueryPhrase(p
2910: 2d 3e 70 46 74 73 2c 20 69 50 68 72 61 73 65 2c  ->pFts, iPhrase,
2920: 20 26 63 74 78 2c 20 78 51 75 65 72 79 50 68 72   &ctx, xQueryPhr
2930: 61 73 65 43 62 29 3b 0a 20 20 20 20 20 20 69 66  aseCb);.      if
2940: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2950: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
2960: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2970: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
2980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2990: 20 20 20 43 41 53 45 28 31 32 2c 20 22 78 53 65     CASE(12, "xSe
29a0: 74 41 75 78 64 61 74 61 22 29 20 7b 0a 20 20 20  tAuxdata") {.   
29b0: 20 20 20 46 35 74 41 75 78 44 61 74 61 20 2a 70     F5tAuxData *p
29c0: 44 61 74 61 20 3d 20 28 46 35 74 41 75 78 44 61  Data = (F5tAuxDa
29d0: 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ta*)sqlite3_mall
29e0: 6f 63 28 73 69 7a 65 6f 66 28 46 35 74 41 75 78  oc(sizeof(F5tAux
29f0: 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
2a00: 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ( pData==0 ){.  
2a10: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2a20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
2a40: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2a50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74      }.      pDat
2a70: 61 2d 3e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 32  a->pObj = objv[2
2a80: 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  ];.      Tcl_Inc
2a90: 72 52 65 66 43 6f 75 6e 74 28 70 44 61 74 61 2d  rRefCount(pData-
2aa0: 3e 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 72 63  >pObj);.      rc
2ab0: 20 3d 20 70 2d 3e 70 41 70 69 2d 3e 78 53 65 74   = p->pApi->xSet
2ac0: 41 75 78 64 61 74 61 28 70 2d 3e 70 46 74 73 2c  Auxdata(p->pFts,
2ad0: 20 70 44 61 74 61 2c 20 78 53 65 74 41 75 78 64   pData, xSetAuxd
2ae0: 61 74 61 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  ataDestructor);.
2af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b00: 20 7d 0a 20 20 20 20 43 41 53 45 28 31 33 2c 20   }.    CASE(13, 
2b10: 22 78 47 65 74 41 75 78 64 61 74 61 22 29 20 7b  "xGetAuxdata") {
2b20: 0a 20 20 20 20 20 20 46 35 74 41 75 78 44 61 74  .      F5tAuxDat
2b30: 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20  a *pData;.      
2b40: 69 6e 74 20 62 43 6c 65 61 72 3b 0a 20 20 20 20  int bClear;.    
2b50: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
2b60: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
2b70: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 43  rp, objv[2], &bC
2b80: 6c 65 61 72 29 20 29 7b 0a 20 20 20 20 20 20 20  lear) ){.       
2b90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ba0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2bb0: 20 70 44 61 74 61 20 3d 20 28 46 35 74 41 75 78   pData = (F5tAux
2bc0: 44 61 74 61 2a 29 70 2d 3e 70 41 70 69 2d 3e 78  Data*)p->pApi->x
2bd0: 47 65 74 41 75 78 64 61 74 61 28 70 2d 3e 70 46  GetAuxdata(p->pF
2be0: 74 73 2c 20 62 43 6c 65 61 72 29 3b 0a 20 20 20  ts, bClear);.   
2bf0: 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20     if( pData==0 
2c00: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
2c10: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2c20: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
2c30: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
2c40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2c50: 2c 20 70 44 61 74 61 2d 3e 70 4f 62 6a 29 3b 0a  , pData->pObj);.
2c60: 20 20 20 20 20 20 20 20 69 66 28 20 62 43 6c 65          if( bCle
2c70: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ar ){.          
2c80: 78 53 65 74 41 75 78 64 61 74 61 44 65 73 74 72  xSetAuxdataDestr
2c90: 75 63 74 6f 72 28 28 76 6f 69 64 2a 29 70 44 61  uctor((void*)pDa
2ca0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta);.        }. 
2cb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2cc0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
2cd0: 2a 20 54 68 65 73 65 20 74 77 6f 20 2d 20 78 53  * These two - xS
2ce0: 65 74 41 75 78 64 61 74 61 49 6e 74 20 61 6e 64  etAuxdataInt and
2cf0: 20 78 47 65 74 41 75 78 64 61 74 61 49 6e 74 20   xGetAuxdataInt 
2d00: 2d 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  - are similar to
2d10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 78 53 65 74   the.    ** xSet
2d20: 41 75 78 64 61 74 61 20 61 6e 64 20 78 47 65 74  Auxdata and xGet
2d30: 41 75 78 64 61 74 61 20 6d 65 74 68 6f 64 73 20  Auxdata methods 
2d40: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
2d50: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
2d60: 65 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 61 74  e.    ** is that
2d70: 20 74 68 65 79 20 6d 61 79 20 6f 6e 6c 79 20 73   they may only s
2d80: 61 76 65 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ave an integer v
2d90: 61 6c 75 65 20 61 73 20 61 75 78 69 6c 69 61 72  alue as auxiliar
2da0: 79 20 64 61 74 61 2c 20 61 6e 64 0a 20 20 20 20  y data, and.    
2db0: 2a 2a 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66  ** do not specif
2dc0: 79 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 66  y a destructor f
2dd0: 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  unction.  */.   
2de0: 20 43 41 53 45 28 31 34 2c 20 22 78 53 65 74 41   CASE(14, "xSetA
2df0: 75 78 64 61 74 61 49 6e 74 22 29 20 7b 0a 20 20  uxdataInt") {.  
2e00: 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20      int iVal;.  
2e10: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
2e20: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2e30: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c  , objv[2], &iVal
2e40: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2e50: 52 52 4f 52 3b 0a 20 20 20 20 20 20 72 63 20 3d  RROR;.      rc =
2e60: 20 70 2d 3e 70 41 70 69 2d 3e 78 53 65 74 41 75   p->pApi->xSetAu
2e70: 78 64 61 74 61 28 70 2d 3e 70 46 74 73 2c 20 28  xdata(p->pFts, (
2e80: 76 6f 69 64 2a 29 28 28 63 68 61 72 2a 29 30 20  void*)((char*)0 
2e90: 2b 20 69 56 61 6c 29 2c 20 30 29 3b 0a 20 20 20  + iVal), 0);.   
2ea0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2eb0: 20 20 20 20 43 41 53 45 28 31 35 2c 20 22 78 47      CASE(15, "xG
2ec0: 65 74 41 75 78 64 61 74 61 49 6e 74 22 29 20 7b  etAuxdataInt") {
2ed0: 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b  .      int iVal;
2ee0: 0a 20 20 20 20 20 20 69 6e 74 20 62 43 6c 65 61  .      int bClea
2ef0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  r;.      if( Tcl
2f00: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
2f10: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2f20: 32 5d 2c 20 26 62 43 6c 65 61 72 29 20 29 20 72  2], &bClear) ) r
2f30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f40: 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 28 69  .      iVal = (i
2f50: 6e 74 29 28 28 63 68 61 72 2a 29 70 2d 3e 70 41  nt)((char*)p->pA
2f60: 70 69 2d 3e 78 47 65 74 41 75 78 64 61 74 61 28  pi->xGetAuxdata(
2f70: 70 2d 3e 70 46 74 73 2c 20 62 43 6c 65 61 72 29  p->pFts, bClear)
2f80: 20 2d 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20   - (char*)0);.  
2f90: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2fa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2fb0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 29  _NewIntObj(iVal)
2fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 43 41 53 45 28      }..    CASE(
2fe0: 31 36 2c 20 22 78 50 68 72 61 73 65 46 6f 72 65  16, "xPhraseFore
2ff0: 61 63 68 22 29 20 7b 0a 20 20 20 20 20 20 69 6e  ach") {.      in
3000: 74 20 69 50 68 72 61 73 65 3b 0a 20 20 20 20 20  t iPhrase;.     
3010: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
3020: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
3030: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
3040: 6c 76 61 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  lvar;.      cons
3050: 74 20 63 68 61 72 20 2a 7a 4f 66 66 76 61 72 3b  t char *zOffvar;
3060: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
3070: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35  pScript = objv[5
3080: 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 50 68 72  ];.      Fts5Phr
3090: 61 73 65 49 74 65 72 20 69 74 65 72 3b 0a 0a 20  aseIter iter;.. 
30a0: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
30b0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
30c0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 50 68  p, objv[2], &iPh
30d0: 72 61 73 65 29 20 29 20 72 65 74 75 72 6e 20 54  rase) ) return T
30e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
30f0: 7a 43 6f 6c 76 61 72 20 3d 20 54 63 6c 5f 47 65  zColvar = Tcl_Ge
3100: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
3110: 3b 0a 20 20 20 20 20 20 7a 4f 66 66 76 61 72 20  ;.      zOffvar 
3120: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
3130: 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 20 20 20  objv[4]);..     
3140: 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e 78   rc = p->pApi->x
3150: 50 68 72 61 73 65 46 69 72 73 74 28 70 2d 3e 70  PhraseFirst(p->p
3160: 46 74 73 2c 20 69 50 68 72 61 73 65 2c 20 26 69  Fts, iPhrase, &i
3170: 74 65 72 2c 20 26 69 43 6f 6c 2c 20 26 69 4f 66  ter, &iCol, &iOf
3180: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
3190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31a0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
31b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
31c0: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
31d0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  c), 0);.        
31e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3200: 66 6f 72 28 20 3b 69 43 6f 6c 3e 3d 30 3b 20 70  for( ;iCol>=0; p
3210: 2d 3e 70 41 70 69 2d 3e 78 50 68 72 61 73 65 4e  ->pApi->xPhraseN
3220: 65 78 74 28 70 2d 3e 70 46 74 73 2c 20 26 69 74  ext(p->pFts, &it
3230: 65 72 2c 20 26 69 43 6f 6c 2c 20 26 69 4f 66 66  er, &iCol, &iOff
3240: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ) ){.        Tcl
3250: 5f 53 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _SetVar2Ex(inter
3260: 70 2c 20 7a 43 6f 6c 76 61 72 2c 20 30 2c 20 54  p, zColvar, 0, T
3270: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 43 6f  cl_NewIntObj(iCo
3280: 6c 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  l), 0);.        
3290: 54 63 6c 5f 53 65 74 56 61 72 32 45 78 28 69 6e  Tcl_SetVar2Ex(in
32a0: 74 65 72 70 2c 20 7a 4f 66 66 76 61 72 2c 20 30  terp, zOffvar, 0
32b0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
32c0: 69 4f 66 66 29 2c 20 30 29 3b 0a 20 20 20 20 20  iOff), 0);.     
32d0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
32e0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
32f0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
3300: 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43     if( rc==TCL_C
3310: 4f 4e 54 49 4e 55 45 20 29 20 72 63 20 3d 20 54  ONTINUE ) rc = T
3320: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  CL_OK;.        i
3330: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc!=TCL_OK ){
3340: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
3350: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 20 72  c==TCL_BREAK ) r
3360: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
3370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
3390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33a0: 20 7d 0a 0a 20 20 20 20 43 41 53 45 28 31 37 2c   }..    CASE(17,
33b0: 20 22 78 50 68 72 61 73 65 43 6f 6c 75 6d 6e 46   "xPhraseColumnF
33c0: 6f 72 65 61 63 68 22 29 20 7b 0a 20 20 20 20 20  oreach") {.     
33d0: 20 69 6e 74 20 69 50 68 72 61 73 65 3b 0a 20 20   int iPhrase;.  
33e0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
33f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3400: 7a 43 6f 6c 76 61 72 3b 0a 20 20 20 20 20 20 54  zColvar;.      T
3410: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
3420: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 20  = objv[4];.     
3430: 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72 20   Fts5PhraseIter 
3440: 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 69 66 28  iter;..      if(
3450: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
3460: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
3470: 32 5d 2c 20 26 69 50 68 72 61 73 65 29 20 29 20  2], &iPhrase) ) 
3480: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3490: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 76 61 72 20  ;.      zColvar 
34a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
34b0: 6f 62 6a 76 5b 33 5d 29 3b 0a 0a 20 20 20 20 20  objv[3]);..     
34c0: 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e 78   rc = p->pApi->x
34d0: 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d  PhraseFirstColum
34e0: 6e 28 70 2d 3e 70 46 74 73 2c 20 69 50 68 72 61  n(p->pFts, iPhra
34f0: 73 65 2c 20 26 69 74 65 72 2c 20 26 69 43 6f 6c  se, &iter, &iCol
3500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
3510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3520: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
3530: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
3540: 72 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  r*)sqlite3ErrNam
3550: 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  e(rc), TCL_VOLAT
3560: 49 4c 45 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ILE);.        re
3570: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3590: 72 28 20 3b 20 69 43 6f 6c 3e 3d 30 3b 20 70 2d  r( ; iCol>=0; p-
35a0: 3e 70 41 70 69 2d 3e 78 50 68 72 61 73 65 4e 65  >pApi->xPhraseNe
35b0: 78 74 43 6f 6c 75 6d 6e 28 70 2d 3e 70 46 74 73  xtColumn(p->pFts
35c0: 2c 20 26 69 74 65 72 2c 20 26 69 43 6f 6c 29 29  , &iter, &iCol))
35d0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
35e0: 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
35f0: 7a 43 6f 6c 76 61 72 2c 20 30 2c 20 54 63 6c 5f  zColvar, 0, Tcl_
3600: 4e 65 77 49 6e 74 4f 62 6a 28 69 43 6f 6c 29 2c  NewIntObj(iCol),
3610: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
3620: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3630: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
3640: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
3650: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
3660: 45 20 29 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  E ) rc = TCL_OK;
3670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
3680: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
3690: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
36a0: 5f 42 52 45 41 4b 20 29 20 72 63 20 3d 20 54 43  _BREAK ) rc = TC
36b0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
36c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
36d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
36e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
36f0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
3700: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
3720: 23 75 6e 64 65 66 20 43 41 53 45 0a 0a 20 20 69  #undef CASE..  i
3730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3740: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
3750: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
3760: 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  har*)sqlite3ErrN
3770: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
3780: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
3790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
37a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
37b0: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  OK;.}..static vo
37c0: 69 64 20 78 46 35 74 46 75 6e 63 74 69 6f 6e 28  id xF5tFunction(
37d0: 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74  .  const Fts5Ext
37e0: 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c  ensionApi *pApi,
37f0: 20 20 20 2f 2a 20 41 50 49 20 6f 66 66 65 72 65     /* API offere
3800: 64 20 62 79 20 63 75 72 72 65 6e 74 20 46 54 53  d by current FTS
3810: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 46 74   version */.  Ft
3820: 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c  s5Context *pFts,
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61   First arg to pa
3850: 73 73 20 74 6f 20 70 41 70 69 20 66 75 6e 63 74  ss to pApi funct
3860: 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ions */.  sqlite
3870: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
3890: 74 65 78 74 20 66 6f 72 20 72 65 74 75 72 6e 69  text for returni
38a0: 6e 67 20 72 65 73 75 6c 74 2f 65 72 72 6f 72 20  ng result/error 
38b0: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
38e0: 66 20 76 61 6c 75 65 73 20 69 6e 20 61 70 56 61  f values in apVa
38f0: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  l[] array */.  s
3900: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3910: 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
3920: 2a 20 41 72 72 61 79 20 6f 66 20 74 72 61 69 6c  * Array of trail
3930: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ing arguments */
3940: 0a 29 7b 0a 20 20 46 35 74 46 75 6e 63 74 69 6f  .){.  F5tFunctio
3950: 6e 20 2a 70 20 3d 20 28 46 35 74 46 75 6e 63 74  n *p = (F5tFunct
3960: 69 6f 6e 2a 29 70 41 70 69 2d 3e 78 55 73 65 72  ion*)pApi->xUser
3970: 44 61 74 61 28 70 46 74 73 29 3b 0a 20 20 54 63  Data(pFts);.  Tc
3980: 6c 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b 20 20 20  l_Obj *pEval;   
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39a0: 20 53 63 72 69 70 74 20 74 6f 20 65 76 61 6c 75   Script to evalu
39b0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ate */.  int i;.
39c0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74 61    int rc;..  sta
39d0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
39e0: 34 20 69 43 6d 64 20 3d 20 30 3b 0a 20 20 63 68  4 iCmd = 0;.  ch
39f0: 61 72 20 7a 43 6d 64 5b 36 34 5d 3b 0a 20 20 46  ar zCmd[64];.  F
3a00: 35 74 41 70 69 20 73 41 70 69 3b 0a 20 20 73 41  5tApi sApi;.  sA
3a10: 70 69 2e 70 41 70 69 20 3d 20 70 41 70 69 3b 0a  pi.pApi = pApi;.
3a20: 20 20 73 41 70 69 2e 70 46 74 73 20 3d 20 70 46    sApi.pFts = pF
3a30: 74 73 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a  ts;..  sprintf(z
3a40: 43 6d 64 2c 20 22 66 35 74 5f 25 6c 6c 64 22 2c  Cmd, "f5t_%lld",
3a50: 20 69 43 6d 64 2b 2b 29 3b 0a 20 20 54 63 6c 5f   iCmd++);.  Tcl_
3a60: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
3a70: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 7a 43 6d 64  (p->interp, zCmd
3a80: 2c 20 78 46 35 74 41 70 69 2c 20 26 73 41 70 69  , xF5tApi, &sApi
3a90: 2c 20 30 29 3b 0a 20 20 70 45 76 61 6c 20 3d 20  , 0);.  pEval = 
3aa0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
3ab0: 28 70 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  (p->pScript);.  
3ac0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3ad0: 28 70 45 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c  (pEval);.  Tcl_L
3ae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3af0: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
3b00: 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77 53 74 72  Eval, Tcl_NewStr
3b10: 69 6e 67 4f 62 6a 28 7a 43 6d 64 2c 20 2d 31 29  ingObj(zCmd, -1)
3b20: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
3b30: 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
3b40: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d   Tcl_Obj *pObj =
3b50: 20 30 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   0;.    switch( 
3b60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3b70: 70 65 28 61 70 56 61 6c 5b 69 5d 29 20 29 7b 0a  pe(apVal[i]) ){.
3b80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
3b90: 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  E_TEXT:.        
3ba0: 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pObj = Tcl_NewSt
3bb0: 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63  ringObj((const c
3bc0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
3bd0: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 5d  ue_text(apVal[i]
3be0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
3bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
3c00: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
3c10: 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63         pObj = Tc
3c20: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
3c30: 6a 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  j(.            s
3c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
3c50: 62 28 61 70 56 61 6c 5b 69 5d 29 2c 20 73 71 6c  b(apVal[i]), sql
3c60: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
3c70: 28 61 70 56 61 6c 5b 69 5d 29 0a 20 20 20 20 20  (apVal[i]).     
3c80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72     );.        br
3c90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
3ca0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
3cb0: 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54          pObj = T
3cc0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
3cd0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  (sqlite3_value_i
3ce0: 6e 74 36 34 28 61 70 56 61 6c 5b 69 5d 29 29 3b  nt64(apVal[i]));
3cf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3d00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
3d10: 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20  E_FLOAT:.       
3d20: 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 44   pObj = Tcl_NewD
3d30: 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33  oubleObj(sqlite3
3d40: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 70  _value_double(ap
3d50: 56 61 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Val[i]));.      
3d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
3d70: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
3d80: 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pObj = Tcl_NewOb
3d90: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  j();.        bre
3da0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ak;.    }.    Tc
3db0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3dc0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
3dd0: 2c 20 70 45 76 61 6c 2c 20 70 4f 62 6a 29 3b 0a  , pEval, pObj);.
3de0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f    }..  rc = Tcl_
3df0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
3e00: 65 72 70 2c 20 70 45 76 61 6c 2c 20 54 43 4c 5f  erp, pEval, TCL_
3e10: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
3e20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3e30: 28 70 45 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 44  (pEval);.  Tcl_D
3e40: 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 70 2d 3e  eleteCommand(p->
3e50: 69 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 0a  interp, zCmd);..
3e60: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3e70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3e80: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
3e90: 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  x, Tcl_GetString
3ea0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
3eb0: 29 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ), -1);.  }else{
3ec0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  .    Tcl_Obj *pV
3ed0: 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  ar = Tcl_GetObjR
3ee0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
3ef0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
3f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
3f10: 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65  pe = (pVar->type
3f20: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
3f30: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b  Ptr->name : "");
3f40: 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54  .    char c = zT
3f50: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ype[0];.    if( 
3f60: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
3f70: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
3f80: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
3f90: 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  bytes==0 ){.    
3fa0: 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e    /* Only return
3fb0: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
3fc0: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
3fd0: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
3fe0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  and.      ** has
3ff0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
4000: 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  sentation. */.  
4010: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4020: 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 65  r *data = Tcl_Ge
4030: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
4040: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
4050: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4060: 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20 64 61 74  t_blob(pCtx, dat
4070: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41  a, n, SQLITE_TRA
4080: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
4090: 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  se if( c=='b' &&
40a0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
40b0: 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20  oolean")==0 ){. 
40c0: 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46       Tcl_GetIntF
40d0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
40e0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
40f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
4100: 74 78 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  tx, n);.    }els
4110: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
4120: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
4130: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
4140: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
4150: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
4160: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
4170: 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &r);.      sqli
4180: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
4190: 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20  e(pCtx, r);.    
41a0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
41b0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
41c0: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
41d0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
41e0: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
41f0: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
4200: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
4210: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
4220: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
4230: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
4240: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4250: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
4260: 74 78 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  tx, v);.    }els
4270: 65 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  e{.      unsigne
4280: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 28  d char *data = (
4290: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
42a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
42b0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
42c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
42d0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
42e0: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
42f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4300: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
4310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 46 35  .static void xF5
4320: 74 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  tDestroy(void *p
4330: 43 74 78 29 7b 0a 20 20 46 35 74 46 75 6e 63 74  Ctx){.  F5tFunct
4340: 69 6f 6e 20 2a 70 20 3d 20 28 46 35 74 46 75 6e  ion *p = (F5tFun
4350: 63 74 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 54  ction*)pCtx;.  T
4360: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4370: 70 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 63  p->pScript);.  c
4380: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 70 29  kfree((char *)p)
4390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
43a0: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72 65  sqlite3_fts5_cre
43b0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20  ate_function DB 
43c0: 4e 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  NAME SCRIPT.**.*
43d0: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 2e 2e 2e  * Description...
43e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
43f0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 35 74  QLITE_TCLAPI f5t
4400: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 0a  CreateFunction(.
4410: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
4420: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
4430: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
4440: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
4450: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
4460: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4470: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4480: 69 70 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ipt;.  sqlite3 *
4490: 64 62 20 3d 20 30 3b 0a 20 20 66 74 73 35 5f 61  db = 0;.  fts5_a
44a0: 70 69 20 2a 70 41 70 69 20 3d 20 30 3b 0a 20 20  pi *pApi = 0;.  
44b0: 46 35 74 46 75 6e 63 74 69 6f 6e 20 2a 70 43 74  F5tFunction *pCt
44c0: 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  x = 0;.  int rc;
44d0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
44e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
44f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4500: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d  1, objv, "DB NAM
4510: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
4520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4530: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 35 74 44  ;.  }.  if( f5tD
4540: 62 41 6e 64 41 70 69 28 69 6e 74 65 72 70 2c 20  bAndApi(interp, 
4550: 6f 62 6a 76 5b 31 5d 2c 20 26 64 62 2c 20 26 70  objv[1], &db, &p
4560: 41 70 69 29 20 29 20 72 65 74 75 72 6e 20 54 43  Api) ) return TC
4570: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d  L_ERROR;..  zNam
4580: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
4590: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 53  g(objv[2]);.  pS
45a0: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
45b0: 0a 20 20 70 43 74 78 20 3d 20 28 46 35 74 46 75  .  pCtx = (F5tFu
45c0: 6e 63 74 69 6f 6e 2a 29 63 6b 61 6c 6c 6f 63 28  nction*)ckalloc(
45d0: 73 69 7a 65 6f 66 28 46 35 74 46 75 6e 63 74 69  sizeof(F5tFuncti
45e0: 6f 6e 29 29 3b 0a 20 20 70 43 74 78 2d 3e 69 6e  on));.  pCtx->in
45f0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
4600: 20 70 43 74 78 2d 3e 70 53 63 72 69 70 74 20 3d   pCtx->pScript =
4610: 20 70 53 63 72 69 70 74 3b 0a 20 20 54 63 6c 5f   pScript;.  Tcl_
4620: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
4630: 72 69 70 74 29 3b 0a 0a 20 20 72 63 20 3d 20 70  ript);..  rc = p
4640: 41 70 69 2d 3e 78 43 72 65 61 74 65 46 75 6e 63  Api->xCreateFunc
4650: 74 69 6f 6e 28 0a 20 20 20 20 20 20 70 41 70 69  tion(.      pApi
4660: 2c 20 7a 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  , zName, (void*)
4670: 70 43 74 78 2c 20 78 46 35 74 46 75 6e 63 74 69  pCtx, xF5tFuncti
4680: 6f 6e 2c 20 78 46 35 74 44 65 73 74 72 6f 79 0a  on, xF5tDestroy.
4690: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
46a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
46b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
46c0: 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 3a  (interp, "error:
46d0: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
46e0: 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
46f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4700: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4710: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64  TCL_OK;.}..typed
4720: 65 66 20 73 74 72 75 63 74 20 46 35 74 54 6f 6b  ef struct F5tTok
4730: 65 6e 69 7a 65 43 74 78 20 46 35 74 54 6f 6b 65  enizeCtx F5tToke
4740: 6e 69 7a 65 43 74 78 3b 0a 73 74 72 75 63 74 20  nizeCtx;.struct 
4750: 46 35 74 54 6f 6b 65 6e 69 7a 65 43 74 78 20 7b  F5tTokenizeCtx {
4760: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
4770: 3b 0a 20 20 69 6e 74 20 62 53 75 62 73 74 3b 0a  ;.  int bSubst;.
4780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
4790: 6e 70 75 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63  nput;.};..static
47a0: 20 69 6e 74 20 78 54 6f 6b 65 6e 69 7a 65 43 62   int xTokenizeCb
47b0: 32 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  2(.  void *pCtx,
47c0: 20 0a 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 0a   .  int tflags,.
47d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
47e0: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
47f0: 2c 20 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  , .  int iStart,
4800: 20 69 6e 74 20 69 45 6e 64 0a 29 7b 0a 20 20 46   int iEnd.){.  F
4810: 35 74 54 6f 6b 65 6e 69 7a 65 43 74 78 20 2a 70  5tTokenizeCtx *p
4820: 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65 43   = (F5tTokenizeC
4830: 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20  tx*)pCtx;.  if( 
4840: 70 2d 3e 62 53 75 62 73 74 20 29 7b 0a 20 20 20  p->bSubst ){.   
4850: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4860: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 2d 3e  ndElement(0, p->
4870: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
4880: 69 6e 67 4f 62 6a 28 7a 54 6f 6b 65 6e 2c 20 6e  ingObj(zToken, n
4890: 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c  Token));.    Tcl
48a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
48b0: 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 20 20 30  ement(.        0
48c0: 2c 20 70 2d 3e 70 52 65 74 2c 20 54 63 6c 5f 4e  , p->pRet, Tcl_N
48d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 26 70 2d 3e  ewStringObj(&p->
48e0: 7a 49 6e 70 75 74 5b 69 53 74 61 72 74 5d 2c 20  zInput[iStart], 
48f0: 69 45 6e 64 2d 69 53 74 61 72 74 29 0a 20 20 20  iEnd-iStart).   
4900: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
4910: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4920: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 2d 3e  ndElement(0, p->
4930: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
4940: 69 6e 67 4f 62 6a 28 7a 54 6f 6b 65 6e 2c 20 6e  ingObj(zToken, n
4950: 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c  Token));.    Tcl
4960: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4970: 65 6d 65 6e 74 28 30 2c 20 70 2d 3e 70 52 65 74  ement(0, p->pRet
4980: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
4990: 69 53 74 61 72 74 29 29 3b 0a 20 20 20 20 54 63  iStart));.    Tc
49a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
49b0: 6c 65 6d 65 6e 74 28 30 2c 20 70 2d 3e 70 52 65  lement(0, p->pRe
49c0: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
49d0: 28 69 45 6e 64 29 29 3b 0a 20 20 7d 0a 20 20 72  (iEnd));.  }.  r
49e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
49f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  .}.../*.**      
4a00: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 74 6f 6b  sqlite3_fts5_tok
4a10: 65 6e 69 7a 65 20 44 42 20 54 4f 4b 45 4e 49 5a  enize DB TOKENIZ
4a20: 45 52 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 44 65  ER TEXT.**.** De
4a30: 73 63 72 69 70 74 69 6f 6e 2e 2e 2e 0a 2a 2f 0a  scription....*/.
4a40: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
4a50: 45 5f 54 43 4c 41 50 49 20 66 35 74 54 6f 6b 65  E_TCLAPI f5tToke
4a60: 6e 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  nize(.  void * c
4a70: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
4a80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4a90: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
4aa0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
4ab0: 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
4ac0: 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 6e 54 65  zText;.  int nTe
4ad0: 78 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  xt;.  sqlite3 *d
4ae0: 62 20 3d 20 30 3b 0a 20 20 66 74 73 35 5f 61 70  b = 0;.  fts5_ap
4af0: 69 20 2a 70 41 70 69 20 3d 20 30 3b 0a 20 20 46  i *pApi = 0;.  F
4b00: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  ts5Tokenizer *pT
4b10: 6f 6b 20 3d 20 30 3b 0a 20 20 66 74 73 35 5f 74  ok = 0;.  fts5_t
4b20: 6f 6b 65 6e 69 7a 65 72 20 74 6f 6b 65 6e 69 7a  okenizer tokeniz
4b30: 65 72 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  er;.  Tcl_Obj *p
4b40: 52 65 74 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  Ret = 0;.  void 
4b50: 2a 70 55 73 65 72 64 61 74 61 3b 0a 20 20 69 6e  *pUserdata;.  in
4b60: 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 6e 41 72  t rc;..  int nAr
4b70: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
4b80: 2a 2a 61 7a 41 72 67 3b 0a 20 20 46 35 74 54 6f  **azArg;.  F5tTo
4b90: 6b 65 6e 69 7a 65 43 74 78 20 63 74 78 3b 0a 0a  kenizeCtx ctx;..
4ba0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
4bb0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
4bc0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4bd0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
4be0: 2c 20 22 3f 2d 73 75 62 73 74 3f 20 44 42 20 4e  , "?-subst? DB N
4bf0: 41 4d 45 20 54 45 58 54 22 29 3b 0a 20 20 20 20  AME TEXT");.    
4c00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4c10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
4c20: 3d 3d 35 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==5 ){.    char 
4c30: 2a 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  *zOpt = Tcl_GetS
4c40: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
4c50: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 22      if( strcmp("
4c60: 2d 73 75 62 73 74 22 2c 20 7a 4f 70 74 29 20 29  -subst", zOpt) )
4c70: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
4c80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4c90: 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
4ca0: 70 74 69 6f 6e 3a 20 22 2c 20 7a 4f 70 74 2c 20  ption: ", zOpt, 
4cb0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
4cc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4cd0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 35 74 44  }.  }.  if( f5tD
4ce0: 62 41 6e 64 41 70 69 28 69 6e 74 65 72 70 2c 20  bAndApi(interp, 
4cf0: 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 2c 20 26 64  objv[objc-3], &d
4d00: 62 2c 20 26 70 41 70 69 29 20 29 20 72 65 74 75  b, &pApi) ) retu
4d10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4d20: 69 66 28 20 54 63 6c 5f 53 70 6c 69 74 4c 69 73  if( Tcl_SplitLis
4d30: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  t(interp, Tcl_Ge
4d40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
4d50: 63 2d 32 5d 29 2c 20 26 6e 41 72 67 2c 20 26 61  c-2]), &nArg, &a
4d60: 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74  zArg) ){.    ret
4d70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4d80: 20 7d 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30   }.  if( nArg==0
4d90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4da0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4db0: 20 22 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69   "no such tokeni
4dc0: 7a 65 72 3a 20 22 2c 20 30 29 3b 0a 20 20 20 20  zer: ", 0);.    
4dd0: 54 63 6c 5f 46 72 65 65 28 28 76 6f 69 64 2a 29  Tcl_Free((void*)
4de0: 61 7a 41 72 67 29 3b 0a 20 20 20 20 72 65 74 75  azArg);.    retu
4df0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4e00: 7d 0a 20 20 7a 54 65 78 74 20 3d 20 54 63 6c 5f  }.  zText = Tcl_
4e10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4e20: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26  (objv[objc-1], &
4e30: 6e 54 65 78 74 29 3b 0a 0a 20 20 72 63 20 3d 20  nText);..  rc = 
4e40: 70 41 70 69 2d 3e 78 46 69 6e 64 54 6f 6b 65 6e  pApi->xFindToken
4e50: 69 7a 65 72 28 70 41 70 69 2c 20 61 7a 41 72 67  izer(pApi, azArg
4e60: 5b 30 5d 2c 20 26 70 55 73 65 72 64 61 74 61 2c  [0], &pUserdata,
4e70: 20 26 74 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20   &tokenizer);.  
4e80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4e90: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
4ea0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4eb0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e  , "no such token
4ec0: 69 7a 65 72 3a 20 22 2c 20 61 7a 41 72 67 5b 30  izer: ", azArg[0
4ed0: 5d 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ], 0);.    retur
4ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4ef0: 0a 0a 20 20 72 63 20 3d 20 74 6f 6b 65 6e 69 7a  ..  rc = tokeniz
4f00: 65 72 2e 78 43 72 65 61 74 65 28 70 55 73 65 72  er.xCreate(pUser
4f10: 64 61 74 61 2c 20 26 61 7a 41 72 67 5b 31 5d 2c  data, &azArg[1],
4f20: 20 6e 41 72 67 2d 31 2c 20 26 70 54 6f 6b 29 3b   nArg-1, &pTok);
4f30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4f40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
4f50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4f60: 65 72 70 2c 20 22 65 72 72 6f 72 20 69 6e 20 74  erp, "error in t
4f70: 6f 6b 65 6e 69 7a 65 72 2e 78 43 72 65 61 74 65  okenizer.xCreate
4f80: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ()", 0);.    ret
4f90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4fa0: 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c   }..  pRet = Tcl
4fb0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c  _NewObj();.  Tcl
4fc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
4fd0: 65 74 29 3b 0a 20 20 63 74 78 2e 62 53 75 62 73  et);.  ctx.bSubs
4fe0: 74 20 3d 20 28 6f 62 6a 63 3d 3d 35 29 3b 0a 20  t = (objc==5);. 
4ff0: 20 63 74 78 2e 70 52 65 74 20 3d 20 70 52 65 74   ctx.pRet = pRet
5000: 3b 0a 20 20 63 74 78 2e 7a 49 6e 70 75 74 20 3d  ;.  ctx.zInput =
5010: 20 7a 54 65 78 74 3b 0a 20 20 72 63 20 3d 20 74   zText;.  rc = t
5020: 6f 6b 65 6e 69 7a 65 72 2e 78 54 6f 6b 65 6e 69  okenizer.xTokeni
5030: 7a 65 28 0a 20 20 20 20 20 20 70 54 6f 6b 2c 20  ze(.      pTok, 
5040: 28 76 6f 69 64 2a 29 26 63 74 78 2c 20 46 54 53  (void*)&ctx, FTS
5050: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
5060: 45 4e 54 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78  ENT, zText, nTex
5070: 74 2c 20 78 54 6f 6b 65 6e 69 7a 65 43 62 32 0a  t, xTokenizeCb2.
5080: 20 20 29 3b 0a 20 20 74 6f 6b 65 6e 69 7a 65 72    );.  tokenizer
5090: 2e 78 44 65 6c 65 74 65 28 70 54 6f 6b 29 3b 0a  .xDelete(pTok);.
50a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
50b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
50c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
50d0: 72 70 2c 20 22 65 72 72 6f 72 20 69 6e 20 74 6f  rp, "error in to
50e0: 6b 65 6e 69 7a 65 72 2e 78 54 6f 6b 65 6e 69 7a  kenizer.xTokeniz
50f0: 65 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 54 63  e()", 0);.    Tc
5100: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5110: 52 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ret);.    return
5120: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5130: 0a 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 76 6f  ..  Tcl_Free((vo
5140: 69 64 2a 29 61 7a 41 72 67 29 3b 0a 20 20 54 63  id*)azArg);.  Tc
5150: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
5160: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
5170: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5180: 28 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  (pRet);.  return
5190: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a   TCL_OK;.}../***
51a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51e0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20  ******.** Start 
51f0: 6f 66 20 74 6f 6b 65 6e 69 7a 65 72 20 77 72 61  of tokenizer wra
5200: 70 70 65 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  pper..*/..typede
5210: 66 20 73 74 72 75 63 74 20 46 35 74 54 6f 6b 65  f struct F5tToke
5220: 6e 69 7a 65 72 43 6f 6e 74 65 78 74 20 46 35 74  nizerContext F5t
5230: 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e 74 65 78 74  TokenizerContext
5240: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
5250: 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 62 20   F5tTokenizerCb 
5260: 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 62 3b 0a  F5tTokenizerCb;.
5270: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
5280: 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c  5tTokenizerModul
5290: 65 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f  e F5tTokenizerMo
52a0: 64 75 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74  dule;.typedef st
52b0: 72 75 63 74 20 46 35 74 54 6f 6b 65 6e 69 7a 65  ruct F5tTokenize
52c0: 72 49 6e 73 74 61 6e 63 65 20 46 35 74 54 6f 6b  rInstance F5tTok
52d0: 65 6e 69 7a 65 72 49 6e 73 74 61 6e 63 65 3b 0a  enizerInstance;.
52e0: 0a 73 74 72 75 63 74 20 46 35 74 54 6f 6b 65 6e  .struct F5tToken
52f0: 69 7a 65 72 43 6f 6e 74 65 78 74 20 7b 0a 20 20  izerContext {.  
5300: 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20 69 6e  void *pCtx;.  in
5310: 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64  t (*xToken)(void
5320: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68  *, int, const ch
5330: 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  ar*, int, int, i
5340: 6e 74 29 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  nt);.};..struct 
5350: 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  F5tTokenizerModu
5360: 6c 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  le {.  Tcl_Inter
5370: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
5380: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
5390: 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e   F5tTokenizerCon
53a0: 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 3b 0a  text *pContext;.
53b0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 35 74 54 6f  };..struct F5tTo
53c0: 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e 63 65 20  kenizerInstance 
53d0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
53e0: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
53f0: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 46 35  j *pScript;.  F5
5400: 74 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e 74 65 78  tTokenizerContex
5410: 74 20 2a 70 43 6f 6e 74 65 78 74 3b 0a 7d 3b 0a  t *pContext;.};.
5420: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 35 74 54  .static int f5tT
5430: 6f 6b 65 6e 69 7a 65 72 43 72 65 61 74 65 28 0a  okenizerCreate(.
5440: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
5450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
5460: 41 72 67 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Arg, .  int nArg
5470: 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  , .  Fts5Tokeniz
5480: 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20  er **ppOut.){.  
5490: 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  F5tTokenizerModu
54a0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 46 35 74 54  le *pMod = (F5tT
54b0: 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 2a 29  okenizerModule*)
54c0: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
54d0: 2a 70 45 76 61 6c 3b 0a 20 20 69 6e 74 20 72 63  *pEval;.  int rc
54e0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 69 6e 74   = TCL_OK;.  int
54f0: 20 69 3b 0a 0a 20 20 70 45 76 61 6c 20 3d 20 54   i;..  pEval = T
5500: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5510: 70 4d 6f 64 2d 3e 70 53 63 72 69 70 74 29 3b 0a  pMod->pScript);.
5520: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5530: 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20 66 6f 72  nt(pEval);.  for
5540: 28 69 3d 30 3b 20 72 63 3d 3d 54 43 4c 5f 4f 4b  (i=0; rc==TCL_OK
5550: 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29   && i<nArg; i++)
5560: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5570: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Obj = Tcl_NewStr
5580: 69 6e 67 4f 62 6a 28 61 7a 41 72 67 5b 69 5d 2c  ingObj(azArg[i],
5590: 20 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 54   -1);.    rc = T
55a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
55b0: 45 6c 65 6d 65 6e 74 28 70 4d 6f 64 2d 3e 69 6e  Element(pMod->in
55c0: 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 70 4f 62  terp, pEval, pOb
55d0: 6a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  j);.  }..  if( r
55e0: 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
55f0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
5600: 6a 45 78 28 70 4d 6f 64 2d 3e 69 6e 74 65 72 70  jEx(pMod->interp
5610: 2c 20 70 45 76 61 6c 2c 20 54 43 4c 5f 47 4c 4f  , pEval, TCL_GLO
5620: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 20  BAL_ONLY);.  }. 
5630: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5640: 74 28 70 45 76 61 6c 29 3b 0a 0a 20 20 69 66 28  t(pEval);..  if(
5650: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
5660: 20 20 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 49     F5tTokenizerI
5670: 6e 73 74 61 6e 63 65 20 2a 70 49 6e 73 74 3b 0a  nstance *pInst;.
5680: 20 20 20 20 70 49 6e 73 74 20 3d 20 28 46 35 74      pInst = (F5t
5690: 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e 63  TokenizerInstanc
56a0: 65 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  e*)ckalloc(sizeo
56b0: 66 28 46 35 74 54 6f 6b 65 6e 69 7a 65 72 49 6e  f(F5tTokenizerIn
56c0: 73 74 61 6e 63 65 29 29 3b 0a 20 20 20 20 6d 65  stance));.    me
56d0: 6d 73 65 74 28 70 49 6e 73 74 2c 20 30 2c 20 73  mset(pInst, 0, s
56e0: 69 7a 65 6f 66 28 46 35 74 54 6f 6b 65 6e 69 7a  izeof(F5tTokeniz
56f0: 65 72 49 6e 73 74 61 6e 63 65 29 29 3b 0a 20 20  erInstance));.  
5700: 20 20 70 49 6e 73 74 2d 3e 69 6e 74 65 72 70 20    pInst->interp 
5710: 3d 20 70 4d 6f 64 2d 3e 69 6e 74 65 72 70 3b 0a  = pMod->interp;.
5720: 20 20 20 20 70 49 6e 73 74 2d 3e 70 53 63 72 69      pInst->pScri
5730: 70 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  pt = Tcl_GetObjR
5740: 65 73 75 6c 74 28 70 4d 6f 64 2d 3e 69 6e 74 65  esult(pMod->inte
5750: 72 70 29 3b 0a 20 20 20 20 70 49 6e 73 74 2d 3e  rp);.    pInst->
5760: 70 43 6f 6e 74 65 78 74 20 3d 20 70 4d 6f 64 2d  pContext = pMod-
5770: 3e 70 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 54  >pContext;.    T
5780: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5790: 70 49 6e 73 74 2d 3e 70 53 63 72 69 70 74 29 3b  pInst->pScript);
57a0: 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 28 46  .    *ppOut = (F
57b0: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 49  ts5Tokenizer*)pI
57c0: 6e 73 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  nst;.  }..  retu
57d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
57e0: 63 20 76 6f 69 64 20 66 35 74 54 6f 6b 65 6e 69  c void f5tTokeni
57f0: 7a 65 72 44 65 6c 65 74 65 28 46 74 73 35 54 6f  zerDelete(Fts5To
5800: 6b 65 6e 69 7a 65 72 20 2a 70 29 7b 0a 20 20 46  kenizer *p){.  F
5810: 35 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61  5tTokenizerInsta
5820: 6e 63 65 20 2a 70 49 6e 73 74 20 3d 20 28 46 35  nce *pInst = (F5
5830: 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e  tTokenizerInstan
5840: 63 65 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63  ce*)p;.  Tcl_Dec
5850: 72 52 65 66 43 6f 75 6e 74 28 70 49 6e 73 74 2d  rRefCount(pInst-
5860: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 63 6b 66  >pScript);.  ckf
5870: 72 65 65 28 28 63 68 61 72 20 2a 29 70 49 6e 73  ree((char *)pIns
5880: 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  t);.}..static in
5890: 74 20 66 35 74 54 6f 6b 65 6e 69 7a 65 72 54 6f  t f5tTokenizerTo
58a0: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54 6f  kenize(.  Fts5To
58b0: 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 0a 20 20 76  kenizer *p, .  v
58c0: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
58d0: 20 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73 74 20   flags,.  const 
58e0: 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74  char *pText, int
58f0: 20 6e 54 65 78 74 2c 20 0a 20 20 69 6e 74 20 28   nText, .  int (
5900: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
5910: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  int, const char*
5920: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
5930: 0a 29 7b 0a 20 20 46 35 74 54 6f 6b 65 6e 69 7a  .){.  F5tTokeniz
5940: 65 72 49 6e 73 74 61 6e 63 65 20 2a 70 49 6e 73  erInstance *pIns
5950: 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65  t = (F5tTokenize
5960: 72 49 6e 73 74 61 6e 63 65 2a 29 70 3b 0a 20 20  rInstance*)p;.  
5970: 76 6f 69 64 20 2a 70 4f 6c 64 43 74 78 3b 0a 20  void *pOldCtx;. 
5980: 20 69 6e 74 20 28 2a 78 4f 6c 64 54 6f 6b 65 6e   int (*xOldToken
5990: 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f  )(void*, int, co
59a0: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20  nst char*, int, 
59b0: 69 6e 74 2c 20 69 6e 74 29 3b 0a 20 20 54 63 6c  int, int);.  Tcl
59c0: 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b 0a 20 20 69  _Obj *pEval;.  i
59d0: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
59e0: 68 61 72 20 2a 7a 46 6c 61 67 73 3b 0a 0a 20 20  har *zFlags;..  
59f0: 70 4f 6c 64 43 74 78 20 3d 20 70 49 6e 73 74 2d  pOldCtx = pInst-
5a00: 3e 70 43 6f 6e 74 65 78 74 2d 3e 70 43 74 78 3b  >pContext->pCtx;
5a10: 0a 20 20 78 4f 6c 64 54 6f 6b 65 6e 20 3d 20 70  .  xOldToken = p
5a20: 49 6e 73 74 2d 3e 70 43 6f 6e 74 65 78 74 2d 3e  Inst->pContext->
5a30: 78 54 6f 6b 65 6e 3b 0a 0a 20 20 70 49 6e 73 74  xToken;..  pInst
5a40: 2d 3e 70 43 6f 6e 74 65 78 74 2d 3e 70 43 74 78  ->pContext->pCtx
5a50: 20 3d 20 70 43 74 78 3b 0a 20 20 70 49 6e 73 74   = pCtx;.  pInst
5a60: 2d 3e 70 43 6f 6e 74 65 78 74 2d 3e 78 54 6f 6b  ->pContext->xTok
5a70: 65 6e 20 3d 20 78 54 6f 6b 65 6e 3b 0a 0a 20 20  en = xToken;..  
5a80: 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 66  assert( .      f
5a90: 6c 61 67 73 3d 3d 46 54 53 35 5f 54 4f 4b 45 4e  lags==FTS5_TOKEN
5aa0: 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 0a 20 20 20  IZE_DOCUMENT.   
5ab0: 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 5f 54  || flags==FTS5_T
5ac0: 4f 4b 45 4e 49 5a 45 5f 41 55 58 0a 20 20 20 7c  OKENIZE_AUX.   |
5ad0: 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 5f 54 4f  | flags==FTS5_TO
5ae0: 4b 45 4e 49 5a 45 5f 51 55 45 52 59 0a 20 20 20  KENIZE_QUERY.   
5af0: 7c 7c 20 66 6c 61 67 73 3d 3d 28 46 54 53 35 5f  || flags==(FTS5_
5b00: 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20 7c  TOKENIZE_QUERY |
5b10: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50   FTS5_TOKENIZE_P
5b20: 52 45 46 49 58 29 0a 20 20 29 3b 0a 20 20 70 45  REFIX).  );.  pE
5b30: 76 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  val = Tcl_Duplic
5b40: 61 74 65 4f 62 6a 28 70 49 6e 73 74 2d 3e 70 53  ateObj(pInst->pS
5b50: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 49 6e  cript);.  Tcl_In
5b60: 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76 61 6c  crRefCount(pEval
5b70: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
5b80: 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46  gs ){.    case F
5b90: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43  TS5_TOKENIZE_DOC
5ba0: 55 4d 45 4e 54 3a 0a 20 20 20 20 20 20 7a 46 6c  UMENT:.      zFl
5bb0: 61 67 73 20 3d 20 22 64 6f 63 75 6d 65 6e 74 22  ags = "document"
5bc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5bd0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 4f 4b     case FTS5_TOK
5be0: 45 4e 49 5a 45 5f 41 55 58 3a 0a 20 20 20 20 20  ENIZE_AUX:.     
5bf0: 20 7a 46 6c 61 67 73 20 3d 20 22 61 75 78 22 3b   zFlags = "aux";
5c00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c10: 20 20 63 61 73 65 20 46 54 53 35 5f 54 4f 4b 45    case FTS5_TOKE
5c20: 4e 49 5a 45 5f 51 55 45 52 59 3a 0a 20 20 20 20  NIZE_QUERY:.    
5c30: 20 20 7a 46 6c 61 67 73 20 3d 20 22 71 75 65 72    zFlags = "quer
5c40: 79 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  y";.      break;
5c50: 0a 20 20 20 20 63 61 73 65 20 28 46 54 53 35 5f  .    case (FTS5_
5c60: 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58 20  TOKENIZE_PREFIX 
5c70: 7c 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f  | FTS5_TOKENIZE_
5c80: 51 55 45 52 59 29 3a 0a 20 20 20 20 20 20 7a 46  QUERY):.      zF
5c90: 6c 61 67 73 20 3d 20 22 70 72 65 66 69 78 71 75  lags = "prefixqu
5ca0: 65 72 79 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ery";.      brea
5cb0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
5cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
5cd0: 29 3b 0a 20 20 20 20 20 20 7a 46 6c 61 67 73 20  );.      zFlags 
5ce0: 3d 20 22 69 6e 76 61 6c 69 64 22 3b 0a 20 20 20  = "invalid";.   
5cf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5d00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5d10: 6e 64 45 6c 65 6d 65 6e 74 28 70 49 6e 73 74 2d  ndElement(pInst-
5d20: 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20  >interp, pEval, 
5d30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5d40: 28 7a 46 6c 61 67 73 2c 20 2d 31 29 29 3b 0a 20  (zFlags, -1));. 
5d50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5d60: 6e 64 45 6c 65 6d 65 6e 74 28 70 49 6e 73 74 2d  ndElement(pInst-
5d70: 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20  >interp, pEval, 
5d80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5d90: 28 70 54 65 78 74 2c 6e 54 65 78 74 29 29 3b 0a  (pText,nText));.
5da0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
5db0: 62 6a 45 78 28 70 49 6e 73 74 2d 3e 69 6e 74 65  bjEx(pInst->inte
5dc0: 72 70 2c 20 70 45 76 61 6c 2c 20 54 43 4c 5f 47  rp, pEval, TCL_G
5dd0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 54  LOBAL_ONLY);.  T
5de0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5df0: 70 45 76 61 6c 29 3b 0a 0a 20 20 70 49 6e 73 74  pEval);..  pInst
5e00: 2d 3e 70 43 6f 6e 74 65 78 74 2d 3e 70 43 74 78  ->pContext->pCtx
5e10: 20 3d 20 70 4f 6c 64 43 74 78 3b 0a 20 20 70 49   = pOldCtx;.  pI
5e20: 6e 73 74 2d 3e 70 43 6f 6e 74 65 78 74 2d 3e 78  nst->pContext->x
5e30: 54 6f 6b 65 6e 20 3d 20 78 4f 6c 64 54 6f 6b 65  Token = xOldToke
5e40: 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  n;.  return rc;.
5e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
5e60: 5f 66 74 73 35 5f 74 6f 6b 65 6e 20 3f 2d 63 6f  _fts5_token ?-co
5e70: 6c 6f 63 61 74 65 64 3f 20 54 45 58 54 20 53 54  located? TEXT ST
5e80: 41 52 54 20 45 4e 44 0a 2a 2f 0a 73 74 61 74 69  ART END.*/.stati
5e90: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
5ea0: 41 50 49 20 66 35 74 54 6f 6b 65 6e 69 7a 65 72  API f5tTokenizer
5eb0: 52 65 74 75 72 6e 28 0a 20 20 76 6f 69 64 20 2a  Return(.  void *
5ec0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
5ed0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5ee0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
5ef0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
5f00: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 46 35 74 54  objv[].){.  F5tT
5f10: 6f 6b 65 6e 69 7a 65 72 43 6f 6e 74 65 78 74 20  okenizerContext 
5f20: 2a 70 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a  *p = (F5tTokeniz
5f30: 65 72 43 6f 6e 74 65 78 74 2a 29 63 6c 69 65 6e  erContext*)clien
5f40: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 53 74  tData;.  int iSt
5f50: 61 72 74 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b  art;.  int iEnd;
5f60: 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20  .  int nToken;. 
5f70: 20 69 6e 74 20 74 66 6c 61 67 73 20 3d 20 30 3b   int tflags = 0;
5f80: 0a 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 3b  .  char *zToken;
5f90: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
5fa0: 28 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20  ( objc==5 ){.   
5fb0: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 63   int nArg;.    c
5fc0: 68 61 72 20 2a 7a 41 72 67 20 3d 20 54 63 6c 5f  har *zArg = Tcl_
5fd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5fe0: 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 41 72 67 29  (objv[1], &nArg)
5ff0: 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d  ;.    if( nArg<=
6000: 31 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 26 26  10 && nArg>=2 &&
6010: 20 6d 65 6d 63 6d 70 28 22 2d 63 6f 6c 6f 63 61   memcmp("-coloca
6020: 74 65 64 22 2c 20 7a 41 72 67 2c 20 6e 41 72 67  ted", zArg, nArg
6030: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 66  )==0 ){.      tf
6040: 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 54 4f 4b  lags |= FTS5_TOK
6050: 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 3b 0a 20 20  EN_COLOCATED;.  
6060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
6070: 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 20 20 7d  oto usage;.    }
6080: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a  .  }else if( obj
6090: 63 21 3d 34 20 29 7b 0a 20 20 20 20 67 6f 74 6f  c!=4 ){.    goto
60a0: 20 75 73 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 7a   usage;.  }..  z
60b0: 54 6f 6b 65 6e 20 3d 20 54 63 6c 5f 47 65 74 53  Token = Tcl_GetS
60c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
60d0: 76 5b 6f 62 6a 63 2d 33 5d 2c 20 26 6e 54 6f 6b  v[objc-3], &nTok
60e0: 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  en);.  if( Tcl_G
60f0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
6100: 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  erp, objv[objc-2
6110: 5d 2c 20 26 69 53 74 61 72 74 29 20 0a 20 20 20  ], &iStart) .   
6120: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
6130: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6140: 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 45 6e 64  v[objc-1], &iEnd
6150: 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ) .  ){.    retu
6160: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6170: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 78 54 6f 6b  }..  if( p->xTok
6180: 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  en==0 ){.    Tcl
6190: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
61a0: 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20 20 22  terp, .        "
61b0: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 74 6f 6b  sqlite3_fts5_tok
61c0: 65 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  en may only be u
61d0: 73 65 64 20 62 79 20 74 6f 6b 65 6e 69 7a 65 72  sed by tokenizer
61e0: 20 63 61 6c 6c 62 61 63 6b 22 2c 20 30 0a 20 20   callback", 0.  
61f0: 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20    );.    return 
6200: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
6210: 20 20 72 63 20 3d 20 70 2d 3e 78 54 6f 6b 65 6e    rc = p->xToken
6220: 28 70 2d 3e 70 43 74 78 2c 20 74 66 6c 61 67 73  (p->pCtx, tflags
6230: 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , zToken, nToken
6240: 2c 20 69 53 74 61 72 74 2c 20 69 45 6e 64 29 3b  , iStart, iEnd);
6250: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
6260: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 2a 29  (interp, (char*)
6270: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
6280: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
6290: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3d 3d  );.  return rc==
62a0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
62b0: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  OK : TCL_ERROR;.
62c0: 0a 20 75 73 61 67 65 3a 0a 20 20 54 63 6c 5f 57  . usage:.  Tcl_W
62d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
62e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
62f0: 63 6f 6c 6f 63 61 74 65 64 3f 20 54 45 58 54 20  colocated? TEXT 
6300: 53 54 41 52 54 20 45 4e 44 22 29 3b 0a 20 20 72  START END");.  r
6310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6320: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
6330: 66 35 74 44 65 6c 54 6f 6b 65 6e 69 7a 65 72 28  f5tDelTokenizer(
6340: 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 46  void *pCtx){.  F
6350: 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c  5tTokenizerModul
6360: 65 20 2a 70 4d 6f 64 20 3d 20 28 46 35 74 54 6f  e *pMod = (F5tTo
6370: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 2a 29 70  kenizerModule*)p
6380: 43 74 78 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  Ctx;.  Tcl_DecrR
6390: 65 66 43 6f 75 6e 74 28 70 4d 6f 64 2d 3e 70 53  efCount(pMod->pS
63a0: 63 72 69 70 74 29 3b 0a 20 20 63 6b 66 72 65 65  cript);.  ckfree
63b0: 28 28 63 68 61 72 20 2a 29 70 4d 6f 64 29 3b 0a  ((char *)pMod);.
63c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 73 71  }../*.**      sq
63d0: 6c 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74  lite3_fts5_creat
63e0: 65 5f 74 6f 6b 65 6e 69 7a 65 72 20 44 42 20 4e  e_tokenizer DB N
63f0: 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a  AME SCRIPT.**.**
6400: 20 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b 65   Register a toke
6410: 6e 69 7a 65 72 20 6e 61 6d 65 64 20 4e 41 4d 45  nizer named NAME
6420: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
6430: 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 57  script SCRIPT. W
6440: 68 65 6e 0a 2a 2a 20 61 20 74 6f 6b 65 6e 69 7a  hen.** a tokeniz
6450: 65 72 20 69 6e 73 74 61 6e 63 65 20 69 73 20 63  er instance is c
6460: 72 65 61 74 65 64 20 28 66 74 73 35 5f 74 6f 6b  reated (fts5_tok
6470: 65 6e 69 7a 65 72 2e 78 43 72 65 61 74 65 29 2c  enizer.xCreate),
6480: 20 61 6e 79 20 74 6f 6b 65 6e 69 7a 65 72 0a 2a   any tokenizer.*
6490: 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  * arguments are 
64a0: 61 70 70 65 6e 64 65 64 20 74 6f 20 53 43 52 49  appended to SCRI
64b0: 50 54 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  PT and the resul
64c0: 74 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  t executed..**.*
64d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
64e0: 72 6e 65 64 20 62 79 20 28 53 43 52 49 50 54 20  rned by (SCRIPT 
64f0: 2b 20 61 72 67 73 29 20 69 73 20 69 74 73 65 6c  + args) is itsel
6500: 66 20 61 20 74 63 6c 20 73 63 72 69 70 74 2e 20  f a tcl script. 
6510: 54 68 69 73 20 0a 2a 2a 20 73 63 72 69 70 74 20  This .** script 
6520: 2d 20 63 61 6c 6c 20 69 74 20 53 43 52 49 50 54  - call it SCRIPT
6530: 32 20 2d 20 69 73 20 65 78 65 63 75 74 65 64 20  2 - is executed 
6540: 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 74 65 78 74  to tokenize text
6550: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 74 6f   using the.** to
6560: 6b 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65  kenizer instance
6570: 20 22 72 65 74 75 72 6e 65 64 22 20 62 79 20 53   "returned" by S
6580: 43 52 49 50 54 2e 20 53 70 65 63 69 66 69 63 61  CRIPT. Specifica
6590: 6c 6c 79 2c 20 74 6f 20 74 6f 6b 65 6e 69 7a 65  lly, to tokenize
65a0: 0a 2a 2a 20 74 65 78 74 20 53 43 52 49 50 54 32  .** text SCRIPT2
65b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
65c0: 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
65d0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69  nt appended to i
65e0: 74 20 2d 20 74 68 65 0a 2a 2a 20 74 65 78 74 20  t - the.** text 
65f0: 74 6f 20 74 6f 6b 65 6e 69 7a 65 2e 0a 2a 2a 0a  to tokenize..**.
6600: 2a 2a 20 53 43 52 49 50 54 32 20 73 68 6f 75 6c  ** SCRIPT2 shoul
6610: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 5b 73 71  d invoke the [sq
6620: 6c 69 74 65 33 5f 66 74 73 35 5f 74 6f 6b 65 6e  lite3_fts5_token
6630: 5d 20 63 6f 6d 6d 61 6e 64 20 6f 6e 63 65 20 66  ] command once f
6640: 6f 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e  or each.** token
6650: 20 77 69 74 68 69 6e 20 74 68 65 20 74 6f 6b 65   within the toke
6660: 6e 69 7a 65 64 20 74 65 78 74 2e 0a 2a 2f 0a 73  nized text..*/.s
6670: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6680: 5f 54 43 4c 41 50 49 20 66 35 74 43 72 65 61 74  _TCLAPI f5tCreat
6690: 65 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 43 6c  eTokenizer(.  Cl
66a0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
66b0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
66c0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
66d0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
66e0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
66f0: 7b 0a 20 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72  {.  F5tTokenizer
6700: 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  Context *pContex
6710: 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65  t = (F5tTokenize
6720: 72 43 6f 6e 74 65 78 74 2a 29 63 6c 69 65 6e 74  rContext*)client
6730: 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  Data;.  sqlite3 
6740: 2a 64 62 3b 0a 20 20 66 74 73 35 5f 61 70 69 20  *db;.  fts5_api 
6750: 2a 70 41 70 69 3b 0a 20 20 63 68 61 72 20 2a 7a  *pApi;.  char *z
6760: 4e 61 6d 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Name;.  Tcl_Obj 
6770: 2a 70 53 63 72 69 70 74 3b 0a 20 20 66 74 73 35  *pScript;.  fts5
6780: 5f 74 6f 6b 65 6e 69 7a 65 72 20 74 3b 0a 20 20  _tokenizer t;.  
6790: 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  F5tTokenizerModu
67a0: 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74 20  le *pMod;.  int 
67b0: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
67c0: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
67d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
67e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
67f0: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
6800: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6810: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ROR;.  }.  if( f
6820: 35 74 44 62 41 6e 64 41 70 69 28 69 6e 74 65 72  5tDbAndApi(inter
6830: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 62 2c  p, objv[1], &db,
6840: 20 26 70 41 70 69 29 20 29 7b 0a 20 20 20 20 72   &pApi) ){.    r
6850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6860: 0a 20 20 7d 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  .  }.  zName = T
6870: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
6880: 76 5b 32 5d 29 3b 0a 20 20 70 53 63 72 69 70 74  v[2]);.  pScript
6890: 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 0a 20 20 74   = objv[3];..  t
68a0: 2e 78 43 72 65 61 74 65 20 3d 20 66 35 74 54 6f  .xCreate = f5tTo
68b0: 6b 65 6e 69 7a 65 72 43 72 65 61 74 65 3b 0a 20  kenizerCreate;. 
68c0: 20 74 2e 78 54 6f 6b 65 6e 69 7a 65 20 3d 20 66   t.xTokenize = f
68d0: 35 74 54 6f 6b 65 6e 69 7a 65 72 54 6f 6b 65 6e  5tTokenizerToken
68e0: 69 7a 65 3b 0a 20 20 74 2e 78 44 65 6c 65 74 65  ize;.  t.xDelete
68f0: 20 3d 20 66 35 74 54 6f 6b 65 6e 69 7a 65 72 44   = f5tTokenizerD
6900: 65 6c 65 74 65 3b 0a 0a 20 20 70 4d 6f 64 20 3d  elete;..  pMod =
6910: 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f   (F5tTokenizerMo
6920: 64 75 6c 65 2a 29 63 6b 61 6c 6c 6f 63 28 73 69  dule*)ckalloc(si
6930: 7a 65 6f 66 28 46 35 74 54 6f 6b 65 6e 69 7a 65  zeof(F5tTokenize
6940: 72 4d 6f 64 75 6c 65 29 29 3b 0a 20 20 70 4d 6f  rModule));.  pMo
6950: 64 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  d->interp = inte
6960: 72 70 3b 0a 20 20 70 4d 6f 64 2d 3e 70 53 63 72  rp;.  pMod->pScr
6970: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
6980: 20 70 4d 6f 64 2d 3e 70 43 6f 6e 74 65 78 74 20   pMod->pContext 
6990: 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 20 20 54 63  = pContext;.  Tc
69a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
69b0: 53 63 72 69 70 74 29 3b 0a 20 20 72 63 20 3d 20  Script);.  rc = 
69c0: 70 41 70 69 2d 3e 78 43 72 65 61 74 65 54 6f 6b  pApi->xCreateTok
69d0: 65 6e 69 7a 65 72 28 70 41 70 69 2c 20 7a 4e 61  enizer(pApi, zNa
69e0: 6d 65 2c 20 28 76 6f 69 64 2a 29 70 4d 6f 64 2c  me, (void*)pMod,
69f0: 20 26 74 2c 20 66 35 74 44 65 6c 54 6f 6b 65 6e   &t, f5tDelToken
6a00: 69 7a 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  izer);.  if( rc!
6a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6a20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6a30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f  lt(interp, "erro
6a40: 72 20 69 6e 20 66 74 73 35 5f 61 70 69 2e 78 43  r in fts5_api.xC
6a50: 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28 29  reateTokenizer()
6a60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
6a70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
6a80: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
6a90: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  K;.}..static voi
6aa0: 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  d SQLITE_TCLAPI 
6ab0: 78 46 35 74 46 72 65 65 28 43 6c 69 65 6e 74 44  xF5tFree(ClientD
6ac0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 7b  ata clientData){
6ad0: 0a 20 20 63 6b 66 72 65 65 28 63 6c 69 65 6e 74  .  ckfree(client
6ae0: 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
6af0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 74 73       sqlite3_fts
6b00: 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  5_may_be_corrupt
6b10: 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 53   BOOLEAN.**.** S
6b20: 65 74 20 6f 72 20 63 6c 65 61 72 20 74 68 65 20  et or clear the 
6b30: 67 6c 6f 62 61 6c 20 22 6d 61 79 2d 62 65 2d 63  global "may-be-c
6b40: 6f 72 72 75 70 74 22 20 66 6c 61 67 2e 20 52 65  orrupt" flag. Re
6b50: 74 75 72 6e 20 74 68 65 20 6f 6c 64 20 76 61 6c  turn the old val
6b60: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
6b70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
6b80: 66 35 74 4d 61 79 42 65 43 6f 72 72 75 70 74 28  f5tMayBeCorrupt(
6b90: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
6ba0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
6bb0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
6bc0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
6bd0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
6be0: 29 7b 0a 20 20 69 6e 74 20 62 4f 6c 64 20 3d 20  ){.  int bOld = 
6bf0: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61 79  sqlite3_fts5_may
6c00: 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0a 0a 20 20  _be_corrupt;..  
6c10: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
6c20: 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
6c30: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6c40: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6c50: 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20  "?BOOLEAN?");.  
6c60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6c70: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
6c80: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  jc==2 ){.    int
6c90: 20 62 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 54   bNew;.    if( T
6ca0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
6cb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6cc0: 76 5b 31 5d 2c 20 26 62 4e 65 77 29 20 29 20 72  v[1], &bNew) ) r
6cd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 74 73  .    sqlite3_fts
6cf0: 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  5_may_be_corrupt
6d00: 20 3d 20 62 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = bNew;.  }..  
6d10: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6d20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
6d30: 49 6e 74 4f 62 6a 28 62 4f 6c 64 29 29 3b 0a 20  IntObj(bOld));. 
6d40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6d50: 7d 0a 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  }...static unsig
6d60: 6e 65 64 20 69 6e 74 20 66 35 74 5f 66 74 73 35  ned int f5t_fts5
6d70: 48 61 73 68 4b 65 79 28 69 6e 74 20 6e 53 6c 6f  HashKey(int nSlo
6d80: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  t, const char *p
6d90: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
6da0: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  i;.  unsigned in
6db0: 74 20 68 20 3d 20 31 33 3b 0a 20 20 66 6f 72 28  t h = 13;.  for(
6dc0: 69 3d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  i=n-1; i>=0; i--
6dd0: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 20 3c 3c  ){.    h = (h <<
6de0: 20 33 29 20 5e 20 68 20 5e 20 70 5b 69 5d 3b 0a   3) ^ h ^ p[i];.
6df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 68 20    }.  return (h 
6e00: 25 20 6e 53 6c 6f 74 29 3b 0a 7d 0a 0a 73 74 61  % nSlot);.}..sta
6e10: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
6e20: 43 4c 41 50 49 20 66 35 74 54 6f 6b 65 6e 48 61  CLAPI f5tTokenHa
6e30: 73 68 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sh(.  void * cli
6e40: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
6e50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
6e60: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
6e70: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
6e80: 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  [].){.  char *z;
6e90: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69  .  int n;.  unsi
6ea0: 67 6e 65 64 20 69 6e 74 20 69 56 61 6c 3b 0a 20  gned int iVal;. 
6eb0: 20 69 6e 74 20 6e 53 6c 6f 74 3b 0a 0a 20 20 69   int nSlot;..  i
6ec0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
6ed0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6ee0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
6ef0: 6a 76 2c 20 22 4e 53 4c 4f 54 20 54 4f 4b 45 4e  jv, "NSLOT TOKEN
6f00: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
6f10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6f20: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
6f30: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6f40: 6a 76 5b 31 5d 2c 20 26 6e 53 6c 6f 74 29 20 29  jv[1], &nSlot) )
6f50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
6f60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
6f70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6f80: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6f90: 26 6e 29 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 66  &n);..  iVal = f
6fa0: 35 74 5f 66 74 73 35 48 61 73 68 4b 65 79 28 6e  5t_fts5HashKey(n
6fb0: 53 6c 6f 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 54  Slot, z, n);.  T
6fc0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
6fd0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
6fe0: 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20  ntObj(iVal));.  
6ff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7000: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
7010: 49 54 45 5f 54 43 4c 41 50 49 20 66 35 74 52 65  ITE_TCLAPI f5tRe
7020: 67 69 73 74 65 72 4d 61 74 63 68 69 6e 66 6f 28  gisterMatchinfo(
7030: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
7040: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
7050: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
7060: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7070: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
7080: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
7090: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
70a0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
70b0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
70c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
70d0: 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
70e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
70f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ROR;.  }.  if( f
7100: 35 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  5tDbPointer(inte
7110: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 62  rp, objv[1], &db
7120: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
7140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7150: 73 35 54 65 73 74 52 65 67 69 73 74 65 72 4d 61  s5TestRegisterMa
7160: 74 63 68 69 6e 66 6f 28 64 62 29 3b 0a 20 20 69  tchinfo(db);.  i
7170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7180: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
7190: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
71a0: 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  har*)sqlite3ErrN
71b0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
71c0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
71d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
71e0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
71f0: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
7200: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66   SQLITE_TCLAPI f
7210: 35 74 52 65 67 69 73 74 65 72 54 6f 6b 28 0a 20  5tRegisterTok(. 
7220: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
7230: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
7240: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
7250: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
7260: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
7270: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
7280: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
7290: 66 74 73 35 5f 61 70 69 20 2a 70 41 70 69 20 3d  fts5_api *pApi =
72a0: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
72b0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
72c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
72d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
72e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
72f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7300: 66 28 20 66 35 74 44 62 41 6e 64 41 70 69 28 69  f( f5tDbAndApi(i
7310: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7320: 26 64 62 2c 20 26 70 41 70 69 29 20 29 7b 0a 20  &db, &pApi) ){. 
7330: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7340: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
7350: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 73 74   sqlite3Fts5Test
7360: 52 65 67 69 73 74 65 72 54 6f 6b 28 64 62 2c 20  RegisterTok(db, 
7370: 70 41 70 69 29 3b 0a 20 20 69 66 28 20 72 63 21  pApi);.  if( rc!
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
73a0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 2a 29 73  interp, (char*)s
73b0: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
73c0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
73d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
73e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
73f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7400: 2f 2a 0a 2a 2a 20 45 6e 74 72 79 20 70 6f 69 6e  /*.** Entry poin
7410: 74 2e 0a 2a 2f 0a 69 6e 74 20 46 74 73 35 74 63  t..*/.int Fts5tc
7420: 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  l_Init(Tcl_Inter
7430: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74  p *interp){.  st
7440: 61 74 69 63 20 73 74 72 75 63 74 20 43 6d 64 20  atic struct Cmd 
7450: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  {.    char *zNam
7460: 65 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  e;.    Tcl_ObjCm
7470: 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
7480: 20 20 69 6e 74 20 62 54 6f 6b 65 6e 69 7a 65 43    int bTokenizeC
7490: 74 78 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  tx;.  } aCmd[] =
74a0: 20 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65   {.    { "sqlite
74b0: 33 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 74 6f  3_fts5_create_to
74c0: 6b 65 6e 69 7a 65 72 22 2c 20 20 20 66 35 74 43  kenizer",   f5tC
74d0: 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 2c 20  reateTokenizer, 
74e0: 31 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69  1 },.    { "sqli
74f0: 74 65 33 5f 66 74 73 35 5f 74 6f 6b 65 6e 22 2c  te3_fts5_token",
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 35                f5
7510: 74 54 6f 6b 65 6e 69 7a 65 72 52 65 74 75 72 6e  tTokenizerReturn
7520: 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  , 1 },.    { "sq
7530: 6c 69 74 65 33 5f 66 74 73 35 5f 74 6f 6b 65 6e  lite3_fts5_token
7540: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
7550: 66 35 74 54 6f 6b 65 6e 69 7a 65 2c 20 30 20 7d  f5tTokenize, 0 }
7560: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  ,.    { "sqlite3
7570: 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e  _fts5_create_fun
7580: 63 74 69 6f 6e 22 2c 20 20 20 20 66 35 74 43 72  ction",    f5tCr
7590: 65 61 74 65 46 75 6e 63 74 69 6f 6e 2c 20 30 20  eateFunction, 0 
75a0: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
75b0: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
75c0: 72 72 75 70 74 22 2c 20 20 20 20 20 66 35 74 4d  rrupt",     f5tM
75d0: 61 79 42 65 43 6f 72 72 75 70 74 2c 20 30 20 7d  ayBeCorrupt, 0 }
75e0: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  ,.    { "sqlite3
75f0: 5f 66 74 73 35 5f 74 6f 6b 65 6e 5f 68 61 73 68  _fts5_token_hash
7600: 22 2c 20 20 20 20 20 20 20 20 20 66 35 74 54 6f  ",         f5tTo
7610: 6b 65 6e 48 61 73 68 2c 20 30 20 7d 2c 0a 20 20  kenHash, 0 },.  
7620: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 74 73    { "sqlite3_fts
7630: 35 5f 72 65 67 69 73 74 65 72 5f 6d 61 74 63 68  5_register_match
7640: 69 6e 66 6f 22 2c 20 66 35 74 52 65 67 69 73 74  info", f5tRegist
7650: 65 72 4d 61 74 63 68 69 6e 66 6f 2c 20 30 20 7d  erMatchinfo, 0 }
7660: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  ,.    { "sqlite3
7670: 5f 66 74 73 35 5f 72 65 67 69 73 74 65 72 5f 66  _fts5_register_f
7680: 74 73 35 74 6f 6b 65 6e 69 7a 65 22 2c 20 66 35  ts5tokenize", f5
7690: 74 52 65 67 69 73 74 65 72 54 6f 6b 2c 20 30 20  tRegisterTok, 0 
76a0: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
76b0: 20 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f    F5tTokenizerCo
76c0: 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 3b  ntext *pContext;
76d0: 0a 0a 20 20 70 43 6f 6e 74 65 78 74 20 3d 20 28  ..  pContext = (
76e0: 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e 74  F5tTokenizerCont
76f0: 65 78 74 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a  ext*)ckalloc(siz
7700: 65 6f 66 28 46 35 74 54 6f 6b 65 6e 69 7a 65 72  eof(F5tTokenizer
7710: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 6d 65 6d  Context));.  mem
7720: 73 65 74 28 70 43 6f 6e 74 65 78 74 2c 20 30 2c  set(pContext, 0,
7730: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 74 65 78   sizeof(*pContex
7740: 74 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t));..  for(i=0;
7750: 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f   i<sizeof(aCmd)/
7760: 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b  sizeof(aCmd[0]);
7770: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7780: 74 20 43 6d 64 20 2a 70 20 3d 20 26 61 43 6d 64  t Cmd *p = &aCmd
7790: 5b 69 5d 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  [i];.    void *p
77a0: 43 74 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Ctx = 0;.    if(
77b0: 20 70 2d 3e 62 54 6f 6b 65 6e 69 7a 65 43 74 78   p->bTokenizeCtx
77c0: 20 29 20 70 43 74 78 20 3d 20 28 76 6f 69 64 2a   ) pCtx = (void*
77d0: 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 54  )pContext;.    T
77e0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
77f0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 70 2d 3e 7a  and(interp, p->z
7800: 4e 61 6d 65 2c 20 70 2d 3e 78 50 72 6f 63 2c 20  Name, p->xProc, 
7810: 70 43 74 78 2c 20 28 69 20 3f 20 30 20 3a 20 78  pCtx, (i ? 0 : x
7820: 46 35 74 46 72 65 65 29 29 3b 0a 20 20 7d 0a 0a  F5tFree));.  }..
7830: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
7840: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51 4c  .}.#else  /* SQL
7850: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 20  ITE_ENABLE_FTS5 
7860: 2a 2f 0a 69 6e 74 20 46 74 73 35 74 63 6c 5f 49  */.int Fts5tcl_I
7870: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
7880: 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72  interp){.  retur
7890: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
78a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
78b0: 42 4c 45 5f 46 54 53 35 20 2a 2f 0a 23 65 6e 64  BLE_FTS5 */.#end
78c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
78d0: 54 20 2a 2f 0a                                   T */.