]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with the fts5 auxiliary function API causing a crash when a query conta...
authordan <dan@noemail.net>
Wed, 21 Sep 2016 19:43:34 +0000 (19:43 +0000)
committerdan <dan@noemail.net>
Wed, 21 Sep 2016 19:43:34 +0000 (19:43 +0000)
FossilOrigin-Name: 0741812d7fcd558479e4849fbb3ba8d03738d018

ext/fts5/fts5_expr.c
ext/fts5/test/fts5eb.test
manifest
manifest.uuid

index c8f649c7fd01f02b8106a649f3885f65946041da..ac3913d4e3d60dcc5528df0a47b49eb1a3970dc1 100644 (file)
@@ -754,6 +754,7 @@ static int fts5ExprNearInitAll(
   Fts5ExprNearset *pNear = pNode->pNear;
   int i, j;
   int rc = SQLITE_OK;
+  int bEof = 1;
 
   assert( pNode->bNomatch==0 );
   for(i=0; rc==SQLITE_OK && i<pNear->nPhrase; i++){
@@ -761,7 +762,6 @@ static int fts5ExprNearInitAll(
     for(j=0; j<pPhrase->nTerm; j++){
       Fts5ExprTerm *pTerm = &pPhrase->aTerm[j];
       Fts5ExprTerm *p;
-      int bEof = 1;
 
       for(p=pTerm; p && rc==SQLITE_OK; p=p->pSynonym){
         if( p->pIter ){
@@ -781,13 +781,12 @@ static int fts5ExprNearInitAll(
         }
       }
 
-      if( bEof ){
-        pNode->bEof = 1;
-        return rc;
-      }
+      if( bEof ) break;
     }
+    if( bEof ) break;
   }
 
+  pNode->bEof = bEof;
   return rc;
 }
 
@@ -1638,7 +1637,6 @@ int sqlite3Fts5ExprClonePhrase(
 ){
   int rc = SQLITE_OK;             /* Return code */
   Fts5ExprPhrase *pOrig;          /* The phrase extracted from pExpr */
-  int i;                          /* Used to iterate through phrase terms */
   Fts5Expr *pNew = 0;             /* Expression to return via *ppNew */
   TokenCtx sCtx = {0,0};          /* Context object for fts5ParseTokenize */
 
@@ -1668,18 +1666,25 @@ int sqlite3Fts5ExprClonePhrase(
     }
   }
 
-  for(i=0; rc==SQLITE_OK && i<pOrig->nTerm; i++){
-    int tflags = 0;
-    Fts5ExprTerm *p;
-    for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){
-      const char *zTerm = p->zTerm;
-      rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, (int)strlen(zTerm),
-          0, 0);
-      tflags = FTS5_TOKEN_COLOCATED;
-    }
-    if( rc==SQLITE_OK ){
-      sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix;
+  if( pOrig->nTerm ){
+    int i;                          /* Used to iterate through phrase terms */
+    for(i=0; rc==SQLITE_OK && i<pOrig->nTerm; i++){
+      int tflags = 0;
+      Fts5ExprTerm *p;
+      for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){
+        const char *zTerm = p->zTerm;
+        rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, (int)strlen(zTerm),
+            0, 0);
+        tflags = FTS5_TOKEN_COLOCATED;
+      }
+      if( rc==SQLITE_OK ){
+        sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix;
+      }
     }
+  }else{
+    /* This happens when parsing a token or quoted phrase that contains
+    ** no token characters at all. (e.g ... MATCH '""'). */
+    sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase));
   }
 
   if( rc==SQLITE_OK ){
index 69418aae63d307a03c9092b556f9a1c6ffe42abf..510a0d790c6ce921c3268e8211be5949ca05671a 100644 (file)
@@ -63,6 +63,23 @@ do_catchsql_test 2.1 {
   SELECT fts5_expr_tcl()
 } {1 {wrong number of arguments to function fts5_expr_tcl}}
 
+
+do_execsql_test 3.0 {
+  CREATE VIRTUAL TABLE e1 USING fts5(text, tokenize = 'porter unicode61');
+  INSERT INTO e1 VALUES ("just a few words with a / inside");
+}
+do_execsql_test 3.1 {
+  SELECT rowid, bm25(e1) FROM e1 WHERE e1 MATCH '"just"' ORDER BY rank;
+} {1 -1e-06}
+do_execsql_test 3.2 {
+  SELECT rowid FROM e1 WHERE e1 MATCH '"/" OR "just"'
+} 1
+do_execsql_test 3.3 {
+  SELECT rowid, bm25(e1) FROM e1 WHERE e1 MATCH '"/" OR "just"' ORDER BY rank;
+} {1 -1e-06}
+
+
+
 finish_test
 
 
index d38a8e9735c201d9c0210c145951c0b3a47758a9..9ff357b93c9dc8a8d0910629dc9feab37bb545ce 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\srun\svacuummem.test\sif\sENABLE_MEMORY_MANAGEMENT\sis\sdefined.
-D 2016-09-21T19:00:37.910
+C Fix\sa\sproblem\swith\sthe\sfts5\sauxiliary\sfunction\sAPI\scausing\sa\scrash\swhen\sa\squery\scontained\sa\sphrase\sof\szero\sterms.
+D 2016-09-21T19:43:34.002
 F Makefile.in 6fd48ffcf7c2deea7499062d1f3747f986c19678
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc e1aa788e84f926e42239ee167c53f785bedacacd
@@ -102,7 +102,7 @@ F ext/fts5/fts5Int.h b2eda36e0f224365c8e23dc8f559311834f1c13f
 F ext/fts5/fts5_aux.c 2f20784a344701d4c72986e2e692062dd47d568c
 F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd
 F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857
-F ext/fts5/fts5_expr.c 1ee97156421919e497595bfa962bb88ad1665401
+F ext/fts5/fts5_expr.c c65c5629f4b3a49850fd84ea0731dee2360e144f
 F ext/fts5/fts5_hash.c 880998e596b60f078348d48732ca4ad9a90caad2
 F ext/fts5/fts5_index.c 2d146d5c547f60d22d6fc4014d5e2b64248cd7c4
 F ext/fts5/fts5_main.c f85281445dcf8be32d18841c93a6f90fe27dbfe2
@@ -148,7 +148,7 @@ F ext/fts5/test/fts5determin.test 10648edb75ef1e196b10978fd21a9be0c31e09c3
 F ext/fts5/test/fts5dlidx.test 007e9390c94638760797dbec2990c97c3fa08dfe
 F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
 F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
-F ext/fts5/test/fts5eb.test c516ae0c934be6fd29ec95ea8b5f11f461311535
+F ext/fts5/test/fts5eb.test 14597b5ecc9b2b7039ac5e0b0fca0311a7d22005
 F ext/fts5/test/fts5fault1.test e09040d3e17b8c0837101e8c79c8a874c4376fb7
 F ext/fts5/test/fts5fault2.test d8c6c7f916ccbdfc10b2c69530e9dd3bc8313232
 F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3
@@ -1525,7 +1525,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2b44f9aa7d4e2089dacd6bfcf526dae9309b7af3
-R db79f70a5622e7667604a8f395c4feab
+P 4a613d856433ac48e8ee0cd7f0e774e484e8acf6
+R b3b313c63559d3f43c5fcc9e87b2dba1
 U dan
-Z 3cf2a9a4785a48ab2e27ceae8a5f7a0d
+Z ee8b7750ac92f9eff66f8bc864927c4a
index 9d88275fc214e12fa47886761f623f4c4a596637..fd49af75a42b1fa9d697d2487df84c9e2eb06c28 100644 (file)
@@ -1 +1 @@
-4a613d856433ac48e8ee0cd7f0e774e484e8acf6
\ No newline at end of file
+0741812d7fcd558479e4849fbb3ba8d03738d018
\ No newline at end of file