]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Roll back the transaction if a write statement fails with OE_Abort but there is no...
authordan <dan@noemail.net>
Sat, 26 Jan 2019 16:34:08 +0000 (16:34 +0000)
committerdan <dan@noemail.net>
Sat, 26 Jan 2019 16:34:08 +0000 (16:34 +0000)
FossilOrigin-Name: d536be698d1c6479e09f99ac12620c900f7f57bad0842372cbfe0755e41355e9

manifest
manifest.uuid
src/vacuum.c
src/vdbe.c
src/vdbeaux.c
src/window.c
test/triggerG.test
test/window1.test

index 34f86707653c575719000b2f205d482ec1896845..7cc33d6c303d0df0b46a1d773fd82678dfb57147 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\s".eqp\strace"\scommand\sto\sthe\sCLI\swhen\susing\sSQLITE_DEBUG,\sas\sa\nconvenient\sshorthand\sfor\s"PRAGMA\svdbe_debug=ON"\sbut\swith\sautomatic\sindentation\nfeature\sfor\sprogram\slistings\sprovided\sby\sthe\sCLI.
-D 2019-01-26T15:40:04.766
+C Roll\sback\sthe\stransaction\sif\sa\swrite\sstatement\sfails\swith\sOE_Abort\sbut\sthere\sis\sno\sopen\sstatement\stransaction.
+D 2019-01-26T16:34:08.268
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359
@@ -584,12 +584,12 @@ F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1
 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432
-F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca
-F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02
+F src/vacuum.c c3b29ca1fad775a44689a0c1a76db364f6da8fd91bfd3ed95b3e8319224da0ac
+F src/vdbe.c e5f6b9a31b6d2c1345d9f6652c8b904c43dda8cbf1c3fd7c40d943bc5b6e9cf4
 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237
 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f
 F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4
-F src/vdbeaux.c 158abc9c49a6870ce9c173b080faa6c3382a9b5a2d653d0a002eb20482e17cb2
+F src/vdbeaux.c 698579727cc7722a8c4c7aece21d8913b70c4bc969827cec3b263c7fe8d0a456
 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
 F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf
 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
@@ -603,7 +603,7 @@ F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae
 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811
 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
-F src/window.c 1f4f7c69f23992b91c82e71fe47dd4e3ed70ceae12ce5ca6a1e757fdb158dcae
+F src/window.c c59090ba8a8530bc733b3f9e645ce7516520772a08e08c3726d4ceba5bc93765
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -1552,7 +1552,7 @@ F test/triggerC.test c7fbc3eb241b5a7ba4b0815f76c3708483e91890f9573add12a610c45b2
 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d
 F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
-F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499
+F test/triggerG.test 87ceb4c486240a6270fbd123c68cd21d24b99d14641a7a9c38e6916bd6ef894e
 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1
 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a
 F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9
@@ -1675,7 +1675,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
-F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b
+F test/window1.test 8910b6d158e8b27452bdf0d3e13605c2d25dd98b7ab846d69956ad7cd230f9b1
 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
 F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823
@@ -1804,7 +1804,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 13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6
-R 526b182186e89dc3ca0b6f304ae40eae
-U drh
-Z abb2dd0860dab724b6ef3b845cc9519b
+P 626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662
+R 374a4a5a4902f8068a8e4fb4932d79c2
+U dan
+Z 051e3778c0a596a848823fd20b772e47
index 6ffd094b950d44e8483b49a393545e6b6c65bf3a..da88bd492e9e5f627f363470fe060e1bb5e0f049 100644 (file)
@@ -1 +1 @@
-626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662
\ No newline at end of file
+d536be698d1c6479e09f99ac12620c900f7f57bad0842372cbfe0755e41355e9
\ No newline at end of file
index 8042f107b437507e9bafa97b4be5e84a7814b5c4..0c0937f7201b1eaf61345bba3edfc20e79b887ab 100644 (file)
@@ -130,6 +130,8 @@ void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){
     }
     sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg);
     sqlite3VdbeUsesBtree(v, iDb);
+    assert( pParse==pParse->pToplevel || pParse->pToplevel==0 );
+    pParse->mayAbort = pParse->isMultiWrite = 1;
   }
 build_vacuum_end:
   sqlite3ExprDelete(pParse->db, pInto);
