]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
RETURNING bug fix: Correctly deal with RETURNING statements on changes to
authordrh <>
Tue, 27 Apr 2021 13:04:18 +0000 (13:04 +0000)
committerdrh <>
Tue, 27 Apr 2021 13:04:18 +0000 (13:04 +0000)
TEMP tables that also have triggers.
dbsqlfuzz 78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2

FossilOrigin-Name: d0b15eccbfe1e50c3daf7b2fd4769a52bba35d553b07e462ca3f5f22df6742fd

manifest
manifest.uuid
src/build.c
src/trigger.c
test/alter4.test
test/returning1.test

index 7d620432469ad2968968b0f8f9c454a2005a75bb..b4bf3535eff923e967a568af0c6fef04d2179fde 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\ssegfault\sthat\scould\soccur\swhen\squerying\sa\scorrupt\sdata\sstructures\swith\san\sfts5token\stable.
-D 2021-04-27T11:28:57.305
+C RETURNING\sbug\sfix:\s\sCorrectly\sdeal\swith\sRETURNING\sstatements\son\schanges\sto\nTEMP\stables\sthat\salso\shave\striggers.\ndbsqlfuzz\s78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2
+D 2021-04-27T13:04:18.170
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -487,7 +487,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 0555f7e97ede886ac3d7aaec363b44498c9716dd45f3f0484de31eb90e30a37e
 F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5
 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0
-F src/build.c f4072218dacf42f45b733d1a9a98b3a4d7b8c676a7e5d8ff17d70b60aff687ae
+F src/build.c 1310181a298ea9d9b36a3d3d74b0b1d6d3e164b25c6252fa9d30fa7c0a7691a5
 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 2a322b9a3d75771fb4d99e0702851f4f68dda982507a0f798eefb0712969a410
@@ -609,7 +609,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e
 F src/treeview.c e483aeedf6f207000db1f90eb6abd816350493314c30e8749d319bdb9ab3b08c
-F src/trigger.c f8493674f5c8f103c1a2cd0616af9dca85c7058450f9fe47cacd15cf5d512d52
+F src/trigger.c 6b32e50b880c5e570c3c37331d47f2cb18335935a9816f143c0b414d2beee93c
 F src/update.c b3abdaf4a314bbed238da69a6ca54c0f21262119389b412ee5778fffe62dd3cc
 F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
@@ -645,7 +645,7 @@ F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
 F test/alter.test f53d8a4ecd35f051c07e54a36beec5d0a30d30a9d98bc723f6cde6afbfb3c5ca
 F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
 F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29
-F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf
+F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959
 F test/alterauth2.test 381b1ab603c9ef96314a3158528ea17f7964449385a28eeaf8191120b2e24a8d
 F test/altercol.test b11fa1b131e80ab5b6ecfb3b725fb0419c14ca6efba5adb57aeabfc9baa0c8f3
@@ -1299,7 +1299,7 @@ F test/releasetest.tcl 8dcfc21d6b4a4a1d9a8503de0a94800d129ec8f03ef53d6e68b79ef78
 F test/releasetest_data.tcl a864d27370e812c34a05224d6144ca082463906d5a4651782ad3b43712ab166a
 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b
 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
-F test/returning1.test 99012dc464860e1502153276d5e5c2bee32c53d3a866dcfc09b39932048e2276
+F test/returning1.test 03ef5c149d6e04c75d5ddd0d4a58a5bed5859faa4a72d74ac7a2093d6a2ede19
 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa
 F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f
 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
