]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the fts5 integrity-check so that it works with columnsize=0 tables.
authordan <dan@noemail.net>
Thu, 3 Sep 2015 11:00:50 +0000 (11:00 +0000)
committerdan <dan@noemail.net>
Thu, 3 Sep 2015 11:00:50 +0000 (11:00 +0000)
FossilOrigin-Name: 11b887b15eaee57ea2577c763e70494f1e251275

ext/fts5/fts5_storage.c
ext/fts5/test/fts5columnsize.test
ext/fts5/test/fts5fault7.test [new file with mode: 0644]
ext/fts5/test/fts5synonym.test
manifest
manifest.uuid

index 6ff81d428d2dbbeb0b58f09774de40df1596182e..c91e7eeba3498ad601132446c028dc568dfdf19c 100644 (file)
@@ -891,7 +891,9 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){
       int i;
       ctx.iRowid = sqlite3_column_int64(pScan, 0);
       ctx.szCol = 0;
-      rc = sqlite3Fts5StorageDocsize(p, ctx.iRowid, aColSize);
+      if( pConfig->bColumnsize ){
+        rc = sqlite3Fts5StorageDocsize(p, ctx.iRowid, aColSize);
+      }
       for(i=0; rc==SQLITE_OK && i<pConfig->nCol; i++){
         if( pConfig->abUnindexed[i] ) continue;
         ctx.iCol = i;
@@ -903,7 +905,9 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){
             (void*)&ctx,
             fts5StorageIntegrityCallback
         );
-        if( ctx.szCol!=aColSize[i] ) rc = FTS5_CORRUPT;
+        if( pConfig->bColumnsize && ctx.szCol!=aColSize[i] ){
+          rc = FTS5_CORRUPT;
+        }
         aTotalSize[i] += ctx.szCol;
       }
       if( rc!=SQLITE_OK ) break;
@@ -928,7 +932,7 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){
     rc = fts5StorageCount(p, "content", &nRow);
     if( rc==SQLITE_OK && nRow!=p->nTotalRow ) rc = FTS5_CORRUPT;
   }
-  if( rc==SQLITE_OK ){
+  if( rc==SQLITE_OK && pConfig->bColumnsize ){
     i64 nRow;
     rc = fts5StorageCount(p, "docsize", &nRow);
     if( rc==SQLITE_OK && nRow!=p->nTotalRow ) rc = FTS5_CORRUPT;
@@ -1012,9 +1016,12 @@ static int fts5StorageDecodeSizeArray(
 ** otherwise.
 */
 int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){
-  int nCol = p->pConfig->nCol;
-  sqlite3_stmt *pLookup = 0;
-  int rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0);
+  int nCol = p->pConfig->nCol;    /* Number of user columns in table */
+  sqlite3_stmt *pLookup = 0;      /* Statement to query %_docsize */
+  int rc;                         /* Return Code */
+
+  assert( p->pConfig->bColumnsize );
+  rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0);
   if( rc==SQLITE_OK ){
     int bCorrupt = 1;
     sqlite3_bind_int64(pLookup, 1, iRowid);
index ed0edd677ec3e6936601881ccc56cfd405a77052..dec9b58d3d1830a0ca85dc31a6f443e1bcaee566 100644 (file)
@@ -134,5 +134,18 @@ do_execsql_test 3.2.1 {
   1 {-1 0 -1} 2 {-1 0 -1}
 }
 
+#-------------------------------------------------------------------------
+# Test the integrity-check
+#
+do_execsql_test 4.1.1 {
+  CREATE VIRTUAL TABLE t5 USING fts5(x, columnsize=0);
+  INSERT INTO t5 VALUES('1 2 3 4');
+  INSERT INTO t5 VALUES('2 4 6 8');
+}
+
+breakpoint
+do_execsql_test 4.1.2 {
+  INSERT INTO t5(t5) VALUES('integrity-check');
+}
 
 finish_test
diff --git a/ext/fts5/test/fts5fault7.test b/ext/fts5/test/fts5fault7.test
new file mode 100644 (file)
index 0000000..381f9ea
--- /dev/null
@@ -0,0 +1,45 @@
+# 2015 September 3
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#*************************************************************************
+#
+# This file is focused on OOM errors.
+#
+
+source [file join [file dirname [info script]] fts5_common.tcl]
+source $testdir/malloc_common.tcl
+set testprefix fts5fault2
+
+# If SQLITE_ENABLE_FTS3 is defined, omit this file.
+ifcapable !fts5 {
+  finish_test
+  return
+}
+
+#-------------------------------------------------------------------------
+# Test fault-injection on a query that uses xColumnSize() on columnsize=0
+# table.
+#
+do_execsql_test 1.0 {
+  CREATE VIRTUAL TABLE t1 USING fts5(x, columnsize=0);
+  INSERT INTO t1 VALUES('a b c d e f g');
+  INSERT INTO t1 VALUES('a b c d');
+  INSERT INTO t1 VALUES('a b c d e f g h i j');
+}
+
+
+fts5_aux_test_functions db
+do_faultsim_test 1 -faults oom* -body {
+  execsql { SELECT fts5_test_columnsize(t1) FROM t1 WHERE t1 MATCH 'b' }
+} -test {
+  faultsim_test_result {0 {7 4 10}} {1 SQLITE_NOMEM}
+}
+
+finish_test
+
index 81073dec8ba0d1614fe50bd7ef5542a33fbdc572..008d2fc5439b48ae1aeb197d92fa8a0a6eacb559 100644 (file)
@@ -433,12 +433,28 @@ proc tcl_tokenize {tflags text} {
     }
   }
 }
