]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems with running UPDATE and DELETE against a VIEW and referencing
authordrh <drh@noemail.net>
Wed, 29 Oct 2014 01:26:25 +0000 (01:26 +0000)
committerdrh <drh@noemail.net>
Wed, 29 Oct 2014 01:26:25 +0000 (01:26 +0000)
the rowid in the WHERE clause.  This is a cherrypick of [95f8ebdbf87326f2]
and [8523670d50004f3].

FossilOrigin-Name: cc33e846c8509419f0a1fbfb286807b4c137788d

manifest
manifest.uuid
src/delete.c
src/update.c
test/trigger9.test

index f5c3788a3258b03c998b927f292776b4fbd7cb7d..be89f4c86aea158cbf9a4690ba178352a12a94f1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Disable\sthe\suse\sof\sstrchrnul()\sunless\sspecifically\senabled\sby\scompile-time\noptions.\s\sCherrypick\sof\scheck-in\s[e580470db77d6da9]
-D 2014-10-29T01:18:03.185
+C Fix\sproblems\swith\srunning\sUPDATE\sand\sDELETE\sagainst\sa\sVIEW\sand\sreferencing\nthe\srowid\sin\sthe\sWHERE\sclause.\s\sThis\sis\sa\scherrypick\sof\s[95f8ebdbf87326f2]\nand\s[8523670d50004f3].
+D 2014-10-29T01:26:25.633
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -180,7 +180,7 @@ F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
 F src/complete.c 535183afb3c75628b78ce82612931ac7cdf26f14
 F src/ctime.c bb434068b5308a857b181c2d204a320ff0d6c638
 F src/date.c 57a7f9ba9f6b4d5268f5e411739066a611f99036
-F src/delete.c fae81cc2eb14b75267d4f47d3cfc9ae02aae726f
+F src/delete.c 0750b1eb4d96cd3fb2c798599a3a7c85e92f1417
 F src/expr.c fc204d08af06437ddaffe5a1b1f1f6f9e1a55d6d
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c da985ae673efef2c712caef825a5d2edb087ead7
@@ -285,7 +285,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c 6de09362b657f19ba83e5fa521ee715787ce9fee
 F src/tokenize.c cc9016e5007fc5e76789079616d2f26741bcc689
 F src/trigger.c 25571661fdeae8c7f975ff40ffec205520a3f92f
-F src/update.c 729f6f18fc27740591d085e1172cebe311144bf0
+F src/update.c 3c4ecc282accf12d39edb8d524cf089645e55a13
 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
 F src/util.c 4006c01772bd8d8ac4306d523bbcee41d3e392d8
 F src/vacuum.c 59f03f92bcff57faa6a8ca256eb29ccddfb0614a
@@ -1048,7 +1048,7 @@ F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83
 F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9
 F test/trigger7.test b39e6dee1debe0ff9c2ef66326668f149f07c9c4
 F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4
-F test/trigger9.test 5b0789f1c5c4600961f8e68511b825b87be53e31
+F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41
 F test/triggerA.test fe5597f47ee21bacb4936dc827994ed94161e332
 F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
 F test/triggerC.test a68980c5955d62ee24be6f97129d824f199f9a4c
@@ -1204,8 +1204,9 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 304ea6ba6f4cf40a76d32d37af73a253f493ba47
-Q +e580470db77d6da970c755102790e603fb26b3c6
-R 87a2c5d1dcd7231208aa0589a51fed61
+P 837368adfe859c41b347d3124d5b3fdf790eec03
+Q +8523670d50004f3112b7871f11c8b8b02aab96ab
+Q +95f8ebdbf87326f23cd38e561ac5632b5367a449
+R b3ee8c71d158066739429e7ae8387325
 U drh
-Z b2af8bf5eda5ca802506e90d5ed9925a
+Z 624aac6d2575ef133925a49cc2066eb1
index 3e0b305a641563efced78aa41444ba3351b9efd3..99e8b826f5baa3cfd52c647f6bbe2f83817672a1 100644 (file)
@@ -1 +1 @@
-837368adfe859c41b347d3124d5b3fdf790eec03
\ No newline at end of file
+cc33e846c8509419f0a1fbfb286807b4c137788d
\ No newline at end of file
index b97407400b2d587dcde768452f621da9c1fe6ec2..d81dd3f6b48d8eab35a073dcceedbd8b1555550a 100644 (file)
@@ -481,7 +481,7 @@ void sqlite3DeleteFrom(
       assert( nKey==nPk );  /* OP_Found will use an unpacked key */
       assert( !IsVirtual(pTab) );
       if( aToOpen[iDataCur-iTabCur] ){
-        assert( pPk!=0 );
+        assert( pPk!=0 || pTab->pSelect!=0 );
         sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey);
         VdbeCoverage(v);
       }
index f781a60ccd61c3135d1504e9673e397fe2a9afcc..3af4017f1ba9a3143bbe2c9d0dd78b50aab3bd54 100644 (file)
@@ -431,8 +431,8 @@ void sqlite3Update(
 
   /* Top of the update loop */
   if( okOnePass ){
-    if( aToOpen[iDataCur-iBaseCur] ){
-      assert( pPk!=0 );
+    if( aToOpen[iDataCur-iBaseCur] && !isView ){
+      assert( pPk );
       sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey);
       VdbeCoverageNeverTaken(v);
     }
index f56c8acbc58edf08a1b49f5c8f9259a8354907c2..326fa63d4c6b0b557f88ef3b322a20d7f2a5bf85 100644 (file)
@@ -32,6 +32,7 @@ ifcapable {!trigger} {
   finish_test
   return
 }
+set ::testprefix trigger9
 
 proc has_rowdata {sql} {
   expr {[lsearch [execsql "explain $sql"] RowData]>=0}
@@ -220,4 +221,36 @@ ifcapable compound {
   } {2}
 }
 
+reset_db
+do_execsql_test 4.1 {
+  CREATE TABLE t1(a, b);
+  CREATE TABLE log(x);
+  INSERT INTO t1 VALUES(1, 2);
+  INSERT INTO t1 VALUES(3, 4);
+  CREATE VIEW v1 AS SELECT a, b FROM t1;
+
+  CREATE TRIGGER tr1 INSTEAD OF DELETE ON v1 BEGIN
+    INSERT INTO log VALUES('delete');
+  END;
+
+  CREATE TRIGGER tr2 INSTEAD OF UPDATE ON v1 BEGIN
+    INSERT INTO log VALUES('update');
+  END;
+
+  CREATE TRIGGER tr3 INSTEAD OF INSERT ON v1 BEGIN
+    INSERT INTO log VALUES('insert');
+  END;
+}
+
+do_execsql_test 4.2 {
+  DELETE FROM v1 WHERE rowid=1;
+} {}
+
+do_execsql_test 4.3 {
+  UPDATE v1 SET a=b WHERE rowid=2;
+} {}
+
+
+
+
 finish_test