1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-15 11:41:13 +03:00

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
This commit is contained in:
drh
2008-10-30 15:03:15 +00:00
parent 281d8bd3ac
commit 99dfe5eb47
9 changed files with 161 additions and 73 deletions

View File

@@ -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) 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-29T07:01:57 D 2008-10-30T15:03:16
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in da817da72422f9b876602c225fcd17d6ca4182f7 F Makefile.in da817da72422f9b876602c225fcd17d6ca4182f7
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -118,7 +118,7 @@ F src/insert.c 110cca7845ed5a66c08fdd413b02e706ae34455f
F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e
F src/legacy.c aac57bd984e666059011ea01ec4383892a253be3 F src/legacy.c aac57bd984e666059011ea01ec4383892a253be3
F src/loadext.c 3872457afdf25bb174fd383cb4e3e0d2a9e60552 F src/loadext.c 3872457afdf25bb174fd383cb4e3e0d2a9e60552
F src/main.c ff40f9f21c76d5062bc0bc06bd8853fc217dd170 F src/main.c df799b66bb11deac9d6de66ba7931700923094b4
F src/malloc.c a213fb461b8df08aed7606f6a1e1d3452e089000 F src/malloc.c a213fb461b8df08aed7606f6a1e1d3452e089000
F src/mem0.c f2f84062d1f35814d6535c9f9e33de3bfb3b132c F src/mem0.c f2f84062d1f35814d6535c9f9e33de3bfb3b132c
F src/mem1.c 2091081d1c6bcd4516738f37cd84d42e814cf9a2 F src/mem1.c 2091081d1c6bcd4516738f37cd84d42e814cf9a2
@@ -150,14 +150,14 @@ F src/random.c a87afbd598aa877e23ac676ee92fd8ee5c786a51
F src/resolve.c 266bb03d2b456fe68f5df2dd5687e7e88ff8088d F src/resolve.c 266bb03d2b456fe68f5df2dd5687e7e88ff8088d
F src/select.c d910d7350df0d918e22286c5bfd39d4ea68ec813 F src/select.c d910d7350df0d918e22286c5bfd39d4ea68ec813
F src/shell.c d83b578a8ccdd3e0e7fef4388a0887ce9f810967 F src/shell.c d83b578a8ccdd3e0e7fef4388a0887ce9f810967
F src/sqlite.h.in ee95eeed2196e5fa98fdad007301b8d5d3733b6d F src/sqlite.h.in f74e769732013f96d1ea71e4fe9a489c76bed785
F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
F src/sqliteInt.h 926279c94cdf21e53fc66badb8541d94aed25018 F src/sqliteInt.h 926279c94cdf21e53fc66badb8541d94aed25018
F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8 F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8
F src/tclsqlite.c 96049bd454f1547abff0a57c45f0dfa57701e076 F src/tclsqlite.c 96049bd454f1547abff0a57c45f0dfa57701e076
F src/test1.c a7310348961945e656c096e5f91d4d87dee6b61d F src/test1.c 9b440b38e1710e9be1512c003fa141e0e3948e05
F src/test2.c 897528183edf2839c2a3c991d415905db56f1240 F src/test2.c 897528183edf2839c2a3c991d415905db56f1240
F src/test3.c 88a246b56b824275300e6c899634fbac1dc94b14 F src/test3.c 88a246b56b824275300e6c899634fbac1dc94b14
F src/test4.c f79ab52d27ff49b784b631a42e2ccd52cfd5c84c F src/test4.c f79ab52d27ff49b784b631a42e2ccd52cfd5c84c
@@ -190,7 +190,7 @@ F src/update.c ed233298db6dd23d340e449e4b4a81b9306da6aa
F src/utf.c c63e6f69082f85c19ab88d62dedaf91d71ac1a50 F src/utf.c c63e6f69082f85c19ab88d62dedaf91d71ac1a50
F src/util.c afe659ccc05d1f8af9e8631dabfec3ee3a7144af F src/util.c afe659ccc05d1f8af9e8631dabfec3ee3a7144af
F src/vacuum.c fd77433d0c26d3ff1eb96eab017a1787ac5aa642 F src/vacuum.c fd77433d0c26d3ff1eb96eab017a1787ac5aa642
F src/vdbe.c be81532805ee6fc1fe7bd2e1c82cf4a09b7b3061 F src/vdbe.c e3629776ef4a49f997b271fbd83e54b6104d5607
F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3 F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3
F src/vdbeInt.h a20f479ec3bf41c61b0c2bd5176a9bad6b2a07ef F src/vdbeInt.h a20f479ec3bf41c61b0c2bd5176a9bad6b2a07ef
F src/vdbeapi.c 6798c70cf176d23594ec557db88190ca8c7fa860 F src/vdbeapi.c 6798c70cf176d23594ec557db88190ca8c7fa860
@@ -235,9 +235,9 @@ F test/blob.test 2a38d867bdf08f9ce081776acec1ac8d4bca66be
F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0
F test/cache.test 3ff445c445742a7b6b9ba6e1d62a25263f9424b9 F test/cache.test 3ff445c445742a7b6b9ba6e1d62a25263f9424b9
F test/capi2.test 36f87803c811b5986dd31eb5492cb704552776b4 F test/capi2.test 36f87803c811b5986dd31eb5492cb704552776b4
F test/capi3.test ffc1156d1f28738eb335df0b88dd294bb3c94c27 F test/capi3.test 74089bd93dc5bbc9f80854b02a594aba0c730e9a
F test/capi3b.test 664eb55318132f292f2c436f90906f578cad6b97 F test/capi3b.test 664eb55318132f292f2c436f90906f578cad6b97
F test/capi3c.test 440ba10acccb74c0f160d7462a93abd1dc328224 F test/capi3c.test db9310ac62766ab09b9282468f910ecd5b8014b8
F test/capi3d.test 57d83b690d7364bde02cddbf8339a4b50d80ce23 F test/capi3d.test 57d83b690d7364bde02cddbf8339a4b50d80ce23
F test/cast.test ce8f14fc80f70b30ed984480cc0d8914a459e8f9 F test/cast.test ce8f14fc80f70b30ed984480cc0d8914a459e8f9
F test/check.test 024ed399600b799160378cf9d9f436bdf5dfd184 F test/check.test 024ed399600b799160378cf9d9f436bdf5dfd184
@@ -443,7 +443,7 @@ F test/misc3.test 7212ed8dad01427e9acab9bd3e7e5e2c2e89be9e
F test/misc4.test 91e8ed25c092c2bb4e0bb01864631e2930f8d7de F test/misc4.test 91e8ed25c092c2bb4e0bb01864631e2930f8d7de
F test/misc5.test 6a5c1e3217a95b0db05ff9a0f1ecb5ce9043ffef F test/misc5.test 6a5c1e3217a95b0db05ff9a0f1ecb5ce9043ffef
F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91
F test/misc7.test 0d763f703a34521e55ab30145b747aafa0e5f794 F test/misc7.test edbbe77d48c7d70a60f8c33e2c7d182ca25f0181
F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33 F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33
F test/mutex1.test ff260ddaf7240390dbb013d28aba3a33ec0dada4 F test/mutex1.test ff260ddaf7240390dbb013d28aba3a33ec0dada4
F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660
@@ -652,7 +652,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P 4651f590f0b8bf13938b2b15d5082136e763af8d P dc5308c7629abe6a3bad21489c8e97087c264e5a
R e062a5dfa67b3ff54e219649b4e4fdb6 R 5295e43b763246c263ebf9a171998453
U danielk1977 U drh
Z d3e719d91fd94e74917b0fa45d10565a Z 61bb1497945a9a8883e7532aff687652

