]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix minor problems in term matching.
authordan <dan@noemail.net>
Thu, 26 Jun 2014 12:31:41 +0000 (12:31 +0000)
committerdan <dan@noemail.net>
Thu, 26 Jun 2014 12:31:41 +0000 (12:31 +0000)
FossilOrigin-Name: 94eeb077d08a1d2607f3ff3a9fbf18229ba475bb

ext/fts5/fts5_expr.c
ext/fts5/fts5_index.c
manifest
manifest.uuid
test/fts5ab.test

index e34818dd6c5b6bb39016339af63e80b759b723de..364ac024efbf728813df01ed916751c23388336c 100644 (file)
@@ -461,8 +461,9 @@ static int fts5ParseTokenize(
 
   pTerm = &pPhrase->aTerm[pPhrase->nTerm++];
   pTerm->bPrefix = 0;
-  
+  pTerm->pIter = 0;
   pTerm->zTerm = fts5Strdup(pToken, nToken);
+
   return pTerm->zTerm ? SQLITE_OK : SQLITE_NOMEM;
 }
 
index 375912d69d6b702af0e70db92ade76b6daac282a..e620058b2e3681608bc736815a1948a9547bc394 100644 (file)
@@ -1097,8 +1097,8 @@ static void fts5SegIterNextPage(
 ){
   Fts5StructureSegment *pSeg = pIter->pSeg;
   if( pIter->pLeaf ) fts5DataRelease(pIter->pLeaf);
-  if( pIter->iLeafPgno<pSeg->pgnoLast ){
-    pIter->iLeafPgno++;
+  pIter->iLeafPgno++;
+  if( pIter->iLeafPgno<=pSeg->pgnoLast ){
     pIter->pLeaf = fts5DataRead(p, 
         FTS5_SEGMENT_ROWID(pIter->iIdx, pSeg->iSegid, 0, pIter->iLeafPgno)
     );
@@ -1196,11 +1196,13 @@ static void fts5SegIterSeekInit(
 
     iPg = node.iChild;
     for(fts5NodeIterNext(&p->rc, &node);
-        node.aData && fts5BufferCompareBlob(&node.term, pTerm, nTerm)>=0;
+        node.aData && fts5BufferCompareBlob(&node.term, pTerm, nTerm)<=0;
         fts5NodeIterNext(&p->rc, &node)
     ){
       iPg = node.iChild;
     }
+    fts5NodeIterFree(&node);
+    fts5DataRelease(pNode);
   }
 
   if( iPg>=pSeg->pgnoFirst ){
@@ -1215,12 +1217,25 @@ static void fts5SegIterSeekInit(
       fts5SegIterLoadTerm(p, pIter, 0);
 
       while( (res = fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)) ){
-        if( res<0 ){
-          /* Search for the end of the position list within the current page. */
+        if( res<0 && pIter->iLeafPgno==iPg ){
+          /* Search for the end of the current doclist within the current
+          ** page. The end of a doclist is marked by a pair of successive
+          ** 0x00 bytes.  */
           int iOff;
-          for(iOff=pIter->iLeafOffset; iOff<n && a[iOff]; iOff++);
-          pIter->iLeafOffset = iOff+1;
-          if( iOff<n ) continue;
+          for(iOff=pIter->iLeafOffset+1; iOff<n; iOff++){
+            if( a[iOff]==0 && a[iOff-1]==0 ) break;
+          }
+          iOff++;
+
+          /* If the iterator is not yet at the end of the next page, load
+          ** the next term and jump to the next iteration of the while()
+          ** loop.  */
+          if( iOff<n ){
+            int nKeep;
+            pIter->iLeafOffset = iOff + getVarint32(&a[iOff], nKeep);
+            fts5SegIterLoadTerm(p, pIter, nKeep);
+            continue;
+          }
         }
 
         /* No matching term on this page. Set the iterator to EOF. */
index 21a248c4b9c2082bb14612cbcb2eca16d180c32b..34ec6a1a05d050dc51b1857074a9826c4b46ed34 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Begin\sadding\squery\ssupport\sto\sfts5.
-D 2014-06-25T20:28:38.917
+C Fix\sminor\sproblems\sin\sterm\smatching.
+D 2014-06-26T12:31:41.784
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -106,8 +106,8 @@ F ext/fts3/unicode/mkunicode.tcl dc6f268eb526710e2c6e496c372471d773d0c368
 F ext/fts5/fts5.c 1af3184dd9c0e5c1686f71202d6b6cac8f225f05
 F ext/fts5/fts5Int.h 3fd1ebeb58963727cae0ccc8e4e80751bd870296
 F ext/fts5/fts5_config.c 94f1b4cb4de6a7cd5780c14adb0198e289df8cef
-F ext/fts5/fts5_expr.c 9666362ff500ce21262f355194c1f4b164261b5d
-F ext/fts5/fts5_index.c 3e6fbae93eb4dbaaa4bbba4bb11719aafefe363d
+F ext/fts5/fts5_expr.c 1874b17f10a38d0b21e0c38a28637f74e4d2570a
+F ext/fts5/fts5_index.c c8b21d12f15ca6fe028ede3f8e040dcb2aaef6f6
 F ext/fts5/fts5_storage.c 7848d8f8528d798bba159900ea310a6d4a279da8
 F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43
 F ext/icu/icu.c d415ccf984defeb9df2c0e1afcfaa2f6dc05eacb
@@ -592,7 +592,7 @@ F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
 F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849
 F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36
 F test/fts5aa.test c8d3b9694f6b2864161c7437408464a535d19343
-F test/fts5ab.test 79841ddc1645900b17dcf25d3767dcb05f82a4d4
+F test/fts5ab.test 6436ad345d1e7eb5ab198c0174834380805f609c
 F test/fts5ea.test ff43b40f8879ba50b82def70f2ab67c195d1a1d4
 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
 F test/func.test ae97561957aba6ca9e3a7b8a13aac41830d701ef
@@ -1188,7 +1188,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 3515da85d09220c464979467b476c611da4a6a7a
-R 71f18cc20edef985f8bf9c192ad2143e
+P 47a9f3cc92deefe163108e3507bd4614bf1f5da7
+R b3c853e0de2f65908d06e4caafc2bc71
 U dan
-Z a8b08260950e139985bb661309680a76
+Z 840b486e1cfb6171cd4015bc26a5f123
index ad013c65e266eb40c7ab816a3c2df338686e3ce7..3e7acc7005289b18218e80266e0422d268fab900 100644 (file)
@@ -1 +1 @@
-47a9f3cc92deefe163108e3507bd4614bf1f5da7
\ No newline at end of file
+94eeb077d08a1d2607f3ff3a9fbf18229ba475bb
\ No newline at end of file
index a731956aa8d75fc601b9b70cd0669249ec9fbc0f..1b976caff7db033ff62d9ddcccebd557bf8f108d 100644 (file)
@@ -59,6 +59,7 @@ do_execsql_test 1.6 {
 reset_db
 do_execsql_test 2.1 {
   CREATE VIRTUAL TABLE t1 USING fts5(x);
+  INSERT INTO t1(t1) VALUES('pgsz=32');
   INSERT INTO t1 VALUES('one');
   INSERT INTO t1 VALUES('two');
   INSERT INTO t1 VALUES('three');
@@ -72,6 +73,32 @@ do_execsql_test 2.3 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'two' } {2 two}
 do_execsql_test 2.4 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'three' } {3 three}
 do_execsql_test 2.5 { SELECT rowid, * FROM t1 WHERE t1 MATCH 'one' } {1 one}
 
+do_execsql_test 2.6 {
+  INSERT INTO t1 VALUES('a b c d e f g');
+  INSERT INTO t1 VALUES('b d e a a a i');
+  INSERT INTO t1 VALUES('x y z b c c c');
+}
+
+foreach {tn expr res} {
+  1  a    {5 4}
+  2  b    {6 5 4}
+  3  c    {6 4}
+  4  d    {5 4}
+  5  e    {5 4}
+  6  f    {4}
+  7  g    {4}
+  8  x    {6}
+  9  y    {6}
+  10 z    {6}
+} {
+  do_execsql_test 2.7.$tn { SELECT rowid FROM t1 WHERE t1 MATCH $expr } $res
+}
 
+#db eval {
+#  SELECT fts5_decode(rowid, block) AS t FROM t1_data;
+#} {
+#  puts $t
+#}
 
 finish_test
+