]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an fts5 problem involving detail=none, "ORDER BY rowid DESC" and deleted items...
authordan <dan@noemail.net>
Wed, 6 Jan 2016 18:53:57 +0000 (18:53 +0000)
committerdan <dan@noemail.net>
Wed, 6 Jan 2016 18:53:57 +0000 (18:53 +0000)
FossilOrigin-Name: 8d05cfd48db1462dfd3efd502d53bd33214403fb

ext/fts5/fts5_index.c
ext/fts5/test/fts5dlidx.test
ext/fts5/test/fts5eb.test
ext/fts5/test/fts5simple2.test
manifest
manifest.uuid

index 49d8638f33a7160904f0866f16954873e56ef860..ef673085c6ecf097d5d307883d03ac78ae606fda 100644 (file)
@@ -1764,14 +1764,14 @@ static void fts5SegIterNext(
         i64 iDelta;
 
         pIter->iRowidOffset--;
-        pIter->iLeafOffset = iOff = pIter->aRowidOffset[pIter->iRowidOffset];
+        pIter->iLeafOffset = pIter->aRowidOffset[pIter->iRowidOffset];
+        fts5SegIterLoadNPos(p, pIter);
+        iOff = pIter->iLeafOffset;
         if( p->pConfig->eDetail!=FTS5_DETAIL_NONE ){
-          iOff += fts5GetPoslistSize(&a[iOff], &nPos, &bDummy);
-          iOff += nPos;
+          iOff += pIter->nPos;
         }
         fts5GetVarint(&a[iOff], (u64*)&iDelta);
         pIter->iRowid -= iDelta;
-        fts5SegIterLoadNPos(p, pIter);
       }else{
         fts5SegIterReverseNewPage(p, pIter);
       }
index 5a03c6989b59e906aab2cc56f9f71aef94c3fb10..232b5021f1a656cbc0d361ff3111e92f82c647a3 100644 (file)
@@ -26,7 +26,7 @@ if { $tcl_platform(wordSize)<8 } {
   return
 }
 
