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 |