]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Have contentless and external content fts5 tables ignore "OR REPLACE" conflict handling.
authordan <dan@noemail.net>
Tue, 27 Oct 2015 20:04:53 +0000 (20:04 +0000)
committerdan <dan@noemail.net>
Tue, 27 Oct 2015 20:04:53 +0000 (20:04 +0000)
FossilOrigin-Name: a85c2a4758c27e8d5d0395751eb3cfd9985ce696

ext/fts5/fts5_main.c
ext/fts5/fts5_storage.c
ext/fts5/test/fts5aa.test
ext/fts5/test/fts5conflict.test [new file with mode: 0644]
manifest
manifest.uuid

index a133cf41b9cf2458af12e8e6d1cb97b30005d61c..bd004cf824008a028c76f3eeb3391f70589bfb78 100644 (file)
@@ -1451,7 +1451,10 @@ static int fts5UpdateMethod(
     **
     ** Cases 3 and 4 may violate the rowid constraint.
     */
-    int eConflict = sqlite3_vtab_on_conflict(pConfig->db);
+    int eConflict = SQLITE_ABORT;
+    if( pConfig->eContent==FTS5_CONTENT_NORMAL ){
+      eConflict = sqlite3_vtab_on_conflict(pConfig->db);
+    }
 
     assert( eType0==SQLITE_INTEGER || eType0==SQLITE_NULL );
     assert( nArg!=1 || eType0==SQLITE_INTEGER );
index ff4aea50e1e8471ab16d495a67fa13c03b3c32c7..5fd5dc51a223ab422c7c2a53c9aa0bf79f73afd2 100644 (file)
@@ -513,13 +513,15 @@ int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel){
   }
 
   /* Delete the %_content record */
