]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the sqlite3_extended_errcode() interface. Change to return
authordrh <drh@noemail.net>
Thu, 30 Oct 2008 15:03:15 +0000 (15:03 +0000)
committerdrh <drh@noemail.net>
Thu, 30 Oct 2008 15:03:15 +0000 (15:03 +0000)
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
manifest.uuid
src/main.c
src/sqlite.h.in
src/test1.c
src/vdbe.c
test/capi3.test
test/capi3c.test
test/misc7.test

index c02d3bd1043f6270352bba70e298516258084cde..a8ceb6c72986e70dc63ebbf0e5c1b9f519badf3c 100644 (file)
--- 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
index 397cd305783f2a92a9dd53057ddeaf5222fd15e3..ec0fc6dc6d81145ac525c040226895f58ae5b472 100644 (file)
@@ -1 +1 @@
-dc5308c7629abe6a3bad21489c8e97087c264e5a
\ No newline at end of file
+4c6a90a16627b1664bf7f15ab40b440b3bd60b48
\ No newline at end of file
index a3098579b89cbfbe7352ef131152e8e1cf8e3f2c..b0efd48b5abc9bb657f52e5a878396fb85377d02 100644 (file)
@@ -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 <ctype.h>
@@ -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
index cab38db633d651f10ddf0b44de8ce817e5968e40..51b51250257a51eb87ab6200e9ec00d845944d7e 100644 (file)
@@ -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.
 */
index fd6630d1f36c757c98d6d4c4f040bc93221b0887..4c502564b55633f51635e8dc99469ea4cecff8d7 100644 (file)
@@ -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 },
index a4a62b8bd1961c0fd5f58b81daa23f857a7e85db..9e175ce553ea211bd192e7b07a1b74049efc63ad 100644 (file)
@@ -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 <ctype.h>
@@ -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 );
index 5ac748750ea4cef89ed443467dd22bd9b9d9d190..dd08d58eab878ecef31fa184bc57f18ee40bd9f0 100644 (file)
@@ -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 {
index dcf3d68a58eca2a2c632a581f481b720fb25b092..798c084ed561f49ad5ee5df4416c9281b2b1cc94 100644 (file)
@@ -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.
index ef1d010f43c312cc0ba4cb8023ccfd60e7b26bca..585453b14a46e7705e56fbc78676897811139b3f 100644 (file)
@@ -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