-do_execsql_test 7.0 {
-  CREATE VIRTUAL TABLE t1 USING fts5(a, b, columnsize=0, tokenize=tcl);
+
+do_execsql_test 7.0.1 {
+  CREATE VIRTUAL TABLE t1 USING fts5(a, b, columnsize=1, tokenize=tcl);
   INSERT INTO t1 VALUES('0 2 3', '4 5 6 7');
   INSERT INTO t1 VALUES('8 9', '0 0 0 0 0 0 0 0 0 0');
   SELECT fts5_test_columnsize(t1) FROM t1 WHERE t1 MATCH '000 AND 00 AND 0';
 } {{3 4} {2 10}}
 
+do_execsql_test 7.0.2 {
+  INSERT INTO t1(t1) VALUES('integrity-check');
+}
+
+do_execsql_test 7.1.1 {
+  CREATE VIRTUAL TABLE t2 USING fts5(a, b, columnsize=0, tokenize=tcl);
+  INSERT INTO t2 VALUES('0 2 3', '4 5 6 7');
+  INSERT INTO t2 VALUES('8 9', '0 0 0 0 0 0 0 0 0 0');
+  SELECT fts5_test_columnsize(t2) FROM t2 WHERE t2 MATCH '000 AND 00 AND 0';
+} {{3 4} {2 10}}
+
+do_execsql_test 7.1.2 {
+  INSERT INTO t2(t2) VALUES('integrity-check');
+}
+
 finish_test
 
index efbe08818c68ec71ce9890c73be00c0a7161cd2e..5ea1f7c040e2b49353b0645af5261b959ab39147 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\smemory\sleak\sin\sfts5_expr.c.
-D 2015-09-03T10:27:02.747
+C Fix\sthe\sfts5\sintegrity-check\sso\sthat\sit\sworks\swith\scolumnsize=0\stables.
+D 2015-09-03T11:00:50.518
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in e2218eb228374422969de7b1680eda6864affcef
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -114,7 +114,7 @@ F ext/fts5/fts5_expr.c 0c36c1db8eccdeb006e3c8d1499d05015f6e11a6
 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246
 F ext/fts5/fts5_index.c 076c4995bf06a6d1559a6e31f9a86b90f2105374
 F ext/fts5/fts5_main.c e9d0892424bb7f0a8b58613d4ff75cb650cf286e
-F ext/fts5/fts5_storage.c c888defbb961d64c12299b3d1725a24a770b047e
+F ext/fts5/fts5_storage.c 4b883f592ffdc6bcefba6fa03580228379a1333f
 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37
 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf
 F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a
@@ -141,7 +141,7 @@ F ext/fts5/test/fts5auto.test caa5bcf917db11944655a2a9bd38c67c520376ca
 F ext/fts5/test/fts5aux.test 8c687c948cc98e9a94be014df7d518acc1b3b74f
 F ext/fts5/test/fts5auxdata.test 141a7cbffcceb1bd2799b4b29c183ff8780d586e
 F ext/fts5/test/fts5bigpl.test 04ee0d7eebbebf17c31f5a0b5c5f9494eac3a0cb
-F ext/fts5/test/fts5columnsize.test 97dc6bd66c91009d00407aa078dd5e9e8eb22f99
+F ext/fts5/test/fts5columnsize.test a8cfef21ffa1c264b9f670a7d94eeaccb5341c07
 F ext/fts5/test/fts5config.test ad2ff42ddc856aed2d05bf89dc1c578c8a39ea3b
 F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1
 F ext/fts5/test/fts5corrupt.test 928c9c91d40690d301f943a7ed0ffc19e0d0e7b6
@@ -157,6 +157,7 @@ F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3
 F ext/fts5/test/fts5fault4.test 762991d526ee67c2b374351a17248097ea38bee7
 F ext/fts5/test/fts5fault5.test 54da9fd4c3434a1d4f6abdcb6469299d91cf5875
 F ext/fts5/test/fts5fault6.test 97bce1a36b7a64e3203fea504ae8e5cfd5ada423
+F ext/fts5/test/fts5fault7.test f4a9b796f8b20c78ec7cf9f4e11144d15d7c3fd4
 F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741
 F ext/fts5/test/fts5hash.test 42eb066f667e9a389a63437cb7038c51974d4fc6
 F ext/fts5/test/fts5integrity.test 29f41d2c7126c6122fbb5d54e556506456876145
@@ -172,7 +173,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1
 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
 F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
 F ext/fts5/test/fts5rowid.test 6f9833b23b176dc4aa15b7fc02afeb2b220fd460
-F ext/fts5/test/fts5synonym.test e9ef0e6d59e6050020e0a805c37edde623bf289e
+F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671
 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89
 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841
 F ext/fts5/test/fts5unicode2.test c1dd890ba32b7609adba78e420faa847abe43b59
@@ -1381,7 +1382,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P bdedd838bb3028c586bcc9f643852ce1364adb49
-R 780ceea4c7fd3021fab9ec34a27ddefc
+P 399932a181437d84cd57234e76c4b65da1e4ac5f
+R 71ce956d6d1c9e126c469db6cf4c4e29
 U dan
-Z ba334b6166e1647cafa078f408fcb3d8
+Z 54ee3fa6162283338bf35bd792c52ef7
index f12f376ddc44db338710e3af24a37b46ef44fe30..5fc6e92798692f39c54e97c2a67cbb777af80cd6 100644 (file)
@@ -1 +1 @@
-399932a181437d84cd57234e76c4b65da1e4ac5f
\ No newline at end of file
+11b887b15eaee57ea2577c763e70494f1e251275
\ No newline at end of file