]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Have fts5 integrity check verify that prefix indexes contain the same values as retur...
authordan <dan@noemail.net>
Sat, 11 Apr 2015 18:25:04 +0000 (18:25 +0000)
committerdan <dan@noemail.net>
Sat, 11 Apr 2015 18:25:04 +0000 (18:25 +0000)
FossilOrigin-Name: bdb8e82ab683f2438cde9f0b63e497dbf0141dcf

ext/fts5/fts5Int.h
ext/fts5/fts5_index.c
manifest
manifest.uuid

index 83f0bf82526a497debd82dbe6b51cac491a43b8e..59d3271212c24a7cd1d21f09cc92babe0da4e675 100644 (file)
@@ -227,8 +227,9 @@ typedef struct Fts5IndexIter Fts5IndexIter;
 /*
 ** Values used as part of the flags argument passed to IndexQuery().
 */
-#define FTS5INDEX_QUERY_PREFIX  0x0001      /* Prefix query */
-#define FTS5INDEX_QUERY_DESC    0x0002      /* Docs in descending rowid order */
+#define FTS5INDEX_QUERY_PREFIX     0x0001   /* Prefix query */
+#define FTS5INDEX_QUERY_DESC       0x0002   /* Docs in descending rowid order */
+#define FTS5INDEX_QUERY_TEST_NOIDX 0x0004   /* Do not use prefix index */
 
 /*
 ** Create/destroy an Fts5Index object.
index 926a495bdbac6c4a431bc66e95dbf06f9b7fd0ab..d805d256fffa18f4e1f11c580ce0359b8ae44b86 100644 (file)
@@ -4428,10 +4428,25 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){
         ** the same. If not, call this corruption.  */
         rc = fts5QueryCksum(p, z, n, flags, &ck1);
         if( rc==SQLITE_OK ){
-          rc = fts5QueryCksum(p, z, n, flags | FTS5INDEX_QUERY_DESC, &ck2);
+          rc = fts5QueryCksum(p, z, n, flags|FTS5INDEX_QUERY_DESC, &ck2);
         }
         if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT;
 
+        /* If this is a prefix query, check that the results returned if the
+        ** the index is disabled are the same. In both ASC and DESC order. */
+        if( iIdx>0 && rc==SQLITE_OK ){
+          int f = flags|FTS5INDEX_QUERY_TEST_NOIDX;
+          ck2 = 0;
+          rc = fts5QueryCksum(p, z, n, f, &ck2);
+          if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT;
+        }
+        if( iIdx>0 && rc==SQLITE_OK ){
+          int f = flags|FTS5INDEX_QUERY_TEST_NOIDX|FTS5INDEX_QUERY_DESC;
+          ck2 = 0;
+          rc = fts5QueryCksum(p, z, n, f, &ck2);
+          if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT;
+        }
+
         cksum3 ^= ck1;
         fts5BufferSet(&rc, &term, n, (const u8*)z);
         p->rc = rc;