@@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 7e18e114b245d17aa259ea9ab42752ccc9ad5303bbac8d8e46928dd10319f545
-R 94e1ea33ad9ba6b0dbbaecf2b13998ec
-U dan
-Z ee8ca3be45fa2c821c20209430a0aa50
+P cbedfa05501f3eb9750fb21e2ab8516f8f14c479c847f454e52572af278aab71
+R a976188e13a3ac3ca205f341c810934f
+U drh
+Z 3100e8a3f8619ad426bba2c803a9756c
index 9b18930242b96aafe206b5d46b42be28fdaf652d..a06951a997d3791afbec20642d7132f53a0a6c3b 100644 (file)
@@ -1 +1 @@
-cbedfa05501f3eb9750fb21e2ab8516f8f14c479c847f454e52572af278aab71
\ No newline at end of file
+d0b15eccbfe1e50c3daf7b2fd4769a52bba35d553b07e462ca3f5f22df6742fd
\ No newline at end of file
index 47b0d56932484f70da44b707a1aefcbf18d88574..b0090f5e5704897721e248d6c4447c9caa53682c 100644 (file)
@@ -1323,6 +1323,7 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
   pRet->retTrig.tr_tm = TRIGGER_AFTER;
   pRet->retTrig.bReturning = 1;
   pRet->retTrig.pSchema = db->aDb[1].pSchema;
+  pRet->retTrig.pTabSchema = db->aDb[1].pSchema;
   pRet->retTrig.step_list = &pRet->retTStep;
   pRet->retTStep.op = TK_RETURNING;
   pRet->retTStep.pTrig = &pRet->retTrig;
index 578d1e42ef32b558bf1bc7cd91ae2a5eb9759536..ddbd490cea146158d34af2399fbecad46656a6c8 100644 (file)
@@ -60,30 +60,44 @@ Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
   if( p==0 ){
     return pTab->pTrigger;
   }
-  pList = pTab->pTrigger;
-  if( pTmpSchema!=pTab->pSchema ){
-    while( p ){
-      Trigger *pTrig = (Trigger *)sqliteHashData(p);
-      if( pTrig->pTabSchema==pTab->pSchema
-       && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
-      ){
-        pTrig->pNext = pList;
-        pList = pTrig;
-      }else if( pTrig->op==TK_RETURNING
+  if( pTmpSchema==pTab->pSchema ){
+    pList = 0;
+  }else{
+    pList = pTab->pTrigger;
+  }
+  while( p ){
+    Trigger *pTrig = (Trigger *)sqliteHashData(p);
+    if( pTrig->pTabSchema==pTab->pSchema
+     && pTrig->table
+     && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
+    ){
+      pTrig->pNext = pList;
+      pList = pTrig;
+    }else if( pTrig->op==TK_RETURNING
 #ifndef SQLITE_OMIT_VIRTUALTABLE
-                && pParse->db->pVtabCtx==0
+              && pParse->db->pVtabCtx==0
 #endif
-                ){
-        assert( pParse->bReturning );
-        assert( &(pParse->u1.pReturning->retTrig) == pTrig );
-        pTrig->table = pTab->zName;
-        pTrig->pTabSchema = pTab->pSchema;
-        pTrig->pNext = pList;
-        pList = pTrig;
-      }        
-      p = sqliteHashNext(p);    
+    ){
+      assert( pParse->bReturning );
+      assert( &(pParse->u1.pReturning->retTrig) == pTrig );
+      pTrig->table = pTab->zName;
+      pTrig->pTabSchema = pTab->pSchema;
+      pTrig->pNext = pList;
+      pList = pTrig;
+    }        
+    p = sqliteHashNext(p);    
+  }
+#if 0
+  if( pList ){
+    Trigger *pX;
+    printf("Triggers for %s:", pTab->zName);
+    for(pX=pList; pX; pX=pX->pNext){
+      printf(" %s", pX->zName);
     }
+    printf("\n");
+    fflush(stdout);
   }
+#endif
   return pList;  
 }
 
index 3aca7df3383b78f0c94367b1032f6225e0a265ad..c63ba6b07231eacb2268fd98aed70c701f785ace 100644 (file)
@@ -318,16 +318,16 @@ ifcapable trigger&&tempdb {
       END;
   
       INSERT INTO t1 VALUES(1, 2);
-      SELECT * FROM log;
+      SELECT * FROM log ORDER BY trig, a, b;
     }
-  } {b 1 2 a 1 2}
+  } {a 1 2 b 1 2}
   do_test alter4-6.2 {
     execsql {
       ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
       INSERT INTO t1(a, b) VALUES(3, 4);
-      SELECT * FROM log;
+      SELECT * FROM log ORDER BY trig, a, b;
     }
-  } {b 1 2 a 1 2 b 3 4 a 3 4}
+  } {a 1 2 a 3 4 b 1 2 b 3 4}
 }
 
 # Ticket #1183 - Make sure adding columns to large tables does not cause