index 98df0a39772f3f4df28b926a8c88fe3254bd7e50..074fbad7d45af5b8866be67a627abd70b9793da2 100644 (file)
@@ -988,7 +988,7 @@ case OP_Halt: {
 
   pcx = (int)(pOp - aOp);
 #ifdef SQLITE_DEBUG
-  if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); }
+  if( pOp->p2==OE_Abort && !pOp->p3 ){ sqlite3VdbeAssertAbortable(p); }
 #endif
   if( pOp->p1==SQLITE_OK && p->pFrame ){
     /* Halt the sub-program. Return control to the parent frame. */
index f5d30f3badece4af020d906012b6597e7ad48f10..987ea379a0e7a915874288cbaf0ceadcb88990e4 100644 (file)
@@ -636,7 +636,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
   while( (pOp = opIterNext(&sIter))!=0 ){
     int opcode = pOp->opcode;
     if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename 
-     || opcode==OP_VDestroy
+     || opcode==OP_VDestroy || opcode==OP_Vacuum
      || ((opcode==OP_Halt || opcode==OP_HaltIfNull) 
       && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort))
     ){
@@ -2943,7 +2943,9 @@ int sqlite3VdbeHalt(Vdbe *p){
     }else if( eStatementOp==0 ){
       if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){
         eStatementOp = SAVEPOINT_RELEASE;
-      }else if( p->errorAction==OE_Abort ){
+      }else if( p->errorAction==OE_Abort 
+           && (p->usesStmtJournal || p->readOnly || p->rc!=SQLITE_ERROR) 
+      ){
         eStatementOp = SAVEPOINT_ROLLBACK;
       }else{
         sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
index bb9bfa93e69a5ba8130f7f42a1c30ca47dcef728..bdc029802f06c49fdbfd192a3e058f5321615f20 100644 (file)
@@ -1076,6 +1076,9 @@ static void windowCheckIntValue(Parse *pParse, int reg, int eCond){
   VdbeCoverageNeverNullIf(v, eCond==1);
   VdbeCoverageNeverNullIf(v, eCond==2);
   sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort);
+#ifdef SQLITE_DEBUG
+  sqlite3VdbeChangeP3(v, -1, 1);
+#endif
   sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC);
   sqlite3ReleaseTempReg(pParse, regZero);
 }
index f5965e17076fef5ae3bfa9c9b6acd3920b27cd4b..412aa1edfc572e91a03e1c64e1c6bbb320826be4 100644 (file)
@@ -75,4 +75,25 @@ do_catchsql_test 310 {
   INSERT INTO t4 VALUES(1);
 } {1 {hex literal too big: 0x2147483648e0e0099}}
 
+#-------------------------------------------------------------------------
+
+do_execsql_test 400 {
+  CREATE TABLE x1(a, b);
+  CREATE TRIGGER x1t AFTER INSERT ON x1 BEGIN
+    SELECT abs(-9223372036854775808 + new.a);
+  END;
+  BEGIN;
+}
+
+do_catchsql_test 410 {
+  INSERT INTO x1 VALUES(2, 2), (0, 0), (1, 1);
+} {1 {integer overflow}}
+
+do_execsql_test  420 {
+  SELECT * FROM x1; 
+} {}
+
+do_test  430 { sqlite3_get_autocommit db } {1}
+
 finish_test
+
index 2c504205e5a120eb9c27b33a24eaa38b4f48b8e3..2817a399117519d3187c3ca503d2d72abd196a1a 100644 (file)
@@ -700,5 +700,38 @@ do_execsql_test 16.2 {
   3 101
 }
 
+#-------------------------------------------------------------------------
+do_execsql_test 17.0 {
+  CREATE TABLE tbl1(a,b,c,d);
+  CREATE TRIGGER r1 AFTER INSERT ON tbl1 WHEN new.a NOT NULL BEGIN
+    SELECT sum(d) OVER
+    (PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND -2 FOLLOWING)
+    FROM tbl1;
+  END;
+}
+
+do_catchsql_test 17.1.1 {
+  INSERT INTO tbl1(a) VALUES(1);
+} {1 {frame ending offset must be a non-negative integer}}
+do_execsql_test 17.1.2 {
+  SELECT count(*) FROM tbl1;
+} 0
+
+do_catchsql_test 17.2.1 {
+  INSERT INTO tbl1(a) VALUES(NULL), (NULL), (1);
+} {1 {frame ending offset must be a non-negative integer}}
+do_execsql_test 17.2.2 {
+  SELECT count(*) FROM tbl1;
+} 0
+
+do_catchsql_test 17.3.1 {
+  BEGIN;
+    INSERT INTO tbl1(a) VALUES(NULL);
+    INSERT INTO tbl1(a) VALUES(NULL), (1);
+} {1 {frame ending offset must be a non-negative integer}}
+do_execsql_test 17.3.2 {
+  SELECT count(*) FROM tbl1;
+} 0
+do_test 17.3.3 { sqlite3_get_autocommit db } 1
 
 finish_test