From: dan Date: Sat, 26 Jan 2019 16:34:08 +0000 (+0000) Subject: Roll back the transaction if a write statement fails with OE_Abort but there is no... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f6265d31c075ac2c3fab7f9adf5360442c542204;p=thirdparty%2Fsqlite.git Roll back the transaction if a write statement fails with OE_Abort but there is no open statement transaction. FossilOrigin-Name: d536be698d1c6479e09f99ac12620c900f7f57bad0842372cbfe0755e41355e9 --- diff --git a/manifest b/manifest index 34f8670765..7cc33d6c30 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 6ffd094b95..da88bd492e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 \ No newline at end of file +d536be698d1c6479e09f99ac12620c900f7f57bad0842372cbfe0755e41355e9 \ No newline at end of file diff --git a/src/vacuum.c b/src/vacuum.c index 8042f107b4..0c0937f720 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -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); diff --git a/src/vdbe.c b/src/vdbe.c index 98df0a3977..074fbad7d4 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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. */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f5d30f3bad..987ea379a0 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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); diff --git a/src/window.c b/src/window.c index bb9bfa93e6..bdc029802f 100644 --- a/src/window.c +++ b/src/window.c @@ -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); } diff --git a/test/triggerG.test b/test/triggerG.test index f5965e1707..412aa1edfc 100644 --- a/test/triggerG.test +++ b/test/triggerG.test @@ -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 + diff --git a/test/window1.test b/test/window1.test index 2c504205e5..2817a39911 100644 --- a/test/window1.test +++ b/test/window1.test @@ -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