]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Updates so that fts5 API functions xInst, xPhraseFirst and xPhraseNext work with...
authordan <dan@noemail.net>
Tue, 22 Dec 2015 18:54:16 +0000 (18:54 +0000)
committerdan <dan@noemail.net>
Tue, 22 Dec 2015 18:54:16 +0000 (18:54 +0000)
FossilOrigin-Name: 69bffc1632c8a8f3bfe5bf92607e64fed982e48c

ext/fts5/fts5.h
ext/fts5/fts5_main.c
ext/fts5/fts5_tcl.c
ext/fts5/fts5_test_mi.c
ext/fts5/test/fts5_common.tcl
ext/fts5/test/fts5offsets.test
manifest
manifest.uuid

index 5f528af7933fce0bfc527ac55e9548b63d447a15..400b7c7885927e10ac634b1ebe50142a6998b2d7 100644 (file)
@@ -110,6 +110,12 @@ struct Fts5PhraseIter {
 **   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.
 **
@@ -196,7 +202,7 @@ struct Fts5PhraseIter {
 **       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
@@ -210,7 +216,7 @@ struct Fts5PhraseIter {
 **   See xPhraseFirst above.
 */
 struct Fts5ExtensionApi {
-  int iVersion;                   /* Currently always set to 1 */
+  int iVersion;                   /* Currently always set to 2 */
 
   void *(*xUserData)(Fts5Context*);
 
index cf2c748c4c99ec0d828881b826d7956d2e04d2c8..1d0b4c219e6ba92687c36f4559b0d9eadf9dc42d 100644 (file)
@@ -309,6 +309,13 @@ static int fts5IsContentless(Fts5Table *pTab){
   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(). 
 */
@@ -1749,6 +1756,10 @@ static int fts5ApiInst(
   ){
     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];
@@ -1914,6 +1925,11 @@ static void fts5ApiPhraseNext(
   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);
index b470c557d32890a0adfdeb02c596e98e63ef6a73..bf815eab8176a86229cf329615e2111e7aeb613d 100644 (file)
@@ -235,6 +235,7 @@ static int xF5tApi(
     { "xGetAuxdata",       1, "CLEAR" },              /* 13 */
     { "xSetAuxdataInt",    1, "INTEGER" },            /* 14 */
     { "xGetAuxdataInt",    1, "CLEAR" },              /* 15 */
+    { "xPhraseForeach",    4, "IPHRASE COLVAR OFFVAR SCRIPT" }, /* 16 */
     { 0, 0, 0}
   };
 
@@ -431,6 +432,36 @@ static int xF5tApi(
       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;
index 355f23330d3b2f9aaffca839d6c1f3cbd5b67ee6..fb4a2102b451185ef9de567d230269160a01809e 100644 (file)
@@ -134,7 +134,7 @@ static int fts5MatchinfoXCb(
   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]++;
index 2c64b3b9a4b42ca4718d86bdbd8cc6e5038b0e77..74e84ab2340be680066d5619b96eaf07cf8c634c 100644 (file)
@@ -28,6 +28,18 @@ proc fts5_test_poslist {cmd} {
   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} {
@@ -113,6 +125,7 @@ proc fts5_aux_test_functions {db} {
     fts5_test_columntext
     fts5_test_columntotalsize
     fts5_test_poslist
+    fts5_test_poslist2
     fts5_test_tokenize
     fts5_test_rowcount
     fts5_test_all
index b70bee3b5348b324710b4a2aefc7c48936ee20cc..2f2674fabea6b0eb0886ef163137dd2db673da81 100644 (file)
@@ -74,10 +74,93 @@ do_execsql_test 2.0 {
 
 #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
 
index 34b04180c1ffdea1d108bf3b0a0d97100dbb42d4..d02d515584dc7f17ece37ef432ad389c898afd3c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -96,7 +96,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
 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
@@ -104,17 +104,17 @@ F ext/fts5/fts5_config.c ba5248a05c28ec6a6fdf2599a86e9fd67e5c61e2
 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
@@ -156,7 +156,7 @@ F ext/fts5/test/fts5integrity.test 87db5d4e7da0ce04a1dcba5ba91658673c997a65
 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
@@ -1406,7 +1406,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 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
index 32831e991d0a0bccbc966984c825ff0eb82233f5..07c12c4bf070469e97c75feaee000cec50e1c9f0 100644 (file)
@@ -1 +1 @@
-609a0bc7f34e6dae74ce756aff920f3df78fe828
\ No newline at end of file
+69bffc1632c8a8f3bfe5bf92607e64fed982e48c
\ No newline at end of file