From 21021a5cbfdd904573412ee72908dbd47f37de4a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 13 Feb 2012 17:01:51 +0000 Subject: [PATCH] Add the new SQLITE_ABORT_ROLLBACK extended error code to be returned for statements that are cancelled due to a rollback. FossilOrigin-Name: 549f4fd00d8325c10099b100e5202b77ee1d83ad --- manifest | 25 +++++++++++-------------- manifest.uuid | 2 +- src/main.c | 19 ++++++++++++++----- src/sqlite.h.in | 1 + src/vdbe.c | 2 +- src/vdbeaux.c | 6 +++--- test/tkt-f777251dc7a.test | 2 +- test/trans3.test | 7 +++---- 8 files changed, 35 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 03fcacd56d..24d2878880 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sROLLBACK\scommand\sso\sthat\spending\sstatements\sto\snot\sblock\sit.\s\sThe\npending\sstatements\sinstead\sreturn\sSQLITE_ABORT\supon\snext\saccess.\s\sNote:\sThis\ncauses\sseparate\sshared-cache\sconnections\sin\sread_uncommitted\smode\sto\sabort\sas\nwell. -D 2012-02-13T16:43:16.086 +C Add\sthe\snew\sSQLITE_ABORT_ROLLBACK\sextended\serror\scode\sto\sbe\sreturned\sfor\nstatements\sthat\sare\scancelled\sdue\sto\sa\srollback. +D 2012-02-13T17:01:51.864 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 3f79a373e57c3b92dabf76f40b065e719d31ac34 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -147,7 +147,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 0ee69fca0be54cd93939df98d2aca4ca46f44416 F src/loadext.c f20382fbaeec832438a1ba7797bee3d3c8a6d51d -F src/main.c 4aa7f1994a7cf810d7d754cb30202543b40bb726 +F src/main.c e936269fbc1af78cef79c27980e89209aeb20a07 F src/malloc.c 15afac5e59b6584efe072e9933aefb4230e74f97 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c b3677415e69603d6a0e7c5410a1b3731d55beda1 @@ -182,7 +182,7 @@ F src/resolve.c 3d3e80a98f203ac6b9329e9621e29eda85ddfd40 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c 232283a2e60d91cbd9a5ddf2f6f7ecf53d590075 F src/shell.c aa28f117033ba3e44b5eaaf2ad572222bcdfd66e -F src/sqlite.h.in 371c30e4be94b9b0ea6400ed66663fcf8e891eb4 +F src/sqlite.h.in 4f3230be44e084a1e98f91bb031b922f33dcf3f8 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477 F src/sqliteInt.h ea24b5f2d2e3ae7e0c1126a78c0e025ed4e98f4b F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -240,11 +240,11 @@ F src/update.c d3076782c887c10e882996550345da9c4c9f9dea F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84 F src/util.c 9e07bd67dfafe9c75b1da78c87ba030cebbb5388 F src/vacuum.c 0c0ba2242355c6048d65e2b333abe0f7c06348fa -F src/vdbe.c 2afc9b0260dfe47786211e1eb815a52f27c661b7 +F src/vdbe.c 21c17c43e579789959efea50f100de60efbb955c F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb F src/vdbeInt.h 6ff4180a05683566a8835d12f7ec504b22932c82 F src/vdbeapi.c 3662b6a468a2a4605a15dfab313baa6dff81ad91 -F src/vdbeaux.c dce061e42f89cd6d0af15c03a854bcc89bd5deb0 +F src/vdbeaux.c 79cf42b70e211a52d664fc4d585ee2da0a64deac F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb F src/vdbemem.c fb0ac964ccbcd94f595eb993c05bfd9c52468a4a F src/vdbesort.c b25814d385895544ebc8118245c8311ded7f81c9 @@ -763,7 +763,7 @@ F test/tkt-d11f09d36e.test fb44f7961aa6d4b632fb7b9768239832210b5fc7 F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 F test/tkt-f3e5abed55.test 669bb076f2ac573c7398ce00f40cd0ca502043a9 -F test/tkt-f777251dc7a.test a3121f92f49af447572f7a3cde9f07806443c75d +F test/tkt-f777251dc7a.test af6531446c64bfd268416f07b4df7be7f9c749d2 F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 F test/tkt-f973c7ac31.test 1da0ed15ec2c7749fb5ce2828cd69d07153ad9f4 F test/tkt-fa7bf5ec.test 9102dfea58aa371d78969da735f9392c57e2e035 @@ -856,7 +856,7 @@ F test/trace.test 4b36a41a3e9c7842151af6da5998f5080cdad9e5 F test/trace2.test 962175290996d5f06dc4402ca218bbfc7df4cb20 F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test d5337e61de45e66b1fcbf9db833fa8c82e624b22 -F test/trans3.test d728abaa318ca364dc370e06576aa7e5fbed7e97 +F test/trans3.test 373ac5183cc56be69f48ae44090e7f672939f732 F test/trigger1.test de42feb7cd442787d38185ae74f5a1d7afa400cb F test/trigger2.test 834187beafd1db383af0c659cfa49b0576832816 F test/trigger3.test d2c60d8be271c355d61727411e753181e877230a @@ -989,10 +989,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 76bb649ee2633226324130f5898622c348f93769 -R 99d7e91688392c96521a36db0be702a8 -T *branch * nonblocking-rollback -T *sym-nonblocking-rollback * -T -sym-trunk * +P 9b66c79e054c8a109d1ee8d35fed1c42814c330d +R 1066e7f5b671895741b8f4418594178f U drh -Z 742e7385f2147385b0b62b5bc1ba4557 +Z 81fc65771654ca843df55065930e81f0 diff --git a/manifest.uuid b/manifest.uuid index 92a77a8c19..67d01dda7d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b66c79e054c8a109d1ee8d35fed1c42814c330d \ No newline at end of file +549f4fd00d8325c10099b100e5202b77ee1d83ad \ No newline at end of file diff --git a/src/main.c b/src/main.c index 21a40842ca..dedfba4a19 100644 --- a/src/main.c +++ b/src/main.c @@ -920,12 +920,21 @@ const char *sqlite3ErrStr(int rc){ /* SQLITE_RANGE */ "bind or column index out of range", /* SQLITE_NOTADB */ "file is encrypted or is not a database", }; - rc &= 0xff; - if( ALWAYS(rc>=0) && rc<(int)(sizeof(aMsg)/sizeof(aMsg[0])) && aMsg[rc]!=0 ){ - return aMsg[rc]; - }else{ - return "unknown error"; + const char *zErr = "unknown error"; + switch( rc ){ + case SQLITE_ABORT_ROLLBACK: { + zErr = "abort due to ROLLBACK"; + break; + } + default: { + rc &= 0xff; + if( ALWAYS(rc>=0) && rcautoCommit ){ if( iRollback ){ assert( desiredAutoCommit==1 ); - sqlite3RollbackAll(db, SQLITE_ABORT); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c85a635891..ef339d1e13 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2166,7 +2166,7 @@ int sqlite3VdbeHalt(Vdbe *p){ /* We are forced to roll back the active transaction. Before doing ** so, abort any other statements this handle currently has active. */ - sqlite3RollbackAll(db, SQLITE_ABORT); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; } @@ -2223,7 +2223,7 @@ int sqlite3VdbeHalt(Vdbe *p){ }else if( p->errorAction==OE_Abort ){ eStatementOp = SAVEPOINT_ROLLBACK; }else{ - sqlite3RollbackAll(db, SQLITE_ABORT); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; } @@ -2243,7 +2243,7 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; } - sqlite3RollbackAll(db, SQLITE_ABORT); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; } diff --git a/test/tkt-f777251dc7a.test b/test/tkt-f777251dc7a.test index 25bf667d7d..af6f71ad96 100644 --- a/test/tkt-f777251dc7a.test +++ b/test/tkt-f777251dc7a.test @@ -42,7 +42,7 @@ do_test tkt-f7772-1.2 { BEGIN IMMEDIATE; SELECT x, force_rollback(), EXISTS(SELECT 1 FROM t3 WHERE w=x) FROM t2; } -} {1 {callback requested query abort}} +} {1 {abort due to ROLLBACK}} do_test tkt-f7772-1.3 { sqlite3_get_autocommit db } {1} diff --git a/test/trans3.test b/test/trans3.test index ab7db6a277..d5b316bec8 100644 --- a/test/trans3.test +++ b/test/trans3.test @@ -64,14 +64,13 @@ do_test trans3-1.5 { } } errmsg] lappend x $errmsg -} {1 {cannot rollback transaction - SQL statements in progress}} +} {1 {abort due to ROLLBACK}} do_test trans3-1.6 { set ::ecode -} {SQLITE_BUSY} +} {} do_test trans3-1.7 { - db eval COMMIT db eval {SELECT * FROM t1} -} {1 2 3 4 5} +} {1 2 3 4} unset -nocomplain ecode finish_test -- 2.39.5