]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplication and optimization of error message handling.
authordrh <drh@noemail.net>
Fri, 13 Dec 2013 16:23:55 +0000 (16:23 +0000)
committerdrh <drh@noemail.net>
Fri, 13 Dec 2013 16:23:55 +0000 (16:23 +0000)
FossilOrigin-Name: 9d347f547e7ba9590b0c68edf50a14ad94a2bb92

manifest
manifest.uuid
src/backup.c
src/main.c
src/sqliteInt.h
src/util.c
src/vdbeapi.c
src/vdbeaux.c
src/vdbemem.c
test/capi3.test

index c46916bc45c0ef15de0b6d37ccb99bbd669b28f7..51d6982489f5a64a3adf879f7e08353a96584427 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\sSQLITE_FCNTL_SYNC\sand\sSQLITE_FCNTL_COMMIT_PHASETWO\sfile-controls\nand\shave\sthe\spager\scall\sthem\sat\sappropriate\stimes.\s\sThis\sis\sneeded\sin\sorder\nto\senable\sZIPVFS\sto\sdo\smulti-file\satomic\scommits.
-D 2013-12-11T15:47:39.590
+C Simplication\sand\soptimization\sof\serror\smessage\shandling.
+D 2013-12-13T16:23:55.861
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -163,7 +163,7 @@ F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083
 F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f
 F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3
 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
-F src/backup.c 6cb4c4ee1d302621eb18ad93a4216fed387b2568
+F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
 F src/btree.c 09285d6ffe7d819b9656ea9b7ecf1ab949a926fb
@@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
 F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
 F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
-F src/main.c a79c8ca051a914e50d6b221d56801d47835714d8
+F src/main.c fafd3cd2a6c1211c29b9ef36b4af978ef01279ef
 F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
@@ -224,7 +224,7 @@ F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e
 F src/sqlite.h.in 592057b6b3881573c2d516bad30fb20171f16b05
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h c59b756b3aebefdce24ff44c4a7b3c155a3c26ee
+F src/sqliteInt.h 3c1c14a551b019c94e1addcb67d92dd14a62e058
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -278,15 +278,15 @@ F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4
 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba
 F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b
 F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
-F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49
+F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c
 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
 F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7
 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644
 F src/vdbeInt.h a7bc268f844d75be48bb7ae16f77b418fd3c641c
-F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed
-F src/vdbeaux.c 74f3ad068f91d60ff56179a22610e7b0ef71e5d6
+F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad
+F src/vdbeaux.c a22cbd91b24503b82690cb03324ffec9f4ef63f6
 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde
-F src/vdbemem.c ac71e169dc056936f7a26ccaa808cd17456ffab1
+F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2
 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
 F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c
 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
@@ -364,7 +364,7 @@ F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3
 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0
 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de
 F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738
-F test/capi3.test 56ab450125ead38846cbae7e5b6a216686c3cffa
+F test/capi3.test f5eab498a0927d498e6d75c14567addb995ceccb
 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4
 F test/capi3c.test 93d24621c9ff84da9da060f30431e0453db1cdb0
 F test/capi3d.test 6d0fc0a86d73f42dd19a7d8b7761ab9bc02277d0
@@ -1146,8 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 5e239ecda0f7835ce037b38b04627a574b5854cd 9ff4dfe1e36b40e386858b03f36cfab8f6806fdd
-R 13a0878650f79a2d1e381d073556388e
-T +closed 9ff4dfe1e36b40e386858b03f36cfab8f6806fdd
+P 552f94d50f08cf11f33205730fde52bc2f06cff6
+R ab0976577ee6877312e7ddd6286ed77d
 U drh