-  if( rc==SQLITE_OK ){
-    rc = fts5StorageGetStmt(p, FTS5_STMT_DELETE_CONTENT, &pDel, 0);
-  }
-  if( rc==SQLITE_OK ){
-    sqlite3_bind_int64(pDel, 1, iDel);
-    sqlite3_step(pDel);
-    rc = sqlite3_reset(pDel);
+  if( pConfig->eContent==FTS5_CONTENT_NORMAL ){
+    if( rc==SQLITE_OK ){
+      rc = fts5StorageGetStmt(p, FTS5_STMT_DELETE_CONTENT, &pDel, 0);
+    }
+    if( rc==SQLITE_OK ){
+      sqlite3_bind_int64(pDel, 1, iDel);
+      sqlite3_step(pDel);
+      rc = sqlite3_reset(pDel);
+    }
   }
 
   /* Write the averages record */
index f8ea6a8f716653ccfec625d826d8b8beb17fc121..59b8ab86d133c3c15d0314c47a5de721e061cacf 100644 (file)
@@ -15,7 +15,7 @@
 source [file join [file dirname [info script]] fts5_common.tcl]
 set testprefix fts5aa
 
-# If SQLITE_ENABLE_FTS3 is defined, omit this file.
+# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
 ifcapable !fts5 {
   finish_test
   return
diff --git a/ext/fts5/test/fts5conflict.test b/ext/fts5/test/fts5conflict.test
new file mode 100644 (file)
index 0000000..5c1e593
--- /dev/null
@@ -0,0 +1,70 @@
+# 2015 October 27
+#
+# 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 implements regression tests for SQLite library.  The
+# focus of this script is testing the FTS5 module.
+#
+
+source [file join [file dirname [info script]] fts5_common.tcl]
+set testprefix fts5conflict
+
+# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
+ifcapable !fts5 {
+  finish_test
+  return
+}
+
+do_execsql_test 1.0 {
+  CREATE TABLE t1(x INTEGER PRIMARY KEY, a, b);
+  CREATE VIRTUAL TABLE ft USING fts5(a, b, content=t1, content_rowid=x);
+}
+
+do_execsql_test 1.1 {
+  REPLACE INTO ft(rowid, a, b) VALUES(1, 'a b c', 'a b c');
+  REPLACE INTO t1              VALUES(1, 'a b c', 'a b c');
+}
+
+do_execsql_test 1.2 {
+  INSERT INTO ft(ft) VALUES('integrity-check');
+}
+
+do_execsql_test 2.0 {
+  CREATE TABLE tbl(a INTEGER PRIMARY KEY, b, c);
+  CREATE VIRTUAL TABLE fts_idx USING fts5(b, c, content=tbl, content_rowid=a);
+  CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN
+    INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
+  END;
+  CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
+    INSERT INTO fts_idx(fts_idx, rowid, b, c) 
+      VALUES('delete', old.a, old.b, old.c);
+  END;
+  CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
+    INSERT INTO fts_idx(fts_idx, rowid, b, c) 
+      VALUES('delete', old.a, old.b, old.c);
+    INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
+  END;
+}
+
+do_execsql_test 2.1 {
+  PRAGMA recursive_triggers = 1;
+  INSERT INTO tbl VALUES(1,   'x y z', '1 2 3');
+  INSERT INTO tbl VALUES(10,  'x y z', '1 2 3');
+  INSERT INTO tbl VALUES(100, 'x 1 z', '1 y 3');
+
+  UPDATE tbl SET b = '1 2 x' WHERE rowid=10;
+  REPLACE INTO tbl VALUES(1, '4 5 6', '3 2 1');
+  DELETE FROM tbl WHERE a=100;
+
+  INSERT INTO fts_idx(fts_idx) VALUES('integrity-check');
+}
+
+finish_test
+
+
index 9057c85e7bd038b20d1366a457ff64b7e18501c6..200cb097f7d12e61a9f77b7f64b7f06f6ac77980 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sproblems\swith\sprefix\squeries\sin\sfts5.
-D 2015-10-27T17:48:57.642
+C Have\scontentless\sand\sexternal\scontent\sfts5\stables\signore\s"OR\sREPLACE"\sconflict\shandling.
+D 2015-10-27T20:04:53.777
 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 702d3e98f3afc6587a78481257f3c4c900efc3a4
@@ -110,8 +110,8 @@ F ext/fts5/fts5_config.c 88a77f5d5e4dfbb2355b8f6cc9969b7f02d94685
 F ext/fts5/fts5_expr.c 28b15c9ae296204bc0a2e5cf7a667d840a9d2900
 F ext/fts5/fts5_hash.c a9d4c1efebc2a91d26ad7ebdfcbf2678ceac405f
 F ext/fts5/fts5_index.c 356481ce027cc2ede8e462c316b578260cda29d2
-F ext/fts5/fts5_main.c 520a29136ba07448331f73bdc36d0ffa1e9dcfef
-F ext/fts5/fts5_storage.c 8038a54a88d3beb94dc7f9db6428a3bc08b718bb
+F ext/fts5/fts5_main.c 39358d3d8f0d6ea3757c40e0ddcbb6bc435604c3
+F ext/fts5/fts5_storage.c 9ea3d92178743758b6c54d9fe8836bbbdcc92e3b
 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd
 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf
 F ext/fts5/fts5_tokenize.c 12c5d925286491a71bb3dad7c8924ce9cfd18320
@@ -121,7 +121,7 @@ F ext/fts5/fts5_vocab.c 3742d0abfe8aa8c3cb4a7df56aa38f2e3c3fb1c2
 F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35
 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
 F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d
-F ext/fts5/test/fts5aa.test 34ad813e9e958115d388658b2c4a8dde6b1474a5
+F ext/fts5/test/fts5aa.test 2c553eea4dab4bc5a75928f56729277c7bc1d206
 F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
 F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c
 F ext/fts5/test/fts5ad.test e3dfb150fce971b4fd832498c29f56924d451b63
@@ -140,6 +140,7 @@ F ext/fts5/test/fts5auxdata.test 141a7cbffcceb1bd2799b4b29c183ff8780d586e
 F ext/fts5/test/fts5bigpl.test 04ee0d7eebbebf17c31f5a0b5c5f9494eac3a0cb
 F ext/fts5/test/fts5columnsize.test a8cfef21ffa1c264b9f670a7d94eeaccb5341c07
 F ext/fts5/test/fts5config.test ad2ff42ddc856aed2d05bf89dc1c578c8a39ea3b
+F ext/fts5/test/fts5conflict.test 26f4e46c4d31e16221794832a990dc4e30e18de5
 F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1
 F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62
 F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c
@@ -1394,7 +1395,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 45d3539e152a44629639723f18ce70d9ef01f31a
-R fbe2860d8975b512a1715e460bd017e7
+P 3b5758c647530bd5c2e68d0ee3e9f58a96347ca4
+R 12dc88416f949cd01baa0c732f28f65c
 U dan
-Z 8f449fae999a2e5acc0c44c5783d72e3
+Z bfdbdd08273e5e7ba3b496b0efa58731
index 36934c91ef23b272c23ae3428d8c7fe642ba728b..cfeac69b0803cc9798313244bba91c0228c295ef 100644 (file)
@@ -1 +1 @@
-3b5758c647530bd5c2e68d0ee3e9f58a96347ca4
\ No newline at end of file
+a85c2a4758c27e8d5d0395751eb3cfd9985ce696
\ No newline at end of file