index 25aaff43ef8280342762525e5b63df96058fd1bf..a0539f820b980bf221f13e44fdf225a829745e44 100644 (file)
@@ -224,4 +224,60 @@ do_execsql_test 10.4 {
   SELECT * FROM log;
 } {}
 
+# 2021-04-27 dbsqlfuzz 78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2
+# Returning clauses on TEMP tables with triggers.
+#
+reset_db
+do_execsql_test 11.1 {
+  CREATE TEMP TABLE t1(a,b);
+  CREATE TEMP TABLE t2(c,d);
+  CREATE TEMP TABLE t3(e,f);
+  CREATE TEMP TABLE log(op,x,y);
+  CREATE TEMP TRIGGER t1r1 AFTER INSERT ON t1 BEGIN
+     INSERT INTO log(op,x,y) VALUES('I1',new.a,new.b);
+  END;
+  CREATE TEMP TRIGGER t1r2 BEFORE DELETE ON t1 BEGIN
+     INSERT INTO log(op,x,y) VALUES('D1',old.a,old.b);
+  END;
+  CREATE TEMP TRIGGER t2r3 AFTER UPDATE ON t1 BEGIN
+     INSERT INTO log(op,x,y) VALUES('U1',new.a,new.b);
+  END;
+  CREATE TEMP TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN
+     INSERT INTO log(op,x,y) VALUES('I2',new.c,new.d);
+  END;
+  CREATE TEMP TRIGGER t3r1 AFTER DELETE ON t3 BEGIN
+     INSERT INTO log(op,x,y) VALUES('D3',old.e,old.f);
+  END;
+  CREATE TEMP TRIGGER t3r2 BEFORE UPDATE ON t3 BEGIN
+     INSERT INTO log(op,x,y) VALUES('U3',new.e,new.f);
+  END;
+  INSERT INTO t1(a,b) VALUES(1,2),('happy','glad') RETURNING a, b, '|';
+} {1 2 | happy glad |}
+do_execsql_test 11.2 {
+  UPDATE t1 SET b=9 WHERE a=1 RETURNING a, b, 'x';
+} {1 9 x}
+do_execsql_test 11.3 {
+  DELETE FROM t1 WHERE a<>'xray' RETURNING a, b, '@';
+} {1 9 @ happy glad @}
+do_execsql_test 11.4 {
+  SELECT * FROM log;
+  DELETE FROM log;
+} {I1 1 2 I1 happy glad U1 1 9 D1 1 9 D1 happy glad}
+do_execsql_test 11.5 {
+  INSERT INTO t2 VALUES('bravo','charlie') RETURNING d, c, 'z';
+} {charlie bravo z}
+do_execsql_test 11.6 {
+  SELECT * FROM log;
+  DELETE FROM log;
+} {I2 bravo charlie}
+do_execsql_test 11.7 {
+  INSERT INTO t3(e) VALUES(1),(2),(3) RETURNING 'I', e;
+  UPDATE t3 SET f=e+100 RETURNING 'U', e, f;
+  DELETE FROM t3 WHERE f>100 RETURNING 'D', e, f;
+} {I 1 I 2 I 3 U 1 101 U 2 102 U 3 103 D 1 101 D 2 102 D 3 103}
+do_execsql_test 11.6 {
+  SELECT * FROM log;
+  DELETE FROM log;
+} {U3 1 101 U3 2 102 U3 3 103 D3 1 101 D3 2 102 D3 3 103}
+
 finish_test