From: drh Date: Fri, 13 Dec 2013 16:23:55 +0000 (+0000) Subject: Simplication and optimization of error message handling. X-Git-Tag: version-3.8.3~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a3cc007df47198f501b2ae02eeafbb64d6ff0097;p=thirdparty%2Fsqlite.git Simplication and optimization of error message handling. FossilOrigin-Name: 9d347f547e7ba9590b0c68edf50a14ad94a2bb92 --- diff --git a/manifest b/manifest index c46916bc45..51d6982489 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index b6a4ded46b..b1625e6376 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -552f94d50f08cf11f33205730fde52bc2f06cff6 \ No newline at end of file +9d347f547e7ba9590b0c68edf50a14ad94a2bb92 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 292f3f456c..4a6bc7493c 100644 --- a/src/backup.c +++ b/src/backup.c @@ -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); diff --git a/src/main.c b/src/main.c index 3e9f4e0171..09e3bb879f 100644 --- a/src/main.c +++ b/src/main.c @@ -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. diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1f10c31cb5..8e1436efd3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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); diff --git a/src/util.c b/src/util.c index 9fa2a0fbd8..362a5d8970 100644 --- a/src/util.c +++ b/src/util.c @@ -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); } } diff --git a/src/vdbeapi.c b/src/vdbeapi.c index d512562174..ea383dffda 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -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); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9e1eb581f0..6344c4c8fa 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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; } diff --git a/src/vdbemem.c b/src/vdbemem.c index d5901b439a..3beccd92db 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -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 diff --git a/test/capi3.test b/test/capi3.test index 9d7434d25d..2dbc298fa4 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -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}