@@ -4706,17 +4721,18 @@ int sqlite3Fts5IndexQuery(
   int flags,                      /* Mask of FTS5INDEX_QUERY_X flags */
   Fts5IndexIter **ppIter          /* OUT: New iterator object */
 ){
+  Fts5Config *pConfig = p->pConfig;
   Fts5IndexIter *pRet;
   int iIdx = 0;
 
   if( flags & FTS5INDEX_QUERY_PREFIX ){
-    Fts5Config *pConfig = p->pConfig;
-    int nChar = fts5IndexCharlen(pToken, nToken);
-    for(iIdx=1; iIdx<=pConfig->nPrefix; iIdx++){
-      if( pConfig->aPrefix[iIdx-1]==nChar ) break;
-    }
-    if( iIdx>pConfig->nPrefix ){
-      iIdx = -1;
+    if( flags & FTS5INDEX_QUERY_TEST_NOIDX ){
+      iIdx = 1+pConfig->nPrefix;
+    }else{
+      int nChar = fts5IndexCharlen(pToken, nToken);
+      for(iIdx=1; iIdx<=pConfig->nPrefix; iIdx++){
+        if( pConfig->aPrefix[iIdx-1]==nChar ) break;
+      }
     }
   }
 
@@ -4725,7 +4741,7 @@ int sqlite3Fts5IndexQuery(
     memset(pRet, 0, sizeof(Fts5IndexIter));
 
     pRet->pIndex = p;
-    if( iIdx>=0 ){
+    if( iIdx<=pConfig->nPrefix ){
       pRet->pStruct = fts5StructureRead(p, iIdx);
       if( pRet->pStruct ){
         fts5MultiIterNew(p, pRet->pStruct, 
index 9c85f5c4cfcc2204fc050d4abf4afbc8ab8ea1ac..a1dc46526cb040d0497183bb07b387fd79a35453 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improve\sfts5\sintegrity-check\sso\sthat\sit\schecks\sthat\sDESC\squeries\sreturn\sthe\ssame\sas\sASC.\sChange\sthe\sposlist\sformat\sslightly\sto\smake\sroom\sfor\sa\sdelete-flag.
-D 2015-04-11T16:23:31.390
+C Have\sfts5\sintegrity\scheck\sverify\sthat\sprefix\sindexes\scontain\sthe\ssame\svalues\sas\sreturned\sby\sprefix\squeries\son\sthe\smain\sterms\sindex.
+D 2015-04-11T18:25:04.731
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 88a3e6261286db378fdffa1124cad11b3c05f5bb
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -106,13 +106,13 @@ F ext/fts3/unicode/mkunicode.tcl 159c1194da0bc72f51b3c2eb71022568006dc5ad
 F ext/fts5/extract_api_docs.tcl 55a6d648d516f35d9a1e580ac00de27154e1904a
 F ext/fts5/fts5.c 1eb8ca073be5222c43e4eee5408764c2cbb4200b
 F ext/fts5/fts5.h 24a2cc35b5e76eec57b37ba48c12d9d2cb522b3a
-F ext/fts5/fts5Int.h d6fd1eb0b243b64d971126dd820821221810efe3
+F ext/fts5/fts5Int.h 1b537736f8838df7fca10245c0f70a23cfddc7f5
 F ext/fts5/fts5_aux.c fcea18b1a2a3f95a498b52aba2983557d7678a22
 F ext/fts5/fts5_buffer.c 29f79841bf6eef5220eef41b122419b1bcb07b06
 F ext/fts5/fts5_config.c 0847facc8914f57ea4452c43ce109200dc65e894
 F ext/fts5/fts5_expr.c 5215137efab527577d36bdf9e44bfc2ec3e1be98
 F ext/fts5/fts5_hash.c 7c134ed05d25e2a19418356d78aa4e7059bd319c
-F ext/fts5/fts5_index.c 5eea88e4641ee66a86d012b33ddec622b83a9365
+F ext/fts5/fts5_index.c 670a428c51abb4f5f3f6135cc9fd0a19c192f96d
 F ext/fts5/fts5_storage.c ac0f0937059c8d4f38a1f13aa5f2c2cd7edf3e0d
 F ext/fts5/fts5_tcl.c 617b6bb96545be8d9045de6967c688cd9cd15541
 F ext/fts5/fts5_tokenize.c c07f2c2f749282c1dbbf46bde1f6d7095c740b8b
@@ -1292,7 +1292,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 142743918fd5a6d79fa10c44398360c3684a255a
-R e78dd4221a93060347417c129987958e
+P 49c1e74522a26e5dbe6f8305bc96487279b80dfb
+R 008cbeef4b71700e108cdf2aad4130b5
 U dan
-Z 3431ace9d6cdd5acdd6fb6814cf8ac9f
+Z b886f5faefd1f02721c5ad30d158df62
index 5c56b45150e9ea1a3eb08d9615b1db81394940fb..5a159d131f46976688af8386d8d6a767a59fdccd 100644 (file)
@@ -1 +1 @@
-49c1e74522a26e5dbe6f8305bc96487279b80dfb
\ No newline at end of file
+bdb8e82ab683f2438cde9f0b63e497dbf0141dcf
\ No newline at end of file