static void f5tTokenizerDelete(Fts5Tokenizer *p){
F5tTokenizerInstance *pInst = (F5tTokenizerInstance*)p;
- if( pInst->pParent ){
- if( pInst->pModule->parent_v2.xDelete ){
- pInst->pModule->parent_v2.xDelete(pInst->pParent);
- }else{
- pInst->pModule->parent.xDelete(pInst->pParent);
+ if( pInst ){
+ if( pInst->pParent ){
+ if( pInst->pModule->parent_v2.xDelete ){
+ pInst->pModule->parent_v2.xDelete(pInst->pParent);
+ }else{
+ pInst->pModule->parent.xDelete(pInst->pParent);
+ }
}
+ Tcl_DecrRefCount(pInst->pScript);
+ ckfree((char *)pInst);
}
- Tcl_DecrRefCount(pInst->pScript);
- ckfree((char *)pInst);
}
F5tTokenizerModule *pMod;
int rc = SQLITE_OK;
int bV2 = 0; /* True to use _v2 API */
+ int iVersion = 2; /* Value for _v2.iVersion */
const char *zParent = 0; /* Name of parent tokenizer, if any */
int ii = 0;
/* Parse any options. Set stack variables bV2 and zParent. */
for(ii=1; ii<objc-3; ii++){
int iOpt = 0;
- const char *azOpt[] = { "-v2", "-parent", 0 };
+ const char *azOpt[] = { "-v2", "-parent", "-version", 0 };
if( Tcl_GetIndexFromObj(interp, objv[ii], azOpt, "OPTION", 0, &iOpt) ){
return TCL_ERROR;
}
zParent = Tcl_GetString(objv[ii]);
break;
}
+ case 2: /* -version */ {
+ ii++;
+ if( ii==objc-3 ){
+ Tcl_AppendResult(
+ interp, "option requires an argument: -version", (char*)0
+ );
+ return TCL_ERROR;
+ }
+ if( Tcl_GetIntFromObj(interp, objv[ii], &iVersion) ){
+ return TCL_ERROR;
+ }
+ break;
+ }
default:
assert( 0 );
break;
rc = pApi->xFindTokenizer_v2(pApi, zParent, &pMod->pParentCtx, &pParent);
if( rc==SQLITE_OK ){
memcpy(&pMod->parent_v2, pParent, sizeof(fts5_tokenizer_v2));
+ pMod->parent_v2.xDelete(0);
}
}else{
rc = pApi->xFindTokenizer(pApi, zParent, &pMod->pParentCtx,&pMod->parent);
+ if( rc==SQLITE_OK ){
+ pMod->parent.xDelete(0);
+ }
}
}
}else{
fts5_tokenizer_v2 t2;
memset(&t2, 0, sizeof(t2));
- t2.iVersion = 2;
+ t2.iVersion = iVersion;
t2.xCreate = f5tTokenizerCreate;
t2.xTokenize = f5tTokenizerTokenize_v2;
t2.xDelete = f5tTokenizerDelete;
return
}
-set ::testprefix fts5faultH
+set ::testprefix fts5faultI
+
+if 0 {
do_execsql_test 1.0 {
PRAGMA encoding = utf16;
faultsim_test_result {0 {}}
}
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 7.0 {
+ CREATE VIRTUAL TABLE w1 USING fts5(a);
+ INSERT INTO w1 VALUES('one two three');
+ INSERT INTO w1 VALUES('three two one');
+ DELETE FROM w1_content WHERE rowid=1;
+}
+
+faultsim_save_and_close
+
+do_faultsim_test 7 -faults oom* -prep {
+ faultsim_restore_and_reopen
+ db eval { SELECT * FROM w1 }
+} -body {
+ execsql {
+ PRAGMA integrity_check;
+ }
+} -test {
+}
+}
+#-------------------------------------------------------------------------
+reset_db
+fts5_tclnum_register db
+fts5_aux_test_functions db
+
+do_execsql_test 2.0 {
+ CREATE VIRTUAL TABLE ft USING fts5(
+ x, tokenize = "tclnum query", detail=columns
+ );
+ INSERT INTO ft VALUES('one two three i ii iii');
+ INSERT INTO ft VALUES('four five six iv v vi');
+ INSERT INTO ft VALUES('eight nine ten viii ix x');
+} {}
+
+do_faultsim_test 8.1 -faults oom* -prep {
+} -body {
+ execsql {
+ SELECT fts5_test_collist (ft) FROM ft('one two');
+ }
+} -test {
+ faultsim_test_result {0 {{0.0 1.0}}} {1 {SQL logic error}} {1 SQLITE_NOMEM}
+}
+
+do_faultsim_test 8.2 -faults oom* -prep {
+} -body {
+ execsql {
+ SELECT rowid FROM ft('one two') ORDER BY rank;
+ }
+} -test {
+ faultsim_test_result {0 1} {1 {SQL logic error}} {1 SQLITE_NOMEM}
+}
+
+
finish_test
SELECT fts5_columnlocale(x1, 1) FROM x1('two');
} {1 SQLITE_RANGE}
+#-------------------------------------------------------------------------
+#
+reset_db
+do_test 12.0 {
+ list [catch {
+ sqlite3_fts5_create_tokenizer -v2 -version 3 db tcl tcl_create
+ } msg] $msg
+} {1 {error in fts5_api.xCreateTokenizer_v2()}}
+
finish_test
PRAGMA integrity_check
} {ok}
+breakpoint
+sqlite3_db_config db DEFENSIVE 1
+do_execsql_test 21.3 {
+ CREATE TABLE xyz_notashadow(x, y);
+ DROP TABLE xyz_notashadow;
+}
+sqlite3_db_config db DEFENSIVE 0
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 22.0 {
+ SELECT fts5(NULL);
+} {{}}
+do_execsql_test 22.1 {
+ SELECT count(*) FROM (
+ SELECT fts5_source_id()
+ )
+} {1}
+execsql_pp {
+ SELECT fts5_source_id()
+}
+
finish_test
-C Extra\stests.
-D 2024-08-15T20:33:05.956
+C Add\stests\sto\srestore\scoverage\sof\sfts5_main.c.
+D 2024-08-16T16:20:43.666
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/fts5/fts5_index.c eb9a0dda3bc6ef969a6be8d2746af56856e67251810ddba08622b45be8477abe
F ext/fts5/fts5_main.c 23029229021240dc21a69eb749305316103d183375413e2090c064b74b03b7f8
F ext/fts5/fts5_storage.c 5bf88213ff5911625c142ac332ddba10dcd0869e757f91f2a3d27f27ba595992
-F ext/fts5/fts5_tcl.c 50c7e16753fde0c4d80d8abd00a4ed2b0e998d5d3899a484510d01923c5da43b
+F ext/fts5/fts5_tcl.c 1dcf08028141c40a32634bdcf2d5601622ce4edc48f82ac4ce0cbe0a92a6961d
F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
F ext/fts5/fts5_test_tok.c 3cb0a9b508b30d17ef025ccddd26ae3dc8ddffbe76c057616e59a9aa85d36f3b
F ext/fts5/fts5_tokenize.c 96efa85a21a85276680ce3fb19dc5dd8d6b6541b2c37f953ee55bc15092262e1
F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1
F ext/fts5/test/fts5faultG.test 0544411ffcb3e19b42866f757a8a5e0fb8fef3a62c06f61d14deebc571bb7ea9
F ext/fts5/test/fts5faultH.test 2b2b5b8cb1b3fd7679f488c06e22af44107fbc6137eaf45b3e771dc7b149312d
-F ext/fts5/test/fts5faultI.test d9e8c4b0b42910fa447a0e148236def618e7decbf3a334c7933a95e36410f772
+F ext/fts5/test/fts5faultI.test eb0910ec0fa57b4e06241c58252124155e689770b4dd2d8f4f3fc74185be934e
F ext/fts5/test/fts5first.test bfd685b96905bf541d99d8644e0a7219d1d833455a08ab64e344071a613b6ba9
F ext/fts5/test/fts5full.test 97d263c1072f4a560929cca31e70f65d2ae232610e17e6affcf7e979df59547b
F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
F ext/fts5/test/fts5lastrowid.test f36298a1fb9f988bde060a274a7ce638faa9c38a31400f8d2d27ea9373e0c4a1
F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad
F ext/fts5/test/fts5limits.test 8ab67cf5d311c124b6ceb0062d0297767176df4572d955fce79fa43004dff01c
-F ext/fts5/test/fts5locale.test f58ac6ab539d3813556646f7d4b1e19f7e3b1a56ca4439349eb8099d6a821ff6
+F ext/fts5/test/fts5locale.test 5ad9f1b66db4d698c67284f3495007be94f8c6ed183688e64defed72a169b6c0
F ext/fts5/test/fts5matchinfo.test 877520582feb86bbfd95ab780099bcba4526f18ac75ee34979144cf86ba3a5a3
F ext/fts5/test/fts5merge.test 2654df0bcdb2d117c2d38b6aeb0168061be01c643f9e9194b36c43a2970e8082
F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2
-F ext/fts5/test/fts5misc.test b49a3afbda6de02970560c1cd3b804a4896b9f30ce5d75a5f215fa972537b26b
+F ext/fts5/test/fts5misc.test c860b75721d162d7a4f2856322e55e814c2cf0bc45f93ef4388551b54e61a0a0
F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581
F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45
F ext/fts5/test/fts5near.test 33d60867581066e5db7016deb5d651628125d7ff4e0233a88175aa5b65874c74
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d27985245a0e8c0d6b04323c98b26b6a8fb4e489fa8f5f3234252c7c198f23c8
-R c260c68d60eebc40b0c96509388ca9e3
+P fb257540d32ced4a5fe0759d3ad9c1b36fd2b7d64d93cb0a0ecdb48355a68b7a
+R 067a05b128f4dcdbb34743e9c0788abc
U dan
-Z d7c15a75ca8b075cfcf78184db374c6a
+Z 1b380833fd7dd34e177f4e045cee1c46
# Remove this line to create a well-formed Fossil manifest.
-fb257540d32ced4a5fe0759d3ad9c1b36fd2b7d64d93cb0a0ecdb48355a68b7a
+681edd08ab7024ddcd6447a64d8aad581b47b039481b697d91d26e6c6660f373