]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve test coverage of fts5_storage.c.
authordan <dan@noemail.net>
Mon, 18 May 2015 20:34:59 +0000 (20:34 +0000)
committerdan <dan@noemail.net>
Mon, 18 May 2015 20:34:59 +0000 (20:34 +0000)
FossilOrigin-Name: 4dfe2e5871704125338620705e6638f36baaacd7

ext/fts5/fts5_storage.c
ext/fts5/test/fts5aa.test
ext/fts5/test/fts5aux.test
ext/fts5/test/fts5content.test
ext/fts5/test/fts5corrupt2.test
ext/fts5/test/fts5corrupt3.test
ext/fts5/test/fts5fault6.test [new file with mode: 0644]
ext/fts5/test/fts5integrity.test
manifest
manifest.uuid

index 0ea99c25a25355d097e57c38db2cd2926824a44f..5e2e1413c9e1045bc086eb4d92ed068dd03dba46 100644 (file)
@@ -663,9 +663,7 @@ int sqlite3Fts5StorageInsert(
     }else{
       if( eConflict==SQLITE_REPLACE ){
         eStmt = FTS5_STMT_REPLACE_CONTENT;
-        if( sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){
-          rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1]));
-        }
+        rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1]));
       }else{
         eStmt = FTS5_STMT_INSERT_CONTENT;
       }
index 028eece68a2c498a4ed7e5d0a5b5504c1066f32f..800215d2bb827f6d32a67317638797d837d3fee6 100644 (file)
@@ -143,6 +143,14 @@ do_execsql_test 6.2 {
   INSERT INTO t1(t1) VALUES('integrity-check') 
 }
 
+do_execsql_test 6.3 {
+  REPLACE INTO t1(rowid, x, y) VALUES('22', 'l l l', 'l l l');
+}
+
+do_execsql_test 6.4 {
+  INSERT INTO t1(t1) VALUES('integrity-check') 
+}
+
 #-------------------------------------------------------------------------
 #
 reset_db
@@ -400,6 +408,25 @@ do_catchsql_test 16.2 {
   SELECT funk(), bm25(n1), funk() FROM n1 WHERE n1 MATCH 'a+b+c+d'
 } {1 {SQL logic error or missing database}}
 
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 17.1 {
+  CREATE VIRTUAL TABLE b2 USING fts5(x);
+  INSERT INTO b2 VALUES('a');
+  INSERT INTO b2 VALUES('b');
+  INSERT INTO b2 VALUES('c');
+}
+
+do_test 17.2 {
+  set res [list]
+  db eval { SELECT * FROM b2 ORDER BY rowid ASC } {
+    lappend res [execsql { SELECT * FROM b2 ORDER BY rowid ASC }]
+  }
+  set res
+} {{a b c} {a b c} {a b c}}
+
+
 finish_test
 
 
index 894c8d6f1b0272720ad8d0015fb40c883f8dfe1d..923724147415660eae0abb7759a354b1b0bc9beb 100644 (file)
@@ -25,9 +25,15 @@ proc colsize {cmd i} {
 }
 sqlite3_fts5_create_function db colsize colsize
 