-Z b8733cc6e30d13ae991531254c7c0f0a
+Z 888310640adcc5f651502c7cdb27c0d3
index b6a4ded46b1cf94ee053fdf07ef1539a67e1afdd..b1625e63761a1e6abff01b78b68719fe34e8e866 100644 (file)
@@ -1 +1 @@
-552f94d50f08cf11f33205730fde52bc2f06cff6
\ No newline at end of file
+9d347f547e7ba9590b0c68edf50a14ad94a2bb92
\ No newline at end of file
index 292f3f456c33d1c45543586bf24f0f3b52460c97..4a6bc7493c4278a78bf2f90653b19b993cab7a66 100644 (file)
@@ -601,10 +601,10 @@ int sqlite3_backup_finish(sqlite3_backup *p){
 
   /* Set the error code of the destination database handle. */
   rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc;
-  sqlite3Error(p->pDestDb, rc, 0);
-
-  /* Exit the mutexes and free the backup context structure. */
   if( p->pDestDb ){
+    sqlite3Error(p->pDestDb, rc, 0);
+
+    /* Exit the mutexes and free the backup context structure. */
     sqlite3LeaveMutexAndCloseZombie(p->pDestDb);
   }
   sqlite3BtreeLeave(p->pSrc);
index 3e9f4e01711f0232538bb651868f414b56d2a76c..09e3bb879fd6e16aafbb19e6c22c4b2ca59d744c 100644 (file)
@@ -987,9 +987,7 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
 #endif
 
   sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
-  if( db->pErr ){
-    sqlite3ValueFree(db->pErr);
-  }
+  sqlite3ValueFree(db->pErr);
   sqlite3CloseExtensions(db);
 
   db->magic = SQLITE_MAGIC_ERROR;
@@ -1871,6 +1869,7 @@ const char *sqlite3_errmsg(sqlite3 *db){
   if( db->mallocFailed ){
     z = sqlite3ErrStr(SQLITE_NOMEM);
   }else{
+    testcase( db->pErr==0 );
     z = (char*)sqlite3_value_text(db->pErr);
     assert( !db->mallocFailed );
     if( z==0 ){
@@ -1912,8 +1911,7 @@ const void *sqlite3_errmsg16(sqlite3 *db){
   }else{
     z = sqlite3_value_text16(db->pErr);
     if( z==0 ){
-      sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
-           SQLITE_UTF8, SQLITE_STATIC);
+      sqlite3Error(db, db->errCode, sqlite3ErrStr(db->errCode));
       z = sqlite3_value_text16(db->pErr);
     }
     /* A malloc() may have failed within the call to sqlite3_value_text16()
@@ -2627,8 +2625,6 @@ static int openDatabase(
   }
 #endif
 
-  sqlite3Error(db, rc, 0);
-
   /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking
   ** mode.  -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking
   ** mode.  Doing nothing at all also makes NORMAL the default.
index 1f10c31cb56ed7c6983c0d6ae1d413248cbccba7..8e1436efd31e5a659e25ae47fe2a5862dc2212e8 100644 (file)
@@ -3157,6 +3157,7 @@ const void *sqlite3ValueText(sqlite3_value*, u8);
 int sqlite3ValueBytes(sqlite3_value*, u8);
 void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, 
                         void(*)(void*));
+void sqlite3ValueSetNull(sqlite3_value*);
 void sqlite3ValueFree(sqlite3_value*);
 sqlite3_value *sqlite3ValueNew(sqlite3 *);
 char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8);
index 9fa2a0fbd86f41f59424b4e560e7f21bd9755e8d..362a5d8970fb66fa6d7789222ef88e23ce70d2ae 100644 (file)
@@ -115,18 +115,17 @@ int sqlite3Strlen30(const char *z){
 ** to NULL.
 */
 void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat, ...){
-  if( db && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){
-    db->errCode = err_code;
-    if( zFormat ){
-      char *z;
-      va_list ap;
-      va_start(ap, zFormat);
-      z = sqlite3VMPrintf(db, zFormat, ap);
-      va_end(ap);
-      sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC);
-    }else{
-      sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC);
-    }
+  assert( db!=0 );
+  db->errCode = err_code;
+  if( zFormat && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){
+    char *z;
+    va_list ap;
+    va_start(ap, zFormat);
+    z = sqlite3VMPrintf(db, zFormat, ap);
+    va_end(ap);
+    sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC);
+  }else if( db->pErr ){
+    sqlite3ValueSetNull(db->pErr);
   }
 }
 
index d51256217413188766279307e3a9721b9ed8e94c..ea383dffda35b60c88b28fdb2f4d8a3c23000fe4 100644 (file)
@@ -486,7 +486,7 @@ int sqlite3_step(sqlite3_stmt *pStmt){
     v->doingRerun = 1;
     assert( v->expired==0 );
   }
-  if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
+  if( rc2!=SQLITE_OK ){
     /* This case occurs after failing to recompile an sql statement. 
     ** The error message from the SQL compiler has already been loaded 
     ** into the database handle. This block copies the error message 
@@ -496,6 +496,7 @@ int sqlite3_step(sqlite3_stmt *pStmt){
     ** sqlite3_errmsg() and sqlite3_errcode().
     */
     const char *zErr = (const char *)sqlite3_value_text(db->pErr); 
+    assert( zErr!=0 || db->mallocFailed );
     sqlite3DbFree(db, v->zErrMsg);
     if( !db->mallocFailed ){
       v->zErrMsg = sqlite3DbStrDup(db, zErr);
index 9e1eb581f04bc9c746d299f6748d36d8c86fc1d2..6344c4c8fa0865b4ab981e27fb91f4bdeb35c3f5 100644 (file)
@@ -2420,6 +2420,7 @@ int sqlite3VdbeTransferError(Vdbe *p){
   if( p->zErrMsg ){
     u8 mallocFailed = db->mallocFailed;
     sqlite3BeginBenignMalloc();
+    if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db);
     sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT);
     sqlite3EndBenignMalloc();
     db->mallocFailed = mallocFailed;
@@ -2488,8 +2489,7 @@ int sqlite3VdbeReset(Vdbe *p){
     ** to sqlite3_step(). For consistency (since sqlite3_step() was
     ** called), set the database error in this case as well.
     */
-    sqlite3Error(db, p->rc, 0);
-    sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT);
+    sqlite3Error(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg);
     sqlite3DbFree(db, p->zErrMsg);
     p->zErrMsg = 0;
   }
index d5901b439aa1bec96a4683220cd17a28c5c76b17..3beccd92db3bc839fdf703e6040990dc158bc24b 100644 (file)
@@ -482,6 +482,9 @@ void sqlite3VdbeMemSetNull(Mem *pMem){
   MemSetTypeFlag(pMem, MEM_Null);
   pMem->type = SQLITE_NULL;
 }
+void sqlite3ValueSetNull(sqlite3_value *p){
+  sqlite3VdbeMemSetNull((Mem*)p); 
+}
 
 /*
 ** Delete any previous value and set the value to be a BLOB of length
index 9d7434d25d2247f8ebf6af66c4dcd4c3d0ef6363..2dbc298fa44dd119b072c0fc8ff209d6d0232b2e 100644 (file)
@@ -1191,6 +1191,7 @@ do_test capi3-18.2 {
   sqlite3_reset $STMT
   sqlite3_errcode db
 } {SQLITE_SCHEMA}
+breakpoint
 do_test capi3-18.3 {
   sqlite3_errmsg db
 } {database schema has changed}