View File

@@ -1 +1 @@
dc5308c7629abe6a3bad21489c8e97087c264e5a 4c6a90a16627b1664bf7f15ab40b440b3bd60b48

View File

@@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be ** other files are for internal use by SQLite and should not be
** accessed by users of the library. ** 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 "sqliteInt.h"
#include <ctype.h> #include <ctype.h>
@@ -1266,6 +1266,15 @@ int sqlite3_errcode(sqlite3 *db){
} }
return db->errCode & db->errMask; 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 ** Create a new collating function for database "db". The name is zName

View File

@@ -30,7 +30,7 @@
** the version number) and changes its name to "sqlite3.h" as ** the version number) and changes its name to "sqlite3.h" as
** part of the build process. ** 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_ #ifndef _SQLITE3_H_
#define _SQLITE3_H_ #define _SQLITE3_H_
@@ -379,11 +379,13 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**);
** **
** {H12137} The [sqlite3_exec(D,S,C,A,E)] function shall set the [error code] ** {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()]. ** [sqlite3_errmsg()], and [sqlite3_errmsg16()].
** **
** {H12138} If the S parameter to [sqlite3_exec(D,S,C,A,E)] is NULL or an ** {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, ** empty string or contains nothing other than whitespace, comments,
** and/or semicolons, then results of [sqlite3_errcode()], ** and/or semicolons, then results of [sqlite3_errcode()],
** [sqlite3_extended_errcode()],
** [sqlite3_errmsg()], and [sqlite3_errmsg16()] ** [sqlite3_errmsg()], and [sqlite3_errmsg16()]
** shall reset to indicate no errors. ** 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 ** [extended result code] for the most recent failed sqlite3_* API call
** associated with a [database connection]. If a prior API call failed ** associated with a [database connection]. If a prior API call failed
** but the most recent API call succeeded, the return value from ** 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 ** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
** text that describes the error, as either UTF-8 or UTF-16 respectively. ** 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 ** [result code] or [extended result code] for the most recently
** failed interface call associated with the [database connection] D. ** 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)] ** {H12803} The [sqlite3_errmsg(D)] and [sqlite3_errmsg16(D)]
** interfaces return English-language text that describes ** interfaces return English-language text that describes
** the error in the mostly recently failed interface call, ** 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 ** {H12808} Calls to API routines that do not return an error code
** (example: [sqlite3_data_count()]) do not ** (example: [sqlite3_data_count()]) do not
** change the error code or message returned by ** 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 ** {H12809} Interfaces that are not associated with a specific
** [database connection] (examples: ** [database connection] (examples:
** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] ** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()]
** do not change the values returned by ** 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_errcode(sqlite3 *db);
int sqlite3_extended_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*); const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(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,...)] ** {H17821} If an error occurs during evaluation of [sqlite3_blob_open(D,...)]
** then subsequent calls to [sqlite3_errcode(D)], ** then subsequent calls to [sqlite3_errcode(D)],
** [sqlite3_extended_errcode()],
** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return
** information appropriate for that error. ** 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,...)] ** {H17868} If an error occurs during evaluation of [sqlite3_blob_read(P,...)]
** then subsequent calls to [sqlite3_errcode(D)], ** then subsequent calls to [sqlite3_errcode(D)],
** [sqlite3_extended_errcode()],
** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return
** information appropriate for that error, where D is the ** information appropriate for that error, where D is the
** [database connection] that was used to open the [BLOB handle] P. ** [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,...)] ** {H17888} If an error occurs during evaluation of [sqlite3_blob_write(D,...)]
** then subsequent calls to [sqlite3_errcode(D)], ** then subsequent calls to [sqlite3_errcode(D)],
** [sqlite3_extended_errcode()],
** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return ** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] shall return
** information appropriate for that error. ** information appropriate for that error.
*/ */