+proc totalsize {cmd i} { 
+  $cmd xColumnTotalSize $i
+}
+sqlite3_fts5_create_function db totalsize totalsize
+
 do_execsql_test 1.0 {
   CREATE VIRTUAL TABLE f1 USING fts5(a, b);
   INSERT INTO f1 VALUES('one two', 'two one zero');
+  INSERT INTO f1 VALUES('one one', 'one one one');
 }
 
 do_catchsql_test 1.1 {
@@ -46,11 +52,25 @@ do_catchsql_test 1.4 {
 do_catchsql_test 2.1 {
   SELECT colsize(f1, 2) FROM f1 WHERE f1 MATCH 'two';
 } {1 SQLITE_RANGE}
-
 do_execsql_test 2.2 {
   SELECT colsize(f1, 0), colsize(f1, 1) FROM f1 WHERE f1 MATCH 'zero';
 } {2 3}
-
+do_execsql_test 2.3 {
+  SELECT colsize(f1, -1) FROM f1 WHERE f1 MATCH 'zero';
+} {5}
+
+do_execsql_test 2.4.1 {
+  SELECT totalsize(f1, -1) FROM f1 WHERE f1 MATCH 'zero';
+} {10}
+do_execsql_test 2.4.2 {
+  SELECT totalsize(f1, 0) FROM f1 WHERE f1 MATCH 'zero';
+} {4}
+do_execsql_test 2.4.3 {
+  SELECT totalsize(f1, 1) FROM f1 WHERE f1 MATCH 'zero';
+} {6}
+do_catchsql_test 2.4.4 {
+  SELECT totalsize(f1, 2) FROM f1 WHERE f1 MATCH 'zero';
+} {1 SQLITE_RANGE}
 
 #-------------------------------------------------------------------------
 # Test the xSet and xGetAuxdata APIs with a NULL destructor.
index 105e11224bcb6699d6f6ef13ed1c58cd4999c21a..1b5b6b30723455200fe02f472e3cca7ac36c2bef 100644 (file)
@@ -234,6 +234,19 @@ do_execsql_test 5.1 {
 } $::checksum
 
 
-finish_test
+#-------------------------------------------------------------------------
+# Check that a contentless table can be dropped.
+#
+reset_db
+do_execsql_test 6.1 {
+  CREATE VIRTUAL TABLE xx USING fts5(x, y, content="");
+  SELECT name FROM sqlite_master;
+} {xx xx_data xx_docsize xx_config}
+do_execsql_test 6.2 {
+  DROP TABLE xx;
+  SELECT name FROM sqlite_master;
+} {}
+
 
+finish_test
 
index 099b966945f6267ad546f6ed65a81a92eebe8b5c..28486b34ac6bebc13d9fea2f5cbe5b6f9580a1d7 100644 (file)
@@ -240,6 +240,26 @@ foreach {tn hdr} {
   }
 }
 
+#--------------------------------------------------------------------
+reset_db
+do_execsql_test 5.1 {
+  CREATE VIRTUAL TABLE x5 USING fts5(tt);
+  INSERT INTO x5 VALUES('a');
+  INSERT INTO x5 VALUES('a a');
+  INSERT INTO x5 VALUES('a a a');
+  INSERT INTO x5 VALUES('a a a a');
+
+  UPDATE x5_docsize SET sz = X'' WHERE id=3;
+}
+proc colsize {cmd i} { 
+  $cmd xColumnSize $i
+}
+sqlite3_fts5_create_function db colsize colsize
+
+do_catchsql_test 5.2 {
+  SELECT colsize(x5, 0) FROM x5 WHERE x5 MATCH 'a'
+} {1 SQLITE_CORRUPT_VTAB}
+
 
 sqlite3_fts5_may_be_corrupt 0
 finish_test
index 1df8b3e8dee422b98c31631443b756ec950072ce..831eca54542f4be2d580c3c3a20a796b5b12d95d 100644 (file)
@@ -51,6 +51,23 @@ for {set i 0} {$i < $L} {incr i} {
   catchsql ROLLBACK
 }
  
+#-------------------------------------------------------------------------
+# Test that trailing bytes appended to the averages record are ignored.
+#
+do_execsql_test 2.1 {
+  CREATE VIRTUAL TABLE t2 USING fts5(x);
+  INSERT INTO t2 VALUES(rnddoc(10));
+  INSERT INTO t2 VALUES(rnddoc(10));
+  SELECT length(block) FROM t2_data WHERE id=1;
+} {2}
+do_execsql_test 2.2 {
+  UPDATE t2_data SET block = block || 'abcd' WHERE id=1;
+  SELECT length(block) FROM t2_data WHERE id=1;
+} {6}
+do_execsql_test 2.2 {
+  INSERT INTO t2 VALUES(rnddoc(10));
+  SELECT length(block) FROM t2_data WHERE id=1;
+} {2}
 
 sqlite3_fts5_may_be_corrupt 0
 finish_test
diff --git a/ext/fts5/test/fts5fault6.test b/ext/fts5/test/fts5fault6.test
new file mode 100644 (file)
index 0000000..73e488b
--- /dev/null
@@ -0,0 +1,104 @@
+# 2014 June 17
+#
+# 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 fts5fault6
+
+# If SQLITE_ENABLE_FTS5 is defined, omit this file.
+ifcapable !fts5 {
+  finish_test
+  return
+}
+
+#-------------------------------------------------------------------------
+# OOM while rebuilding an FTS5 table.
+#
+do_execsql_test 1.0 {
+  CREATE VIRTUAL TABLE tt USING fts5(a, b);
+  INSERT INTO tt VALUES('c d c g g f', 'a a a d g a');
+  INSERT INTO tt VALUES('c d g b f d', 'b g e c g c');
+  INSERT INTO tt VALUES('c c f d e d', 'c e g d b c');
+  INSERT INTO tt VALUES('e a f c e f', 'g b a c d g');
+  INSERT INTO tt VALUES('c g f b b d', 'g c d c f g');
+  INSERT INTO tt VALUES('d a g a b b', 'g c g g c e');
+  INSERT INTO tt VALUES('e f a b c e', 'f d c d c c');
+  INSERT INTO tt VALUES('e c a g c d', 'b b g f f b');
+  INSERT INTO tt VALUES('g b d d e b', 'f f b d a c');
+  INSERT INTO tt VALUES('e a d a e d', 'c e a e f g');
+}
+faultsim_save_and_close
+
+do_faultsim_test 1.1 -faults oom-t* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  db eval { INSERT INTO tt(tt) VALUES('rebuild') }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+do_faultsim_test 1.2 -faults oom-t* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  db eval { REPLACE INTO tt(rowid, a, b) VALUES(6, 'x y z', 'l l l'); }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+
+#-------------------------------------------------------------------------
+# OOM within a special delete.
+#
+reset_db
+do_execsql_test 2.0 {
+  CREATE VIRTUAL TABLE tt USING fts5(a, content="");
+  INSERT INTO tt VALUES('c d c g g f');
+  INSERT INTO tt VALUES('c d g b f d');
+  INSERT INTO tt VALUES('c c f d e d');
+  INSERT INTO tt VALUES('e a f c e f');
+  INSERT INTO tt VALUES('c g f b b d');
+  INSERT INTO tt VALUES('d a g a b b');
+  INSERT INTO tt VALUES('e f a b c e');
+  INSERT INTO tt VALUES('e c a g c d');
+  INSERT INTO tt VALUES('g b d d e b');
+  INSERT INTO tt VALUES('e a d a e d');
+}
+faultsim_save_and_close
+
+do_faultsim_test 2.1 -faults oom-t* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  db eval { INSERT INTO tt(tt, rowid, a) VALUES('delete', 3, 'c d g b f d'); }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+do_faultsim_test 2.2 -faults oom-t* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  db eval { INSERT INTO tt(tt) VALUES('delete-all') }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+do_faultsim_test 2.3 -faults oom-t* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  db eval { INSERT INTO tt VALUES('x y z') }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
+finish_test
+
index 9e244c26fac8e4009580899875d75d77b43dd6b5..8f56e9273ea5d4bcc5d7a7b71682fdda555975bd 100644 (file)
@@ -48,6 +48,50 @@ do_execsql_test 3.0 {
 
 do_execsql_test 3.1 { INSERT INTO zz(zz) VALUES('integrity-check'); }
 
+#--------------------------------------------------------------------
+# Mess around with a docsize record. And the averages record. Then
+# check that integrity-check picks it up.
+#
+do_execsql_test 4.0 {
+  CREATE VIRTUAL TABLE aa USING fts5(zz);
+  INSERT INTO aa(zz) VALUES('a b c d e');
+  INSERT INTO aa(zz) VALUES('a b c d');
+  INSERT INTO aa(zz) VALUES('a b c');
+  INSERT INTO aa(zz) VALUES('a b');
+  INSERT INTO aa(zz) VALUES('a');
+  SELECT length(sz) FROM aa_docsize;
+} {1 1 1 1 1}
+do_execsql_test 4.1 { 
+  INSERT INTO aa(aa) VALUES('integrity-check'); 
+}
+
+do_catchsql_test 4.2 { 
+  BEGIN;
+    UPDATE aa_docsize SET sz = X'44' WHERE rowid = 3;
+    INSERT INTO aa(aa) VALUES('integrity-check'); 
+} {1 {database disk image is malformed}}
+
+do_catchsql_test 4.3 { 
+  ROLLBACK;
+  BEGIN;
+    UPDATE aa_data SET block = X'44' WHERE rowid = 1;
+    INSERT INTO aa(aa) VALUES('integrity-check'); 
+} {1 {database disk image is malformed}}
+
+do_catchsql_test 4.4 { 
+  ROLLBACK;
+  BEGIN;
+    INSERT INTO aa_docsize VALUES(23, X'04');
+    INSERT INTO aa(aa) VALUES('integrity-check'); 
+} {1 {database disk image is malformed}}
+
+do_catchsql_test 4.5 { 
+  ROLLBACK;
+  BEGIN;
+    INSERT INTO aa_docsize VALUES(23, X'00');
+    INSERT INTO aa_content VALUES(23, '');
+    INSERT INTO aa(aa) VALUES('integrity-check'); 
+} {1 {database disk image is malformed}}
 
 #db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM zz_data} {puts $r}
 #exit
index 7a404472a192c7e8fa577dd724a8765d1a526d00..e1169132372728b6be34360439e205604d4c66e5 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sin\stest\sscript\sfts5fault4.test.
-D 2015-05-18T18:24:41.367
+C Improve\stest\scoverage\sof\sfts5_storage.c.
+D 2015-05-18T20:34:59.915
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in edfc69769e613a6359c42c06ea1d42c3bece1736
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 11f969ed711a0a8b611d47431d74c372ad78c713
 F ext/fts5/fts5_expr.c 0c4b50bb48740c76b8e8b89d5d40a55f8dbffd07
 F ext/fts5/fts5_hash.c 54dd25348a46ea62ea96322c572e08cd1fb37304
 F ext/fts5/fts5_index.c 2c4500c35072b049d1391bbb4e64e4c0e3d3dd43
-F ext/fts5/fts5_storage.c cb8b585bfb7870a36101f1a8fa0b0777f4d1b68d
+F ext/fts5/fts5_storage.c 5d2b51adb304643d8f825ba89283d628418b20c2
 F ext/fts5/fts5_tcl.c f18eeb125d733f4e815a11679b971fa61cd7ec77
 F ext/fts5/fts5_tokenize.c 830eae0d35a5a5a90af34df65da3427f46d942fc
 F ext/fts5/fts5_unicode2.c f74f53316377068812a1fa5a37819e6b8124631d
@@ -121,7 +121,7 @@ F ext/fts5/fts5_vocab.c b54301e376f59f08f662b5dde1cfaf26e86e4db6
 F ext/fts5/fts5parse.y 777da8e5819f75c217982c79c29d014c293acac9
 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
 F ext/fts5/test/fts5_common.tcl d9ea79fdbc9ecbb3541bf89d13ee0e03a8dc3d32
-F ext/fts5/test/fts5aa.test 29409f14dec2ee67bd82ebf15111d6167b1003df
+F ext/fts5/test/fts5aa.test 26f1a462213f3aa067c208bd508d6218c54a620f
 F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
 F ext/fts5/test/fts5ac.test 05008e00bd2761cc45df838a0988ecf318cbe1fd
 F ext/fts5/test/fts5ad.test 2141b0360dc4397bfed30f0b0d700fa64b44835d
@@ -133,14 +133,14 @@ F ext/fts5/test/fts5ai.test f20e53bbf0c55bc596f1fd47f2740dae028b8f37
 F ext/fts5/test/fts5aj.test 05b569f5c16ea3098fb1984eec5cf50dbdaae5d8
 F ext/fts5/test/fts5ak.test 7b8c5df96df599293f920b7e5521ebc79f647592
 F ext/fts5/test/fts5al.test fc60ebeac9d8e366e71309d4c31fa72199d711d7
-F ext/fts5/test/fts5aux.test d9cd26ee45ad5f628b4899f1ac5b757ce7a77bdf
+F ext/fts5/test/fts5aux.test db9035ef292f3ae57ac392f974b1e6b1dd48c6c7
 F ext/fts5/test/fts5auxdata.test c69b86092bf1a157172de5f9169731af3403179b
 F ext/fts5/test/fts5bigpl.test b1cfd00561350ab04994ba7dd9d48468e5e0ec3b
 F ext/fts5/test/fts5config.test c9cc535f3b36cde1e5a32bf579f3f5962a9e82b2
-F ext/fts5/test/fts5content.test 532e15b541254410adc7bfb51f94631cfe82de8f
+F ext/fts5/test/fts5content.test e46904decd896e38c848ad4f38fa4e80251a028b
 F ext/fts5/test/fts5corrupt.test 35bfdbbb3cdcea46ae7385f6432e9b5c574e70a1
-F ext/fts5/test/fts5corrupt2.test 7000030df189f1f3ca58b555b459bcbf9b8f8f77
-F ext/fts5/test/fts5corrupt3.test fe42c0ce0b58b7ad487a469049f91419d22c7459
+F ext/fts5/test/fts5corrupt2.test c231f532162de381fa83ec477b51cd8633fd9da7
+F ext/fts5/test/fts5corrupt3.test da4e2adb2308d8587c2eff31b5aa47447b8a2edb
 F ext/fts5/test/fts5dlidx.test 070531bd45685e545e3e6021deb543f730a4011b
 F ext/fts5/test/fts5doclist.test 635b80ac785627841a59c583bac702b55d49fdc5
 F ext/fts5/test/fts5ea.test 6159e66c4fe9466c37cd6a0ed4197354588b4bcb
@@ -150,9 +150,10 @@ F ext/fts5/test/fts5fault2.test 28c36c843bb39ae855ba79827417ecc37f114341
 F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3
 F ext/fts5/test/fts5fault4.test 7c7c46559368f06b98daa940d376c4740bcdad25
 F ext/fts5/test/fts5fault5.test 98e7e77bc1d8bb47c955e7d6dc870ab5736536e3
+F ext/fts5/test/fts5fault6.test 7cdfdceef362cb9d72f66388846d62bff44c6d01
 F ext/fts5/test/fts5full.test 0924bdca5416a242103239ace79c6f5aa34bab8d
 F ext/fts5/test/fts5hash.test bdba7b591d503005d5a81871ba00a359daa1e969
-F ext/fts5/test/fts5integrity.test 98801bd0fb7c53a40bc770280134865d61724f3a
+F ext/fts5/test/fts5integrity.test b45f633381a85dc000e41d68c96ab510985ca35e
 F ext/fts5/test/fts5merge.test 8077454f2975a63f35761f4b8a718b3a808b7c9c
 F ext/fts5/test/fts5near.test d2e3343e62d438f2efd96ebcd83a0d30a16ea6dc
 F ext/fts5/test/fts5optimize.test 0028c90a7817d3e576d1148fc8dff17d89054e54
@@ -1327,7 +1328,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 ce08206b5c5bf6a81decf20c99a524dd92c3715b
-R 2291f8df21e231273c06942c0f18b8cc
+P a508059305641c2cb53197b0f6e93d7b723697e2
+R b66f4775f516a5c6e7555c8518e4e7c2
 U dan
-Z 4cefad1c255457ef6a42a53ca33a35a5
+Z 5fb8f7409531231cca8a8852556e2f56
index 2399b858539bcc672957ceb639a6e7a4ef6a8cba..c57946abf14cbf5578ebd66147ce6d6d6c685ad7 100644 (file)
@@ -1 +1 @@
-a508059305641c2cb53197b0f6e93d7b723697e2
\ No newline at end of file
+4dfe2e5871704125338620705e6638f36baaacd7
\ No newline at end of file