** should be greater than or equal to zero and smaller than the value
** output by xInstCount().
**
+** Usually, output parameter *piPhrase is set to the phrase number, *piCol
+** to the column in which it occurs and *piOff the token offset of the
+** first token of the phrase. The exception is if the table was created
+** with the offsets=0 option specified. In this case *piOff is always
+** set to -1.
+**
** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM)
** if an error occurs.
**
** Fts5PhraseIter iter;
** int iCol, iOff;
** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff);
-** iOff>=0;
+** iCol>=0;
** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff)
** ){
** // An instance of phrase iPhrase at offset iOff of column iCol
** See xPhraseFirst above.
*/
struct Fts5ExtensionApi {
- int iVersion; /* Currently always set to 1 */
+ int iVersion; /* Currently always set to 2 */
void *(*xUserData)(Fts5Context*);
return pTab->pConfig->eContent==FTS5_CONTENT_NONE;
}
+/*
+** Return true if pTab is an offsetless table.
+*/
+static int fts5IsOffsetless(Fts5Table *pTab){
+ return pTab->pConfig->bOffsets==0;
+}
+
/*
** Delete a virtual table handle allocated by fts5InitVtab().
*/
){
if( iIdx<0 || iIdx>=pCsr->nInstCount ){
rc = SQLITE_RANGE;
+ }else if( fts5IsOffsetless((Fts5Table*)pCsr->base.pVtab) ){
+ *piPhrase = pCsr->aInst[iIdx*3];
+ *piCol = pCsr->aInst[iIdx*3 + 2];
+ *piOff = -1;
}else{
*piPhrase = pCsr->aInst[iIdx*3];
*piCol = pCsr->aInst[iIdx*3 + 1];
if( pIter->a>=pIter->b ){
*piCol = -1;
*piOff = -1;
+ }else if( fts5IsOffsetless((Fts5Table*)(((Fts5Cursor*)pCtx)->base.pVtab)) ){
+ int iVal;
+ pIter->a += fts5GetVarint32(pIter->a, iVal);
+ *piCol += (iVal-2);
+ *piOff = -1;
}else{
int iVal;
pIter->a += fts5GetVarint32(pIter->a, iVal);
{ "xGetAuxdata", 1, "CLEAR" }, /* 13 */
{ "xSetAuxdataInt", 1, "INTEGER" }, /* 14 */
{ "xGetAuxdataInt", 1, "CLEAR" }, /* 15 */
+ { "xPhraseForeach", 4, "IPHRASE COLVAR OFFVAR SCRIPT" }, /* 16 */
{ 0, 0, 0}
};
break;
}
+ CASE(16, "xPhraseForeach") {
+ int iPhrase;
+ int iCol;
+ int iOff;
+ const char *zColvar;
+ const char *zOffvar;
+ Tcl_Obj *pScript = objv[5];
+ Fts5PhraseIter iter;
+
+ if( Tcl_GetIntFromObj(interp, objv[2], &iPhrase) ) return TCL_ERROR;
+ zColvar = Tcl_GetString(objv[3]);
+ zOffvar = Tcl_GetString(objv[4]);
+
+ for(p->pApi->xPhraseFirst(p->pFts, iPhrase, &iter, &iCol, &iOff);
+ iCol>=0;
+ p->pApi->xPhraseNext(p->pFts, &iter, &iCol, &iOff)
+ ){
+ Tcl_SetVar2Ex(interp, zColvar, 0, Tcl_NewIntObj(iCol), 0);
+ Tcl_SetVar2Ex(interp, zOffvar, 0, Tcl_NewIntObj(iOff), 0);
+ rc = Tcl_EvalObjEx(interp, pScript, 0);
+ if( rc==TCL_CONTINUE ) rc = TCL_OK;
+ if( rc!=TCL_OK ){
+ if( rc==TCL_BREAK ) rc = TCL_OK;
+ break;
+ }
+ }
+
+ break;
+ }
+
default:
assert( 0 );
break;
int iPrev = -1;
for(pApi->xPhraseFirst(pFts, 0, &iter, &iCol, &iOff);
- iOff>=0;
+ iCol>=0;
pApi->xPhraseNext(pFts, &iter, &iCol, &iOff)
){
aOut[iCol*3+1]++;
set res
}
+proc fts5_test_poslist2 {cmd} {
+ set res [list]
+
+ for {set i 0} {$i < [$cmd xPhraseCount]} {incr i} {
+ $cmd xPhraseForeach $i c o {
+ lappend res $i.$c.$o
+ }
+ }
+
+ set res
+}
+
proc fts5_test_columnsize {cmd} {
set res [list]
for {set i 0} {$i < [$cmd xColumnCount]} {incr i} {
fts5_test_columntext
fts5_test_columntotalsize
fts5_test_poslist
+ fts5_test_poslist2
fts5_test_tokenize
fts5_test_rowcount
fts5_test_all
#db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM t2_data} {puts $r}
-breakpoint
do_execsql_test 2.1 {
INSERT INTO t2(t2) VALUES('integrity-check');
}
+#-------------------------------------------------------------------------
+# Check that the xInstCount, xInst, xPhraseFirst and xPhraseNext APIs
+# work with offsets=0 tables.
+#
+set data {
+ 1 {abb aca aca} {aba bab aab aac caa} {abc cbc ccb bcc bab ccb aca}
+ 2 {bca aca acb} {ccb bcc bca aab bcc} {bab aaa aac cbb bba aca abc}
+ 3 {cca abc cab} {aab aba bcc cac baa} {bab cbb acb aba aab ccc cca}
+ 4 {ccb bcb aba} {aba bbb bcc cac bbb} {cbb aaa bca bcc aab cac aca}
+ 5 {bca bbc cac} {aba cbb cac cca aca} {cab acb cbc ccb cac bbb bcb}
+ 6 {acc bba cba} {bab bbc bbb bcb aca} {bca ccc cbb aca bac ccc ccb}
+ 7 {aba bab aaa} {abb bca aac bcb bcc} {bcb bbc aba aaa cba abc acc}
+ 8 {cab aba aaa} {ccb aca caa bbc bcc} {aaa abc ccb bbb cac cca abb}
+ 9 {bcb bab bac} {bcb cba cac bbb abc} {aba aca cbb acb abb ccc ccb}
+ 10 {aba aab ccc} {abc ccc bcc cab bbb} {aab bcc cbb ccc aaa bac baa}
+ 11 {bab acb cba} {aac cab cab bca cbc} {aab cbc aac baa ccb acc cac}
+ 12 {ccc cbb cbc} {aaa aab bcc aac bbc} {cbc cbc bac bac ccc bbc acc}
+ 13 {cab bbc abc} {bbb bab bba aca bab} {baa bbb aab bbb ccb bbb ccc}
+ 14 {bbc cab caa} {acb aac abb cba acc} {cba bba bba acb abc abb baa}
+ 15 {aba cca bcc} {aaa acb abc aab ccb} {cca bcb acc aaa caa cca cbc}
+ 16 {bcb bba aba} {cbc acb cab caa ccb} {aac aaa bbc cab cca cba abc}
+ 17 {caa cbb acc} {ccb bcb bca aaa bcc} {bbb aca bcb bca cbc cbc cca}
+ 18 {cbb bbc aac} {ccc bbc aaa aab baa} {cab cab cac cca bbc abc bbc}
+ 19 {ccc acc aaa} {aab cbb bca cca caa} {bcb aca aca cab acc bac bcc}
+ 20 {aab ccc bcb} {bbc cbb bbc aaa bcc} {cbc aab ccc aaa bcb bac cbc}
+ 21 {aba cab ccc} {bbc cbc cba acc bbb} {acc aab aac acb aca bca acb}
+ 22 {bcb bca baa} {cca bbc aca ccb cbb} {aab abc bbc aaa cab bcc bcc}
+ 23 {cac cbb caa} {bbc aba bbb bcc ccb} {bbc bbb cab bbc cac abb acc}
+ 24 {ccb acb caa} {cab bba cac bbc aac} {aac bca abc cab bca cab bcb}
+ 25 {bbb aca bca} {bcb acc ccc cac aca} {ccc acb acc cac cac bba bbc}
+ 26 {bab acc caa} {caa cab cac bac aca} {aba cac caa acc bac ccc aaa}
+ 27 {bca bca aaa} {ccb aca bca aaa baa} {bab acc aaa cca cba cca bac}
+ 28 {ccb cac cac} {bca abb bba bbc baa} {aca ccb aac cab ccc cab caa}
+ 29 {abc bca cab} {cac cbc cbb ccc bcc} {bcc aaa aaa acc aac cac aac}
+ 30 {aca acc acb} {aab aac cbb caa acb} {acb bbc bbc acc cbb bbc aac}
+ 31 {aba aca baa} {aca bcc cab bab acb} {bcc acb baa bcb bbc acc aba}
+ 32 {abb cbc caa} {cba abb bbb cbb aca} {bac aca caa cac caa ccb bbc}
+ 33 {bcc bcb bcb} {cca cab cbc abb bab} {caa bbc aac bbb cab cba aaa}
+ 34 {caa cab acc} {ccc ccc bcc acb bcc} {bac bba aca bcb bba bcb cac}
+ 35 {bac bcb cba} {bcc acb bbc cba bab} {abb cbb abc abc bac acc cbb}
+ 36 {cab bab ccb} {bca bba bab cca acc} {acc aab bcc bac acb cbb caa}
+ 37 {aca cbc cab} {bba aac aca aac aaa} {baa cbb cba aba cab bca bcb}
+ 38 {acb aab baa} {baa bab bca bbc bbb} {abc baa acc aba cab baa cac}
+ 39 {bcb aac cba} {bcb baa caa cac bbc} {cbc ccc bab ccb bbb caa aba}
+ 40 {cba ccb abc} {cbb caa cba aac bab} {cbb bbb bca bbb bac cac bca}
+}
+foreach {tn tbl} {
+ 1 { CREATE VIRTUAL TABLE t3 USING fts5(x, y, z, offsets=0) }
+} {
+ reset_db
+ fts5_aux_test_functions db
+ execsql $tbl
+ foreach {id x y z} $data {
+ execsql { INSERT INTO t3(rowid, x, y, z) VALUES($id, $x, $y, $z) }
+ }
+ foreach {tn2 expr} {
+ 1 aaa 2 ccc 3 bab 4 aac
+ 5 aa* 6 cc* 7 ba* 8 aa*
+ 9 a* 10 b* 11 c*
+ } {
+
+ set res [list]
+ foreach {id x y z} $data {
+ if {[lsearch [concat $x $y $z] $expr]>=0} {
+ lappend res $id
+ set inst [list]
+ if {[lsearch $x $expr]>=0} { lappend inst 0.0.-1 }
+ if {[lsearch $y $expr]>=0} { lappend inst 0.1.-1 }
+ if {[lsearch $z $expr]>=0} { lappend inst 0.2.-1 }
+ lappend res $inst
+ }
+ }
+
+ do_execsql_test 3.$tn.$tn2.1 {
+ SELECT rowid, fts5_test_poslist(t3) FROM t3($expr)
+ } $res
+
+ do_execsql_test 3.$tn.$tn2.2 {
+ SELECT rowid, fts5_test_poslist2(t3) FROM t3($expr)
+ } $res
+ }
+
+}
+
finish_test
-C Fix\san\sfts5\sintegrity-check\sproblem\sthat\saffects\soffsets=0\stables\swith\sprefix\sindexes.
-D 2015-12-21T18:45:09.329
+C Updates\sso\sthat\sfts5\sAPI\sfunctions\sxInst,\sxPhraseFirst\sand\sxPhraseNext\swork\swith\sthe\soffsets=0\soption.
+D 2015-12-22T18:54:16.763
F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 5fff077fcc46de7714ed6eebb6159a4c00eab751
F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252
F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
-F ext/fts5/fts5.h 8b9a13b309b180e9fb88ea5666c0d8d73c6102d9
+F ext/fts5/fts5.h 7d6785c75afe23239dad9cbaffc6fc55803feb4b
F ext/fts5/fts5Int.h e71739ed0b816758f1f77baaccca1b4a9064c4dc
F ext/fts5/fts5_aux.c 1f384972d606375b8fa078319f25ab4b5feb1b35
F ext/fts5/fts5_buffer.c 87204c8b3b8bc62b27376eab09b74d6d5acc41f1
F ext/fts5/fts5_expr.c 3b2c7ac54e6c03e732751a6a4bf9ced8f408e2a2
F ext/fts5/fts5_hash.c d4a6b52faca0134cc7bcc880f03a257a0dec2636
F ext/fts5/fts5_index.c 1d1939afbc434907993d7e9a0c631be630d5b0dc
-F ext/fts5/fts5_main.c ef04699949ab8e42d590ae30188afef7ad58776e
+F ext/fts5/fts5_main.c b7d6540c63f347908d8ee937ca8a7987130c84b3
F ext/fts5/fts5_storage.c 14e0bb6549a66da54adf4fa1564edbf24647cb22
-F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd
-F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf
+F ext/fts5/fts5_tcl.c c3cfff5f727b3d02f73c5717413d637b18b960f2
+F ext/fts5/fts5_test_mi.c c9c8cf455c49ded156a234e0de1c8ba9be85e5c3
F ext/fts5/fts5_tokenize.c 618efe033bceb80c521b1e9ddfd9fee85fb5946e
F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c
F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1
F ext/fts5/fts5_vocab.c 3742d0abfe8aa8c3cb4a7df56aa38f2e3c3fb1c2
F ext/fts5/fts5parse.y 1647eba089b9b3fc058b4dc989d9da87d15b9580
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
-F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d
+F ext/fts5/test/fts5_common.tcl 4a23a75f31dbb96c03c2840fae1bf85b4f64f062
F ext/fts5/test/fts5aa.test 2c553eea4dab4bc5a75928f56729277c7bc1d206
F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c
F ext/fts5/test/fts5matchinfo.test 2163b0013e824bba65499da9e34ea4da41349cc2
F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367
F ext/fts5/test/fts5near.test b214cddb1c1f1bddf45c75af768f20145f7e71cc
-F ext/fts5/test/fts5offsets.test 1a2d53c34a896d2038b839df2178410c45977671
+F ext/fts5/test/fts5offsets.test 7d32df518f6513131c14ce985006c3ac5873e79f
F ext/fts5/test/fts5onepass.test 7ed9608e258132cb8d55e7c479b08676ad68810c
F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5
F ext/fts5/test/fts5phrase.test f6d1d464da5beb25dc56277aa4f1d6102f0d9a2f
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ad0987d83c252dd8d6a69321893629d7be805c28
-R f519655f5c64b0aca45be5b21174cea1
+P 609a0bc7f34e6dae74ce756aff920f3df78fe828
+R 3d59533357e77f6a30434e9a4ea67f85
U dan
-Z 77d1a35391efdb0fe1eff3fc97431cfb
+Z ae770209a83bcb452cb39fda88b8ef75
-609a0bc7f34e6dae74ce756aff920f3df78fe828
\ No newline at end of file
+69bffc1632c8a8f3bfe5bf92607e64fed982e48c
\ No newline at end of file