-if 1 {
+foreach_detail_mode $testprefix {
 
 proc do_fb_test {tn sql res} {
   set res2 [lsort -integer -decr $res]
@@ -34,7 +34,7 @@ proc do_fb_test {tn sql res} {
   uplevel [list do_execsql_test $tn.2 "$sql ORDER BY rowid DESC" $res2]
 }
 
-# This test populates the FTS5 table containing $nEntry entries. Rows are 
+# This test populates the FTS5 table with $nEntry entries. Rows are 
 # numbered from 0 to ($nEntry-1). The rowid for row $i is:
 #
 #   ($iFirst + $i*$nStep)
@@ -77,10 +77,12 @@ proc do_dlidx_test1 {tn spc1 spc2 nEntry iFirst nStep} {
   do_fb_test $tn.4.1 { SELECT rowid FROM t1 WHERE t1 MATCH 'a AND y' } $ydoc
   do_fb_test $tn.4.2 { SELECT rowid FROM t1 WHERE t1 MATCH 'y AND a' } $ydoc
   
-  do_fb_test $tn.5.1 { 
-    SELECT rowid FROM t1 WHERE t1 MATCH 'a + b + c + x' } $xdoc
-  do_fb_test $tn.5.2 { 
-    SELECT rowid FROM t1 WHERE t1 MATCH 'b + c + x + y' } $ydoc
+  if {[detail_is_full]} {
+    do_fb_test $tn.5.1 { 
+      SELECT rowid FROM t1 WHERE t1 MATCH 'a + b + c + x' } $xdoc
+    do_fb_test $tn.5.2 { 
+      SELECT rowid FROM t1 WHERE t1 MATCH 'b + c + x + y' } $ydoc
+  }
 }
 
 
@@ -90,7 +92,7 @@ foreach {tn pgsz} {
 } {
   do_execsql_test $tn.0 { 
     DROP TABLE IF EXISTS t1;
-    CREATE VIRTUAL TABLE t1 USING fts5(x);
+    CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
     INSERT INTO t1(t1, rank) VALUES('pgsz', $pgsz);
   }
 
@@ -107,7 +109,7 @@ proc do_dlidx_test2 {tn nEntry iFirst nStep} {
   execsql {
     BEGIN;
     DROP TABLE IF EXISTS t1;
-    CREATE VIRTUAL TABLE t1 USING fts5(x);
+    CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
     INSERT INTO t1(t1, rank) VALUES('pgsz', 64);
     INSERT INTO t1 VALUES('b a');
 
@@ -130,8 +132,6 @@ proc do_dlidx_test2 {tn nEntry iFirst nStep} {
 
 do_dlidx_test2 2.1 [expr 20] [expr 1<<57] [expr (1<<57) + 128]
 
-}
-
 #--------------------------------------------------------------------
 #
 reset_db
@@ -158,7 +158,7 @@ proc rnddoc {} {
 db func rnddoc rnddoc
 
 do_execsql_test 3.1 {
-  CREATE VIRTUAL TABLE abc USING fts5(a);
+  CREATE VIRTUAL TABLE abc USING fts5(a, detail=%DETAIL%);
   INSERT INTO abc(abc, rank) VALUES('pgsz', 32);
 
   INSERT INTO abc VALUES ( rnddoc() );
@@ -192,6 +192,9 @@ foreach v $vocab {
   } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16}
 }
 
+} ;# foreach_detail_mode
+
+
 
 finish_test
 
index 55c4b15cf3b66b64e9b20a18e7e4fc14798be7fe..8205396047bfc5c05fc9b32704744f1de097acd9 100644 (file)
@@ -42,6 +42,15 @@ foreach {tn expr res} {
   10 {abc + "" + def}                 {"abc" + "def"}
   11 {abc "" def}                     {"abc" AND "def"}
   12 {r+e OR w}                       {"r" + "e" OR "w"}
+
+  13 {a AND b NOT c}                  {"a" AND ("b" NOT "c")}
+  14 {a OR b NOT c}                   {"a" OR ("b" NOT "c")}
+  15 {a NOT b AND c}                  {("a" NOT "b") AND "c"}
+  16 {a NOT b OR c}                   {("a" NOT "b") OR "c"}
+
+  17 {a AND b OR c}                   {("a" AND "b") OR "c"}
+  18 {a OR b AND c}                   {"a" OR ("b" AND "c")}
+
 } {
   do_execsql_test 1.$tn {SELECT fts5_expr($expr)} [list $res]
 }
index bb76250e9f269895c7330705de5dadedb0323149..c61970e154e4204e7ce0bbafb8533f9c78b081f1 100644 (file)
@@ -254,8 +254,6 @@ foreach {rowid a} {
   }
 }
 
-}
-
 #-------------------------------------------------------------------------
 #
 reset_db
@@ -269,5 +267,38 @@ do_execsql_test 14.1 {
   SELECT fts5_test_poslist(t1) FROM t1('b') ORDER BY rank;
 } {0.0.1}
 
+}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 15.1 {
+  CREATE VIRTUAL TABLE t1 USING fts5(x, detail=none);
+  BEGIN;
+    INSERT INTO t1(rowid, x) VALUES(1, 'sqlite');
+    INSERT INTO t1(rowid, x) VALUES(2, 'sqlite'); 
+  COMMIT;
+} {}
+
+do_test 15.1 {
+  execsql { INSERT INTO t1(t1) VALUES('integrity-check') }
+} {}
+
+do_test 15.2 {
+  execsql { DELETE FROM t1 }
+} {}
+
+do_execsql_test 15.3.1 {
+  SELECT rowid FROM t1('sqlite');
+} {}
+
+do_execsql_test 15.3.2 {
+  SELECT rowid FROM t1('sqlite') ORDER BY rowid DESC;
+} {}
+
+do_test 15.4 {
+  execsql { INSERT INTO t1(t1) VALUES('integrity-check') }
+} {}
+  
 finish_test
 
index e95f7f880f2926d291d9562352e1a422d55ed703..39b91273fa6b26273ca45d2f0ea9ad7bd71acd23 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\swith\sthe\sxPhraseFirstColumn()\sAPI\sin\sdetail=col\smode.\sRemove\ssome\sunused\stest\scode\sfrom\sfts5ac.test.
-D 2016-01-06T10:17:26.540
+C Fix\san\sfts5\sproblem\sinvolving\sdetail=none,\s"ORDER\sBY\srowid\sDESC"\sand\sdeleted\sitems.\sAlso\sadd\stests\sto\sverify\sthat\sthe\sdocumented\soperator\sprecedences\sare\scorrect.
+D 2016-01-06T18:53:57.055
 F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 5fff077fcc46de7714ed6eebb6159a4c00eab751
@@ -103,7 +103,7 @@ F ext/fts5/fts5_buffer.c 87204c8b3b8bc62b27376eab09b74d6d5acc41f1
 F ext/fts5/fts5_config.c b0ed7b0ddd785fb4d4e6f9037d357f8aa95918e6
 F ext/fts5/fts5_expr.c 5d5dd3044c1a39ace6ddd1034961fd5278ffce2d
 F ext/fts5/fts5_hash.c 1b113977296cf4212c6ec667d5e3f2bd18036955
-F ext/fts5/fts5_index.c 8665393f8be3ae9ed4f1033d7ce0b805108fb95c
+F ext/fts5/fts5_index.c 04fe098ffab66d9424ba4e7c0b88ce7c98748cb1
 F ext/fts5/fts5_main.c cd5f6f0bf868a19e8f8ef01c7b4b86dd152f0bc7
 F ext/fts5/fts5_storage.c 771dd0fda3ee513e32937a386dc2a4aa2d9ea64e
 F ext/fts5/fts5_tcl.c 18e9382d8cdad4c05b49559c68494968b9b4a4fb
@@ -140,10 +140,10 @@ F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62
 F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c
 F ext/fts5/test/fts5corrupt3.test a2b537c120bdd43c79c42fe2438d7b8c81fe5599
 F ext/fts5/test/fts5detail.test 4e971d28e7336c61ab916fc287900355dab7054d
-F ext/fts5/test/fts5dlidx.test ecba5e62ea8b26c33829961602069c546228046d
+F ext/fts5/test/fts5dlidx.test 13871a14641017ae42f6f1055a8067bafd44cb3d
 F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
 F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
-F ext/fts5/test/fts5eb.test 3e5869af2008cbc4ad03a175a0b6f6e58134cd43
+F ext/fts5/test/fts5eb.test 021aa80b7ac09b964249aa32ced9ee908703e4aa
 F ext/fts5/test/fts5fault1.test 4b39c47ca3544615daa8a2f733b911fa08022c77
 F ext/fts5/test/fts5fault2.test 28c36c843bb39ae855ba79827417ecc37f114341
 F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3
@@ -171,7 +171,7 @@ F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
 F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821
 F ext/fts5/test/fts5simple.test 2bc6451cbe887a9215f5b14ae307c70d850344c9
-F ext/fts5/test/fts5simple2.test d453e3ca100e08078a46b12547417891b326240a
+F ext/fts5/test/fts5simple2.test 843f1f7fe439ff32bf74f4fd6430632f9636ef3a
 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671
 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89
 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841
@@ -1408,7 +1408,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P fd217fdb396cf22278a496de0e9dec7902ba8b1f
-R fb939ae0b5d34f9dd8275713b2d3d9d0
+P a4e55f73b3c81e28b917395089c0201f9a2c9178
+R 0d0b45c96327e08ac49c0cd0bf01187b
 U dan
-Z ffed0e3dee313fbcc0c638ddfdf4d418
+Z 1ffb33ee956b9f5de9322a26ad6982ed
index 57c2bbbbf50c746bfe87f0b071bb22b27d504088..1b603ff0f2645a425bfd3be42c611da5555d562b 100644 (file)
@@ -1 +1 @@
-a4e55f73b3c81e28b917395089c0201f9a2c9178
\ No newline at end of file
+8d05cfd48db1462dfd3efd502d53bd33214403fb
\ No newline at end of file