From: drh <> Date: Mon, 4 Aug 2025 13:55:58 +0000 (+0000) Subject: The sqlite3_error_schema() interface now works for errors discovered X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96be4a368bb96413e8fc15dfa499bdfe7fb6c464;p=thirdparty%2Fsqlite.git The sqlite3_error_schema() interface now works for errors discovered during OP_Transaction. FossilOrigin-Name: 560f899662fb974f5ad844709c803ce50a628d3381fe26d4481a1e00c92dd3e5 --- diff --git a/manifest b/manifest index 14c3f6384a..27a566e3e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prototype\sof\sthe\ssqlite3_error_schema()\sinterface.\s\sNon-functional. -D 2025-08-04T11:40:31.845 +C The\ssqlite3_error_schema()\sinterface\snow\sworks\sfor\serrors\sdiscovered\nduring\sOP_Transaction. +D 2025-08-04T13:55:58.341 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -750,7 +750,7 @@ F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd F src/json.c cb87977b1ee25ee7d27505d65a9261b687395bf895342c8ba566b7c01aee2047 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d7edd8e671237539d795d30daaf888908a2c82e99bade4c78f3be021e8b7d655 -F src/main.c 12747414946bfee192ae5b692f2abdfb9fd1317c42dd7aa65edc9db0388d797c +F src/main.c 0b78e9b8939978697a65e33ef04a632fc2945e0909bdeec69b428a1a32f67b41 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -787,11 +787,11 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 1fba451b87114182213ead347113d15c845dac4e61755754600c85595ec92244 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c a6be657216e1fb72f85dad7df0dba0eb79fe76527c08caa65da8fe44f0e4db44 -F src/shell.c.in 7918c9355667b3b348e5850f0dad9095476ef942ee3b96ee9b8bc2710adda1da +F src/shell.c.in ea43bdf584988d00cffa977a3ccd1382dff7f088f2a0b6fd04acda9f4bb71fe9 F src/sqlite.h.in 5ad19d51a8332718bb4ae7cf05a0316fac66abb76149fa2d5b46acc965628709 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 0bfd049bb2088cc44c2ad54f2079d1c6e43091a4e1ce8868779b75f6c1484f1e -F src/sqliteInt.h c52a09238d17eb2dd7f521c2356f8259c655dc26aafd5d36e0f0fae10330f7e9 +F src/sqliteInt.h d5b2f62c605d6dc04f7b036f012bbb850eb9b70fe4069dd7d62c4d35ec46ed27 F src/sqliteLimit.h fe70bd8983e5d317a264f2ea97473b359faf3ebb0827877a76813f5cf0cdc364 F src/status.c 0e72e4f6be6ccfde2488eb63210297e75f569f3ce9920f6c3d77590ec6ce5ffd F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -851,9 +851,9 @@ F src/trigger.c 2cbf345eb2913ee7dfa3622e753ac08c84ace17438f30ae97d98d41db5ca5a4f F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165 -F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3 +F src/util.c cf60fc96b3d31f3e77cfebfe6e00271a901f976b67bff915a76c650a1bb4567f F src/vacuum.c 1bacdd0a81d2b5dc1c508fbf0d938c89fa78dd8d5b46ec92686d44030d4f4789 -F src/vdbe.c a5873cd566a0e2a0344a86dd946add9d34fae3feeae8b126277ef7af8dc11f91 +F src/vdbe.c 0ca76b5d33aa37427af05b11039a54c579555755e29c647d299002569e1a4d5a F src/vdbe.h ea1f1b52f0efe422f80d88da3c57e4eadc72856e29a22f1ff08e502ec6ba5f08 F src/vdbeInt.h 52896dd4d5b62190c53db14b09fc2484434eb594c963df0fa66eb8a94527b02e F src/vdbeapi.c f9a4881a9674fec3fa13da35044a1484d3c4b95f9ec891cc8ffb02ef2b7a41df @@ -2213,11 +2213,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8bb315ef7429a60899f5afe878a3b1aa146b18eef2ac9f4d6eca98587a2255cd -R cc0d2f0b0bb50e7bf998c482672b2a34 -T *branch * error-schema -T *sym-error-schema * -T -sym-trunk * +P 715cb6035ea1b8b74c2a19180bbee9027ab8b57e9f2b55be5b512a983d79ba6a +R 5e1b2e7bd346e05bda9945b69c72dde5 U drh -Z 565b276da4e150dc170705cdd9673a0e +Z 3f225359ec1b9fd0a33b4cb754e30b47 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8e08b193bc..4c622b9c0e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -715cb6035ea1b8b74c2a19180bbee9027ab8b57e9f2b55be5b512a983d79ba6a +560f899662fb974f5ad844709c803ce50a628d3381fe26d4481a1e00c92dd3e5 diff --git a/src/main.c b/src/main.c index d1768853e9..ba933c0ce5 100644 --- a/src/main.c +++ b/src/main.c @@ -2798,23 +2798,18 @@ int sqlite3_system_errno(sqlite3 *db){ /* ** Return the name of the database schema ("main", "temp", or the name of ** an ATTACH-ed database) to which the latest error applies. Return NULL -** if the error does not apply to a specific schema. -** -** This routine will typically return a string for errors like SQLITE_READONLY, -** or SQLITE_CORRUPT, or SQLITE_BUSY. It will return NULL for errors -** like SQLITE_NOMEM. +** if the error does not apply to a specific schema or if there have been +** no errors reported. */ const char *sqlite3_error_schema(sqlite3 *db){ - int iDb; if( db && !sqlite3SafetyCheckSickOrOk(db) ){ return 0; } - if( !db || db->mallocFailed ){ + if( !db || db->mallocFailed || db->errSchema==0 ){ return 0; } - iDb = ((db->errCode >> 24) & 0x7f) - 1; - if( iDb<0 ) return 0; - return db->aDb[iDb].zDbSName; + assert( db->errSchema>0 && db->errSchema<=db->nDb ); + return db->aDb[db->errSchema-1].zDbSName; } /* @@ -3377,7 +3372,7 @@ static int openDatabase( } } sqlite3_mutex_enter(db->mutex); - db->errMask = (flags & SQLITE_OPEN_EXRESCODE)!=0 ? 0x00ffffff : 0xff; + db->errMask = (flags & SQLITE_OPEN_EXRESCODE)!=0 ? 0xffffffff : 0xff; db->nDb = 2; db->eOpenState = SQLITE_STATE_BUSY; db->aDb = db->aDbStatic; @@ -4111,7 +4106,7 @@ int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - db->errMask = onoff ? 0x00ffffff : 0xff; + db->errMask = onoff ? 0xffffffff : 0xff; sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } diff --git a/src/shell.c.in b/src/shell.c.in index 3b797223ad..dba3d1b2b9 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -12499,7 +12499,9 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ rc = shell_exec(p, zSql, &zErrMsg); END_TIMER(p->out); if( rc || zErrMsg ){ - char zPrefix[100]; + sqlite3_str *pPrefix = sqlite3_str_new(0); + char *zPrefix; + const char *zSchema; const char *zErrorTail; const char *zErrorType; if( zErrMsg==0 ){ @@ -12516,12 +12518,22 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ zErrorTail = zErrMsg; } if( in!=0 || !stdin_is_interactive ){ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, - "%s near line %d:", zErrorType, startline); + sqlite3_str_appendf(pPrefix, + "%s near line %d", zErrorType, startline); }else{ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType); + sqlite3_str_appendf(pPrefix, "%s", zErrorType); } - sqlite3_fprintf(stderr,"%s %s\n", zPrefix, zErrorTail); + zSchema = sqlite3_error_schema(p->db); + if( zSchema ){ + const char *zFilename = sqlite3_db_filename(p->db, zSchema); + sqlite3_str_appendf(pPrefix, ", schema \"%s\"", zSchema); + if( zFilename ){ + sqlite3_str_appendf(pPrefix, ", file \"%s\"", zFilename); + } + } + zPrefix = sqlite3_str_finish(pPrefix); + sqlite3_fprintf(stderr,"%s: %s\n", zPrefix, zErrorTail); + sqlite3_free(zPrefix); sqlite3_free(zErrMsg); zErrMsg = 0; return 1; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 76ca7d3a0d..dedec38835 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1685,6 +1685,7 @@ struct sqlite3 { u8 dfltLockMode; /* Default locking-mode for attached dbs */ signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ u8 suppressErr; /* Do not issue error messages if true */ + u8 errSchema; /* Schema in which error occurs */ u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ u8 mTrace; /* zero or more SQLITE_TRACE flags */ @@ -1816,11 +1817,6 @@ struct sqlite3 { */ #define HI(X) ((u64)(X)<<32) -/* -** Combine a schema index with an error code. -*/ -#define ERRCODE_WITH_SCHEMA(E,X) (((X)<<24)|(E)) - /* ** Possible values for the sqlite3.flags. ** diff --git a/src/util.c b/src/util.c index 8e4fd516ef..ee4f9fa41c 100644 --- a/src/util.c +++ b/src/util.c @@ -145,6 +145,7 @@ void sqlite3ErrorClear(sqlite3 *db){ assert( db!=0 ); db->errCode = SQLITE_OK; db->errByteOffset = -1; + db->errSchema = 0; if( db->pErr ) sqlite3ValueSetNull(db->pErr); } diff --git a/src/vdbe.c b/src/vdbe.c index 0465ba27a8..521fa625ee 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4128,6 +4128,7 @@ case OP_Transaction: { p->rc = rc; goto vdbe_return; } + db->errSchema = pOp->p1+1; goto abort_due_to_error; } @@ -4190,7 +4191,10 @@ case OP_Transaction: { ** reprepared, changeCntOn will be set again. */ p->changeCntOn = 0; } - if( rc ) goto abort_due_to_error; + if( rc ){ + db->errSchema = pOp->p1+1; + goto abort_due_to_error; + } break; }