System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 5cec41326fabe65323945a46fa9495ee85c3d5fd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4a 75 6e 65 20  /*.** 2007 June 
0010: 32 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  22.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
0180: 73 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  s is part of an 
0190: 53 51 4c 69 74 65 20 6d 6f 64 75 6c 65 20 69 6d  SQLite module im
01a0: 70 6c 65 6d 65 6e 74 69 6e 67 20 66 75 6c 6c 2d  plementing full-
01b0: 74 65 78 74 20 73 65 61 72 63 68 2e 0a 2a 2a 20  text search..** 
01c0: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
01d0: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
01e0: 74 68 65 20 67 65 6e 65 72 69 63 20 74 6f 6b 65  the generic toke
01f0: 6e 69 7a 65 72 20 69 6e 74 65 72 66 61 63 65 2e  nizer interface.
0200: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  .*/../*.** The c
0210: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
0220: 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
0230: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d if:.**.**     
0240: 2a 20 54 68 65 20 46 54 53 32 20 6d 6f 64 75 6c  * The FTS2 modul
0250: 65 20 69 73 20 62 65 69 6e 67 20 62 75 69 6c 74  e is being built
0260: 20 61 73 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e   as an extension
0270: 0a 2a 2a 20 20 20 20 20 20 20 28 69 6e 20 77 68  .**       (in wh
0280: 69 63 68 20 63 61 73 65 20 53 51 4c 49 54 45 5f  ich case SQLITE_
0290: 43 4f 52 45 20 69 73 20 6e 6f 74 20 64 65 66 69  CORE is not defi
02a0: 6e 65 64 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ned), or.**.**  
02b0: 20 20 20 2a 20 54 68 65 20 46 54 53 32 20 6d 6f     * The FTS2 mo
02c0: 64 75 6c 65 20 69 73 20 62 65 69 6e 67 20 62 75  dule is being bu
02d0: 69 6c 74 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ilt into the cor
02e0: 65 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 53 51  e of.**       SQ
02f0: 4c 69 74 65 20 28 69 6e 20 77 68 69 63 68 20 63  Lite (in which c
0300: 61 73 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ase SQLITE_ENABL
0310: 45 5f 46 54 53 32 20 69 73 20 64 65 66 69 6e 65  E_FTS2 is define
0320: 64 29 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  d)..*/.#if !defi
0330: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
0340: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
0350: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 29 0a  TE_ENABLE_FTS2).
0360: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0370: 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  te3.h".#include 
0380: 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53  "sqlite3ext.h".S
0390: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
03a0: 49 4e 49 54 31 0a 0a 23 69 6e 63 6c 75 64 65 20  INIT1..#include 
03b0: 22 66 74 73 32 5f 68 61 73 68 2e 68 22 0a 23 69  "fts2_hash.h".#i
03c0: 6e 63 6c 75 64 65 20 22 66 74 73 32 5f 74 6f 6b  nclude "fts2_tok
03d0: 65 6e 69 7a 65 72 2e 68 22 0a 23 69 6e 63 6c 75  enizer.h".#inclu
03e0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f  de <assert.h>../
03f0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0400: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 20 73  ion of the SQL s
0410: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
0420: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  or accessing the
0430: 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
0440: 68 61 73 68 20 74 61 62 6c 65 2e 20 54 68 69 73  hash table. This
0450: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
0460: 20 63 61 6c 6c 65 64 20 61 73 20 66 6f 6c 6c 6f   called as follo
0470: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ws:.**.**   SELE
0480: 43 54 20 3c 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  CT <function-nam
0490: 65 3e 28 3c 6b 65 79 2d 6e 61 6d 65 3e 29 3b 0a  e>(<key-name>);.
04a0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 66 75 6e  **   SELECT <fun
04b0: 63 74 69 6f 6e 2d 6e 61 6d 65 3e 28 3c 6b 65 79  ction-name>(<key
04c0: 2d 6e 61 6d 65 3e 2c 20 3c 70 6f 69 6e 74 65 72  -name>, <pointer
04d0: 3e 29 3b 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  >);.**.** where 
04e0: 3c 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 3e 20  <function-name> 
04f0: 69 73 20 74 68 65 20 6e 61 6d 65 20 70 61 73 73  is the name pass
0500: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
0510: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20   argument.** to 
0520: 74 68 65 20 73 71 6c 69 74 65 33 46 74 73 32 49  the sqlite3Fts2I
0530: 6e 69 74 48 61 73 68 54 61 62 6c 65 28 29 20 66  nitHashTable() f
0540: 75 6e 63 74 69 6f 6e 20 28 65 2e 67 2e 20 27 66  unction (e.g. 'f
0550: 74 73 32 5f 74 6f 6b 65 6e 69 7a 65 72 27 29 2e  ts2_tokenizer').
0560: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 3c 70  .**.** If the <p
0570: 6f 69 6e 74 65 72 3e 20 61 72 67 75 6d 65 6e 74  ointer> argument
0580: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 69   is specified, i
0590: 74 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  t must be a blob
05a0: 20 76 61 6c 75 65 0a 2a 2a 20 63 6f 6e 74 61 69   value.** contai
05b0: 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
05c0: 6f 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 74  o be stored as t
05d0: 68 65 20 68 61 73 68 20 64 61 74 61 20 63 6f 72  he hash data cor
05e0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
05f0: 20 74 68 65 20 73 74 72 69 6e 67 20 3c 6b 65 79   the string <key
0600: 2d 6e 61 6d 65 3e 2e 20 49 66 20 3c 70 6f 69 6e  -name>. If <poin
0610: 74 65 72 3e 20 69 73 20 6e 6f 74 20 73 70 65 63  ter> is not spec
0620: 69 66 69 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ified, then.** t
0630: 68 65 20 73 74 72 69 6e 67 20 3c 6b 65 79 2d 6e  he string <key-n
0640: 61 6d 65 3e 20 6d 75 73 74 20 61 6c 72 65 61 64  ame> must alread
0650: 79 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 68  y exist in the h
0660: 61 73 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  as table. Otherw
0670: 69 73 65 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ise,.** an error
0680: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
0690: 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
06a0: 6f 74 20 74 68 65 20 3c 70 6f 69 6e 74 65 72 3e  ot the <pointer>
06b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 73 70 65   argument is spe
06c0: 63 69 66 69 65 64 2c 20 74 68 65 20 76 61 6c 75  cified, the valu
06d0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 73  e returned.** is
06e0: 20 61 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69   a blob containi
06f0: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 73  ng the pointer s
0700: 74 6f 72 65 64 20 61 73 20 74 68 65 20 68 61 73  tored as the has
0710: 68 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  h data correspon
0720: 64 69 6e 67 0a 2a 2a 20 74 6f 20 73 74 72 69 6e  ding.** to strin
0730: 67 20 3c 6b 65 79 2d 6e 61 6d 65 3e 20 28 61 66  g <key-name> (af
0740: 74 65 72 20 74 68 65 20 68 61 73 68 2d 74 61 62  ter the hash-tab
0750: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2c 20 69  le is updated, i
0760: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2e 0a 2a  f applicable)..*
0770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 63  /.static void sc
0780: 61 6c 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  alarFunc(.  sqli
0790: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
07a0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
07b0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
07c0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 66 74  e **argv.){.  ft
07d0: 73 32 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20  s2Hash *pHash;. 
07e0: 20 76 6f 69 64 20 2a 70 50 74 72 20 3d 20 30 3b   void *pPtr = 0;
07f0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
0800: 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  d char *zName;. 
0810: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
0820: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
0830: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20  | argc==2 );..  
0840: 70 48 61 73 68 20 3d 20 28 66 74 73 32 48 61 73  pHash = (fts2Has
0850: 68 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  h *)sqlite3_user
0860: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
0870: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
0880: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
0890: 67 76 5b 30 5d 29 3b 0a 20 20 6e 4e 61 6d 65 20  gv[0]);.  nName 
08a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
08b0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 2b 31  bytes(argv[0])+1
08c0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32  ;..  if( argc==2
08d0: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4f   ){.    void *pO
08e0: 6c 64 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  ld;.    int n = 
08f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
0900: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
0910: 20 20 69 66 28 20 6e 21 3d 73 69 7a 65 6f 66 28    if( n!=sizeof(
0920: 70 50 74 72 29 20 29 7b 0a 20 20 20 20 20 20 73  pPtr) ){.      s
0930: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
0940: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 61 72  ror(context, "ar
0950: 67 75 6d 65 6e 74 20 74 79 70 65 20 6d 69 73 6d  gument type mism
0960: 61 74 63 68 22 2c 20 2d 31 29 3b 0a 20 20 20 20  atch", -1);.    
0970: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
0980: 20 20 20 20 70 50 74 72 20 3d 20 2a 28 76 6f 69      pPtr = *(voi
0990: 64 20 2a 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  d **)sqlite3_val
09a0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29  ue_blob(argv[1])
09b0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
09c0: 69 74 65 33 46 74 73 32 48 61 73 68 49 6e 73 65  ite3Fts2HashInse
09d0: 72 74 28 70 48 61 73 68 2c 20 28 76 6f 69 64 20  rt(pHash, (void 
09e0: 2a 29 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  *)zName, nName, 
09f0: 70 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pPtr);.    if( p
0a00: 4f 6c 64 3d 3d 70 50 74 72 20 29 7b 0a 20 20 20  Old==pPtr ){.   
0a10: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0a20: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
0a30: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
0a40: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74  , -1);.      ret
0a50: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  urn;.    }.  }el
0a60: 73 65 7b 0a 20 20 20 20 70 50 74 72 20 3d 20 73  se{.    pPtr = s
0a70: 71 6c 69 74 65 33 46 74 73 32 48 61 73 68 46 69  qlite3Fts2HashFi
0a80: 6e 64 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  nd(pHash, zName,
0a90: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
0aa0: 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 20 20   !pPtr ){.      
0ab0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c  char *zErr = sql
0ac0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
0ad0: 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 69 7a 65 72 3a  known tokenizer:
0ae0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
0af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0b00: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
0b10: 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20  , zErr, -1);.   
0b20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
0b30: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 65 74  zErr);.      ret
0b40: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
0b50: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0b60: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
0b70: 76 6f 69 64 20 2a 29 26 70 50 74 72 2c 20 73 69  void *)&pPtr, si
0b80: 7a 65 6f 66 28 70 50 74 72 29 2c 20 53 51 4c 49  zeof(pPtr), SQLI
0b90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
0ba0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0bb0: 54 45 53 54 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  TEST..#include <
0bc0: 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tcl.h>.#include 
0bd0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a  <string.h>../*.*
0be0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0bf0: 20 6f 66 20 61 20 73 70 65 63 69 61 6c 20 53 51   of a special SQ
0c00: 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  L scalar functio
0c10: 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 6f  n for testing to
0c20: 6b 65 6e 69 7a 65 72 73 20 0a 2a 2a 20 64 65 73  kenizers .** des
0c30: 69 67 6e 65 64 20 74 6f 20 62 65 20 75 73 65 64  igned to be used
0c40: 20 69 6e 20 63 6f 6e 63 65 72 74 20 77 69 74 68   in concert with
0c50: 20 74 68 65 20 54 63 6c 20 74 65 73 74 69 6e 67   the Tcl testing
0c60: 20 66 72 61 6d 65 77 6f 72 6b 2e 20 54 68 69 73   framework. This
0c70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  .** function mus
0c80: 74 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  t be called with
0c90: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 3a 0a   two arguments:.
0ca0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c  **.**   SELECT <
0cb0: 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 3e 28 3c  function-name>(<
0cc0: 6b 65 79 2d 6e 61 6d 65 3e 2c 20 3c 69 6e 70 75  key-name>, <inpu
0cd0: 74 2d 73 74 72 69 6e 67 3e 29 3b 0a 2a 2a 20 20  t-string>);.**  
0ce0: 20 53 45 4c 45 43 54 20 3c 66 75 6e 63 74 69 6f   SELECT <functio
0cf0: 6e 2d 6e 61 6d 65 3e 28 3c 6b 65 79 2d 6e 61 6d  n-name>(<key-nam
0d00: 65 3e 2c 20 3c 70 6f 69 6e 74 65 72 3e 29 3b 0a  e>, <pointer>);.
0d10: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 66 75 6e  **.** where <fun
0d20: 63 74 69 6f 6e 2d 6e 61 6d 65 3e 20 69 73 20 74  ction-name> is t
0d30: 68 65 20 6e 61 6d 65 20 70 61 73 73 65 64 20 61  he name passed a
0d40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
0d50: 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  ument.** to the 
0d60: 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 48  sqlite3Fts2InitH
0d70: 61 73 68 54 61 62 6c 65 28 29 20 66 75 6e 63 74  ashTable() funct
0d80: 69 6f 6e 20 28 65 2e 67 2e 20 27 66 74 73 32 5f  ion (e.g. 'fts2_
0d90: 74 6f 6b 65 6e 69 7a 65 72 27 29 0a 2a 2a 20 63  tokenizer').** c
0da0: 6f 6e 63 61 74 65 6e 61 74 65 64 20 77 69 74 68  oncatenated with
0db0: 20 74 68 65 20 73 74 72 69 6e 67 20 27 5f 74 65   the string '_te
0dc0: 73 74 27 20 28 65 2e 67 2e 20 27 66 74 73 32 5f  st' (e.g. 'fts2_
0dd0: 74 6f 6b 65 6e 69 7a 65 72 5f 74 65 73 74 27 29  tokenizer_test')
0de0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
0df0: 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  rn value is a st
0e00: 72 69 6e 67 20 74 68 61 74 20 6d 61 79 20 62 65  ring that may be
0e10: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
0e20: 61 20 54 63 6c 0a 2a 2a 20 6c 69 73 74 2e 20 46  a Tcl.** list. F
0e30: 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
0e40: 20 74 68 65 20 3c 69 6e 70 75 74 2d 73 74 72 69   the <input-stri
0e50: 6e 67 3e 2c 20 74 68 72 65 65 20 65 6c 65 6d 65  ng>, three eleme
0e60: 6e 74 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64  nts are.** added
0e70: 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
0e80: 20 6c 69 73 74 2e 20 54 68 65 20 66 69 72 73 74   list. The first
0e90: 20 69 73 20 74 68 65 20 74 6f 6b 65 6e 20 70 6f   is the token po
0ea0: 73 69 74 69 6f 6e 2c 20 74 68 65 20 0a 2a 2a 20  sition, the .** 
0eb0: 73 65 63 6f 6e 64 20 69 73 20 74 68 65 20 74 6f  second is the to
0ec0: 6b 65 6e 20 74 65 78 74 20 28 66 6f 6c 64 65 64  ken text (folded
0ed0: 2c 20 73 74 65 6d 6d 65 64 2c 20 65 74 63 2e 29  , stemmed, etc.)
0ee0: 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 20 69   and the third i
0ef0: 73 20 74 68 65 0a 2a 2a 20 73 75 62 73 74 72 69  s the.** substri
0f00: 6e 67 20 6f 66 20 3c 69 6e 70 75 74 2d 73 74 72  ng of <input-str
0f10: 69 6e 67 3e 20 61 73 73 6f 63 69 61 74 65 64 20  ing> associated 
0f20: 77 69 74 68 20 74 68 65 20 74 6f 6b 65 6e 2e 20  with the token. 
0f30: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a  For example, .**
0f40: 20 75 73 69 6e 67 20 74 68 65 20 62 75 69 6c 74   using the built
0f50: 2d 69 6e 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b  -in "simple" tok
0f60: 65 6e 69 7a 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  enizer:.**.**   
0f70: 53 45 4c 45 43 54 20 66 74 73 5f 74 6f 6b 65 6e  SELECT fts_token
0f80: 69 7a 65 72 5f 74 65 73 74 28 27 73 69 6d 70 6c  izer_test('simpl
0f90: 65 27 2c 20 27 49 20 64 6f 6e 27 74 20 73 65 65  e', 'I don't see
0fa0: 20 68 6f 77 27 29 3b 0a 2a 2a 0a 2a 2a 20 77 69   how');.**.** wi
0fb0: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  ll return the st
0fc0: 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 7b  ring:.**.**   "{
0fd0: 30 20 69 20 49 20 31 20 64 6f 6e 74 20 64 6f 6e  0 i I 1 dont don
0fe0: 27 74 20 32 20 73 65 65 20 73 65 65 20 33 20 68  't 2 see see 3 h
0ff0: 6f 77 20 68 6f 77 7d 22 0a 2a 2a 20 20 20 0a 2a  ow how}".**   .*
1000: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
1010: 73 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  stFunc(.  sqlite
1020: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1030: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
1040: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1050: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 66 74 73 32  **argv.){.  fts2
1060: 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 73  Hash *pHash;.  s
1070: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1080: 5f 6d 6f 64 75 6c 65 20 2a 70 3b 0a 20 20 73 71  _module *p;.  sq
1090: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
10a0: 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 30 3b  *pTokenizer = 0;
10b0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
10c0: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 73  izer_cursor *pCs
10d0: 72 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74 20  r = 0;..  const 
10e0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
10f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1100: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name;.  int nNam
1110: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
1120: 2a 7a 49 6e 70 75 74 3b 0a 20 20 69 6e 74 20 6e  *zInput;.  int n
1130: 49 6e 70 75 74 3b 0a 0a 20 20 63 6f 6e 73 74 20  Input;..  const 
1140: 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
1150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1160: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
1170: 6b 65 6e 3b 0a 20 20 69 6e 74 20 69 53 74 61 72  ken;.  int iStar
1180: 74 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20  t;.  int iEnd;. 
1190: 20 69 6e 74 20 69 50 6f 73 3b 0a 0a 20 20 54 63   int iPos;..  Tc
11a0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
11b0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20  assert( argc==2 
11c0: 7c 7c 20 61 72 67 63 3d 3d 33 20 29 3b 0a 0a 20  || argc==3 );.. 
11d0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
11e0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
11f0: 76 5b 30 5d 29 3b 0a 20 20 7a 4e 61 6d 65 20 3d  v[0]);.  zName =
1200: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
1210: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1220: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 49  t(argv[0]);.  nI
1230: 6e 70 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  nput = sqlite3_v
1240: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1250: 61 72 67 63 2d 31 5d 29 3b 0a 20 20 7a 49 6e 70  argc-1]);.  zInp
1260: 75 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ut = (const char
1270: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
1280: 5f 74 65 78 74 28 61 72 67 76 5b 61 72 67 63 2d  _text(argv[argc-
1290: 31 5d 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  1]);..  if( argc
12a0: 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==3 ){.    zArg 
12b0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
12c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12d0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
12e0: 0a 0a 20 20 70 48 61 73 68 20 3d 20 28 66 74 73  ..  pHash = (fts
12f0: 32 48 61 73 68 20 2a 29 73 71 6c 69 74 65 33 5f  2Hash *)sqlite3_
1300: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
1310: 74 29 3b 0a 20 20 70 20 3d 20 28 73 71 6c 69 74  t);.  p = (sqlit
1320: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
1330: 75 6c 65 20 2a 29 73 71 6c 69 74 65 33 46 74 73  ule *)sqlite3Fts
1340: 32 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c  2HashFind(pHash,
1350: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
1360: 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1370: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
1380: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1390: 22 75 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 69 7a  "unknown tokeniz
13a0: 65 72 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  er: %s", zName);
13b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
13c0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
13d0: 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  t, zErr, -1);.  
13e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13f0: 45 72 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Err);.    return
1400: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
1410: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
1420: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1430: 28 70 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 53  (pRet);..  if( S
1440: 51 4c 49 54 45 5f 4f 4b 21 3d 70 2d 3e 78 43 72  QLITE_OK!=p->xCr
1450: 65 61 74 65 28 7a 41 72 67 20 3f 20 31 20 3a 20  eate(zArg ? 1 : 
1460: 30 2c 20 26 7a 41 72 67 2c 20 26 70 54 6f 6b 65  0, &zArg, &pToke
1470: 6e 69 7a 65 72 29 20 29 7b 0a 20 20 20 20 7a 45  nizer) ){.    zE
1480: 72 72 20 3d 20 22 65 72 72 6f 72 20 69 6e 20 78  rr = "error in x
1490: 43 72 65 61 74 65 28 29 22 3b 0a 20 20 20 20 67  Create()";.    g
14a0: 6f 74 6f 20 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  oto finish;.  }.
14b0: 20 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d    pTokenizer->pM
14c0: 6f 64 75 6c 65 20 3d 20 70 3b 0a 20 20 69 66 28  odule = p;.  if(
14d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 70 2d 3e 78   SQLITE_OK!=p->x
14e0: 4f 70 65 6e 28 70 54 6f 6b 65 6e 69 7a 65 72 2c  Open(pTokenizer,
14f0: 20 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 2c   zInput, nInput,
1500: 20 26 70 43 73 72 29 20 29 7b 0a 20 20 20 20 7a   &pCsr) ){.    z
1510: 45 72 72 20 3d 20 22 65 72 72 6f 72 20 69 6e 20  Err = "error in 
1520: 78 4f 70 65 6e 28 29 22 3b 0a 20 20 20 20 67 6f  xOpen()";.    go
1530: 74 6f 20 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 20  to finish;.  }. 
1540: 20 70 43 73 72 2d 3e 70 54 6f 6b 65 6e 69 7a 65   pCsr->pTokenize
1550: 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a  r = pTokenizer;.
1560: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
1570: 5f 4f 4b 3d 3d 70 2d 3e 78 4e 65 78 74 28 70 43  _OK==p->xNext(pC
1580: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  sr, &zToken, &nT
1590: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
15a0: 69 45 6e 64 2c 20 26 69 50 6f 73 29 20 29 7b 0a  iEnd, &iPos) ){.
15b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
15c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
15d0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
15e0: 4f 62 6a 28 69 50 6f 73 29 29 3b 0a 20 20 20 20  Obj(iPos));.    
15f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1600: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
1610: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1620: 62 6a 28 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  bj(zToken, nToke
1630: 6e 29 29 3b 0a 20 20 20 20 7a 54 6f 6b 65 6e 20  n));.    zToken 
1640: 3d 20 26 7a 49 6e 70 75 74 5b 69 53 74 61 72 74  = &zInput[iStart
1650: 5d 3b 0a 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  ];.    nToken = 
1660: 69 45 6e 64 2d 69 53 74 61 72 74 3b 0a 20 20 20  iEnd-iStart;.   
1670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1680: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
1690: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
16a0: 4f 62 6a 28 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  Obj(zToken, nTok
16b0: 65 6e 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  en));.  }..  if(
16c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 70 2d 3e 78   SQLITE_OK!=p->x
16d0: 43 6c 6f 73 65 28 70 43 73 72 29 20 29 7b 0a 20  Close(pCsr) ){. 
16e0: 20 20 20 7a 45 72 72 20 3d 20 22 65 72 72 6f 72     zErr = "error
16f0: 20 69 6e 20 78 43 6c 6f 73 65 28 29 22 3b 0a 20   in xClose()";. 
1700: 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 3b 0a     goto finish;.
1710: 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
1720: 5f 4f 4b 21 3d 70 2d 3e 78 44 65 73 74 72 6f 79  _OK!=p->xDestroy
1730: 28 70 54 6f 6b 65 6e 69 7a 65 72 29 20 29 7b 0a  (pTokenizer) ){.
1740: 20 20 20 20 7a 45 72 72 20 3d 20 22 65 72 72 6f      zErr = "erro
1750: 72 20 69 6e 20 78 44 65 73 74 72 6f 79 28 29 22  r in xDestroy()"
1760: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73  ;.    goto finis
1770: 68 3b 0a 20 20 7d 0a 0a 66 69 6e 69 73 68 3a 0a  h;.  }..finish:.
1780: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
1790: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
17a0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
17b0: 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  zErr, -1);.  }el
17c0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
17d0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
17e0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
17f0: 6e 67 28 70 52 65 74 29 2c 20 2d 31 2c 20 53 51  ng(pRet), -1, SQ
1800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1810: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52  .  }.  Tcl_DecrR
1820: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 7d  efCount(pRet);.}
1830: 0a 0a 73 74 61 74 69 63 0a 69 6e 74 20 72 65 67  ..static.int reg
1840: 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72 28 0a  isterTokenizer(.
1850: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1860: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a    char *zName, .
1870: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1880: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
1890: 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   *p.){.  int rc;
18a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18b0: 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20  *pStmt;.  const 
18c0: 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 53  char zSql[] = "S
18d0: 45 4c 45 43 54 20 66 74 73 32 5f 74 6f 6b 65 6e  ELECT fts2_token
18e0: 69 7a 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20  izer(?, ?)";..  
18f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1900: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
1910: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
1920: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1930: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1940: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 73  urn rc;.  }..  s
1950: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1960: 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65  (pStmt, 1, zName
1970: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
1980: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
1990: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
19a0: 20 32 2c 20 26 70 2c 20 73 69 7a 65 6f 66 28 70   2, &p, sizeof(p
19b0: 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
19c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
19d0: 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 72 65 74  p(pStmt);..  ret
19e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
19f0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
1a00: 73 74 61 74 69 63 0a 69 6e 74 20 71 75 65 72 79  static.int query
1a10: 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 73 71 6c  Tokenizer(.  sql
1a20: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61  ite3 *db, .  cha
1a30: 72 20 2a 7a 4e 61 6d 65 2c 20 20 0a 20 20 63 6f  r *zName,  .  co
1a40: 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  nst sqlite3_toke
1a50: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70  nizer_module **p
1a60: 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  p.){.  int rc;. 
1a70: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a80: 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Stmt;.  const ch
1a90: 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 53 45 4c  ar zSql[] = "SEL
1aa0: 45 43 54 20 66 74 73 32 5f 74 6f 6b 65 6e 69 7a  ECT fts2_tokeniz
1ab0: 65 72 28 3f 29 22 3b 0a 0a 20 20 2a 70 70 20 3d  er(?)";..  *pp =
1ac0: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
1ad0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1ae0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1af0: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
1b00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b20: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  }..  sqlite3_bin
1b30: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
1b40: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
1b50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
1b60: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
1b70: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1b80: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ) ){.    if( sql
1b90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1ba0: 28 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49  (pStmt, 0)==SQLI
1bb0: 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
1bc0: 20 6d 65 6d 63 70 79 28 70 70 2c 20 73 71 6c 69   memcpy(pp, sqli
1bd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1be0: 70 53 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f  pStmt, 0), sizeo
1bf0: 66 28 2a 70 70 29 29 3b 0a 20 20 20 20 7d 0a 20  f(*pp));.    }. 
1c00: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
1c10: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1c20: 74 6d 74 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  tmt);.}..void sq
1c30: 6c 69 74 65 33 46 74 73 32 53 69 6d 70 6c 65 54  lite3Fts2SimpleT
1c40: 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73  okenizerModule(s
1c50: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
1c60: 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70  _module const**p
1c70: 70 4d 6f 64 75 6c 65 29 3b 0a 0a 2f 2a 0a 2a 2a  pModule);../*.**
1c80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1c90: 6f 66 20 74 68 65 20 73 63 61 6c 61 72 20 66 75  of the scalar fu
1ca0: 6e 63 74 69 6f 6e 20 66 74 73 32 5f 74 6f 6b 65  nction fts2_toke
1cb0: 6e 69 7a 65 72 5f 69 6e 74 65 72 6e 61 6c 5f 74  nizer_internal_t
1cc0: 65 73 74 28 29 2e 0a 2a 2a 20 54 68 69 73 20 66  est()..** This f
1cd0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1ce0: 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
1cf0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 63 6c  , it is not incl
1d00: 75 64 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 62  uded in the.** b
1d10: 75 69 6c 64 20 75 6e 6c 65 73 73 20 53 51 4c 49  uild unless SQLI
1d20: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
1d30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75  ed..**.** The pu
1d40: 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 69 73  rpose of this is
1d50: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
1d60: 65 20 66 74 73 32 5f 74 6f 6b 65 6e 69 7a 65 72  e fts2_tokenizer
1d70: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  () function.** c
1d80: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 64 65  an be used as de
1d90: 73 69 67 6e 65 64 20 62 79 20 74 68 65 20 43 2d  signed by the C-
1da0: 63 6f 64 65 20 69 6e 20 74 68 65 20 71 75 65 72  code in the quer
1db0: 79 54 6f 6b 65 6e 69 7a 65 72 20 61 6e 64 0a 2a  yTokenizer and.*
1dc0: 2a 20 72 65 67 69 73 74 65 72 54 6f 6b 65 6e 69  * registerTokeni
1dd0: 7a 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  zer() functions 
1de0: 61 62 6f 76 65 2e 20 54 68 65 73 65 20 74 77 6f  above. These two
1df0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 72   functions are r
1e00: 65 70 65 61 74 65 64 0a 2a 2a 20 69 6e 20 74 68  epeated.** in th
1e10: 65 20 52 45 41 44 4d 45 2e 74 6f 6b 65 6e 69 7a  e README.tokeniz
1e20: 65 72 20 66 69 6c 65 20 61 73 20 61 6e 20 65 78  er file as an ex
1e30: 61 6d 70 6c 65 2c 20 73 6f 20 69 74 20 69 73 20  ample, so it is 
1e40: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20  important to.** 
1e50: 74 65 73 74 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  test them..**.**
1e60: 20 54 6f 20 72 75 6e 20 74 68 65 20 74 65 73 74   To run the test
1e70: 73 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  s, evaluate the 
1e80: 66 74 73 32 5f 74 6f 6b 65 6e 69 7a 65 72 5f 69  fts2_tokenizer_i
1e90: 6e 74 65 72 6e 61 6c 5f 74 65 73 74 28 29 20 73  nternal_test() s
1ea0: 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  calar.** functio
1eb0: 6e 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  n with no argume
1ec0: 6e 74 73 2e 20 41 6e 20 61 73 73 65 72 74 28 29  nts. An assert()
1ed0: 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 61 20   will fail if a 
1ee0: 70 72 6f 62 6c 65 6d 20 69 73 0a 2a 2a 20 64 65  problem is.** de
1ef0: 74 65 63 74 65 64 2e 20 69 2e 65 2e 3a 0a 2a 2a  tected. i.e.:.**
1f00: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 66  .**     SELECT f
1f10: 74 73 32 5f 74 6f 6b 65 6e 69 7a 65 72 5f 69 6e  ts2_tokenizer_in
1f20: 74 65 72 6e 61 6c 5f 74 65 73 74 28 29 3b 0a 2a  ternal_test();.*
1f30: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
1f40: 20 69 6e 74 54 65 73 74 46 75 6e 63 28 0a 20 20   intTestFunc(.  
1f50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1f60: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
1f70: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
1f80: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1f90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
1fa0: 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  t sqlite3_tokeni
1fb0: 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 70 31 3b 0a  zer_module *p1;.
1fc0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1fd0: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
1fe0: 20 2a 70 32 3b 0a 20 20 73 71 6c 69 74 65 33 20   *p2;.  sqlite3 
1ff0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
2000: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
2010: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20  ta(context);..  
2020: 2f 2a 20 54 65 73 74 20 74 68 65 20 71 75 65 72  /* Test the quer
2030: 79 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  y function */.  
2040: 73 71 6c 69 74 65 33 46 74 73 32 53 69 6d 70 6c  sqlite3Fts2Simpl
2050: 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  eTokenizerModule
2060: 28 26 70 31 29 3b 0a 20 20 72 63 20 3d 20 71 75  (&p1);.  rc = qu
2070: 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 64 62 2c  eryTokenizer(db,
2080: 20 22 73 69 6d 70 6c 65 22 2c 20 26 70 32 29 3b   "simple", &p2);
2090: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
20a0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
20b0: 73 65 72 74 28 20 70 31 3d 3d 70 32 20 29 3b 0a  sert( p1==p2 );.
20c0: 20 20 72 63 20 3d 20 71 75 65 72 79 54 6f 6b 65    rc = queryToke
20d0: 6e 69 7a 65 72 28 64 62 2c 20 22 6e 6f 73 75 63  nizer(db, "nosuc
20e0: 68 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 26 70 32  htokenizer", &p2
20f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
2100: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b  =SQLITE_ERROR );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 32 3d 3d 30  .  assert( p2==0
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
2130: 3d 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f  =strcmp(sqlite3_
2140: 65 72 72 6d 73 67 28 64 62 29 2c 20 22 75 6e 6b  errmsg(db), "unk
2150: 6e 6f 77 6e 20 74 6f 6b 65 6e 69 7a 65 72 3a 20  nown tokenizer: 
2160: 6e 6f 73 75 63 68 74 6f 6b 65 6e 69 7a 65 72 22  nosuchtokenizer"
2170: 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20  ) );..  /* Test 
2180: 74 68 65 20 73 74 6f 72 61 67 65 20 66 75 6e 63  the storage func
2190: 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 72  tion */.  rc = r
21a0: 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65 72  egisterTokenizer
21b0: 28 64 62 2c 20 22 6e 6f 73 75 63 68 74 6f 6b 65  (db, "nosuchtoke
21c0: 6e 69 7a 65 72 22 2c 20 70 31 29 3b 0a 20 20 61  nizer", p1);.  a
21d0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
21e0: 45 5f 4f 4b 20 29 3b 0a 20 20 72 63 20 3d 20 71  E_OK );.  rc = q
21f0: 75 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 64 62  ueryTokenizer(db
2200: 2c 20 22 6e 6f 73 75 63 68 74 6f 6b 65 6e 69 7a  , "nosuchtokeniz
2210: 65 72 22 2c 20 26 70 32 29 3b 0a 20 20 61 73 73  er", &p2);.  ass
2220: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2230: 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
2240: 70 32 3d 3d 70 31 20 29 3b 0a 0a 20 20 73 71 6c  p2==p1 );..  sql
2250: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2260: 28 63 6f 6e 74 65 78 74 2c 20 22 6f 6b 22 2c 20  (context, "ok", 
2270: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
2280: 43 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f  C);.}..#endif../
2290: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 53 51 4c 20  *.** Set up SQL 
22a0: 6f 62 6a 65 63 74 73 20 69 6e 20 64 61 74 61 62  objects in datab
22b0: 61 73 65 20 64 62 20 75 73 65 64 20 74 6f 20 61  ase db used to a
22c0: 63 63 65 73 73 20 74 68 65 20 63 6f 6e 74 65 6e  ccess the conten
22d0: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73  ts of.** the has
22e0: 68 20 74 61 62 6c 65 20 70 6f 69 6e 74 65 64 20  h table pointed 
22f0: 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
2300: 48 61 73 68 2e 20 54 68 65 20 68 61 73 68 20 74  Hash. The hash t
2310: 61 62 6c 65 20 6d 75 73 74 0a 2a 2a 20 62 65 65  able must.** bee
2320: 6e 20 69 6e 69 74 69 61 6c 69 73 65 64 20 74 6f  n initialised to
2330: 20 75 73 65 20 73 74 72 69 6e 67 20 6b 65 79 73   use string keys
2340: 2c 20 61 6e 64 20 74 6f 20 74 61 6b 65 20 61 20  , and to take a 
2350: 70 72 69 76 61 74 65 20 63 6f 70 79 20 0a 2a 2a  private copy .**
2360: 20 6f 66 20 74 68 65 20 6b 65 79 20 77 68 65 6e   of the key when
2370: 20 61 20 76 61 6c 75 65 20 69 73 20 69 6e 73 65   a value is inse
2380: 72 74 65 64 2e 20 69 2e 65 2e 20 62 79 20 61 20  rted. i.e. by a 
2390: 63 61 6c 6c 20 73 69 6d 69 6c 61 72 20 74 6f 3a  call similar to:
23a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
23b0: 33 46 74 73 32 48 61 73 68 49 6e 69 74 28 70 48  3Fts2HashInit(pH
23c0: 61 73 68 2c 20 46 54 53 32 5f 48 41 53 48 5f 53  ash, FTS2_HASH_S
23d0: 54 52 49 4e 47 2c 20 31 29 3b 0a 2a 2a 0a 2a 2a  TRING, 1);.**.**
23e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
23f0: 64 64 73 20 61 20 73 63 61 6c 61 72 20 66 75 6e  dds a scalar fun
2400: 63 74 69 6f 6e 20 28 73 65 65 20 68 65 61 64 65  ction (see heade
2410: 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  r comment above.
2420: 2a 2a 20 73 63 61 6c 61 72 46 75 6e 63 28 29 20  ** scalarFunc() 
2430: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  in this file for
2440: 20 64 65 74 61 69 6c 73 29 20 61 6e 64 2c 20 69   details) and, i
2450: 66 20 45 4e 41 42 4c 45 5f 54 41 42 4c 45 20 69  f ENABLE_TABLE i
2460: 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74 20  s.** defined at 
2470: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 74 69 6d 65  compilation time
2480: 2c 20 61 20 74 65 6d 70 6f 72 61 72 79 20 76 69  , a temporary vi
2490: 72 74 75 61 6c 20 74 61 62 6c 65 20 28 73 65 65  rtual table (see
24a0: 20 68 65 61 64 65 72 20 0a 2a 2a 20 63 6f 6d 6d   header .** comm
24b0: 65 6e 74 20 61 62 6f 76 65 20 73 74 72 75 63 74  ent above struct
24c0: 20 48 61 73 68 54 61 62 6c 65 56 74 61 62 29 20   HashTableVtab) 
24d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24e0: 73 63 68 65 6d 61 2e 20 42 6f 74 68 20 0a 2a 2a  schema. Both .**
24f0: 20 70 72 6f 76 69 64 65 20 72 65 61 64 2f 77 72   provide read/wr
2500: 69 74 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ite access to th
2510: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 2a 70  e contents of *p
2520: 48 61 73 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Hash..**.** The 
2530: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
2540: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2550: 20 7a 4e 61 6d 65 2c 20 69 73 20 75 73 65 64 20   zName, is used 
2560: 61 73 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  as the name.** o
2570: 66 20 62 6f 74 68 20 74 68 65 20 73 63 61 6c 61  f both the scala
2580: 72 20 61 6e 64 2c 20 69 66 20 63 72 65 61 74 65  r and, if create
2590: 64 2c 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  d, the virtual t
25a0: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
25b0: 69 74 65 33 46 74 73 32 49 6e 69 74 48 61 73 68  ite3Fts2InitHash
25c0: 54 61 62 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  Table(.  sqlite3
25d0: 20 2a 64 62 2c 20 0a 20 20 66 74 73 32 48 61 73   *db, .  fts2Has
25e0: 68 20 2a 70 48 61 73 68 2c 20 0a 20 20 63 6f 6e  h *pHash, .  con
25f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
2600: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2610: 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a  ITE_OK;.  void *
2620: 70 20 3d 20 28 76 6f 69 64 20 2a 29 70 48 61 73  p = (void *)pHas
2630: 68 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 61  h;.  const int a
2640: 6e 79 20 3d 20 53 51 4c 49 54 45 5f 41 4e 59 3b  ny = SQLITE_ANY;
2650: 0a 20 20 63 68 61 72 20 2a 7a 54 65 73 74 20 3d  .  char *zTest =
2660: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 73   0;.  char *zTes
2670: 74 32 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  t2 = 0;..#ifdef 
2680: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 76 6f  SQLITE_TEST.  vo
2690: 69 64 20 2a 70 64 62 20 3d 20 28 76 6f 69 64 20  id *pdb = (void 
26a0: 2a 29 64 62 3b 0a 20 20 7a 54 65 73 74 20 3d 20  *)db;.  zTest = 
26b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26c0: 22 25 73 5f 74 65 73 74 22 2c 20 7a 4e 61 6d 65  "%s_test", zName
26d0: 29 3b 0a 20 20 7a 54 65 73 74 32 20 3d 20 73 71  );.  zTest2 = sq
26e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
26f0: 73 5f 69 6e 74 65 72 6e 61 6c 5f 74 65 73 74 22  s_internal_test"
2700: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
2710: 21 7a 54 65 73 74 20 7c 7c 20 21 7a 54 65 73 74  !zTest || !zTest
2720: 32 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  2 ){.    rc = SQ
2730: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2740: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
2750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 7c  !=SQLITE_OK.   |
2760: 7c 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  | (rc = sqlite3_
2770: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2780: 64 62 2c 20 7a 4e 61 6d 65 2c 20 31 2c 20 61 6e  db, zName, 1, an
2790: 79 2c 20 70 2c 20 73 63 61 6c 61 72 46 75 6e 63  y, p, scalarFunc
27a0: 2c 20 30 2c 20 30 29 29 0a 20 20 20 7c 7c 20 28  , 0, 0)).   || (
27b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
27c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
27d0: 20 7a 4e 61 6d 65 2c 20 32 2c 20 61 6e 79 2c 20   zName, 2, any, 
27e0: 70 2c 20 73 63 61 6c 61 72 46 75 6e 63 2c 20 30  p, scalarFunc, 0
27f0: 2c 20 30 29 29 0a 23 69 66 64 65 66 20 53 51 4c  , 0)).#ifdef SQL
2800: 49 54 45 5f 54 45 53 54 0a 20 20 20 7c 7c 20 28  ITE_TEST.   || (
2810: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2820: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
2830: 20 7a 54 65 73 74 2c 20 32 2c 20 61 6e 79 2c 20   zTest, 2, any, 
2840: 70 2c 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20  p, testFunc, 0, 
2850: 30 29 29 0a 20 20 20 7c 7c 20 28 72 63 20 3d 20  0)).   || (rc = 
2860: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2870: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54 65 73  unction(db, zTes
2880: 74 2c 20 33 2c 20 61 6e 79 2c 20 70 2c 20 74 65  t, 3, any, p, te
2890: 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 29 0a 20  stFunc, 0, 0)). 
28a0: 20 20 7c 7c 20 28 72 63 20 3d 20 73 71 6c 69 74    || (rc = sqlit
28b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
28c0: 6f 6e 28 64 62 2c 20 7a 54 65 73 74 32 2c 20 30  on(db, zTest2, 0
28d0: 2c 20 61 6e 79 2c 20 70 64 62 2c 20 69 6e 74 54  , any, pdb, intT
28e0: 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 29 0a  estFunc, 0, 0)).
28f0: 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 73  #endif.  );..  s
2900: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 73  qlite3_free(zTes
2910: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
2920: 65 65 28 7a 54 65 73 74 32 29 3b 0a 20 20 72 65  ee(zTest2);.  re
2930: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
2940: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2950: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
2960: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2970: 41 42 4c 45 5f 46 54 53 32 29 20 2a 2f 0a        ABLE_FTS2) */.