/ Hex Artifact Content
Login

Artifact 6da58d6e8f42a93c4486b5ba9b187a7f995dee37:


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 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
01a0: 3e 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  >..#ifdef SQLITE
01b0: 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 0a 23 69  _ENABLE_FTS5..#i
01c0: 6e 63 6c 75 64 65 20 22 66 74 73 35 2e 68 22 0a  nclude "fts5.h".
01d0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
01e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
01f0: 73 65 72 74 2e 68 3e 0a 0a 65 78 74 65 72 6e 20  sert.h>..extern 
0200: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35  int sqlite3_fts5
0210: 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 3b  _may_be_corrupt;
0220: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
0230: 74 65 33 46 74 73 35 54 65 73 74 52 65 67 69 73  te3Fts5TestRegis
0240: 74 65 72 4d 61 74 63 68 69 6e 66 6f 28 73 71 6c  terMatchinfo(sql
0250: 69 74 65 33 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  ite3 *);../*****
0260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ****.** This is 
02b0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  a copy of the fi
02c0: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
02d0: 53 71 6c 69 74 65 44 62 20 73 74 72 75 63 74 75  SqliteDb structu
02e0: 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c  re in .** tclsql
02f0: 69 74 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20  ite.c.  We need 
0300: 69 74 20 68 65 72 65 20 73 6f 20 74 68 61 74 20  it here so that 
0310: 74 68 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70  the get_sqlite_p
0320: 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a  ointer routine.*
0330: 2a 20 63 61 6e 20 65 78 74 72 61 63 74 20 74 68  * can extract th
0340: 65 20 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74  e sqlite3* point
0350: 65 72 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74  er from an exist
0360: 69 6e 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a  ing Tcl SQLite.*
0370: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
0380: 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63  ..extern const c
0390: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e  har *sqlite3ErrN
03a0: 61 6d 65 28 69 6e 74 29 3b 0a 0a 73 74 72 75 63  ame(int);..struc
03b0: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
03c0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a  qlite3 *db;.};..
03d0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
03e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
03f0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
0400: 73 74 61 74 69 63 20 69 6e 74 20 66 35 74 44 62  static int f5tDb
0410: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
0420: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
0430: 4f 62 6a 20 2a 70 4f 62 6a 2c 20 73 71 6c 69 74  Obj *pObj, sqlit
0440: 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20 73 74  e3 **ppDb){.  st
0450: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a 70  ruct SqliteDb *p
0460: 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  ;.  Tcl_CmdInfo 
0470: 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72 20  cmdInfo;.  char 
0480: 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  *z = Tcl_GetStri
0490: 6e 67 28 70 4f 62 6a 29 3b 0a 20 20 69 66 28 20  ng(pObj);.  if( 
04a0: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
04b0: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26 63  fo(interp, z, &c
04c0: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 70  mdInfo) ){.    p
04d0: 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c 69 74   = (struct Sqlit
04e0: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
04f0: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  ClientData;.    
0500: 2a 70 70 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  *ppDb = p->db;. 
0510: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
0520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0530: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 20  CL_ERROR;.}../* 
0540: 45 6e 64 20 6f 66 20 63 6f 64 65 20 74 68 61 74  End of code that
0550: 20 61 63 63 65 73 73 65 73 20 74 68 65 20 53 71   accesses the Sq
0560: 6c 69 74 65 44 62 20 73 74 72 75 63 74 2e 0a 2a  liteDb struct..*
0570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74  *********/..stat
05c0: 69 63 20 69 6e 74 20 66 35 74 52 65 73 75 6c 74  ic int f5tResult
05d0: 54 6f 45 72 72 6f 72 43 6f 64 65 28 63 6f 6e 73  ToErrorCode(cons
05e0: 74 20 63 68 61 72 20 2a 7a 52 65 73 29 7b 0a 20  t char *zRes){. 
05f0: 20 73 74 72 75 63 74 20 45 72 72 6f 72 43 6f 64   struct ErrorCod
0600: 65 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  e {.    int rc;.
0610: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0620: 7a 45 72 72 6f 72 3b 0a 20 20 7d 20 61 45 72 72  zError;.  } aErr
0630: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 53 51 4c  [] = {.    { SQL
0640: 49 54 45 5f 44 4f 4e 45 2c 20 20 22 53 51 4c 49  ITE_DONE,  "SQLI
0650: 54 45 5f 44 4f 4e 45 22 20 7d 2c 0a 20 20 20 20  TE_DONE" },.    
0660: 7b 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  { SQLITE_ERROR, 
0670: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 20 7d  "SQLITE_ERROR" }
0680: 2c 0a 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 4f  ,.    { SQLITE_O
0690: 4b 2c 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4b  K,    "SQLITE_OK
06a0: 22 20 7d 2c 0a 20 20 20 20 7b 20 53 51 4c 49 54  " },.    { SQLIT
06b0: 45 5f 4f 4b 2c 20 20 20 20 22 22 20 7d 2c 0a 20  E_OK,    "" },. 
06c0: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   };.  int i;..  
06d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
06e0: 66 28 61 45 72 72 29 2f 73 69 7a 65 6f 66 28 61  f(aErr)/sizeof(a
06f0: 45 72 72 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Err[0]); i++){. 
0700: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
0710: 33 5f 73 74 72 69 63 6d 70 28 7a 52 65 73 2c 20  3_stricmp(zRes, 
0720: 61 45 72 72 5b 69 5d 2e 7a 45 72 72 6f 72 29 20  aErr[i].zError) 
0730: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0740: 61 45 72 72 5b 69 5d 2e 72 63 3b 0a 20 20 20 20  aErr[i].rc;.    
0750: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
0760: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
0770: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 35 74 44  .static int f5tD
0780: 62 41 6e 64 41 70 69 28 0a 20 20 54 63 6c 5f 49  bAndApi(.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
07a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
07b0: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
07c0: 44 62 2c 20 0a 20 20 66 74 73 35 5f 61 70 69 20  Db, .  fts5_api 
07d0: 2a 2a 70 70 41 70 69 0a 29 7b 0a 20 20 73 71 6c  **ppApi.){.  sql
07e0: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
07f0: 69 6e 74 20 72 63 20 3d 20 66 35 74 44 62 50 6f  int rc = f5tDbPo
0800: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 70 4f  inter(interp, pO
0810: 62 6a 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20  bj, &db);.  if( 
0820: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc!=TCL_OK ){.  
0830: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0840: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
0850: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0860: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 66 74  Stmt = 0;.    ft
0870: 73 35 5f 61 70 69 20 2a 70 41 70 69 20 3d 20 30  s5_api *pApi = 0
0880: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
0890: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
08a0: 62 2c 20 22 53 45 4c 45 43 54 20 66 74 73 35 28  b, "SELECT fts5(
08b0: 29 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  )", -1, &pStmt, 
08c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
08d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
08e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
08f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72  ult(interp, "err
0900: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
0910: 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
0920: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
0930: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
0940: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
0950: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
0960: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
0970: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 50 74 72 20  onst void *pPtr 
0980: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
0990: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b  _blob(pStmt, 0);
09a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28 76  .      memcpy((v
09b0: 6f 69 64 2a 29 26 70 41 70 69 2c 20 70 50 74 72  oid*)&pApi, pPtr
09c0: 2c 20 73 69 7a 65 6f 66 28 70 41 70 69 29 29 3b  , sizeof(pApi));
09d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
09e0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
09f0: 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f  (pStmt)!=SQLITE_
0a00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
0a10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0a20: 65 72 70 2c 20 22 65 72 72 6f 72 3a 20 22 2c 20  erp, "error: ", 
0a30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
0a40: 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  b), 0);.      re
0a50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0a60: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 44 62      }..    *ppDb
0a70: 20 3d 20 64 62 3b 0a 20 20 20 20 2a 70 70 41 70   = db;.    *ppAp
0a80: 69 20 3d 20 70 41 70 69 3b 0a 20 20 7d 0a 0a 20  i = pApi;.  }.. 
0a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0aa0: 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
0ab0: 74 20 46 35 74 46 75 6e 63 74 69 6f 6e 20 46 35  t F5tFunction F5
0ac0: 74 46 75 6e 63 74 69 6f 6e 3b 0a 73 74 72 75 63  tFunction;.struc
0ad0: 74 20 46 35 74 46 75 6e 63 74 69 6f 6e 20 7b 0a  t F5tFunction {.
0ae0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0af0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
0b00: 2a 70 53 63 72 69 70 74 3b 0a 7d 3b 0a 0a 74 79  *pScript;.};..ty
0b10: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 35 74  pedef struct F5t
0b20: 41 70 69 20 46 35 74 41 70 69 3b 0a 73 74 72 75  Api F5tApi;.stru
0b30: 63 74 20 46 35 74 41 70 69 20 7b 0a 20 20 63 6f  ct F5tApi {.  co
0b40: 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
0b50: 6e 41 70 69 20 2a 70 41 70 69 3b 0a 20 20 46 74  nApi *pApi;.  Ft
0b60: 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 3b  s5Context *pFts;
0b70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  .};../*.** An ob
0b80: 6a 65 63 74 20 6f 66 20 74 68 69 73 20 74 79 70  ject of this typ
0b90: 65 20 69 73 20 75 73 65 64 20 77 69 74 68 20 74  e is used with t
0ba0: 68 65 20 78 53 65 74 41 75 78 64 61 74 61 28 29  he xSetAuxdata()
0bb0: 20 61 6e 64 20 78 47 65 74 41 75 78 64 61 74 61   and xGetAuxdata
0bc0: 28 29 0a 2a 2a 20 41 50 49 20 74 65 73 74 20 77  ().** API test w
0bd0: 72 61 70 70 65 72 73 2e 20 54 68 65 20 74 63 6c  rappers. The tcl
0be0: 20 69 6e 74 65 72 66 61 63 65 20 61 6c 6c 6f 77   interface allow
0bf0: 73 20 61 20 73 69 6e 67 6c 65 20 74 63 6c 20 76  s a single tcl v
0c00: 61 6c 75 65 20 74 6f 20 62 65 20 0a 2a 2a 20 73  alue to be .** s
0c10: 61 76 65 64 20 75 73 69 6e 67 20 78 53 65 74 41  aved using xSetA
0c20: 75 78 64 61 74 61 28 29 2e 20 49 6e 73 74 65 61  uxdata(). Instea
0c30: 64 20 6f 66 20 73 69 6d 70 6c 79 20 73 74 6f 72  d of simply stor
0c40: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
0c50: 20 74 68 65 0a 2a 2a 20 74 63 6c 20 6f 62 6a 65   the.** tcl obje
0c60: 63 74 2c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ct, the code in 
0c70: 74 68 69 73 20 66 69 6c 65 20 77 72 61 70 73 20  this file wraps 
0c80: 69 74 20 69 6e 20 61 6e 20 73 71 6c 69 74 65 33  it in an sqlite3
0c90: 5f 6d 61 6c 6c 6f 63 27 64 20 0a 2a 2a 20 69 6e  _malloc'd .** in
0ca0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0cb0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 20 73  llowing struct s
0cc0: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 64 65  o that if the de
0cd0: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
0ce0: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 69 6e  .** correctly in
0cf0: 76 6f 6b 65 64 20 69 74 20 77 69 6c 6c 20 62 65  voked it will be
0d00: 20 72 65 70 6f 72 74 65 64 20 61 73 20 61 6e 20   reported as an 
0d10: 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20 6c 65  SQLite memory le
0d20: 61 6b 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ak..*/.typedef s
0d30: 74 72 75 63 74 20 46 35 74 41 75 78 44 61 74 61  truct F5tAuxData
0d40: 20 46 35 74 41 75 78 44 61 74 61 3b 0a 73 74 72   F5tAuxData;.str
0d50: 75 63 74 20 46 35 74 41 75 78 44 61 74 61 20 7b  uct F5tAuxData {
0d60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a  .  Tcl_Obj *pObj
0d70: 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.};..static int
0d80: 20 78 54 6f 6b 65 6e 69 7a 65 43 62 28 0a 20 20   xTokenizeCb(.  
0d90: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
0da0: 6e 74 20 74 66 6c 61 67 73 2c 0a 20 20 63 6f 6e  nt tflags,.  con
0db0: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 2c  st char *zToken,
0dc0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 0a 20 20   int nToken, .  
0dd0: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
0de0: 69 45 6e 64 0a 29 7b 0a 20 20 46 35 74 46 75 6e  iEnd.){.  F5tFun
0df0: 63 74 69 6f 6e 20 2a 70 20 3d 20 28 46 35 74 46  ction *p = (F5tF
0e00: 75 6e 63 74 69 6f 6e 2a 29 70 43 74 78 3b 0a 20  unction*)pCtx;. 
0e10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 76 61 6c 20   Tcl_Obj *pEval 
0e20: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
0e30: 62 6a 28 70 2d 3e 70 53 63 72 69 70 74 29 3b 0a  bj(p->pScript);.
0e40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 63 6c    int rc;..  Tcl
0e50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45  _IncrRefCount(pE
0e60: 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  val);.  Tcl_List
0e70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
0e80: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61  (p->interp, pEva
0e90: 6c 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  l, Tcl_NewString
0ea0: 4f 62 6a 28 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  Obj(zToken, nTok
0eb0: 65 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  en));.  Tcl_List
0ec0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
0ed0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61  (p->interp, pEva
0ee0: 6c 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  l, Tcl_NewIntObj
0ef0: 28 69 53 74 61 72 74 29 29 3b 0a 20 20 54 63 6c  (iStart));.  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 49   pEval, Tcl_NewI
0f30: 6e 74 4f 62 6a 28 69 45 6e 64 29 29 3b 0a 0a 20  ntObj(iEnd));.. 
0f40: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
0f50: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
0f60: 45 76 61 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  Eval, 0);.  Tcl_
0f70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76  DecrRefCount(pEv
0f80: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54  al);.  if( rc==T
0f90: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  CL_OK ){.    rc 
0fa0: 3d 20 66 35 74 52 65 73 75 6c 74 54 6f 45 72 72  = f5tResultToErr
0fb0: 6f 72 43 6f 64 65 28 54 63 6c 5f 47 65 74 53 74  orCode(Tcl_GetSt
0fc0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
0fd0: 74 65 72 70 29 29 3b 0a 20 20 7d 0a 0a 20 20 72  terp));.  }..  r
0fe0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
0ff0: 74 69 63 20 69 6e 74 20 78 46 35 74 41 70 69 28  tic int xF5tApi(
1000: 76 6f 69 64 2a 2c 20 54 63 6c 5f 49 6e 74 65 72  void*, Tcl_Inter
1010: 70 2a 2c 20 69 6e 74 2c 20 54 63 6c 5f 4f 62 6a  p*, int, Tcl_Obj
1020: 20 2a 43 4f 4e 53 54 20 5b 5d 29 3b 0a 0a 73 74   *CONST []);..st
1030: 61 74 69 63 20 69 6e 74 20 78 51 75 65 72 79 50  atic int xQueryP
1040: 68 72 61 73 65 43 62 28 0a 20 20 63 6f 6e 73 74  hraseCb(.  const
1050: 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70   Fts5ExtensionAp
1060: 69 20 2a 70 41 70 69 2c 20 0a 20 20 46 74 73 35  i *pApi, .  Fts5
1070: 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c 20 0a  Context *pFts, .
1080: 20 20 76 6f 69 64 20 2a 70 43 74 78 0a 29 7b 0a    void *pCtx.){.
1090: 20 20 46 35 74 46 75 6e 63 74 69 6f 6e 20 2a 70    F5tFunction *p
10a0: 20 3d 20 28 46 35 74 46 75 6e 63 74 69 6f 6e 2a   = (F5tFunction*
10b0: 29 70 43 74 78 3b 0a 20 20 73 74 61 74 69 63 20  )pCtx;.  static 
10c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
10d0: 6d 64 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  md = 0;.  Tcl_Ob
10e0: 6a 20 2a 70 45 76 61 6c 3b 0a 20 20 69 6e 74 20  j *pEval;.  int 
10f0: 72 63 3b 0a 0a 20 20 63 68 61 72 20 7a 43 6d 64  rc;..  char zCmd
1100: 5b 36 34 5d 3b 0a 20 20 46 35 74 41 70 69 20 73  [64];.  F5tApi s
1110: 41 70 69 3b 0a 0a 20 20 73 41 70 69 2e 70 41 70  Api;..  sApi.pAp
1120: 69 20 3d 20 70 41 70 69 3b 0a 20 20 73 41 70 69  i = pApi;.  sApi
1130: 2e 70 46 74 73 20 3d 20 70 46 74 73 3b 0a 20 20  .pFts = pFts;.  
1140: 73 70 72 69 6e 74 66 28 7a 43 6d 64 2c 20 22 66  sprintf(zCmd, "f
1150: 35 74 5f 32 5f 25 6c 6c 64 22 2c 20 69 43 6d 64  5t_2_%lld", iCmd
1160: 2b 2b 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74  ++);.  Tcl_Creat
1170: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 70 2d 3e 69  eObjCommand(p->i
1180: 6e 74 65 72 70 2c 20 7a 43 6d 64 2c 20 78 46 35  nterp, zCmd, xF5
1190: 74 41 70 69 2c 20 26 73 41 70 69 2c 20 30 29 3b  tApi, &sApi, 0);
11a0: 0a 0a 20 20 70 45 76 61 6c 20 3d 20 54 63 6c 5f  ..  pEval = Tcl_
11b0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
11c0: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
11d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76  IncrRefCount(pEv
11e0: 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  al);.  Tcl_ListO
11f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1200: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c  p->interp, pEval
1210: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1220: 62 6a 28 7a 43 6d 64 2c 20 2d 31 29 29 3b 0a 20  bj(zCmd, -1));. 
1230: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
1240: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
1250: 45 76 61 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  Eval, 0);.  Tcl_
1260: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76  DecrRefCount(pEv
1270: 61 6c 29 3b 0a 20 20 54 63 6c 5f 44 65 6c 65 74  al);.  Tcl_Delet
1280: 65 43 6f 6d 6d 61 6e 64 28 70 2d 3e 69 6e 74 65  eCommand(p->inte
1290: 72 70 2c 20 7a 43 6d 64 29 3b 0a 0a 20 20 69 66  rp, zCmd);..  if
12a0: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
12b0: 20 20 20 20 72 63 20 3d 20 66 35 74 52 65 73 75      rc = f5tResu
12c0: 6c 74 54 6f 45 72 72 6f 72 43 6f 64 65 28 54 63  ltToErrorCode(Tc
12d0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
12e0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 20  t(p->interp));. 
12f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1300: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1310: 78 53 65 74 41 75 78 64 61 74 61 44 65 73 74 72  xSetAuxdataDestr
1320: 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b 0a  uctor(void *p){.
1330: 20 20 46 35 74 41 75 78 44 61 74 61 20 2a 70 44    F5tAuxData *pD
1340: 61 74 61 20 3d 20 28 46 35 74 41 75 78 44 61 74  ata = (F5tAuxDat
1350: 61 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63 72  a*)p;.  Tcl_Decr
1360: 52 65 66 43 6f 75 6e 74 28 70 44 61 74 61 2d 3e  RefCount(pData->
1370: 70 4f 62 6a 29 3b 0a 20 20 73 71 6c 69 74 65 33  pObj);.  sqlite3
1380: 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a  _free(pData);.}.
1390: 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 61 70 69 20  ./*.**      api 
13a0: 73 75 62 2d 63 6f 6d 6d 61 6e 64 2e 2e 2e 0a 2a  sub-command....*
13b0: 2a 0a 2a 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  *.** Description
13c0: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
13d0: 74 20 78 46 35 74 41 70 69 28 0a 20 20 76 6f 69  t xF5tApi(.  voi
13e0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1400: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1410: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1420: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1430: 74 72 75 63 74 20 53 75 62 20 7b 0a 20 20 20 20  truct Sub {.    
1440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1450: 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  e;.    int nArg;
1460: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1470: 2a 7a 4d 73 67 3b 0a 20 20 7d 20 61 53 75 62 5b  *zMsg;.  } aSub[
1480: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 78 43 6f  ] = {.    { "xCo
1490: 6c 75 6d 6e 43 6f 75 6e 74 22 2c 20 20 20 20 20  lumnCount",     
14a0: 20 30 2c 20 22 22 20 7d 2c 20 20 20 20 20 20 20   0, "" },       
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
14c0: 30 20 2a 2f 0a 20 20 20 20 7b 20 22 78 52 6f 77  0 */.    { "xRow
14d0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
14e0: 30 2c 20 22 22 20 7d 2c 20 20 20 20 20 20 20 20  0, "" },        
14f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31             /*  1
1500: 20 2a 2f 0a 20 20 20 20 7b 20 22 78 43 6f 6c 75   */.    { "xColu
1510: 6d 6e 54 6f 74 61 6c 53 69 7a 65 22 2c 20 20 31  mnTotalSize",  1
1520: 2c 20 22 43 4f 4c 22 20 7d 2c 20 20 20 20 20 20  , "COL" },      
1530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20            /*  2 
1540: 2a 2f 0a 20 20 20 20 7b 20 22 78 54 6f 6b 65 6e  */.    { "xToken
1550: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 32 2c  ize",         2,
1560: 20 22 54 45 58 54 20 53 43 52 49 50 54 22 20 7d   "TEXT SCRIPT" }
1570: 2c 20 20 20 20 20 20 20 20 2f 2a 20 20 33 20 2a  ,        /*  3 *
1580: 2f 0a 20 20 20 20 7b 20 22 78 50 68 72 61 73 65  /.    { "xPhrase
1590: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 30 2c 20  Count",      0, 
15a0: 22 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20  "" },           
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f          /*  4 */
15c0: 0a 20 20 20 20 7b 20 22 78 50 68 72 61 73 65 53  .    { "xPhraseS
15d0: 69 7a 65 22 2c 20 20 20 20 20 20 20 31 2c 20 22  ize",       1, "
15e0: 50 48 52 41 53 45 22 20 7d 2c 20 20 20 20 20 20  PHRASE" },      
15f0: 20 20 20 20 20 20 20 2f 2a 20 20 35 20 2a 2f 0a         /*  5 */.
1600: 20 20 20 20 7b 20 22 78 49 6e 73 74 43 6f 75 6e      { "xInstCoun
1610: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 22 22  t",        0, ""
1620: 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   },             
1630: 20 20 20 20 20 20 2f 2a 20 20 36 20 2a 2f 0a 20        /*  6 */. 
1640: 20 20 20 7b 20 22 78 49 6e 73 74 22 2c 20 20 20     { "xInst",   
1650: 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 49 44            1, "ID
1660: 58 22 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20  X" },           
1670: 20 20 20 20 20 2f 2a 20 20 37 20 2a 2f 0a 20 20       /*  7 */.  
1680: 20 20 7b 20 22 78 52 6f 77 69 64 22 2c 20 20 20    { "xRowid",   
1690: 20 20 20 20 20 20 20 20 20 30 2c 20 22 22 20 7d           0, "" }
16a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16b0: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
16c0: 20 7b 20 22 78 43 6f 6c 75 6d 6e 54 65 78 74 22   { "xColumnText"
16d0: 2c 20 20 20 20 20 20 20 31 2c 20 22 43 4f 4c 22  ,       1, "COL"
16e0: 20 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   },             
16f0: 20 20 20 2f 2a 20 20 39 20 2a 2f 0a 20 20 20 20     /*  9 */.    
1700: 7b 20 22 78 43 6f 6c 75 6d 6e 53 69 7a 65 22 2c  { "xColumnSize",
1710: 20 20 20 20 20 20 20 31 2c 20 22 43 4f 4c 22 20         1, "COL" 
1720: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
1730: 20 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 7b    /* 10 */.    {
1740: 20 22 78 51 75 65 72 79 50 68 72 61 73 65 22 2c   "xQueryPhrase",
1750: 20 20 20 20 20 20 32 2c 20 22 50 48 52 41 53 45        2, "PHRASE
1760: 20 53 43 52 49 50 54 22 20 7d 2c 20 20 20 20 20   SCRIPT" },     
1770: 20 2f 2a 20 31 31 20 2a 2f 0a 20 20 20 20 7b 20   /* 11 */.    { 
1780: 22 78 53 65 74 41 75 78 64 61 74 61 22 2c 20 20  "xSetAuxdata",  
1790: 20 20 20 20 20 31 2c 20 22 56 41 4c 55 45 22 20       1, "VALUE" 
17a0: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
17b0: 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7b 20 22  /* 12 */.    { "
17c0: 78 47 65 74 41 75 78 64 61 74 61 22 2c 20 20 20  xGetAuxdata",   
17d0: 20 20 20 20 31 2c 20 22 43 4c 45 41 52 22 20 7d      1, "CLEAR" }
17e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17f0: 2a 20 31 33 20 2a 2f 0a 20 20 20 20 7b 20 22 78  * 13 */.    { "x
1800: 53 65 74 41 75 78 64 61 74 61 49 6e 74 22 2c 20  SetAuxdataInt", 
1810: 20 20 20 31 2c 20 22 49 4e 54 45 47 45 52 22 20     1, "INTEGER" 
1820: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  },            /*
1830: 20 31 34 20 2a 2f 0a 20 20 20 20 7b 20 22 78 47   14 */.    { "xG
1840: 65 74 41 75 78 64 61 74 61 49 6e 74 22 2c 20 20  etAuxdataInt",  
1850: 20 20 31 2c 20 22 43 4c 45 41 52 22 20 7d 2c 20    1, "CLEAR" }, 
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1870: 31 35 20 2a 2f 0a 20 20 20 20 7b 20 30 2c 20 30  15 */.    { 0, 0
1880: 2c 20 30 7d 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74  , 0}.  };..  int
1890: 20 72 63 3b 0a 20 20 69 6e 74 20 69 53 75 62 20   rc;.  int iSub 
18a0: 3d 20 30 3b 0a 20 20 46 35 74 41 70 69 20 2a 70  = 0;.  F5tApi *p
18b0: 20 3d 20 28 46 35 74 41 70 69 2a 29 63 6c 69 65   = (F5tApi*)clie
18c0: 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f  ntData;..  if( o
18d0: 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
18e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1900: 53 55 42 2d 43 4f 4d 4d 41 4e 44 22 29 3b 0a 20  SUB-COMMAND");. 
1910: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1920: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
1930: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
1940: 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20  mObjStruct(.    
1950: 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31    interp, objv[1
1960: 5d 2c 20 61 53 75 62 2c 20 73 69 7a 65 6f 66 28  ], aSub, sizeof(
1970: 61 53 75 62 5b 30 5d 29 2c 20 22 53 55 42 2d 43  aSub[0]), "SUB-C
1980: 4f 4d 4d 41 4e 44 22 2c 20 30 2c 20 26 69 53 75  OMMAND", 0, &iSu
1990: 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  b.  );.  if( rc!
19a0: 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
19b0: 20 72 63 3b 0a 20 20 69 66 28 20 61 53 75 62 5b   rc;.  if( aSub[
19c0: 69 53 75 62 5d 2e 6e 41 72 67 21 3d 6f 62 6a 63  iSub].nArg!=objc
19d0: 2d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  -2 ){.    Tcl_Wr
19e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
19f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 61 53 75 62  p, 1, objv, aSub
1a00: 5b 69 53 75 62 5d 2e 7a 4d 73 67 29 3b 0a 20 20  [iSub].zMsg);.  
1a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a20: 4f 52 3b 0a 20 20 7d 0a 0a 23 64 65 66 69 6e 65  OR;.  }..#define
1a30: 20 43 41 53 45 28 69 2c 73 74 72 29 20 63 61 73   CASE(i,str) cas
1a40: 65 20 69 3a 20 61 73 73 65 72 74 28 20 73 74 72  e i: assert( str
1a50: 63 6d 70 28 61 53 75 62 5b 69 5d 2e 7a 4e 61 6d  cmp(aSub[i].zNam
1a60: 65 2c 20 73 74 72 29 3d 3d 30 20 29 3b 0a 20 20  e, str)==0 );.  
1a70: 73 77 69 74 63 68 28 20 69 53 75 62 20 29 7b 0a  switch( iSub ){.
1a80: 20 20 20 20 43 41 53 45 28 30 2c 20 22 78 43 6f      CASE(0, "xCo
1a90: 6c 75 6d 6e 43 6f 75 6e 74 22 29 20 7b 0a 20 20  lumnCount") {.  
1aa0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
1ab0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 41      nCol = p->pA
1ac0: 70 69 2d 3e 78 43 6f 6c 75 6d 6e 43 6f 75 6e 74  pi->xColumnCount
1ad0: 28 70 2d 3e 70 46 74 73 29 3b 0a 20 20 20 20 20  (p->pFts);.     
1ae0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1af0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
1b00: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1b10: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1b20: 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20  tObj(nCol));.   
1b30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 41 53 45  ;.    }.    CASE
1b50: 28 31 2c 20 22 78 52 6f 77 43 6f 75 6e 74 22 29  (1, "xRowCount")
1b60: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b70: 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 0a 20 20 20  _int64 nRow;.   
1b80: 20 20 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d     rc = p->pApi-
1b90: 3e 78 52 6f 77 43 6f 75 6e 74 28 70 2d 3e 70 46  >xRowCount(p->pF
1ba0: 74 73 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20  ts, &nRow);.    
1bb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
1bd0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1be0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
1bf0: 69 64 65 49 6e 74 4f 62 6a 28 6e 52 6f 77 29 29  ideIntObj(nRow))
1c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c20: 20 43 41 53 45 28 32 2c 20 22 78 43 6f 6c 75 6d   CASE(2, "xColum
1c30: 6e 54 6f 74 61 6c 53 69 7a 65 22 29 20 7b 0a 20  nTotalSize") {. 
1c40: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
1c50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
1c60: 36 34 20 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20  64 nSize;.      
1c70: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c90: 6a 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29 20  jv[2], &iCol) ) 
1ca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cb0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  ;.      rc = p->
1cc0: 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54 6f 74  pApi->xColumnTot
1cd0: 61 6c 53 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20  alSize(p->pFts, 
1ce0: 69 43 6f 6c 2c 20 26 6e 53 69 7a 65 29 3b 0a 20  iCol, &nSize);. 
1cf0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d10: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1d20: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1d30: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 53 69  ewWideIntObj(nSi
1d40: 7a 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ze));.      }.  
1d50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d60: 0a 20 20 20 20 43 41 53 45 28 33 2c 20 22 78 54  .    CASE(3, "xT
1d70: 6f 6b 65 6e 69 7a 65 22 29 20 7b 0a 20 20 20 20  okenize") {.    
1d80: 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 20    int nText;.   
1d90: 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d     char *zText =
1da0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1db0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1dc0: 6e 54 65 78 74 29 3b 0a 20 20 20 20 20 20 46 35  nText);.      F5
1dd0: 74 46 75 6e 63 74 69 6f 6e 20 63 74 78 3b 0a 20  tFunction ctx;. 
1de0: 20 20 20 20 20 63 74 78 2e 69 6e 74 65 72 70 20       ctx.interp 
1df0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
1e00: 63 74 78 2e 70 53 63 72 69 70 74 20 3d 20 6f 62  ctx.pScript = ob
1e10: 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 72 63 20  jv[3];.      rc 
1e20: 3d 20 70 2d 3e 70 41 70 69 2d 3e 78 54 6f 6b 65  = p->pApi->xToke
1e30: 6e 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 7a 54  nize(p->pFts, zT
1e40: 65 78 74 2c 20 6e 54 65 78 74 2c 20 26 63 74 78  ext, nText, &ctx
1e50: 2c 20 78 54 6f 6b 65 6e 69 7a 65 43 62 29 3b 0a  , xTokenizeCb);.
1e60: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
1e90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
1ea0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1eb0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43   rc;.    }.    C
1ec0: 41 53 45 28 34 2c 20 22 78 50 68 72 61 73 65 43  ASE(4, "xPhraseC
1ed0: 6f 75 6e 74 22 29 20 7b 0a 20 20 20 20 20 20 69  ount") {.      i
1ee0: 6e 74 20 6e 50 68 72 61 73 65 3b 0a 20 20 20 20  nt nPhrase;.    
1ef0: 20 20 6e 50 68 72 61 73 65 20 3d 20 70 2d 3e 70    nPhrase = p->p
1f00: 41 70 69 2d 3e 78 50 68 72 61 73 65 43 6f 75 6e  Api->xPhraseCoun
1f10: 74 28 70 2d 3e 70 46 74 73 29 3b 0a 20 20 20 20  t(p->pFts);.    
1f20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
1f40: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1f50: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1f60: 6e 74 4f 62 6a 28 6e 50 68 72 61 73 65 29 29 3b  ntObj(nPhrase));
1f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1f80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f90: 43 41 53 45 28 35 2c 20 22 78 50 68 72 61 73 65  CASE(5, "xPhrase
1fa0: 53 69 7a 65 22 29 20 7b 0a 20 20 20 20 20 20 69  Size") {.      i
1fb0: 6e 74 20 69 50 68 72 61 73 65 3b 0a 20 20 20 20  nt iPhrase;.    
1fc0: 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
1fd0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1fe0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1ff0: 6a 76 5b 32 5d 2c 20 26 69 50 68 72 61 73 65 29  jv[2], &iPhrase)
2000: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2010: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2020: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
2030: 20 70 2d 3e 70 41 70 69 2d 3e 78 50 68 72 61 73   p->pApi->xPhras
2040: 65 53 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 69  eSize(p->pFts, i
2050: 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 69  Phrase);.      i
2060: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2070: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2080: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2090: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
20a0: 62 6a 28 73 7a 29 29 3b 0a 20 20 20 20 20 20 7d  bj(sz));.      }
20b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20c0: 20 20 7d 0a 20 20 20 20 43 41 53 45 28 36 2c 20    }.    CASE(6, 
20d0: 22 78 49 6e 73 74 43 6f 75 6e 74 22 29 20 7b 0a  "xInstCount") {.
20e0: 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 73 74 3b        int nInst;
20f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  .      rc = p->p
2100: 41 70 69 2d 3e 78 49 6e 73 74 43 6f 75 6e 74 28  Api->xInstCount(
2110: 70 2d 3e 70 46 74 73 2c 20 26 6e 49 6e 73 74 29  p->pFts, &nInst)
2120: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2130: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2140: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
2150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2160: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 49 6e 73  l_NewIntObj(nIns
2170: 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t));.      }.   
2180: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2190: 20 20 20 20 43 41 53 45 28 37 2c 20 22 78 49 6e      CASE(7, "xIn
21a0: 73 74 22 29 20 7b 0a 20 20 20 20 20 20 69 6e 74  st") {.      int
21b0: 20 69 49 64 78 2c 20 69 70 2c 20 69 63 2c 20 69   iIdx, ip, ic, i
21c0: 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  o;.      if( Tcl
21d0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
21e0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
21f0: 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  &iIdx) ){.      
2200: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2210: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2220: 20 20 72 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e    rc = p->pApi->
2230: 78 49 6e 73 74 28 70 2d 3e 70 46 74 73 2c 20 69  xInst(p->pFts, i
2240: 49 64 78 2c 20 26 69 70 2c 20 26 69 63 2c 20 26  Idx, &ip, &ic, &
2250: 69 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  io);.      if( r
2260: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2270: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
2280: 2a 70 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77  *pList = Tcl_New
2290: 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54  Obj();.        T
22a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
22b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
22c0: 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 49 6e  pList, Tcl_NewIn
22d0: 74 4f 62 6a 28 69 70 29 29 3b 0a 20 20 20 20 20  tObj(ip));.     
22e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
22f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2300: 72 70 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f 4e  rp, pList, Tcl_N
2310: 65 77 49 6e 74 4f 62 6a 28 69 63 29 29 3b 0a 20  ewIntObj(ic));. 
2320: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
2330: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2340: 69 6e 74 65 72 70 2c 20 70 4c 69 73 74 2c 20 54  interp, pList, T
2350: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 6f 29  cl_NewIntObj(io)
2360: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  );.        Tcl_S
2370: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2380: 72 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  rp, pList);.    
2390: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
23a0: 0a 20 20 20 20 7d 0a 20 20 20 20 43 41 53 45 28  .    }.    CASE(
23b0: 38 2c 20 22 78 52 6f 77 69 64 22 29 20 7b 0a 20  8, "xRowid") {. 
23c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
23d0: 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 70  64 iRowid = p->p
23e0: 41 70 69 2d 3e 78 52 6f 77 69 64 28 70 2d 3e 70  Api->xRowid(p->p
23f0: 46 74 73 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Fts);.      Tcl_
2400: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2410: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2420: 49 6e 74 4f 62 6a 28 69 52 6f 77 69 64 29 29 3b  IntObj(iRowid));
2430: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2440: 20 20 7d 0a 20 20 20 20 43 41 53 45 28 39 2c 20    }.    CASE(9, 
2450: 22 78 43 6f 6c 75 6d 6e 54 65 78 74 22 29 20 7b  "xColumnText") {
2460: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2470: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  r *z = 0;.      
2480: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
2490: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
24a0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
24b0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
24c0: 62 6a 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29  bjv[2], &iCol) )
24d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
24e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
24f0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
2500: 2d 3e 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54  ->pApi->xColumnT
2510: 65 78 74 28 70 2d 3e 70 46 74 73 2c 20 69 43 6f  ext(p->pFts, iCo
2520: 6c 2c 20 26 7a 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &z, &n);.    
2530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
2550: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2560: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
2570: 74 72 69 6e 67 4f 62 6a 28 7a 2c 20 6e 29 29 3b  tringObj(z, n));
2580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25a0: 43 41 53 45 28 31 30 2c 20 22 78 43 6f 6c 75 6d  CASE(10, "xColum
25b0: 6e 53 69 7a 65 22 29 20 7b 0a 20 20 20 20 20 20  nSize") {.      
25c0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
25d0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
25e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
25f0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2600: 62 6a 76 5b 32 5d 2c 20 26 69 43 6f 6c 29 20 29  bjv[2], &iCol) )
2610: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2620: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2630: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
2640: 2d 3e 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 53  ->pApi->xColumnS
2650: 69 7a 65 28 70 2d 3e 70 46 74 73 2c 20 69 43 6f  ize(p->pFts, iCo
2660: 6c 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  l, &n);.      if
2670: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2680: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
2690: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
26a0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
26b0: 6a 28 6e 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  j(n));.      }. 
26c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26d0: 7d 0a 20 20 20 20 43 41 53 45 28 31 31 2c 20 22  }.    CASE(11, "
26e0: 78 51 75 65 72 79 50 68 72 61 73 65 22 29 20 7b  xQueryPhrase") {
26f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 68 72 61  .      int iPhra
2700: 73 65 3b 0a 20 20 20 20 20 20 46 35 74 46 75 6e  se;.      F5tFun
2710: 63 74 69 6f 6e 20 63 74 78 3b 0a 20 20 20 20 20  ction ctx;.     
2720: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
2730: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2740: 62 6a 76 5b 32 5d 2c 20 26 69 50 68 72 61 73 65  bjv[2], &iPhrase
2750: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 74 78       }.      ctx
2780: 2e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  .interp = interp
2790: 3b 0a 20 20 20 20 20 20 63 74 78 2e 70 53 63 72  ;.      ctx.pScr
27a0: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
27b0: 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 41 70       rc = p->pAp
27c0: 69 2d 3e 78 51 75 65 72 79 50 68 72 61 73 65 28  i->xQueryPhrase(
27d0: 70 2d 3e 70 46 74 73 2c 20 69 50 68 72 61 73 65  p->pFts, iPhrase
27e0: 2c 20 26 63 74 78 2c 20 78 51 75 65 72 79 50 68  , &ctx, xQueryPh
27f0: 72 61 73 65 43 62 29 3b 0a 20 20 20 20 20 20 69  raseCb);.      i
2800: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2810: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2820: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2830: 72 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rp);.      }.   
2840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2850: 20 20 20 20 43 41 53 45 28 31 32 2c 20 22 78 53      CASE(12, "xS
2860: 65 74 41 75 78 64 61 74 61 22 29 20 7b 0a 20 20  etAuxdata") {.  
2870: 20 20 20 20 46 35 74 41 75 78 44 61 74 61 20 2a      F5tAuxData *
2880: 70 44 61 74 61 20 3d 20 28 46 35 74 41 75 78 44  pData = (F5tAuxD
2890: 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ata*)sqlite3_mal
28a0: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 35 74 41 75  loc(sizeof(F5tAu
28b0: 78 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  xData));.      i
28c0: 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20  f( pData==0 ){. 
28d0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
28e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
28f0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
2900: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61       }.      pDa
2930: 74 61 2d 3e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b  ta->pObj = objv[
2940: 32 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  2];.      Tcl_In
2950: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 61 74 61  crRefCount(pData
2960: 2d 3e 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 72  ->pObj);.      r
2970: 63 20 3d 20 70 2d 3e 70 41 70 69 2d 3e 78 53 65  c = p->pApi->xSe
2980: 74 41 75 78 64 61 74 61 28 70 2d 3e 70 46 74 73  tAuxdata(p->pFts
2990: 2c 20 70 44 61 74 61 2c 20 78 53 65 74 41 75 78  , pData, xSetAux
29a0: 64 61 74 61 44 65 73 74 72 75 63 74 6f 72 29 3b  dataDestructor);
29b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29c0: 20 20 7d 0a 20 20 20 20 43 41 53 45 28 31 33 2c    }.    CASE(13,
29d0: 20 22 78 47 65 74 41 75 78 64 61 74 61 22 29 20   "xGetAuxdata") 
29e0: 7b 0a 20 20 20 20 20 20 46 35 74 41 75 78 44 61  {.      F5tAuxDa
29f0: 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20  ta *pData;.     
2a00: 20 69 6e 74 20 62 43 6c 65 61 72 3b 0a 20 20 20   int bClear;.   
2a10: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
2a20: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2a30: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
2a40: 43 6c 65 61 72 29 20 29 7b 0a 20 20 20 20 20 20  Clear) ){.      
2a50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a60: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2a70: 20 20 70 44 61 74 61 20 3d 20 28 46 35 74 41 75    pData = (F5tAu
2a80: 78 44 61 74 61 2a 29 70 2d 3e 70 41 70 69 2d 3e  xData*)p->pApi->
2a90: 78 47 65 74 41 75 78 64 61 74 61 28 70 2d 3e 70  xGetAuxdata(p->p
2aa0: 46 74 73 2c 20 62 43 6c 65 61 72 29 3b 0a 20 20  Fts, bClear);.  
2ab0: 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
2ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2ad0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2ae0: 72 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rp);.      }else
2af0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
2b00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2b10: 70 2c 20 70 44 61 74 61 2d 3e 70 4f 62 6a 29 3b  p, pData->pObj);
2b20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 43 6c  .        if( bCl
2b30: 65 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ear ){.         
2b40: 20 78 53 65 74 41 75 78 64 61 74 61 44 65 73 74   xSetAuxdataDest
2b50: 72 75 63 74 6f 72 28 28 76 6f 69 64 2a 29 70 44  ructor((void*)pD
2b60: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
2b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
2b80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2b90: 2f 2a 20 54 68 65 73 65 20 74 77 6f 20 2d 20 78  /* These two - x
2ba0: 53 65 74 41 75 78 64 61 74 61 49 6e 74 20 61 6e  SetAuxdataInt an
2bb0: 64 20 78 47 65 74 41 75 78 64 61 74 61 49 6e 74  d xGetAuxdataInt
2bc0: 20 2d 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74   - are similar t
2bd0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 78 53 65  o the.    ** xSe
2be0: 74 41 75 78 64 61 74 61 20 61 6e 64 20 78 47 65  tAuxdata and xGe
2bf0: 74 41 75 78 64 61 74 61 20 6d 65 74 68 6f 64 73  tAuxdata methods
2c00: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
2c10: 76 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  ve. The differen
2c20: 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 61  ce.    ** is tha
2c30: 74 20 74 68 65 79 20 6d 61 79 20 6f 6e 6c 79 20  t they may only 
2c40: 73 61 76 65 20 61 6e 20 69 6e 74 65 67 65 72 20  save an integer 
2c50: 76 61 6c 75 65 20 61 73 20 61 75 78 69 6c 69 61  value as auxilia
2c60: 72 79 20 64 61 74 61 2c 20 61 6e 64 0a 20 20 20  ry data, and.   
2c70: 20 2a 2a 20 64 6f 20 6e 6f 74 20 73 70 65 63 69   ** do not speci
2c80: 66 79 20 61 20 64 65 73 74 72 75 63 74 6f 72 20  fy a destructor 
2c90: 66 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  function.  */.  
2ca0: 20 20 43 41 53 45 28 31 34 2c 20 22 78 53 65 74    CASE(14, "xSet
2cb0: 41 75 78 64 61 74 61 49 6e 74 22 29 20 7b 0a 20  AuxdataInt") {. 
2cc0: 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20       int iVal;. 
2cd0: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
2ce0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2cf0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61  p, objv[2], &iVa
2d00: 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
2d10: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 72 63 20  ERROR;.      rc 
2d20: 3d 20 70 2d 3e 70 41 70 69 2d 3e 78 53 65 74 41  = p->pApi->xSetA
2d30: 75 78 64 61 74 61 28 70 2d 3e 70 46 74 73 2c 20  uxdata(p->pFts, 
2d40: 28 76 6f 69 64 2a 29 28 28 63 68 61 72 2a 29 30  (void*)((char*)0
2d50: 20 2b 20 69 56 61 6c 29 2c 20 30 29 3b 0a 20 20   + iVal), 0);.  
2d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d70: 0a 20 20 20 20 43 41 53 45 28 31 35 2c 20 22 78  .    CASE(15, "x
2d80: 47 65 74 41 75 78 64 61 74 61 49 6e 74 22 29 20  GetAuxdataInt") 
2d90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
2da0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 43 6c 65  ;.      int bCle
2db0: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  ar;.      if( Tc
2dc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
2dd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2de0: 5b 32 5d 2c 20 26 62 43 6c 65 61 72 29 20 29 20  [2], &bClear) ) 
2df0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e00: 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 28  ;.      iVal = (
2e10: 28 63 68 61 72 2a 29 70 2d 3e 70 41 70 69 2d 3e  (char*)p->pApi->
2e20: 78 47 65 74 41 75 78 64 61 74 61 28 70 2d 3e 70  xGetAuxdata(p->p
2e30: 46 74 73 2c 20 62 43 6c 65 61 72 29 20 2d 20 28  Fts, bClear) - (
2e40: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
2e50: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2e60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2e70: 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
2e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e90: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
2ea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
2eb0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
2ec0: 0a 20 20 7d 0a 23 75 6e 64 65 66 20 43 41 53 45  .  }.#undef CASE
2ed0: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
2ee0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
2ef0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2f00: 70 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  p, (char*)sqlite
2f10: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
2f20: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
2f30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f40: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
2f50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
2f60: 69 63 20 76 6f 69 64 20 78 46 35 74 46 75 6e 63  ic void xF5tFunc
2f70: 74 69 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 46 74  tion(.  const Ft
2f80: 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a  s5ExtensionApi *
2f90: 70 41 70 69 2c 20 20 20 2f 2a 20 41 50 49 20 6f  pApi,   /* API o
2fa0: 66 66 65 72 65 64 20 62 79 20 63 75 72 72 65 6e  ffered by curren
2fb0: 74 20 46 54 53 20 76 65 72 73 69 6f 6e 20 2a 2f  t FTS version */
2fc0: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
2fd0: 70 46 74 73 2c 20 20 20 20 20 20 20 20 20 20 20  pFts,           
2fe0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
2ff0: 74 6f 20 70 61 73 73 20 74 6f 20 70 41 70 69 20  to pass to pApi 
3000: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  functions */.  s
3010: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3020: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
3030: 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  * Context for re
3040: 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 2f 65  turning result/e
3050: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  rror */.  int nV
3060: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
3070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3080: 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e  ber of values in
3090: 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a   apVal[] array *
30a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
30b0: 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
30c0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
30d0: 74 72 61 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e  trailing argumen
30e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 46 35 74 46 75  ts */.){.  F5tFu
30f0: 6e 63 74 69 6f 6e 20 2a 70 20 3d 20 28 46 35 74  nction *p = (F5t
3100: 46 75 6e 63 74 69 6f 6e 2a 29 70 41 70 69 2d 3e  Function*)pApi->
3110: 78 55 73 65 72 44 61 74 61 28 70 46 74 73 29 3b  xUserData(pFts);
3120: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 76 61  .  Tcl_Obj *pEva
3130: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3140: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20     /* Script to 
3150: 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20 69 6e  evaluate */.  in
3160: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
3170: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
3180: 5f 69 6e 74 36 34 20 69 43 6d 64 20 3d 20 30 3b  _int64 iCmd = 0;
3190: 0a 20 20 63 68 61 72 20 7a 43 6d 64 5b 36 34 5d  .  char zCmd[64]
31a0: 3b 0a 20 20 46 35 74 41 70 69 20 73 41 70 69 3b  ;.  F5tApi sApi;
31b0: 0a 20 20 73 41 70 69 2e 70 41 70 69 20 3d 20 70  .  sApi.pApi = p
31c0: 41 70 69 3b 0a 20 20 73 41 70 69 2e 70 46 74 73  Api;.  sApi.pFts
31d0: 20 3d 20 70 46 74 73 3b 0a 0a 20 20 73 70 72 69   = pFts;..  spri
31e0: 6e 74 66 28 7a 43 6d 64 2c 20 22 66 35 74 5f 25  ntf(zCmd, "f5t_%
31f0: 6c 6c 64 22 2c 20 69 43 6d 64 2b 2b 29 3b 0a 20  lld", iCmd++);. 
3200: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
3210: 6d 6d 61 6e 64 28 70 2d 3e 69 6e 74 65 72 70 2c  mmand(p->interp,
3220: 20 7a 43 6d 64 2c 20 78 46 35 74 41 70 69 2c 20   zCmd, xF5tApi, 
3230: 26 73 41 70 69 2c 20 30 29 3b 0a 20 20 70 45 76  &sApi, 0);.  pEv
3240: 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  al = Tcl_Duplica
3250: 74 65 4f 62 6a 28 70 2d 3e 70 53 63 72 69 70 74  teObj(p->pScript
3260: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
3270: 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20  Count(pEval);.  
3280: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3290: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
32a0: 72 70 2c 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e  rp, pEval, Tcl_N
32b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6d 64  ewStringObj(zCmd
32c0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 66 6f 72 28 69  , -1));..  for(i
32d0: 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
32e0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
32f0: 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 73 77 69  Obj = 0;.    swi
3300: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
3310: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 69 5d  ue_type(apVal[i]
3320: 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
3330: 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20  SQLITE_TEXT:.   
3340: 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f       pObj = Tcl_
3350: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f  NewStringObj((co
3360: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
3370: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
3380: 61 6c 5b 69 5d 29 2c 20 2d 31 29 3b 0a 20 20 20  al[i]), -1);.   
3390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
33b0: 4f 42 3a 0a 20 20 20 20 20 20 20 20 70 4f 62 6a  OB:.        pObj
33c0: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
33d0: 72 61 79 4f 62 6a 28 0a 20 20 20 20 20 20 20 20  rayObj(.        
33e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
33f0: 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 69 5d 29  e_blob(apVal[i])
3400: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
3410: 62 79 74 65 73 28 61 70 56 61 6c 5b 69 5d 29 0a  bytes(apVal[i]).
3420: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
3430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3440: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
3450: 47 45 52 3a 0a 20 20 20 20 20 20 20 20 70 4f 62  GER:.        pOb
3460: 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
3470: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ntObj(sqlite3_va
3480: 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
3490: 69 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 62 72  i]));.        br
34a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
34b0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
34c0: 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c        pObj = Tcl
34d0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71  _NewDoubleObj(sq
34e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
34f0: 6c 65 28 61 70 56 61 6c 5b 69 5d 29 29 3b 0a 20  le(apVal[i]));. 
3500: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3510: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
3520: 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f       pObj = Tcl_
3530: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
3540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3550: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3560: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
3570: 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 70 4f  nterp, pEval, pO
3580: 62 6a 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  bj);.  }..  rc =
3590: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
35a0: 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c  ->interp, pEval,
35b0: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
35c0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
35d0: 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20  Count(pEval);.  
35e0: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
35f0: 64 28 70 2d 3e 69 6e 74 65 72 70 2c 20 7a 43 6d  d(p->interp, zCm
3600: 64 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 54  d);..  if( rc!=T
3610: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  CL_OK ){.    sql
3620: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
3630: 72 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53  r(pCtx, Tcl_GetS
3640: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
3650: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d  nterp), -1);.  }
3660: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
3670: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
3680: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
3690: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
36a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
36b0: 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d   *zType = (pVar-
36c0: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
36d0: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
36e0: 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63   "");.    char c
36f0: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
3700: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
3710: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
3720: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
3730: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
3740: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72  .      /* Only r
3750: 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70  eturn a BLOB typ
3760: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
3770: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
3780: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  rray and.      *
3790: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
37a0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
37b0: 2a 2f 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  */.      unsigne
37c0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54  d char *data = T
37d0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
37e0: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
37f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3800: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78  result_blob(pCtx
3810: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
3820: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
3830: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
3840: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
3850: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
3860: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
3870: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
3880: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
3890: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
38a0: 6e 74 28 70 43 74 78 2c 20 6e 29 3b 0a 20 20 20  nt(pCtx, n);.   
38b0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
38c0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
38d0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
38e0: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
38f0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44  ;.      Tcl_GetD
3900: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20  oubleFromObj(0, 
3910: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
3920: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3930: 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b  double(pCtx, r);
3940: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
3950: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
3960: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
3970: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
3980: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
3990: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
39a0: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
39b0: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
39c0: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
39d0: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
39e0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
39f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3a00: 36 34 28 70 43 74 78 2c 20 76 29 3b 0a 20 20 20  64(pCtx, v);.   
3a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
3a20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
3a30: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
3a40: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
3a50: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
3a60: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
3a70: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
3a80: 43 74 78 2c 20 28 63 68 61 72 20 2a 29 64 61 74  Ctx, (char *)dat
3a90: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41  a, n, SQLITE_TRA
3aa0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20  NSIENT);.    }. 
3ab0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
3ac0: 64 20 78 46 35 74 44 65 73 74 72 6f 79 28 76 6f  d xF5tDestroy(vo
3ad0: 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 46 35 74  id *pCtx){.  F5t
3ae0: 46 75 6e 63 74 69 6f 6e 20 2a 70 20 3d 20 28 46  Function *p = (F
3af0: 35 74 46 75 6e 63 74 69 6f 6e 2a 29 70 43 74 78  5tFunction*)pCtx
3b00: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
3b10: 6f 75 6e 74 28 70 2d 3e 70 53 63 72 69 70 74 29  ount(p->pScript)
3b20: 3b 0a 20 20 63 6b 66 72 65 65 28 28 63 68 61 72  ;.  ckfree((char
3b30: 20 2a 29 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   *)p);.}../*.** 
3b40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 74 73       sqlite3_fts
3b50: 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  5_create_functio
3b60: 6e 20 44 42 20 4e 41 4d 45 20 53 43 52 49 50 54  n DB NAME SCRIPT
3b70: 0a 2a 2a 0a 2a 2a 20 44 65 73 63 72 69 70 74 69  .**.** Descripti
3b80: 6f 6e 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on....*/.static 
3b90: 69 6e 74 20 66 35 74 43 72 65 61 74 65 46 75 6e  int f5tCreateFun
3ba0: 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
3bb0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
3bc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3bd0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
3be0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
3bf0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
3c00: 2a 7a 4e 61 6d 65 3b 0a 20 20 54 63 6c 5f 4f 62  *zName;.  Tcl_Ob
3c10: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 73 71  j *pScript;.  sq
3c20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20  lite3 *db = 0;. 
3c30: 20 66 74 73 35 5f 61 70 69 20 2a 70 41 70 69 20   fts5_api *pApi 
3c40: 3d 20 30 3b 0a 20 20 46 35 74 46 75 6e 63 74 69  = 0;.  F5tFuncti
3c50: 6f 6e 20 2a 70 43 74 78 20 3d 20 30 3b 0a 20 20  on *pCtx = 0;.  
3c60: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
3c70: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
3c80: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
3c90: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
3ca0: 22 44 42 20 4e 41 4d 45 20 53 43 52 49 50 54 22  "DB NAME SCRIPT"
3cb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3cc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
3cd0: 66 28 20 66 35 74 44 62 41 6e 64 41 70 69 28 69  f( f5tDbAndApi(i
3ce0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
3cf0: 26 64 62 2c 20 26 70 41 70 69 29 20 29 20 72 65  &db, &pApi) ) re
3d00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3d10: 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
3d20: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
3d30: 29 3b 0a 20 20 70 53 63 72 69 70 74 20 3d 20 6f  );.  pScript = o
3d40: 62 6a 76 5b 33 5d 3b 0a 20 20 70 43 74 78 20 3d  bjv[3];.  pCtx =
3d50: 20 28 46 35 74 46 75 6e 63 74 69 6f 6e 2a 29 63   (F5tFunction*)c
3d60: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 35  kalloc(sizeof(F5
3d70: 74 46 75 6e 63 74 69 6f 6e 29 29 3b 0a 20 20 70  tFunction));.  p
3d80: 43 74 78 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  Ctx->interp = in
3d90: 74 65 72 70 3b 0a 20 20 70 43 74 78 2d 3e 70 53  terp;.  pCtx->pS
3da0: 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b  cript = pScript;
3db0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
3dc0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20  unt(pScript);.. 
3dd0: 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 72 65   rc = pApi->xCre
3de0: 61 74 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 20  ateFunction(.   
3df0: 20 20 20 70 41 70 69 2c 20 7a 4e 61 6d 65 2c 20     pApi, zName, 
3e00: 28 76 6f 69 64 2a 29 70 43 74 78 2c 20 78 46 35  (void*)pCtx, xF5
3e10: 74 46 75 6e 63 74 69 6f 6e 2c 20 78 46 35 74 44  tFunction, xF5tD
3e20: 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66  estroy.  );.  if
3e30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3e40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3e50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3e60: 22 65 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "error: ", sqlit
3e70: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
3e80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3e90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
3ea0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3eb0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
3ec0: 20 46 35 74 54 6f 6b 65 6e 69 7a 65 43 74 78 20   F5tTokenizeCtx 
3ed0: 46 35 74 54 6f 6b 65 6e 69 7a 65 43 74 78 3b 0a  F5tTokenizeCtx;.
3ee0: 73 74 72 75 63 74 20 46 35 74 54 6f 6b 65 6e 69  struct F5tTokeni
3ef0: 7a 65 43 74 78 20 7b 0a 20 20 54 63 6c 5f 4f 62  zeCtx {.  Tcl_Ob
3f00: 6a 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 62  j *pRet;.  int b
3f10: 53 75 62 73 74 3b 0a 20 20 63 6f 6e 73 74 20 63  Subst;.  const c
3f20: 68 61 72 20 2a 7a 49 6e 70 75 74 3b 0a 7d 3b 0a  har *zInput;.};.
3f30: 0a 73 74 61 74 69 63 20 69 6e 74 20 78 54 6f 6b  .static int xTok
3f40: 65 6e 69 7a 65 43 62 32 28 0a 20 20 76 6f 69 64  enizeCb2(.  void
3f50: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 74   *pCtx, .  int t
3f60: 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73 74 20 63  flags,.  const c
3f70: 68 61 72 20 2a 7a 54 6f 6b 65 6e 2c 20 69 6e 74  har *zToken, int
3f80: 20 6e 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20   nToken, .  int 
3f90: 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64  iStart, int iEnd
3fa0: 0a 29 7b 0a 20 20 46 35 74 54 6f 6b 65 6e 69 7a  .){.  F5tTokeniz
3fb0: 65 43 74 78 20 2a 70 20 3d 20 28 46 35 74 54 6f  eCtx *p = (F5tTo
3fc0: 6b 65 6e 69 7a 65 43 74 78 2a 29 70 43 74 78 3b  kenizeCtx*)pCtx;
3fd0: 0a 20 20 69 66 28 20 70 2d 3e 62 53 75 62 73 74  .  if( p->bSubst
3fe0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   ){.    Tcl_List
3ff0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4000: 28 30 2c 20 70 2d 3e 70 52 65 74 2c 20 54 63 6c  (0, p->pRet, Tcl
4010: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
4020: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 29 3b 0a  oken, nToken));.
4030: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4040: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
4050: 20 20 20 20 20 20 30 2c 20 70 2d 3e 70 52 65 74        0, p->pRet
4060: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4070: 62 6a 28 26 70 2d 3e 7a 49 6e 70 75 74 5b 69 53  bj(&p->zInput[iS
4080: 74 61 72 74 5d 2c 20 69 45 6e 64 2d 69 53 74 61  tart], iEnd-iSta
4090: 72 74 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  rt).    );.  }el
40a0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  se{.    Tcl_List
40b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
40c0: 28 30 2c 20 70 2d 3e 70 52 65 74 2c 20 54 63 6c  (0, p->pRet, Tcl
40d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
40e0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 29 3b 0a  oken, nToken));.
40f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4100: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
4110: 70 2d 3e 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p->pRet, Tcl_New
4120: 49 6e 74 4f 62 6a 28 69 53 74 61 72 74 29 29 3b  IntObj(iStart));
4130: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4140: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4150: 20 70 2d 3e 70 52 65 74 2c 20 54 63 6c 5f 4e 65   p->pRet, Tcl_Ne
4160: 77 49 6e 74 4f 62 6a 28 69 45 6e 64 29 29 3b 0a  wIntObj(iEnd));.
4170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4180: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
4190: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  *      sqlite3_f
41a0: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 20 44 42 20  ts5_tokenize DB 
41b0: 54 4f 4b 45 4e 49 5a 45 52 20 54 45 58 54 0a 2a  TOKENIZER TEXT.*
41c0: 2a 0a 2a 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  *.** Description
41d0: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
41e0: 74 20 66 35 74 54 6f 6b 65 6e 69 7a 65 28 0a 20  t f5tTokenize(. 
41f0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
4200: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
4210: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
4220: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
4230: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
4240: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a  .  char *zText;.
4250: 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 73    int nText;.  s
4260: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
4270: 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41 70 69    fts5_api *pApi
4280: 20 3d 20 30 3b 0a 20 20 46 74 73 35 54 6f 6b 65   = 0;.  Fts5Toke
4290: 6e 69 7a 65 72 20 2a 70 54 6f 6b 20 3d 20 30 3b  nizer *pTok = 0;
42a0: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
42b0: 72 20 74 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 54  r tokenizer;.  T
42c0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 30  cl_Obj *pRet = 0
42d0: 3b 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 64  ;.  void *pUserd
42e0: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
42f0: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 63 6f    int nArg;.  co
4300: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  nst char **azArg
4310: 3b 0a 20 20 46 35 74 54 6f 6b 65 6e 69 7a 65 43  ;.  F5tTokenizeC
4320: 74 78 20 63 74 78 3b 0a 0a 20 20 69 66 28 20 6f  tx ctx;..  if( o
4330: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
4340: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
4350: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4360: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 73 75  , 1, objv, "?-su
4370: 62 73 74 3f 20 44 42 20 4e 41 4d 45 20 54 45 58  bst? DB NAME TEX
4380: 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
4390: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
43a0: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a   if( objc==5 ){.
43b0: 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 20 3d      char *zOpt =
43c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
43d0: 62 6a 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[1]);.    if(
43e0: 20 73 74 72 63 6d 70 28 22 2d 73 75 62 73 74 22   strcmp("-subst"
43f0: 2c 20 7a 4f 70 74 29 20 29 7b 0a 20 20 20 20 20  , zOpt) ){.     
4400: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4410: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 72 65 63  t(interp, "unrec
4420: 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
4430: 22 2c 20 7a 4f 70 74 2c 20 30 29 3b 0a 20 20 20  ", zOpt, 0);.   
4440: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4450: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
4460: 20 69 66 28 20 66 35 74 44 62 41 6e 64 41 70 69   if( f5tDbAndApi
4470: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
4480: 6a 63 2d 33 5d 2c 20 26 64 62 2c 20 26 70 41 70  jc-3], &db, &pAp
4490: 69 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  i) ) return TCL_
44a0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
44b0: 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 72  _SplitList(inter
44c0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
44d0: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 2c 20  (objv[objc-2]), 
44e0: 26 6e 41 72 67 2c 20 26 61 7a 41 72 67 29 20 29  &nArg, &azArg) )
44f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
4500: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4510: 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20  ( nArg==0 ){.   
4520: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4530: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
4540: 63 68 20 74 6f 6b 65 6e 69 7a 65 72 3a 20 22 2c  ch tokenizer: ",
4550: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65   0);.    Tcl_Fre
4560: 65 28 28 76 6f 69 64 2a 29 61 7a 41 72 67 29 3b  e((void*)azArg);
4570: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4580: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 54 65  ERROR;.  }.  zTe
4590: 78 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  xt = Tcl_GetStri
45a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f  ngFromObj(objv[o
45b0: 62 6a 63 2d 31 5d 2c 20 26 6e 54 65 78 74 29 3b  bjc-1], &nText);
45c0: 0a 0a 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78  ..  rc = pApi->x
45d0: 46 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28 70 41  FindTokenizer(pA
45e0: 70 69 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 26 70  pi, azArg[0], &p
45f0: 55 73 65 72 64 61 74 61 2c 20 26 74 6f 6b 65 6e  Userdata, &token
4600: 69 7a 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  izer);.  if( rc!
4610: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4630: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73  lt(interp, "no s
4640: 75 63 68 20 74 6f 6b 65 6e 69 7a 65 72 3a 20 22  uch tokenizer: "
4650: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3b 0a  , azArg[0], 0);.
4660: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4670: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
4680: 3d 20 74 6f 6b 65 6e 69 7a 65 72 2e 78 43 72 65  = tokenizer.xCre
4690: 61 74 65 28 70 55 73 65 72 64 61 74 61 2c 20 26  ate(pUserdata, &
46a0: 61 7a 41 72 67 5b 31 5d 2c 20 6e 41 72 67 2d 31  azArg[1], nArg-1
46b0: 2c 20 26 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  , &pTok);.  if( 
46c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
46d0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
46e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
46f0: 72 72 6f 72 20 69 6e 20 74 6f 6b 65 6e 69 7a 65  rror in tokenize
4700: 72 2e 78 43 72 65 61 74 65 28 29 22 2c 20 30 29  r.xCreate()", 0)
4710: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4720: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
4730: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
4740: 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
4750: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
4760: 63 74 78 2e 62 53 75 62 73 74 20 3d 20 28 6f 62  ctx.bSubst = (ob
4770: 6a 63 3d 3d 35 29 3b 0a 20 20 63 74 78 2e 70 52  jc==5);.  ctx.pR
4780: 65 74 20 3d 20 70 52 65 74 3b 0a 20 20 63 74 78  et = pRet;.  ctx
4790: 2e 7a 49 6e 70 75 74 20 3d 20 7a 54 65 78 74 3b  .zInput = zText;
47a0: 0a 20 20 72 63 20 3d 20 74 6f 6b 65 6e 69 7a 65  .  rc = tokenize
47b0: 72 2e 78 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 20  r.xTokenize(.   
47c0: 20 20 20 70 54 6f 6b 2c 20 28 76 6f 69 64 2a 29     pTok, (void*)
47d0: 26 63 74 78 2c 20 46 54 53 35 5f 54 4f 4b 45 4e  &ctx, FTS5_TOKEN
47e0: 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 2c 20 7a 54  IZE_DOCUMENT, zT
47f0: 65 78 74 2c 20 6e 54 65 78 74 2c 20 78 54 6f 6b  ext, nText, xTok
4800: 65 6e 69 7a 65 43 62 32 0a 20 20 29 3b 0a 20 20  enizeCb2.  );.  
4810: 74 6f 6b 65 6e 69 7a 65 72 2e 78 44 65 6c 65 74  tokenizer.xDelet
4820: 65 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 72  e(pTok);.  if( r
4830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4840: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4850: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72  sult(interp, "er
4860: 72 6f 72 20 69 6e 20 74 6f 6b 65 6e 69 7a 65 72  ror in tokenizer
4870: 2e 78 54 6f 6b 65 6e 69 7a 65 28 29 22 2c 20 30  .xTokenize()", 0
4880: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
4890: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
48a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
48b0: 52 4f 52 3b 0a 20 20 7d 0a 0a 0a 20 20 54 63 6c  ROR;.  }...  Tcl
48c0: 5f 46 72 65 65 28 28 76 6f 69 64 2a 29 61 7a 41  _Free((void*)azA
48d0: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  rg);.  Tcl_SetOb
48e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
48f0: 70 52 65 74 29 3b 0a 20 20 54 63 6c 5f 44 65 63  pRet);.  Tcl_Dec
4900: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
4910: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4920: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4970: 2a 2a 20 53 74 61 72 74 20 6f 66 20 74 6f 6b 65  ** Start of toke
4980: 6e 69 7a 65 72 20 77 72 61 70 70 65 72 2e 0a 2a  nizer wrapper..*
4990: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
49a0: 74 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f  t F5tTokenizerCo
49b0: 6e 74 65 78 74 20 46 35 74 54 6f 6b 65 6e 69 7a  ntext F5tTokeniz
49c0: 65 72 43 6f 6e 74 65 78 74 3b 0a 74 79 70 65 64  erContext;.typed
49d0: 65 66 20 73 74 72 75 63 74 20 46 35 74 54 6f 6b  ef struct F5tTok
49e0: 65 6e 69 7a 65 72 43 62 20 46 35 74 54 6f 6b 65  enizerCb F5tToke
49f0: 6e 69 7a 65 72 43 62 3b 0a 74 79 70 65 64 65 66  nizerCb;.typedef
4a00: 20 73 74 72 75 63 74 20 46 35 74 54 6f 6b 65 6e   struct F5tToken
4a10: 69 7a 65 72 4d 6f 64 75 6c 65 20 46 35 74 54 6f  izerModule F5tTo
4a20: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 3b 0a 74  kenizerModule;.t
4a30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 35  ypedef struct F5
4a40: 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e  tTokenizerInstan
4a50: 63 65 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 49  ce F5tTokenizerI
4a60: 6e 73 74 61 6e 63 65 3b 0a 0a 73 74 72 75 63 74  nstance;..struct
4a70: 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e   F5tTokenizerCon
4a80: 74 65 78 74 20 7b 0a 20 20 76 6f 69 64 20 2a 70  text {.  void *p
4a90: 43 74 78 3b 0a 20 20 69 6e 74 20 28 2a 78 54 6f  Ctx;.  int (*xTo
4aa0: 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c  ken)(void*, int,
4ab0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
4ac0: 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 7d 3b  t, int, int);.};
4ad0: 0a 0a 73 74 72 75 63 74 20 46 35 74 54 6f 6b 65  ..struct F5tToke
4ae0: 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 7b 0a 20 20  nizerModule {.  
4af0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b00: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
4b10: 53 63 72 69 70 74 3b 0a 20 20 46 35 74 54 6f 6b  Script;.  F5tTok
4b20: 65 6e 69 7a 65 72 43 6f 6e 74 65 78 74 20 2a 70  enizerContext *p
4b30: 43 6f 6e 74 65 78 74 3b 0a 7d 3b 0a 0a 73 74 72  Context;.};..str
4b40: 75 63 74 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72  uct F5tTokenizer
4b50: 49 6e 73 74 61 6e 63 65 20 7b 0a 20 20 54 63 6c  Instance {.  Tcl
4b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
4b70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4b80: 69 70 74 3b 0a 20 20 46 35 74 54 6f 6b 65 6e 69  ipt;.  F5tTokeni
4b90: 7a 65 72 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e  zerContext *pCon
4ba0: 74 65 78 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63  text;.};..static
4bb0: 20 69 6e 74 20 66 35 74 54 6f 6b 65 6e 69 7a 65   int f5tTokenize
4bc0: 72 43 72 65 61 74 65 28 0a 20 20 76 6f 69 64 20  rCreate(.  void 
4bd0: 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20  *pCtx, .  const 
4be0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 0a 20  char **azArg, . 
4bf0: 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 46 74   int nArg, .  Ft
4c00: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70  s5Tokenizer **pp
4c10: 4f 75 74 0a 29 7b 0a 20 20 46 35 74 54 6f 6b 65  Out.){.  F5tToke
4c20: 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 4d 6f  nizerModule *pMo
4c30: 64 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65  d = (F5tTokenize
4c40: 72 4d 6f 64 75 6c 65 2a 29 70 43 74 78 3b 0a 20  rModule*)pCtx;. 
4c50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b   Tcl_Obj *pEval;
4c60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f  .  int rc = TCL_
4c70: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  OK;.  int i;..  
4c80: 70 45 76 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  pEval = Tcl_Dupl
4c90: 69 63 61 74 65 4f 62 6a 28 70 4d 6f 64 2d 3e 70  icateObj(pMod->p
4ca0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 49  Script);.  Tcl_I
4cb0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76 61  ncrRefCount(pEva
4cc0: 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  l);.  for(i=0; r
4cd0: 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 69 3c 6e  c==TCL_OK && i<n
4ce0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  Arg; i++){.    T
4cf0: 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 54  cl_Obj *pObj = T
4d00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4d10: 61 7a 41 72 67 5b 69 5d 2c 20 2d 31 29 3b 0a 20  azArg[i], -1);. 
4d20: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
4d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4d40: 28 70 4d 6f 64 2d 3e 69 6e 74 65 72 70 2c 20 70  (pMod->interp, p
4d50: 45 76 61 6c 2c 20 70 4f 62 6a 29 3b 0a 20 20 7d  Eval, pObj);.  }
4d60: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
4d70: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 54  OK ){.    rc = T
4d80: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 4d 6f  cl_EvalObjEx(pMo
4d90: 64 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c  d->interp, pEval
4da0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4db0: 59 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65  Y);.  }.  Tcl_De
4dc0: 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76 61 6c  crRefCount(pEval
4dd0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43  );..  if( rc==TC
4de0: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 35 74 54  L_OK ){.    F5tT
4df0: 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e 63 65  okenizerInstance
4e00: 20 2a 70 49 6e 73 74 3b 0a 20 20 20 20 70 49 6e   *pInst;.    pIn
4e10: 73 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a  st = (F5tTokeniz
4e20: 65 72 49 6e 73 74 61 6e 63 65 2a 29 63 6b 61 6c  erInstance*)ckal
4e30: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 35 74 54 6f  loc(sizeof(F5tTo
4e40: 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e 63 65 29  kenizerInstance)
4e50: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  );.    memset(pI
4e60: 6e 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  nst, 0, sizeof(F
4e70: 35 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61  5tTokenizerInsta
4e80: 6e 63 65 29 29 3b 0a 20 20 20 20 70 49 6e 73 74  nce));.    pInst
4e90: 2d 3e 69 6e 74 65 72 70 20 3d 20 70 4d 6f 64 2d  ->interp = pMod-
4ea0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 49 6e  >interp;.    pIn
4eb0: 73 74 2d 3e 70 53 63 72 69 70 74 20 3d 20 54 63  st->pScript = Tc
4ec0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
4ed0: 4d 6f 64 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  Mod->interp);.  
4ee0: 20 20 70 49 6e 73 74 2d 3e 70 43 6f 6e 74 65 78    pInst->pContex
4ef0: 74 20 3d 20 70 4d 6f 64 2d 3e 70 43 6f 6e 74 65  t = pMod->pConte
4f00: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  xt;.    Tcl_Incr
4f10: 52 65 66 43 6f 75 6e 74 28 70 49 6e 73 74 2d 3e  RefCount(pInst->
4f20: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 2a 70  pScript);.    *p
4f30: 70 4f 75 74 20 3d 20 28 46 74 73 35 54 6f 6b 65  pOut = (Fts5Toke
4f40: 6e 69 7a 65 72 2a 29 70 49 6e 73 74 3b 0a 20 20  nizer*)pInst;.  
4f50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
4f60: 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
4f70: 66 35 74 54 6f 6b 65 6e 69 7a 65 72 44 65 6c 65  f5tTokenizerDele
4f80: 74 65 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  te(Fts5Tokenizer
4f90: 20 2a 70 29 7b 0a 20 20 46 35 74 54 6f 6b 65 6e   *p){.  F5tToken
4fa0: 69 7a 65 72 49 6e 73 74 61 6e 63 65 20 2a 70 49  izerInstance *pI
4fb0: 6e 73 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69  nst = (F5tTokeni
4fc0: 7a 65 72 49 6e 73 74 61 6e 63 65 2a 29 70 3b 0a  zerInstance*)p;.
4fd0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4fe0: 6e 74 28 70 49 6e 73 74 2d 3e 70 53 63 72 69 70  nt(pInst->pScrip
4ff0: 74 29 3b 0a 20 20 63 6b 66 72 65 65 28 28 63 68  t);.  ckfree((ch
5000: 61 72 20 2a 29 70 49 6e 73 74 29 3b 0a 7d 0a 0a  ar *)pInst);.}..
5010: 73 74 61 74 69 63 20 69 6e 74 20 66 35 74 54 6f  static int f5tTo
5020: 6b 65 6e 69 7a 65 72 54 6f 6b 65 6e 69 7a 65 28  kenizerTokenize(
5030: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  .  Fts5Tokenizer
5040: 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
5050: 74 78 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  tx,.  int flags,
5060: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
5070: 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c  Text, int nText,
5080: 20 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e   .  int (*xToken
5090: 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f  )(void*, int, co
50a0: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20  nst char*, int, 
50b0: 69 6e 74 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 46  int, int).){.  F
50c0: 35 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61  5tTokenizerInsta
50d0: 6e 63 65 20 2a 70 49 6e 73 74 20 3d 20 28 46 35  nce *pInst = (F5
50e0: 74 54 6f 6b 65 6e 69 7a 65 72 49 6e 73 74 61 6e  tTokenizerInstan
50f0: 63 65 2a 29 70 3b 0a 20 20 76 6f 69 64 20 2a 70  ce*)p;.  void *p
5100: 4f 6c 64 43 74 78 3b 0a 20 20 69 6e 74 20 28 2a  OldCtx;.  int (*
5110: 78 4f 6c 64 54 6f 6b 65 6e 29 28 76 6f 69 64 2a  xOldToken)(void*
5120: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
5130: 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e  r*, int, int, in
5140: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
5150: 45 76 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Eval;.  int rc;.
5160: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5170: 6c 61 67 73 3b 0a 0a 20 20 70 4f 6c 64 43 74 78  lags;..  pOldCtx
5180: 20 3d 20 70 49 6e 73 74 2d 3e 70 43 6f 6e 74 65   = pInst->pConte
5190: 78 74 2d 3e 70 43 74 78 3b 0a 20 20 78 4f 6c 64  xt->pCtx;.  xOld
51a0: 54 6f 6b 65 6e 20 3d 20 70 49 6e 73 74 2d 3e 70  Token = pInst->p
51b0: 43 6f 6e 74 65 78 74 2d 3e 78 54 6f 6b 65 6e 3b  Context->xToken;
51c0: 0a 0a 20 20 70 49 6e 73 74 2d 3e 70 43 6f 6e 74  ..  pInst->pCont
51d0: 65 78 74 2d 3e 70 43 74 78 20 3d 20 70 43 74 78  ext->pCtx = pCtx
51e0: 3b 0a 20 20 70 49 6e 73 74 2d 3e 70 43 6f 6e 74  ;.  pInst->pCont
51f0: 65 78 74 2d 3e 78 54 6f 6b 65 6e 20 3d 20 78 54  ext->xToken = xT
5200: 6f 6b 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  oken;..  assert(
5210: 20 0a 20 20 20 20 20 20 66 6c 61 67 73 3d 3d 46   .      flags==F
5220: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43  TS5_TOKENIZE_DOC
5230: 55 4d 45 4e 54 0a 20 20 20 7c 7c 20 66 6c 61 67  UMENT.   || flag
5240: 73 3d 3d 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45  s==FTS5_TOKENIZE
5250: 5f 41 55 58 0a 20 20 20 7c 7c 20 66 6c 61 67 73  _AUX.   || flags
5260: 3d 3d 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f  ==FTS5_TOKENIZE_
5270: 51 55 45 52 59 0a 20 20 20 7c 7c 20 66 6c 61 67  QUERY.   || flag
5280: 73 3d 3d 28 46 54 53 35 5f 54 4f 4b 45 4e 49 5a  s==(FTS5_TOKENIZ
5290: 45 5f 51 55 45 52 59 20 7c 20 46 54 53 35 5f 54  E_QUERY | FTS5_T
52a0: 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58 29 0a  OKENIZE_PREFIX).
52b0: 20 20 29 3b 0a 20 20 70 45 76 61 6c 20 3d 20 54    );.  pEval = T
52c0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
52d0: 70 49 6e 73 74 2d 3e 70 53 63 72 69 70 74 29 3b  pInst->pScript);
52e0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
52f0: 75 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20 73 77  unt(pEval);.  sw
5300: 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
5310: 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 4f 4b     case FTS5_TOK
5320: 45 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 3a 0a  ENIZE_DOCUMENT:.
5330: 20 20 20 20 20 20 7a 46 6c 61 67 73 20 3d 20 22        zFlags = "
5340: 64 6f 63 75 6d 65 6e 74 22 3b 0a 20 20 20 20 20  document";.     
5350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5360: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 41   FTS5_TOKENIZE_A
5370: 55 58 3a 0a 20 20 20 20 20 20 7a 46 6c 61 67 73  UX:.      zFlags
5380: 20 3d 20 22 61 75 78 22 3b 0a 20 20 20 20 20 20   = "aux";.      
5390: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
53a0: 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55  FTS5_TOKENIZE_QU
53b0: 45 52 59 3a 0a 20 20 20 20 20 20 7a 46 6c 61 67  ERY:.      zFlag
53c0: 73 20 3d 20 22 71 75 65 72 79 22 3b 0a 20 20 20  s = "query";.   
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
53e0: 73 65 20 28 46 54 53 35 5f 54 4f 4b 45 4e 49 5a  se (FTS5_TOKENIZ
53f0: 45 5f 50 52 45 46 49 58 20 7c 20 46 54 53 35 5f  E_PREFIX | FTS5_
5400: 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 29 3a  TOKENIZE_QUERY):
5410: 0a 20 20 20 20 20 20 7a 46 6c 61 67 73 20 3d 20  .      zFlags = 
5420: 22 70 72 65 66 69 78 71 75 65 72 79 22 3b 0a 20  "prefixquery";. 
5430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5440: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
5450: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
5460: 20 20 7a 46 6c 61 67 73 20 3d 20 22 69 6e 76 61    zFlags = "inva
5470: 6c 69 64 22 3b 0a 20 20 20 20 20 20 62 72 65 61  lid";.      brea
5480: 6b 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 4c 69  k;.  }..  Tcl_Li
5490: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
54a0: 6e 74 28 70 49 6e 73 74 2d 3e 69 6e 74 65 72 70  nt(pInst->interp
54b0: 2c 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77  , pEval, Tcl_New
54c0: 53 74 72 69 6e 67 4f 62 6a 28 7a 46 6c 61 67 73  StringObj(zFlags
54d0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
54e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
54f0: 6e 74 28 70 49 6e 73 74 2d 3e 69 6e 74 65 72 70  nt(pInst->interp
5500: 2c 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77  , pEval, Tcl_New
5510: 53 74 72 69 6e 67 4f 62 6a 28 70 54 65 78 74 2c  StringObj(pText,
5520: 6e 54 65 78 74 29 29 3b 0a 20 20 72 63 20 3d 20  nText));.  rc = 
5530: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 49  Tcl_EvalObjEx(pI
5540: 6e 73 74 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76  nst->interp, pEv
5550: 61 6c 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  al, TCL_GLOBAL_O
5560: 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  NLY);.  Tcl_Decr
5570: 52 65 66 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b  RefCount(pEval);
5580: 0a 0a 20 20 70 49 6e 73 74 2d 3e 70 43 6f 6e 74  ..  pInst->pCont
5590: 65 78 74 2d 3e 70 43 74 78 20 3d 20 70 4f 6c 64  ext->pCtx = pOld
55a0: 43 74 78 3b 0a 20 20 70 49 6e 73 74 2d 3e 70 43  Ctx;.  pInst->pC
55b0: 6f 6e 74 65 78 74 2d 3e 78 54 6f 6b 65 6e 20 3d  ontext->xToken =
55c0: 20 78 4f 6c 64 54 6f 6b 65 6e 3b 0a 20 20 72 65   xOldToken;.  re
55d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
55e0: 2a 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 74  * sqlite3_fts5_t
55f0: 6f 6b 65 6e 20 3f 2d 63 6f 6c 6f 63 61 74 65 64  oken ?-colocated
5600: 3f 20 54 45 58 54 20 53 54 41 52 54 20 45 4e 44  ? TEXT START END
5610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5620: 35 74 54 6f 6b 65 6e 69 7a 65 72 52 65 74 75 72  5tTokenizerRetur
5630: 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
5640: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
5650: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
5660: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
5670: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
5680: 5d 0a 29 7b 0a 20 20 46 35 74 54 6f 6b 65 6e 69  ].){.  F5tTokeni
5690: 7a 65 72 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20  zerContext *p = 
56a0: 28 46 35 74 54 6f 6b 65 6e 69 7a 65 72 43 6f 6e  (F5tTokenizerCon
56b0: 74 65 78 74 2a 29 63 6c 69 65 6e 74 44 61 74 61  text*)clientData
56c0: 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b 0a  ;.  int iStart;.
56d0: 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 69 6e    int iEnd;.  in
56e0: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20  t nToken;.  int 
56f0: 74 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 63 68  tflags = 0;.  ch
5700: 61 72 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e  ar *zToken;.  in
5710: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
5720: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 6e 74 20  c==5 ){.    int 
5730: 6e 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nArg;.    char *
5740: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
5750: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
5760: 5b 31 5d 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20  [1], &nArg);.   
5770: 20 69 66 28 20 6e 41 72 67 3c 3d 31 30 20 26 26   if( nArg<=10 &&
5780: 20 6e 41 72 67 3e 3d 32 20 26 26 20 6d 65 6d 63   nArg>=2 && memc
5790: 6d 70 28 22 2d 63 6f 6c 6f 63 61 74 65 64 22 2c  mp("-colocated",
57a0: 20 7a 41 72 67 2c 20 6e 41 72 67 29 3d 3d 30 20   zArg, nArg)==0 
57b0: 29 7b 0a 20 20 20 20 20 20 74 66 6c 61 67 73 20  ){.      tflags 
57c0: 7c 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f  |= FTS5_TOKEN_CO
57d0: 4c 4f 43 41 54 45 44 3b 0a 20 20 20 20 7d 65 6c  LOCATED;.    }el
57e0: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 75  se{.      goto u
57f0: 73 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sage;.    }.  }e
5800: 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  lse if( objc!=4 
5810: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 73 61 67  ){.    goto usag
5820: 65 3b 0a 20 20 7d 0a 0a 20 20 7a 54 6f 6b 65 6e  e;.  }..  zToken
5830: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
5840: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62 6a  FromObj(objv[obj
5850: 63 2d 33 5d 2c 20 26 6e 54 6f 6b 65 6e 29 3b 0a  c-3], &nToken);.
5860: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
5870: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
5880: 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20 26 69  objv[objc-2], &i
5890: 53 74 61 72 74 29 20 0a 20 20 20 7c 7c 20 54 63  Start) .   || Tc
58a0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
58b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a  interp, objv[obj
58c0: 63 2d 31 5d 2c 20 26 69 45 6e 64 29 20 0a 20 20  c-1], &iEnd) .  
58d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
58e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
58f0: 69 66 28 20 70 2d 3e 78 54 6f 6b 65 6e 3d 3d 30  if( p->xToken==0
5900: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5920: 20 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74   .        "sqlit
5930: 65 33 5f 66 74 73 35 5f 74 6f 6b 65 6e 20 6d 61  e3_fts5_token ma
5940: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 62  y only be used b
5950: 79 20 74 6f 6b 65 6e 69 7a 65 72 20 63 61 6c 6c  y tokenizer call
5960: 62 61 63 6b 22 2c 20 30 0a 20 20 20 20 29 3b 0a  back", 0.    );.
5970: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5980: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
5990: 3d 20 70 2d 3e 78 54 6f 6b 65 6e 28 70 2d 3e 70  = p->xToken(p->p
59a0: 43 74 78 2c 20 74 66 6c 61 67 73 2c 20 7a 54 6f  Ctx, tflags, zTo
59b0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 53 74  ken, nToken, iSt
59c0: 61 72 74 2c 20 69 45 6e 64 29 3b 0a 20 20 54 63  art, iEnd);.  Tc
59d0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
59e0: 72 70 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  rp, (char*)sqlit
59f0: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
5a00: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
5a10: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
5a20: 20 75 73 61 67 65 3a 0a 20 20 54 63 6c 5f 57 72   usage:.  Tcl_Wr
5a30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5a40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 63  p, 1, objv, "?-c
5a50: 6f 6c 6f 63 61 74 65 64 3f 20 54 45 58 54 20 53  olocated? TEXT S
5a60: 54 41 52 54 20 45 4e 44 22 29 3b 0a 20 20 72 65  TART END");.  re
5a70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5a80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
5a90: 35 74 44 65 6c 54 6f 6b 65 6e 69 7a 65 72 28 76  5tDelTokenizer(v
5aa0: 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 46 35  oid *pCtx){.  F5
5ab0: 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  tTokenizerModule
5ac0: 20 2a 70 4d 6f 64 20 3d 20 28 46 35 74 54 6f 6b   *pMod = (F5tTok
5ad0: 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 2a 29 70 43  enizerModule*)pC
5ae0: 74 78 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  tx;.  Tcl_DecrRe
5af0: 66 43 6f 75 6e 74 28 70 4d 6f 64 2d 3e 70 53 63  fCount(pMod->pSc
5b00: 72 69 70 74 29 3b 0a 20 20 63 6b 66 72 65 65 28  ript);.  ckfree(
5b10: 28 63 68 61 72 20 2a 29 70 4d 6f 64 29 3b 0a 7d  (char *)pMod);.}
5b20: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ../*.**      sql
5b30: 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65  ite3_fts5_create
5b40: 5f 74 6f 6b 65 6e 69 7a 65 72 20 44 42 20 4e 41  _tokenizer DB NA
5b50: 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20  ME SCRIPT.**.** 
5b60: 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b 65 6e  Register a token
5b70: 69 7a 65 72 20 6e 61 6d 65 64 20 4e 41 4d 45 20  izer named NAME 
5b80: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 73  implemented by s
5b90: 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 57 68  cript SCRIPT. Wh
5ba0: 65 6e 0a 2a 2a 20 61 20 74 6f 6b 65 6e 69 7a 65  en.** a tokenize
5bb0: 72 20 69 6e 73 74 61 6e 63 65 20 69 73 20 63 72  r instance is cr
5bc0: 65 61 74 65 64 20 28 66 74 73 35 5f 74 6f 6b 65  eated (fts5_toke
5bd0: 6e 69 7a 65 72 2e 78 43 72 65 61 74 65 29 2c 20  nizer.xCreate), 
5be0: 61 6e 79 20 74 6f 6b 65 6e 69 7a 65 72 0a 2a 2a  any tokenizer.**
5bf0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
5c00: 70 70 65 6e 64 65 64 20 74 6f 20 53 43 52 49 50  ppended to SCRIP
5c10: 54 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  T and the result
5c20: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a   executed..**.**
5c30: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5c40: 6e 65 64 20 62 79 20 28 53 43 52 49 50 54 20 2b  ned by (SCRIPT +
5c50: 20 61 72 67 73 29 20 69 73 20 69 74 73 65 6c 66   args) is itself
5c60: 20 61 20 74 63 6c 20 73 63 72 69 70 74 2e 20 54   a tcl script. T
5c70: 68 69 73 20 0a 2a 2a 20 73 63 72 69 70 74 20 2d  his .** script -
5c80: 20 63 61 6c 6c 20 69 74 20 53 43 52 49 50 54 32   call it SCRIPT2
5c90: 20 2d 20 69 73 20 65 78 65 63 75 74 65 64 20 74   - is executed t
5ca0: 6f 20 74 6f 6b 65 6e 69 7a 65 20 74 65 78 74 20  o tokenize text 
5cb0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 74 6f 6b  using the.** tok
5cc0: 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65 20  enizer instance 
5cd0: 22 72 65 74 75 72 6e 65 64 22 20 62 79 20 53 43  "returned" by SC
5ce0: 52 49 50 54 2e 20 53 70 65 63 69 66 69 63 61 6c  RIPT. Specifical
5cf0: 6c 79 2c 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 0a  ly, to tokenize.
5d00: 2a 2a 20 74 65 78 74 20 53 43 52 49 50 54 32 20  ** text SCRIPT2 
5d10: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
5d20: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5d30: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74  t appended to it
5d40: 20 2d 20 74 68 65 0a 2a 2a 20 74 65 78 74 20 74   - the.** text t
5d50: 6f 20 74 6f 6b 65 6e 69 7a 65 2e 0a 2a 2a 0a 2a  o tokenize..**.*
5d60: 2a 20 53 43 52 49 50 54 32 20 73 68 6f 75 6c 64  * SCRIPT2 should
5d70: 20 69 6e 76 6f 6b 65 20 74 68 65 20 5b 73 71 6c   invoke the [sql
5d80: 69 74 65 33 5f 66 74 73 35 5f 74 6f 6b 65 6e 5d  ite3_fts5_token]
5d90: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 63 65 20 66 6f   command once fo
5da0: 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20  r each.** token 
5db0: 77 69 74 68 69 6e 20 74 68 65 20 74 6f 6b 65 6e  within the token
5dc0: 69 7a 65 64 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  ized text..*/.st
5dd0: 61 74 69 63 20 69 6e 74 20 66 35 74 43 72 65 61  atic int f5tCrea
5de0: 74 65 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 43  teTokenizer(.  C
5df0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
5e00: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
5e10: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
5e20: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
5e30: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
5e40: 29 7b 0a 20 20 46 35 74 54 6f 6b 65 6e 69 7a 65  ){.  F5tTokenize
5e50: 72 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65  rContext *pConte
5e60: 78 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a  xt = (F5tTokeniz
5e70: 65 72 43 6f 6e 74 65 78 74 2a 29 63 6c 69 65 6e  erContext*)clien
5e80: 74 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33  tData;.  sqlite3
5e90: 20 2a 64 62 3b 0a 20 20 66 74 73 35 5f 61 70 69   *db;.  fts5_api
5ea0: 20 2a 70 41 70 69 3b 0a 20 20 63 68 61 72 20 2a   *pApi;.  char *
5eb0: 7a 4e 61 6d 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a  zName;.  Tcl_Obj
5ec0: 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 66 74 73   *pScript;.  fts
5ed0: 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 74 3b 0a 20  5_tokenizer t;. 
5ee0: 20 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64   F5tTokenizerMod
5ef0: 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74  ule *pMod;.  int
5f00: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
5f10: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
5f20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5f30: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
5f40: 20 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a   NAME SCRIPT");.
5f50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5f60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5f70: 66 35 74 44 62 41 6e 64 41 70 69 28 69 6e 74 65  f5tDbAndApi(inte
5f80: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 62  rp, objv[1], &db
5f90: 2c 20 26 70 41 70 69 29 20 29 7b 0a 20 20 20 20  , &pApi) ){.    
5fa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5fb0: 3b 0a 20 20 7d 0a 20 20 7a 4e 61 6d 65 20 3d 20  ;.  }.  zName = 
5fc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
5fd0: 6a 76 5b 32 5d 29 3b 0a 20 20 70 53 63 72 69 70  jv[2]);.  pScrip
5fe0: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 0a 20 20  t = objv[3];..  
5ff0: 74 2e 78 43 72 65 61 74 65 20 3d 20 66 35 74 54  t.xCreate = f5tT
6000: 6f 6b 65 6e 69 7a 65 72 43 72 65 61 74 65 3b 0a  okenizerCreate;.
6010: 20 20 74 2e 78 54 6f 6b 65 6e 69 7a 65 20 3d 20    t.xTokenize = 
6020: 66 35 74 54 6f 6b 65 6e 69 7a 65 72 54 6f 6b 65  f5tTokenizerToke
6030: 6e 69 7a 65 3b 0a 20 20 74 2e 78 44 65 6c 65 74  nize;.  t.xDelet
6040: 65 20 3d 20 66 35 74 54 6f 6b 65 6e 69 7a 65 72  e = f5tTokenizer
6050: 44 65 6c 65 74 65 3b 0a 0a 20 20 70 4d 6f 64 20  Delete;..  pMod 
6060: 3d 20 28 46 35 74 54 6f 6b 65 6e 69 7a 65 72 4d  = (F5tTokenizerM
6070: 6f 64 75 6c 65 2a 29 63 6b 61 6c 6c 6f 63 28 73  odule*)ckalloc(s
6080: 69 7a 65 6f 66 28 46 35 74 54 6f 6b 65 6e 69 7a  izeof(F5tTokeniz
6090: 65 72 4d 6f 64 75 6c 65 29 29 3b 0a 20 20 70 4d  erModule));.  pM
60a0: 6f 64 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  od->interp = int
60b0: 65 72 70 3b 0a 20 20 70 4d 6f 64 2d 3e 70 53 63  erp;.  pMod->pSc
60c0: 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a  ript = pScript;.
60d0: 20 20 70 4d 6f 64 2d 3e 70 43 6f 6e 74 65 78 74    pMod->pContext
60e0: 20 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 20 20 54   = pContext;.  T
60f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
6100: 70 53 63 72 69 70 74 29 3b 0a 20 20 72 63 20 3d  pScript);.  rc =
6110: 20 70 41 70 69 2d 3e 78 43 72 65 61 74 65 54 6f   pApi->xCreateTo
6120: 6b 65 6e 69 7a 65 72 28 70 41 70 69 2c 20 7a 4e  kenizer(pApi, zN
6130: 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70 4d 6f 64  ame, (void*)pMod
6140: 2c 20 26 74 2c 20 66 35 74 44 65 6c 54 6f 6b 65  , &t, f5tDelToke
6150: 6e 69 7a 65 72 29 3b 0a 20 20 69 66 28 20 72 63  nizer);.  if( rc
6160: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6170: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6180: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72  ult(interp, "err
6190: 6f 72 20 69 6e 20 66 74 73 35 5f 61 70 69 2e 78  or in fts5_api.x
61a0: 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
61b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  )", 0);.    retu
61c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
61d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
61e0: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  OK;.}..static vo
61f0: 69 64 20 78 46 35 74 46 72 65 65 28 43 6c 69 65  id xF5tFree(Clie
6200: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
6210: 61 29 7b 0a 20 20 63 6b 66 72 65 65 28 63 6c 69  a){.  ckfree(cli
6220: 65 6e 74 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  entData);.}../*.
6230: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
6240: 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  fts5_may_be_corr
6250: 75 70 74 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a  upt BOOLEAN.**.*
6260: 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 74  * Set or clear t
6270: 68 65 20 67 6c 6f 62 61 6c 20 22 6d 61 79 2d 62  he global "may-b
6280: 65 2d 63 6f 72 72 75 70 74 22 20 66 6c 61 67 2e  e-corrupt" flag.
6290: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 6c 64 20   Return the old 
62a0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
62b0: 20 69 6e 74 20 66 35 74 4d 61 79 42 65 43 6f 72   int f5tMayBeCor
62c0: 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
62d0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
62e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
62f0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
6300: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
6310: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 4f  jv[].){.  int bO
6320: 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 66 74 73  ld = sqlite3_fts
6330: 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  5_may_be_corrupt
6340: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
6350: 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
6360: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6370: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
6380: 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22  bjv, "?BOOLEAN?"
6390: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
63a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
63b0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
63c0: 20 20 69 6e 74 20 62 4e 65 77 3b 0a 20 20 20 20    int bNew;.    
63d0: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
63e0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
63f0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 4e 65 77  , objv[1], &bNew
6400: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6410: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
6420: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
6430: 72 72 75 70 74 20 3d 20 62 4e 65 77 3b 0a 20 20  rrupt = bNew;.  
6440: 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  }..  Tcl_SetObjR
6450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
6460: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 4f 6c 64  l_NewIntObj(bOld
6470: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
6480: 5f 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  _OK;.}...static 
6490: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 35 74  unsigned int f5t
64a0: 5f 66 74 73 35 48 61 73 68 4b 65 79 28 69 6e 74  _fts5HashKey(int
64b0: 20 6e 53 6c 6f 74 2c 20 63 6f 6e 73 74 20 63 68   nSlot, const ch
64c0: 61 72 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *p, int n){. 
64d0: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
64e0: 65 64 20 69 6e 74 20 68 20 3d 20 31 33 3b 0a 20  ed int h = 13;. 
64f0: 20 66 6f 72 28 69 3d 6e 2d 31 3b 20 69 3e 3d 30   for(i=n-1; i>=0
6500: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 68 20 3d 20  ; i--){.    h = 
6510: 28 68 20 3c 3c 20 33 29 20 5e 20 68 20 5e 20 70  (h << 3) ^ h ^ p
6520: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
6530: 6e 20 28 68 20 25 20 6e 53 6c 6f 74 29 3b 0a 7d  n (h % nSlot);.}
6540: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 35 74  ..static int f5t
6550: 54 6f 6b 65 6e 48 61 73 68 28 0a 20 20 76 6f 69  TokenHash(.  voi
6560: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
6570: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6580: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
6590: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
65a0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
65b0: 6e 74 20 62 4f 6c 64 20 3d 20 73 71 6c 69 74 65  nt bOld = sqlite
65c0: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
65d0: 72 72 75 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a  rrupt;.  char *z
65e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73  ;.  int n;.  uns
65f0: 69 67 6e 65 64 20 69 6e 74 20 69 56 61 6c 3b 0a  igned int iVal;.
6600: 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 0a 0a 20 20    int nSlot;..  
6610: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
6620: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6630: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
6640: 62 6a 76 2c 20 22 4e 53 4c 4f 54 20 54 4f 4b 45  bjv, "NSLOT TOKE
6650: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
6660: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
6670: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
6680: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6690: 62 6a 76 5b 31 5d 2c 20 26 6e 53 6c 6f 74 29 20  bjv[1], &nSlot) 
66a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
66b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
66c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
66d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
66e0: 20 26 6e 29 3b 0a 0a 20 20 69 56 61 6c 20 3d 20   &n);..  iVal = 
66f0: 66 35 74 5f 66 74 73 35 48 61 73 68 4b 65 79 28  f5t_fts5HashKey(
6700: 6e 53 6c 6f 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  nSlot, z, n);.  
6710: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6720: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
6730: 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
6740: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6750: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 35  }..static int f5
6760: 74 52 65 67 69 73 74 65 72 4d 61 74 63 68 69 6e  tRegisterMatchin
6770: 66 6f 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  fo(.  void * cli
6780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
6790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
67a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
67b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
67c0: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
67d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
67e0: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
67f0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
6800: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6810: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
6820: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6830: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
6840: 28 20 66 35 74 44 62 50 6f 69 6e 74 65 72 28 69  ( f5tDbPointer(i
6850: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
6860: 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
6870: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6880: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
6890: 33 46 74 73 35 54 65 73 74 52 65 67 69 73 74 65  3Fts5TestRegiste
68a0: 72 4d 61 74 63 68 69 6e 66 6f 28 64 62 29 3b 0a  rMatchinfo(db);.
68b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
68c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
68d0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
68e0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 45   (char*)sqlite3E
68f0: 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  rrName(rc), TCL_
6900: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
6910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
6930: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  L_OK;.}../*.** E
6940: 6e 74 72 79 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  ntry point..*/.i
6950: 6e 74 20 46 74 73 35 74 63 6c 5f 49 6e 69 74 28  nt Fts5tcl_Init(
6960: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6970: 72 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  rp){.  static st
6980: 72 75 63 74 20 43 6d 64 20 7b 0a 20 20 20 20 63  ruct Cmd {.    c
6990: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
69a0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
69b0: 78 50 72 6f 63 3b 0a 20 20 20 20 69 6e 74 20 62  xProc;.    int b
69c0: 54 6f 6b 65 6e 69 7a 65 43 74 78 3b 0a 20 20 7d  TokenizeCtx;.  }
69d0: 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20   aCmd[] = {.    
69e0: 7b 20 22 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  { "sqlite3_fts5_
69f0: 63 72 65 61 74 65 5f 74 6f 6b 65 6e 69 7a 65 72  create_tokenizer
6a00: 22 2c 20 20 20 66 35 74 43 72 65 61 74 65 54 6f  ",   f5tCreateTo
6a10: 6b 65 6e 69 7a 65 72 2c 20 31 20 7d 2c 0a 20 20  kenizer, 1 },.  
6a20: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 74 73    { "sqlite3_fts
6a30: 35 5f 74 6f 6b 65 6e 22 2c 20 20 20 20 20 20 20  5_token",       
6a40: 20 20 20 20 20 20 20 66 35 74 54 6f 6b 65 6e 69         f5tTokeni
6a50: 7a 65 72 52 65 74 75 72 6e 2c 20 31 20 7d 2c 0a  zerReturn, 1 },.
6a60: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66      { "sqlite3_f
6a70: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 22 2c 20 20  ts5_tokenize",  
6a80: 20 20 20 20 20 20 20 20 20 66 35 74 54 6f 6b 65           f5tToke
6a90: 6e 69 7a 65 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  nize, 0 },.    {
6aa0: 20 22 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63   "sqlite3_fts5_c
6ab0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  reate_function",
6ac0: 20 20 20 20 66 35 74 43 72 65 61 74 65 46 75 6e      f5tCreateFun
6ad0: 63 74 69 6f 6e 2c 20 30 20 7d 2c 0a 20 20 20 20  ction, 0 },.    
6ae0: 7b 20 22 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  { "sqlite3_fts5_
6af0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c  may_be_corrupt",
6b00: 20 20 20 20 20 66 35 74 4d 61 79 42 65 43 6f 72       f5tMayBeCor
6b10: 72 75 70 74 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  rupt, 0 },.    {
6b20: 20 22 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 74   "sqlite3_fts5_t
6b30: 6f 6b 65 6e 5f 68 61 73 68 22 2c 20 20 20 20 20  oken_hash",     
6b40: 20 20 20 20 66 35 74 54 6f 6b 65 6e 48 61 73 68      f5tTokenHash
6b50: 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  , 0 },.    { "sq
6b60: 6c 69 74 65 33 5f 66 74 73 35 5f 72 65 67 69 73  lite3_fts5_regis
6b70: 74 65 72 5f 6d 61 74 63 68 69 6e 66 6f 22 2c 20  ter_matchinfo", 
6b80: 66 35 74 52 65 67 69 73 74 65 72 4d 61 74 63 68  f5tRegisterMatch
6b90: 69 6e 66 6f 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20  info, 0 }.  };. 
6ba0: 20 69 6e 74 20 69 3b 0a 20 20 46 35 74 54 6f 6b   int i;.  F5tTok
6bb0: 65 6e 69 7a 65 72 43 6f 6e 74 65 78 74 20 2a 70  enizerContext *p
6bc0: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 70 43 6f 6e  Context;..  pCon
6bd0: 74 65 78 74 20 3d 20 28 46 35 74 54 6f 6b 65 6e  text = (F5tToken
6be0: 69 7a 65 72 43 6f 6e 74 65 78 74 2a 29 63 6b 61  izerContext*)cka
6bf0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 35 74 54  lloc(sizeof(F5tT
6c00: 6f 6b 65 6e 69 7a 65 72 43 6f 6e 74 65 78 74 29  okenizerContext)
6c10: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6e  );.  memset(pCon
6c20: 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  text, 0, sizeof(
6c30: 2a 70 43 6f 6e 74 65 78 74 29 29 3b 0a 0a 20 20  *pContext));..  
6c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6c50: 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  f(aCmd)/sizeof(a
6c60: 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
6c70: 20 20 20 73 74 72 75 63 74 20 43 6d 64 20 2a 70     struct Cmd *p
6c80: 20 3d 20 26 61 43 6d 64 5b 69 5d 3b 0a 20 20 20   = &aCmd[i];.   
6c90: 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20 30 3b   void *pCtx = 0;
6ca0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 54 6f 6b  .    if( p->bTok
6cb0: 65 6e 69 7a 65 43 74 78 20 29 20 70 43 74 78 20  enizeCtx ) pCtx 
6cc0: 3d 20 28 76 6f 69 64 2a 29 70 43 6f 6e 74 65 78  = (void*)pContex
6cd0: 74 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  t;.    Tcl_Creat
6ce0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
6cf0: 72 70 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d  rp, p->zName, p-
6d00: 3e 78 50 72 6f 63 2c 20 70 43 74 78 2c 20 28 69  >xProc, pCtx, (i
6d10: 20 3f 20 30 20 3a 20 78 46 35 74 46 72 65 65 29   ? 0 : xF5tFree)
6d20: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
6d30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65   TCL_OK;.}.#else
6d40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42    /* SQLITE_ENAB
6d50: 4c 45 5f 46 54 53 35 20 2a 2f 0a 69 6e 74 20 46  LE_FTS5 */.int F
6d60: 74 73 35 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f  ts5tcl_Init(Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
6d80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6d90: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6da0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35  LITE_ENABLE_FTS5
6db0: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
6dc0: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a           LITE_TEST */.