| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2007 June 22 | 2 ** 2007 June 22 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 assert( argc==1 || argc==2 ); | 62 assert( argc==1 || argc==2 ); |
| 63 | 63 |
| 64 pHash = (Fts3Hash *)sqlite3_user_data(context); | 64 pHash = (Fts3Hash *)sqlite3_user_data(context); |
| 65 | 65 |
| 66 zName = sqlite3_value_text(argv[0]); | 66 zName = sqlite3_value_text(argv[0]); |
| 67 nName = sqlite3_value_bytes(argv[0])+1; | 67 nName = sqlite3_value_bytes(argv[0])+1; |
| 68 | 68 |
| 69 if( argc==2 ){ | 69 if( argc==2 ){ |
| 70 void *pOld; | 70 void *pOld; |
| 71 int n = sqlite3_value_bytes(argv[1]); | 71 int n = sqlite3_value_bytes(argv[1]); |
| 72 if( n!=sizeof(pPtr) ){ | 72 if( zName==0 || n!=sizeof(pPtr) ){ |
| 73 sqlite3_result_error(context, "argument type mismatch", -1); | 73 sqlite3_result_error(context, "argument type mismatch", -1); |
| 74 return; | 74 return; |
| 75 } | 75 } |
| 76 pPtr = *(void **)sqlite3_value_blob(argv[1]); | 76 pPtr = *(void **)sqlite3_value_blob(argv[1]); |
| 77 pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); | 77 pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); |
| 78 if( pOld==pPtr ){ | 78 if( pOld==pPtr ){ |
| 79 sqlite3_result_error(context, "out of memory", -1); | 79 sqlite3_result_error(context, "out of memory", -1); |
| 80 return; | 80 return; |
| 81 } | 81 } |
| 82 }else{ | 82 }else{ |
| 83 pPtr = sqlite3Fts3HashFind(pHash, zName, nName); | 83 if( zName ){ |
| 84 pPtr = sqlite3Fts3HashFind(pHash, zName, nName); |
| 85 } |
| 84 if( !pPtr ){ | 86 if( !pPtr ){ |
| 85 char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); | 87 char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); |
| 86 sqlite3_result_error(context, zErr, -1); | 88 sqlite3_result_error(context, zErr, -1); |
| 87 sqlite3_free(zErr); | 89 sqlite3_free(zErr); |
| 88 return; | 90 return; |
| 89 } | 91 } |
| 90 } | 92 } |
| 91 | 93 |
| 92 sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); | 94 sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); |
| 93 } | 95 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 int n = 0; | 156 int n = 0; |
| 155 char *zCopy; | 157 char *zCopy; |
| 156 char *zEnd; /* Pointer to nul-term of zCopy */ | 158 char *zEnd; /* Pointer to nul-term of zCopy */ |
| 157 sqlite3_tokenizer_module *m; | 159 sqlite3_tokenizer_module *m; |
| 158 | 160 |
| 159 zCopy = sqlite3_mprintf("%s", zArg); | 161 zCopy = sqlite3_mprintf("%s", zArg); |
| 160 if( !zCopy ) return SQLITE_NOMEM; | 162 if( !zCopy ) return SQLITE_NOMEM; |
| 161 zEnd = &zCopy[strlen(zCopy)]; | 163 zEnd = &zCopy[strlen(zCopy)]; |
| 162 | 164 |
| 163 z = (char *)sqlite3Fts3NextToken(zCopy, &n); | 165 z = (char *)sqlite3Fts3NextToken(zCopy, &n); |
| 166 if( z==0 ){ |
| 167 assert( n==0 ); |
| 168 z = zCopy; |
| 169 } |
| 164 z[n] = '\0'; | 170 z[n] = '\0'; |
| 165 sqlite3Fts3Dequote(z); | 171 sqlite3Fts3Dequote(z); |
| 166 | 172 |
| 167 m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); | 173 m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); |
| 168 if( !m ){ | 174 if( !m ){ |
| 169 *pzErr = sqlite3_mprintf("unknown tokenizer: %s", z); | 175 sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", z); |
| 170 rc = SQLITE_ERROR; | 176 rc = SQLITE_ERROR; |
| 171 }else{ | 177 }else{ |
| 172 char const **aArg = 0; | 178 char const **aArg = 0; |
| 173 int iArg = 0; | 179 int iArg = 0; |
| 174 z = &z[n+1]; | 180 z = &z[n+1]; |
| 175 while( z<zEnd && (NULL!=(z = (char *)sqlite3Fts3NextToken(z, &n))) ){ | 181 while( z<zEnd && (NULL!=(z = (char *)sqlite3Fts3NextToken(z, &n))) ){ |
| 176 int nNew = sizeof(char *)*(iArg+1); | 182 int nNew = sizeof(char *)*(iArg+1); |
| 177 char const **aNew = (const char **)sqlite3_realloc((void *)aArg, nNew); | 183 char const **aNew = (const char **)sqlite3_realloc((void *)aArg, nNew); |
| 178 if( !aNew ){ | 184 if( !aNew ){ |
| 179 sqlite3_free(zCopy); | 185 sqlite3_free(zCopy); |
| 180 sqlite3_free((void *)aArg); | 186 sqlite3_free((void *)aArg); |
| 181 return SQLITE_NOMEM; | 187 return SQLITE_NOMEM; |
| 182 } | 188 } |
| 183 aArg = aNew; | 189 aArg = aNew; |
| 184 aArg[iArg++] = z; | 190 aArg[iArg++] = z; |
| 185 z[n] = '\0'; | 191 z[n] = '\0'; |
| 186 sqlite3Fts3Dequote(z); | 192 sqlite3Fts3Dequote(z); |
| 187 z = &z[n+1]; | 193 z = &z[n+1]; |
| 188 } | 194 } |
| 189 rc = m->xCreate(iArg, aArg, ppTok); | 195 rc = m->xCreate(iArg, aArg, ppTok); |
| 190 assert( rc!=SQLITE_OK || *ppTok ); | 196 assert( rc!=SQLITE_OK || *ppTok ); |
| 191 if( rc!=SQLITE_OK ){ | 197 if( rc!=SQLITE_OK ){ |
| 192 *pzErr = sqlite3_mprintf("unknown tokenizer"); | 198 sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); |
| 193 }else{ | 199 }else{ |
| 194 (*ppTok)->pModule = m; | 200 (*ppTok)->pModule = m; |
| 195 } | 201 } |
| 196 sqlite3_free((void *)aArg); | 202 sqlite3_free((void *)aArg); |
| 197 } | 203 } |
| 198 | 204 |
| 199 sqlite3_free(zCopy); | 205 sqlite3_free(zCopy); |
| 200 return rc; | 206 return rc; |
| 201 } | 207 } |
| 202 | 208 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 272 |
| 267 nName = sqlite3_value_bytes(argv[0]); | 273 nName = sqlite3_value_bytes(argv[0]); |
| 268 zName = (const char *)sqlite3_value_text(argv[0]); | 274 zName = (const char *)sqlite3_value_text(argv[0]); |
| 269 nInput = sqlite3_value_bytes(argv[argc-1]); | 275 nInput = sqlite3_value_bytes(argv[argc-1]); |
| 270 zInput = (const char *)sqlite3_value_text(argv[argc-1]); | 276 zInput = (const char *)sqlite3_value_text(argv[argc-1]); |
| 271 | 277 |
| 272 pHash = (Fts3Hash *)sqlite3_user_data(context); | 278 pHash = (Fts3Hash *)sqlite3_user_data(context); |
| 273 p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); | 279 p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); |
| 274 | 280 |
| 275 if( !p ){ | 281 if( !p ){ |
| 276 char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); | 282 char *zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); |
| 277 sqlite3_result_error(context, zErr, -1); | 283 sqlite3_result_error(context, zErr2, -1); |
| 278 sqlite3_free(zErr); | 284 sqlite3_free(zErr2); |
| 279 return; | 285 return; |
| 280 } | 286 } |
| 281 | 287 |
| 282 pRet = Tcl_NewObj(); | 288 pRet = Tcl_NewObj(); |
| 283 Tcl_IncrRefCount(pRet); | 289 Tcl_IncrRefCount(pRet); |
| 284 | 290 |
| 285 for(i=1; i<argc-1; i++){ | 291 for(i=1; i<argc-1; i++){ |
| 286 azArg[i-1] = (const char *)sqlite3_value_text(argv[i]); | 292 azArg[i-1] = (const char *)sqlite3_value_text(argv[i]); |
| 287 } | 293 } |
| 288 | 294 |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 | 485 |
| 480 #ifdef SQLITE_TEST | 486 #ifdef SQLITE_TEST |
| 481 sqlite3_free(zTest); | 487 sqlite3_free(zTest); |
| 482 sqlite3_free(zTest2); | 488 sqlite3_free(zTest2); |
| 483 #endif | 489 #endif |
| 484 | 490 |
| 485 return rc; | 491 return rc; |
| 486 } | 492 } |
| 487 | 493 |
| 488 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ | 494 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ |
| OLD | NEW |