From 99dfe5eb47c33bbe8ce183406ed2e60f5099812e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 30 Oct 2008 15:03:15 +0000 Subject: [PATCH] Add the sqlite3_extended_errcode() interface. Change to return SQLITE_BUSY instead of SQLITE_ERROR when a COMMIT is attempted and one or more queries are still pending. (CVS 5850) FossilOrigin-Name: 4c6a90a16627b1664bf7f15ab40b440b3bd60b48 --- manifest | 26 +++++------ manifest.uuid | 2 +- src/main.c | 11 ++++- src/sqlite.h.in | 25 ++++++++--- src/test1.c | 114 ++++++++++++++++++++++++++++++++--------------- src/vdbe.c | 4 +- test/capi3.test | 26 ++++++++--- test/capi3c.test | 22 ++++++--- test/misc7.test | 4 +- 9 files changed, 161 insertions(+), 73 deletions(-) diff --git a/manifest b/manifest index c02d3bd104..a8ceb6c729 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\shot-journal\sfile\sis\sdetected\sbut\sthe\sapplication\sdoes\snot\shave\sthe\srequired\sread/write\spermissions,\sreturn\sSQLITE_CANTOPEN.\sPrior\sto\sthis\schange,\sSQLITE_BUSY\swas\sreturned.\sTicket\s#3457.\s(CVS\s5849) -D 2008-10-29T07:01:57 +C Add\sthe\ssqlite3_extended_errcode()\sinterface.\s\sChange\sto\sreturn\nSQLITE_BUSY\sinstead\sof\sSQLITE_ERROR\swhen\sa\sCOMMIT\sis\sattempted\sand\sone\nor\smore\squeries\sare\sstill\spending.\s(CVS\s5850) +D 2008-10-30T15:03:16 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in da817da72422f9b876602c225fcd17d6ca4182f7 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -118,7 +118,7 @@ F src/insert.c 110cca7845ed5a66c08fdd413b02e706ae34455f F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e F src/legacy.c aac57bd984e666059011ea01ec4383892a253be3 F src/loadext.c 3872457afdf25bb174fd383cb4e3e0d2a9e60552 -F src/main.c ff40f9f21c76d5062bc0bc06bd8853fc217dd170 +F src/main.c df799b66bb11deac9d6de66ba7931700923094b4 F src/malloc.c a213fb461b8df08aed7606f6a1e1d3452e089000 F src/mem0.c f2f84062d1f35814d6535c9f9e33de3bfb3b132c F src/mem1.c 2091081d1c6bcd4516738f37cd84d42e814cf9a2 @@ -150,14 +150,14 @@ F src/random.c a87afbd598aa877e23ac676ee92fd8ee5c786a51 F src/resolve.c 266bb03d2b456fe68f5df2dd5687e7e88ff8088d F src/select.c d910d7350df0d918e22286c5bfd39d4ea68ec813 F src/shell.c d83b578a8ccdd3e0e7fef4388a0887ce9f810967 -F src/sqlite.h.in ee95eeed2196e5fa98fdad007301b8d5d3733b6d +F src/sqlite.h.in f74e769732013f96d1ea71e4fe9a489c76bed785 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17 F src/sqliteInt.h 926279c94cdf21e53fc66badb8541d94aed25018 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76 F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8 F src/tclsqlite.c 96049bd454f1547abff0a57c45f0dfa57701e076 -F src/test1.c a7310348961945e656c096e5f91d4d87dee6b61d +F src/test1.c 9b440b38e1710e9be1512c003fa141e0e3948e05 F src/test2.c 897528183edf2839c2a3c991d415905db56f1240 F src/test3.c 88a246b56b824275300e6c899634fbac1dc94b14 F src/test4.c f79ab52d27ff49b784b631a42e2ccd52cfd5c84c @@ -190,7 +190,7 @@ F src/update.c ed233298db6dd23d340e449e4b4a81b9306da6aa F src/utf.c c63e6f69082f85c19ab88d62dedaf91d71ac1a50 F src/util.c afe659ccc05d1f8af9e8631dabfec3ee3a7144af F src/vacuum.c fd77433d0c26d3ff1eb96eab017a1787ac5aa642 -F src/vdbe.c be81532805ee6fc1fe7bd2e1c82cf4a09b7b3061 +F src/vdbe.c e3629776ef4a49f997b271fbd83e54b6104d5607 F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3 F src/vdbeInt.h a20f479ec3bf41c61b0c2bd5176a9bad6b2a07ef F src/vdbeapi.c 6798c70cf176d23594ec557db88190ca8c7fa860 @@ -235,9 +235,9 @@ F test/blob.test 2a38d867bdf08f9ce081776acec1ac8d4bca66be F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/cache.test 3ff445c445742a7b6b9ba6e1d62a25263f9424b9 F test/capi2.test 36f87803c811b5986dd31eb5492cb704552776b4 -F test/capi3.test ffc1156d1f28738eb335df0b88dd294bb3c94c27 +F test/capi3.test 74089bd93dc5bbc9f80854b02a594aba0c730e9a F test/capi3b.test 664eb55318132f292f2c436f90906f578cad6b97 -F test/capi3c.test 440ba10acccb74c0f160d7462a93abd1dc328224 +F test/capi3c.test db9310ac62766ab09b9282468f910ecd5b8014b8 F test/capi3d.test 57d83b690d7364bde02cddbf8339a4b50d80ce23 F test/cast.test ce8f14fc80f70b30ed984480cc0d8914a459e8f9 F test/check.test 024ed399600b799160378cf9d9f436bdf5dfd184 @@ -443,7 +443,7 @@ F test/misc3.test 7212ed8dad01427e9acab9bd3e7e5e2c2e89be9e F test/misc4.test 91e8ed25c092c2bb4e0bb01864631e2930f8d7de F test/misc5.test 6a5c1e3217a95b0db05ff9a0f1ecb5ce9043ffef F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 0d763f703a34521e55ab30145b747aafa0e5f794 +F test/misc7.test edbbe77d48c7d70a60f8c33e2c7d182ca25f0181 F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33 F test/mutex1.test ff260ddaf7240390dbb013d28aba3a33ec0dada4 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 @@ -652,7 +652,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 4651f590f0b8bf13938b2b15d5082136e763af8d -R e062a5dfa67b3ff54e219649b4e4fdb6 -U danielk1977 -Z d3e719d91fd94e74917b0fa45d10565a +P dc5308c7629abe6a3bad21489c8e97087c264e5a +R 5295e43b763246c263ebf9a171998453 +U drh +Z 61bb1497945a9a8883e7532aff687652 diff --git a/manifest.uuid b/manifest.uuid index 397cd30578..ec0fc6dc6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc5308c7629abe6a3bad21489c8e97087c264e5a \ No newline at end of file +4c6a90a16627b1664bf7f15ab40b440b3bd60b48 \ No newline at end of file diff --git a/src/main.c b/src/main.c index a3098579b8..b0efd48b5a 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.508 2008/10/12 00:27:53 shane Exp $ +** $Id: main.c,v 1.509 2008/10/30 15:03:16 drh Exp $ */ #include "sqliteInt.h" #include @@ -1266,6 +1266,15 @@ int sqlite3_errcode(sqlite3 *db){ } return db->errCode & db->errMask; } +int sqlite3_extended_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM; + } + return db->errCode; +} /* ** Create a new collating function for database "db". The name is zName diff --git a/src/sqlite.h.in b/src/sqlite.h.in index cab38db633..51b5125025 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -30,7 +30,7 @@ ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. ** -** @(#) $Id: sqlite.h.in,v 1.405 2008/10/17 15:10:37 drh Exp $ +** @(#) $Id: sqlite.h.in,v 1.406 2008/10/30 15:03:16 drh Exp $ */ #ifndef _SQLITE3_H_ #define _SQLITE3_H_ @@ -378,12 +378,14 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** *E to NULL if E is not NULL and there are no errors. ** ** {H12137} The [sqlite3_exec(D,S,C,A,E)] function shall set the [error code] -** and message accessible via [sqlite3_errcode()], +** and message accessible via [sqlite3_errcode()], +** [sqlite3_extended_errcode()], ** [sqlite3_errmsg()], and [sqlite3_errmsg16()]. ** ** {H12138} If the S parameter to [sqlite3_exec(D,S,C,A,E)] is NULL or an ** empty string or contains nothing other than whitespace, comments, ** and/or semicolons, then results of [sqlite3_errcode()], +** [sqlite3_extended_errcode()], ** [sqlite3_errmsg()], and [sqlite3_errmsg16()] ** shall reset to indicate no errors. ** @@ -2658,7 +2660,10 @@ int sqlite3_open_v2( ** [extended result code] for the most recent failed sqlite3_* API call ** associated with a [database connection]. If a prior API call failed ** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. +** sqlite3_errcode() is undefined. The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. ** ** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language ** text that describes the error, as either UTF-8 or UTF-16 respectively. @@ -2677,6 +2682,10 @@ int sqlite3_open_v2( ** [result code] or [extended result code] for the most recently ** failed interface call associated with the [database connection] D. ** +** {H12802} The [sqlite3_extended_errcode(D)] interface returns the numeric +** [extended result code] for the most recently +** failed interface call associated with the [database connection] D. +** ** {H12803} The [sqlite3_errmsg(D)] and [sqlite3_errmsg16(D)] ** interfaces return English-language text that describes ** the error in the mostly recently failed interface call, @@ -2688,15 +2697,18 @@ int sqlite3_open_v2( ** {H12808} Calls to API routines that do not return an error code ** (example: [sqlite3_data_count()]) do not ** change the error code or message returned by -** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()]. +** [sqlite3_errcode()], [sqlite3_extended_errcode()], +** [sqlite3_errmsg()], or [sqlite3_errmsg16()]. ** ** {H12809} Interfaces that are not associated with a specific ** [database connection] (examples: ** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] ** do not change the values returned by -** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()]. +** [sqlite3_errcode()], [sqlite3_extended_errcode()], +** [sqlite3_errmsg()], or [sqlite3_errmsg16()]. */ int sqlite3_errcode(sqlite3 *db); +int sqlite3_extended_errcode(sqlite3 *db); const char *sqlite3_errmsg(sqlite3*); const void *sqlite3_errmsg16(sqlite3*); @@ -5765,6 +5777,7 @@ typedef struct sqlite3_blob sqlite3_blob; ** ** {H17821} If an error occurs during evaluation of [sqlite3_blob_open(D,...)] ** then subsequent calls to [sqlite3_errcode(D)], +** [sqlite3_extended_errcode()], ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** information appropriate for that error. ** @@ -5878,6 +5891,7 @@ int sqlite3_blob_bytes(sqlite3_blob *); ** ** {H17868} If an error occurs during evaluation of [sqlite3_blob_read(P,...)] ** then subsequent calls to [sqlite3_errcode(D)], +** [sqlite3_extended_errcode()], ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** information appropriate for that error, where D is the ** [database connection] that was used to open the [BLOB handle] P. @@ -5947,6 +5961,7 @@ int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** ** {H17888} If an error occurs during evaluation of [sqlite3_blob_write(D,...)] ** then subsequent calls to [sqlite3_errcode(D)], +** [sqlite3_extended_errcode()], ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** information appropriate for that error. */ diff --git a/src/test1.c b/src/test1.c index fd6630d1f3..4c502564b5 100644 --- a/src/test1.c +++ b/src/test1.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test1.c,v 1.328 2008/10/12 00:27:54 shane Exp $ +** $Id: test1.c,v 1.329 2008/10/30 15:03:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -117,35 +117,53 @@ int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ const char *sqlite3TestErrorName(int rc){ const char *zName = 0; - switch( rc & 0xff ){ - case SQLITE_OK: zName = "SQLITE_OK"; break; - case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; - case SQLITE_PERM: zName = "SQLITE_PERM"; break; - case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; - case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; - case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; - case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; - case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; - case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; - case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; - case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; - case SQLITE_FULL: zName = "SQLITE_FULL"; break; - case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; - case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; - case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; - case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; - case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; - case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; - case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; - case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; - case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; - case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; - case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; - case SQLITE_ROW: zName = "SQLITE_ROW"; break; - case SQLITE_DONE: zName = "SQLITE_DONE"; break; - case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; - case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; - default: zName = "SQLITE_Unknown"; break; + switch( rc ){ + case SQLITE_OK: zName = "SQLITE_OK"; break; + case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; + case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; + case SQLITE_PERM: zName = "SQLITE_PERM"; break; + case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; + case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; + case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; + case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; + case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; + case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; + case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; + case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; + case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break; + case SQLITE_FULL: zName = "SQLITE_FULL"; break; + case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; + case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; + case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; + case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; + case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; + case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; + case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; + case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; + case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; + case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; + case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; + case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; + case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; + case SQLITE_ROW: zName = "SQLITE_ROW"; break; + case SQLITE_DONE: zName = "SQLITE_DONE"; break; + case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; + case SQLITE_IOERR_SHORT_READ: zName = "SQLITE_IOERR_SHORT_READ"; break; + case SQLITE_IOERR_WRITE: zName = "SQLITE_IOERR_WRITE"; break; + case SQLITE_IOERR_FSYNC: zName = "SQLITE_IOERR_FSYNC"; break; + case SQLITE_IOERR_DIR_FSYNC: zName = "SQLITE_IOERR_DIR_FSYNC"; break; + case SQLITE_IOERR_TRUNCATE: zName = "SQLITE_IOERR_TRUNCATE"; break; + case SQLITE_IOERR_FSTAT: zName = "SQLITE_IOERR_FSTAT"; break; + case SQLITE_IOERR_UNLOCK: zName = "SQLITE_IOERR_UNLOCK"; break; + case SQLITE_IOERR_RDLOCK: zName = "SQLITE_IOERR_RDLOCK"; break; + case SQLITE_IOERR_DELETE: zName = "SQLITE_IOERR_DELETE"; break; + case SQLITE_IOERR_BLOCKED: zName = "SQLITE_IOERR_BLOCKED"; break; + case SQLITE_IOERR_NOMEM: zName = "SQLITE_IOERR_NOMEM"; break; + case SQLITE_IOERR_ACCESS: zName = "SQLITE_IOERR_ACCESS"; break; + case SQLITE_IOERR_CHECKRESERVEDLOCK: + zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; + case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; + default: zName = "SQLITE_Unknown"; break; } return zName; } @@ -3064,6 +3082,33 @@ static int test_sleep( return TCL_OK; } +/* +** Usage: sqlite3_extended_errcode DB +** +** Return the string representation of the most recent sqlite3_* API +** error code. e.g. "SQLITE_ERROR". +*/ +static int test_ex_errcode( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3 *db; + int rc; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " DB", 0); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + rc = sqlite3_extended_errcode(db); + Tcl_AppendResult(interp, (char *)t1ErrorName(rc), 0); + return TCL_OK; +} + + /* ** Usage: sqlite3_errcode DB ** @@ -3078,7 +3123,6 @@ static int test_errcode( ){ sqlite3 *db; int rc; - char zBuf[30]; if( objc!=2 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", @@ -3087,12 +3131,7 @@ static int test_errcode( } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; rc = sqlite3_errcode(db); - if( (rc&0xff)==rc ){ - zBuf[0] = 0; - }else{ - sprintf(zBuf,"+%d", rc>>8); - } - Tcl_AppendResult(interp, (char *)t1ErrorName(rc), zBuf, 0); + Tcl_AppendResult(interp, (char *)t1ErrorName(rc), 0); return TCL_OK; } @@ -4667,6 +4706,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_clear_bindings", test_clear_bindings, 0}, { "sqlite3_sleep", test_sleep, 0}, { "sqlite3_errcode", test_errcode ,0 }, + { "sqlite3_extended_errcode", test_ex_errcode ,0 }, { "sqlite3_errmsg", test_errmsg ,0 }, { "sqlite3_errmsg16", test_errmsg16 ,0 }, { "sqlite3_open", test_open ,0 }, diff --git a/src/vdbe.c b/src/vdbe.c index a4a62b8bd1..9e175ce553 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,7 +43,7 @@ ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.783 2008/10/27 13:59:34 danielk1977 Exp $ +** $Id: vdbe.c,v 1.784 2008/10/30 15:03:16 drh Exp $ */ #include "sqliteInt.h" #include @@ -2411,7 +2411,7 @@ case OP_AutoCommit: { sqlite3SetString(&p->zErrMsg, db, "cannot %s transaction - " "SQL statements in progress", rollback ? "rollback" : "commit"); - rc = SQLITE_ERROR; + rc = SQLITE_BUSY; }else if( i!=db->autoCommit ){ if( pOp->p2 ){ assert( i==1 ); diff --git a/test/capi3.test b/test/capi3.test index 5ac748750e..dd08d58eab 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this script testing the callback-free C/C++ API. # -# $Id: capi3.test,v 1.67 2008/07/12 15:55:55 danielk1977 Exp $ +# $Id: capi3.test,v 1.68 2008/10/30 15:03:16 drh Exp $ # set testdir [file dirname $argv0] @@ -61,9 +61,12 @@ do_test capi3-1.1 { sqlite3_finalize $STMT set TAIL } {} -do_test capi3-1.2 { +do_test capi3-1.2.1 { sqlite3_errcode $DB } {SQLITE_OK} +do_test capi3-1.2.2 { + sqlite3_extended_errcode $DB +} {SQLITE_OK} do_test capi3-1.3 { sqlite3_errmsg $DB } {not an error} @@ -92,9 +95,12 @@ do_test capi3-1.7 { set STMT [sqlite3_prepare $DB $sql -1 TAIL] } } {1} -do_test capi3-1.8 { +do_test capi3-1.8.1 { sqlite3_errcode $DB } {SQLITE_ERROR} +do_test capi3-1.8.2 { + sqlite3_extended_errcode $DB +} {SQLITE_ERROR} do_test capi3-1.9 { sqlite3_errmsg $DB } {no such column: namex} @@ -118,9 +124,12 @@ ifcapable {utf16} { set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] } } {1} - do_test capi3-2.4 { + do_test capi3-2.4.1 { sqlite3_errcode $DB } {SQLITE_ERROR} + do_test capi3-2.4.2 { + sqlite3_extended_errcode $DB + } {SQLITE_ERROR} do_test capi3-2.5 { sqlite3_errmsg $DB } {no such column: namex} @@ -157,7 +166,7 @@ do_test capi3-3.3 { catch { set db2 [sqlite3_open /bogus/path/test.db {}] } - sqlite3_errcode $db2 + sqlite3_extended_errcode $db2 } {SQLITE_CANTOPEN} do_test capi3-3.4 { sqlite3_errmsg $db2 @@ -824,12 +833,15 @@ do_test capi3-11.2 { set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL] sqlite3_step $STMT } {SQLITE_ROW} -do_test capi3-11.3 { +do_test capi3-11.3.1 { catchsql { COMMIT; } } {1 {cannot commit transaction - SQL statements in progress}} -do_test capi3-11.3.1 { +do_test capi3-11.3.2 { + sqlite3_extended_errcode $DB +} {SQLITE_BUSY} +do_test capi3-11.3.3 { sqlite3_get_autocommit $DB } 0 do_test capi3-11.4 { diff --git a/test/capi3c.test b/test/capi3c.test index dcf3d68a58..798c084ed5 100644 --- a/test/capi3c.test +++ b/test/capi3c.test @@ -13,7 +13,7 @@ # This is a copy of the capi3.test file that has been adapted to # test the new sqlite3_prepare_v2 interface. # -# $Id: capi3c.test,v 1.20 2008/10/12 00:27:54 shane Exp $ +# $Id: capi3c.test,v 1.21 2008/10/30 15:03:16 drh Exp $ # set testdir [file dirname $argv0] @@ -63,9 +63,12 @@ do_test capi3c-1.1 { sqlite3_finalize $STMT set TAIL } {} -do_test capi3c-1.2 { +do_test capi3c-1.2.1 { sqlite3_errcode $DB } {SQLITE_OK} +do_test capi3c-1.2.2 { + sqlite3_extended_errcode $DB +} {SQLITE_OK} do_test capi3c-1.3 { sqlite3_errmsg $DB } {not an error} @@ -81,9 +84,12 @@ do_test capi3c-1.5 { set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] } } {1} -do_test capi3c-1.6 { +do_test capi3c-1.6.1 { sqlite3_errcode $DB } {SQLITE_ERROR} +do_test capi3c-1.6.2 { + sqlite3_extended_errcode $DB +} {SQLITE_ERROR} do_test capi3c-1.7 { sqlite3_errmsg $DB } {no such column: namex} @@ -108,9 +114,12 @@ ifcapable {utf16} { set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] } } {1} - do_test capi3c-2.4 { + do_test capi3c-2.4.1 { sqlite3_errcode $DB } {SQLITE_ERROR} + do_test capi3c-2.4.2 { + sqlite3_extended_errcode $DB + } {SQLITE_ERROR} do_test capi3c-2.5 { sqlite3_errmsg $DB } {no such column: namex} @@ -1231,7 +1240,7 @@ ifcapable progress { sqlite3_step $STMT } {SQLITE_INTERRUPT} do_test capi3c-21.2 { - sqlite3_errcode $DB + sqlite3_extended_errcode $DB } {SQLITE_INTERRUPT} do_test capi3c-21.3 { sqlite3_finalize $STMT @@ -1250,6 +1259,9 @@ ifcapable progress { do_test capi3c-21.7 { sqlite3_errcode $DB } {SQLITE_INTERRUPT} + do_test capi3c-21.8 { + sqlite3_extended_errcode $DB + } {SQLITE_INTERRUPT} } # Make sure sqlite3_result_error_code() returns the correct error code. diff --git a/test/misc7.test b/test/misc7.test index ef1d010f43..585453b14a 100644 --- a/test/misc7.test +++ b/test/misc7.test @@ -10,7 +10,7 @@ #*********************************************************************** # This file implements regression tests for SQLite library. # -# $Id: misc7.test,v 1.24 2008/08/22 13:57:39 pweilbacher Exp $ +# $Id: misc7.test,v 1.25 2008/10/30 15:03:16 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -397,7 +397,7 @@ if {$tcl_platform(platform)!="windows" && $tcl_platform(platform)!="os2"} { catchsql { SELECT count(*) FROM t3; } - } {1 {database is locked}} + } {1 {unable to open database file}} do_test misc7-17.2 { # Note that the -readonly flag must be cleared before the -permissions # are set. Otherwise, when using tcl 8.5 on mac, the fact that the