| Index: third_party/sqlite/src/ext/fts3/fts3_tokenizer.c
 | 
| diff --git a/third_party/sqlite/src/ext/fts3/fts3_tokenizer.c b/third_party/sqlite/src/ext/fts3/fts3_tokenizer.c
 | 
| index 64cfe07aac38fd2aa5bec8c499b1fce4b858b4a5..bfc36af3e38bb1f5bb6a4b44fa4fd4c28abff166 100644
 | 
| --- a/third_party/sqlite/src/ext/fts3/fts3_tokenizer.c
 | 
| +++ b/third_party/sqlite/src/ext/fts3/fts3_tokenizer.c
 | 
| @@ -30,6 +30,18 @@
 | 
|  #include <string.h>
 | 
|  
 | 
|  /*
 | 
| +** Return true if the two-argument version of fts3_tokenizer()
 | 
| +** has been activated via a prior call to sqlite3_db_config(db,
 | 
| +** SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 1, 0);
 | 
| +*/
 | 
| +static int fts3TokenizerEnabled(sqlite3_context *context){
 | 
| +  sqlite3 *db = sqlite3_context_db_handle(context);
 | 
| +  int isEnabled = 0;
 | 
| +  sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,-1,&isEnabled);
 | 
| +  return isEnabled;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
|  ** Implementation of the SQL scalar function for accessing the underlying 
 | 
|  ** hash table. This function may be called as follows:
 | 
|  **
 | 
| @@ -49,7 +61,7 @@
 | 
|  ** is a blob containing the pointer stored as the hash data corresponding
 | 
|  ** to string <key-name> (after the hash-table is updated, if applicable).
 | 
|  */
 | 
| -static void scalarFunc(
 | 
| +static void fts3TokenizerFunc(
 | 
|    sqlite3_context *context,
 | 
|    int argc,
 | 
|    sqlite3_value **argv
 | 
| @@ -67,16 +79,20 @@ static void scalarFunc(
 | 
|    nName = sqlite3_value_bytes(argv[0])+1;
 | 
|  
 | 
|    if( argc==2 ){
 | 
| -    void *pOld;
 | 
| -    int n = sqlite3_value_bytes(argv[1]);
 | 
| -    if( zName==0 || n!=sizeof(pPtr) ){
 | 
| -      sqlite3_result_error(context, "argument type mismatch", -1);
 | 
| -      return;
 | 
| -    }
 | 
| -    pPtr = *(void **)sqlite3_value_blob(argv[1]);
 | 
| -    pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr);
 | 
| -    if( pOld==pPtr ){
 | 
| -      sqlite3_result_error(context, "out of memory", -1);
 | 
| +    if( fts3TokenizerEnabled(context) ){
 | 
| +      void *pOld;
 | 
| +      int n = sqlite3_value_bytes(argv[1]);
 | 
| +      if( zName==0 || n!=sizeof(pPtr) ){
 | 
| +        sqlite3_result_error(context, "argument type mismatch", -1);
 | 
| +        return;
 | 
| +      }
 | 
| +      pPtr = *(void **)sqlite3_value_blob(argv[1]);
 | 
| +      pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr);
 | 
| +      if( pOld==pPtr ){
 | 
| +        sqlite3_result_error(context, "out of memory", -1);
 | 
| +      }
 | 
| +    }else{
 | 
| +      sqlite3_result_error(context, "fts3tokenize disabled", -1);
 | 
|        return;
 | 
|      }
 | 
|    }else{
 | 
| @@ -90,7 +106,6 @@ static void scalarFunc(
 | 
|        return;
 | 
|      }
 | 
|    }
 | 
| -
 | 
|    sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT);
 | 
|  }
 | 
|  
 | 
| @@ -209,7 +224,11 @@ int sqlite3Fts3InitTokenizer(
 | 
|  
 | 
|  #ifdef SQLITE_TEST
 | 
|  
 | 
| -#include <tcl.h>
 | 
| +#if defined(INCLUDE_SQLITE_TCL_H)
 | 
| +#  include "sqlite_tcl.h"
 | 
| +#else
 | 
| +#  include "tcl.h"
 | 
| +#endif
 | 
|  #include <string.h>
 | 
|  
 | 
|  /*
 | 
| @@ -350,6 +369,7 @@ int registerTokenizer(
 | 
|    return sqlite3_finalize(pStmt);
 | 
|  }
 | 
|  
 | 
| +
 | 
|  static
 | 
|  int queryTokenizer(
 | 
|    sqlite3 *db, 
 | 
| @@ -420,11 +440,13 @@ static void intTestFunc(
 | 
|    assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") );
 | 
|  
 | 
|    /* Test the storage function */
 | 
| -  rc = registerTokenizer(db, "nosuchtokenizer", p1);
 | 
| -  assert( rc==SQLITE_OK );
 | 
| -  rc = queryTokenizer(db, "nosuchtokenizer", &p2);
 | 
| -  assert( rc==SQLITE_OK );
 | 
| -  assert( p2==p1 );
 | 
| +  if( fts3TokenizerEnabled(context) ){
 | 
| +    rc = registerTokenizer(db, "nosuchtokenizer", p1);
 | 
| +    assert( rc==SQLITE_OK );
 | 
| +    rc = queryTokenizer(db, "nosuchtokenizer", &p2);
 | 
| +    assert( rc==SQLITE_OK );
 | 
| +    assert( p2==p1 );
 | 
| +  }
 | 
|  
 | 
|    sqlite3_result_text(context, "ok", -1, SQLITE_STATIC);
 | 
|  }
 | 
| @@ -440,7 +462,7 @@ static void intTestFunc(
 | 
|  **    sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1);
 | 
|  **
 | 
|  ** This function adds a scalar function (see header comment above
 | 
| -** scalarFunc() in this file for details) and, if ENABLE_TABLE is
 | 
| +** fts3TokenizerFunc() in this file for details) and, if ENABLE_TABLE is
 | 
|  ** defined at compilation time, a temporary virtual table (see header 
 | 
|  ** comment above struct HashTableVtab) to the database schema. Both 
 | 
|  ** provide read/write access to the contents of *pHash.
 | 
| @@ -469,10 +491,10 @@ int sqlite3Fts3InitHashTable(
 | 
|  #endif
 | 
|  
 | 
|    if( SQLITE_OK==rc ){
 | 
| -    rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0);
 | 
| +    rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0);
 | 
|    }
 | 
|    if( SQLITE_OK==rc ){
 | 
| -    rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0);
 | 
| +    rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0);
 | 
|    }
 | 
|  #ifdef SQLITE_TEST
 | 
|    if( SQLITE_OK==rc ){
 | 
| 
 |