View File

@@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated ** is not included in the SQLite library. It is used for automated
** testing of the SQLite library. ** 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 "sqliteInt.h"
#include "tcl.h" #include "tcl.h"
@@ -117,9 +117,10 @@ int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){
const char *sqlite3TestErrorName(int rc){ const char *sqlite3TestErrorName(int rc){
const char *zName = 0; const char *zName = 0;
switch( rc & 0xff ){ switch( rc ){
case SQLITE_OK: zName = "SQLITE_OK"; break; case SQLITE_OK: zName = "SQLITE_OK"; break;
case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; case SQLITE_ERROR: zName = "SQLITE_ERROR"; break;
case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break;
case SQLITE_PERM: zName = "SQLITE_PERM"; break; case SQLITE_PERM: zName = "SQLITE_PERM"; break;
case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; case SQLITE_BUSY: zName = "SQLITE_BUSY"; break;
@@ -129,11 +130,13 @@ const char *sqlite3TestErrorName(int rc){
case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break;
case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; case SQLITE_IOERR: zName = "SQLITE_IOERR"; break;
case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break;
case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break;
case SQLITE_FULL: zName = "SQLITE_FULL"; break; case SQLITE_FULL: zName = "SQLITE_FULL"; break;
case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break;
case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break;
case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break;
case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break;
case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break;
case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break;
case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break;
case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break;
@@ -141,10 +144,25 @@ const char *sqlite3TestErrorName(int rc){
case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; case SQLITE_AUTH: zName = "SQLITE_AUTH"; break;
case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break;
case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; case SQLITE_RANGE: zName = "SQLITE_RANGE"; break;
case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break;
case SQLITE_ROW: zName = "SQLITE_ROW"; break; case SQLITE_ROW: zName = "SQLITE_ROW"; break;
case SQLITE_DONE: zName = "SQLITE_DONE"; break; case SQLITE_DONE: zName = "SQLITE_DONE"; break;
case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break;
case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; 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; default: zName = "SQLITE_Unknown"; break;
} }
return zName; return zName;
@@ -3064,6 +3082,33 @@ static int test_sleep(
return TCL_OK; 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 ** Usage: sqlite3_errcode DB
** **
@@ -3078,7 +3123,6 @@ static int test_errcode(
){ ){
sqlite3 *db; sqlite3 *db;
int rc; int rc;
char zBuf[30];
if( objc!=2 ){ if( objc!=2 ){
Tcl_AppendResult(interp, "wrong # args: should be \"", 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; if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
rc = sqlite3_errcode(db); rc = sqlite3_errcode(db);
if( (rc&0xff)==rc ){ Tcl_AppendResult(interp, (char *)t1ErrorName(rc), 0);
zBuf[0] = 0;
}else{
sprintf(zBuf,"+%d", rc>>8);
}
Tcl_AppendResult(interp, (char *)t1ErrorName(rc), zBuf, 0);
return TCL_OK; return TCL_OK;
} }
@@ -4667,6 +4706,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite3_clear_bindings", test_clear_bindings, 0}, { "sqlite3_clear_bindings", test_clear_bindings, 0},
{ "sqlite3_sleep", test_sleep, 0}, { "sqlite3_sleep", test_sleep, 0},
{ "sqlite3_errcode", test_errcode ,0 }, { "sqlite3_errcode", test_errcode ,0 },
{ "sqlite3_extended_errcode", test_ex_errcode ,0 },
{ "sqlite3_errmsg", test_errmsg ,0 }, { "sqlite3_errmsg", test_errmsg ,0 },
{ "sqlite3_errmsg16", test_errmsg16 ,0 }, { "sqlite3_errmsg16", test_errmsg16 ,0 },
{ "sqlite3_open", test_open ,0 }, { "sqlite3_open", test_open ,0 },

View File

@@ -43,7 +43,7 @@
** in this file for details. If in doubt, do not deviate from existing ** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code. ** 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 "sqliteInt.h"
#include <ctype.h> #include <ctype.h>
@@ -2411,7 +2411,7 @@ case OP_AutoCommit: {
sqlite3SetString(&p->zErrMsg, db, "cannot %s transaction - " sqlite3SetString(&p->zErrMsg, db, "cannot %s transaction - "
"SQL statements in progress", "SQL statements in progress",
rollback ? "rollback" : "commit"); rollback ? "rollback" : "commit");
rc = SQLITE_ERROR; rc = SQLITE_BUSY;
}else if( i!=db->autoCommit ){ }else if( i!=db->autoCommit ){
if( pOp->p2 ){ if( pOp->p2 ){
assert( i==1 ); assert( i==1 );

View File

@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this script testing the callback-free C/C++ API. # 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] set testdir [file dirname $argv0]
@@ -61,9 +61,12 @@ do_test capi3-1.1 {
sqlite3_finalize $STMT sqlite3_finalize $STMT
set TAIL set TAIL
} {} } {}
do_test capi3-1.2 { do_test capi3-1.2.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_OK} } {SQLITE_OK}
do_test capi3-1.2.2 {
sqlite3_extended_errcode $DB
} {SQLITE_OK}
do_test capi3-1.3 { do_test capi3-1.3 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {not an error} } {not an error}
@@ -92,9 +95,12 @@ do_test capi3-1.7 {
set STMT [sqlite3_prepare $DB $sql -1 TAIL] set STMT [sqlite3_prepare $DB $sql -1 TAIL]
} }
} {1} } {1}
do_test capi3-1.8 { do_test capi3-1.8.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_ERROR} } {SQLITE_ERROR}
do_test capi3-1.8.2 {
sqlite3_extended_errcode $DB
} {SQLITE_ERROR}
do_test capi3-1.9 { do_test capi3-1.9 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {no such column: namex} } {no such column: namex}
@@ -118,9 +124,12 @@ ifcapable {utf16} {
set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
} }
} {1} } {1}
do_test capi3-2.4 { do_test capi3-2.4.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_ERROR} } {SQLITE_ERROR}
do_test capi3-2.4.2 {
sqlite3_extended_errcode $DB
} {SQLITE_ERROR}
do_test capi3-2.5 { do_test capi3-2.5 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {no such column: namex} } {no such column: namex}
@@ -157,7 +166,7 @@ do_test capi3-3.3 {
catch { catch {
set db2 [sqlite3_open /bogus/path/test.db {}] set db2 [sqlite3_open /bogus/path/test.db {}]
} }
sqlite3_errcode $db2 sqlite3_extended_errcode $db2
} {SQLITE_CANTOPEN} } {SQLITE_CANTOPEN}
do_test capi3-3.4 { do_test capi3-3.4 {
sqlite3_errmsg $db2 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] set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
sqlite3_step $STMT sqlite3_step $STMT
} {SQLITE_ROW} } {SQLITE_ROW}
do_test capi3-11.3 { do_test capi3-11.3.1 {
catchsql { catchsql {
COMMIT; COMMIT;
} }
} {1 {cannot commit transaction - SQL statements in progress}} } {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 sqlite3_get_autocommit $DB
} 0 } 0
do_test capi3-11.4 { do_test capi3-11.4 {

View File

@@ -13,7 +13,7 @@
# This is a copy of the capi3.test file that has been adapted to # This is a copy of the capi3.test file that has been adapted to
# test the new sqlite3_prepare_v2 interface. # 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] set testdir [file dirname $argv0]
@@ -63,9 +63,12 @@ do_test capi3c-1.1 {
sqlite3_finalize $STMT sqlite3_finalize $STMT
set TAIL set TAIL
} {} } {}
do_test capi3c-1.2 { do_test capi3c-1.2.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_OK} } {SQLITE_OK}
do_test capi3c-1.2.2 {
sqlite3_extended_errcode $DB
} {SQLITE_OK}
do_test capi3c-1.3 { do_test capi3c-1.3 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {not an error} } {not an error}
@@ -81,9 +84,12 @@ do_test capi3c-1.5 {
set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL]
} }
} {1} } {1}
do_test capi3c-1.6 { do_test capi3c-1.6.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_ERROR} } {SQLITE_ERROR}
do_test capi3c-1.6.2 {
sqlite3_extended_errcode $DB
} {SQLITE_ERROR}
do_test capi3c-1.7 { do_test capi3c-1.7 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {no such column: namex} } {no such column: namex}
@@ -108,9 +114,12 @@ ifcapable {utf16} {
set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL]
} }
} {1} } {1}
do_test capi3c-2.4 { do_test capi3c-2.4.1 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_ERROR} } {SQLITE_ERROR}
do_test capi3c-2.4.2 {
sqlite3_extended_errcode $DB
} {SQLITE_ERROR}
do_test capi3c-2.5 { do_test capi3c-2.5 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {no such column: namex} } {no such column: namex}
@@ -1231,7 +1240,7 @@ ifcapable progress {
sqlite3_step $STMT sqlite3_step $STMT
} {SQLITE_INTERRUPT} } {SQLITE_INTERRUPT}
do_test capi3c-21.2 { do_test capi3c-21.2 {
sqlite3_errcode $DB sqlite3_extended_errcode $DB
} {SQLITE_INTERRUPT} } {SQLITE_INTERRUPT}
do_test capi3c-21.3 { do_test capi3c-21.3 {
sqlite3_finalize $STMT sqlite3_finalize $STMT
@@ -1250,6 +1259,9 @@ ifcapable progress {
do_test capi3c-21.7 { do_test capi3c-21.7 {
sqlite3_errcode $DB sqlite3_errcode $DB
} {SQLITE_INTERRUPT} } {SQLITE_INTERRUPT}
do_test capi3c-21.8 {
sqlite3_extended_errcode $DB
} {SQLITE_INTERRUPT}
} }
# Make sure sqlite3_result_error_code() returns the correct error code. # Make sure sqlite3_result_error_code() returns the correct error code.

View File

@@ -10,7 +10,7 @@
#*********************************************************************** #***********************************************************************
# This file implements regression tests for SQLite library. # 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] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@@ -397,7 +397,7 @@ if {$tcl_platform(platform)!="windows" && $tcl_platform(platform)!="os2"} {
catchsql { catchsql {
SELECT count(*) FROM t3; SELECT count(*) FROM t3;
} }
} {1 {database is locked}} } {1 {unable to open database file}}
do_test misc7-17.2 { do_test misc7-17.2 {
# Note that the -readonly flag must be cleared before the -permissions # 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 # are set. Otherwise, when using tcl 8.5 on mac, the fact that the