Compare commits

...

3 Commits

Author SHA1 Message Date
drh dbfdbcdeb7 Fixes to sqlite3_error_schema().
FossilOrigin-Name: 706556ff094b42c50459e4c4d59323e5d4e88939771010caa94e6ea00553d23f
2025-08-04 17:45:42 +00:00
drh 96be4a368b The sqlite3_error_schema() interface now works for errors discovered
during OP_Transaction.

FossilOrigin-Name: 560f899662fb974f5ad844709c803ce50a628d3381fe26d4481a1e00c92dd3e5
2025-08-04 13:55:58 +00:00
drh fe263ce3a6 Prototype of the sqlite3_error_schema() interface. Non-functional.
FossilOrigin-Name: 715cb6035ea1b8b74c2a19180bbee9027ab8b57e9f2b55be5b512a983d79ba6a
2025-08-04 11:40:31 +00:00
8 changed files with 76 additions and 22 deletions
+12 -12
View File
@@ -1,5 +1,5 @@
C Minor\sdoc\stypo\sfix\sin\ssqliteLimit.h.
D 2025-08-04T11:20:31.998
C Fixes\sto\ssqlite3_error_schema().
D 2025-08-04T17:45:42.502
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 eb46066bf2f0bec2dd89229572de5a9c479c47da134e2422e7a0056e9510cbee
F src/main.c 464d3f12b728294240b71f659df9f76e08d79ad2010b112234622f9376db27f4
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/sqlite.h.in aa4b705018c98d135b1218e163abbde5b1c333952338eb7ed5adb3dcb5a65682
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 a54f83985985655d1276e9e356dd6ae19b8d0b62c2abc75cc9e8f402ea141207
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,8 +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 50234bc9e9fe58daf820ed5a1355f1d173728b5d33a7534244f1acff974baa30
R 4c13f1e1414427dd0a236f4709d9ca73
U stephan
Z 5ee4651eea51cd57517d27d32904605d
P 560f899662fb974f5ad844709c803ce50a628d3381fe26d4481a1e00c92dd3e5
R 08061ea3651a9e3318bbdfe53f73de1e
U drh
Z 5bc897eb3aa61abe0cab154c11fbedc4
# Remove this line to create a well-formed Fossil manifest.
+1 -1
View File
@@ -1 +1 @@
8bb315ef7429a60899f5afe878a3b1aa146b18eef2ac9f4d6eca98587a2255cd
706556ff094b42c50459e4c4d59323e5d4e88939771010caa94e6ea00553d23f
+25 -3
View File
@@ -2639,9 +2639,12 @@ int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){
rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt);
pnLog = 0;
pnCkpt = 0;
if( rc==SQLITE_BUSY ){
bBusy = 1;
rc = SQLITE_OK;
if( rc!=SQLITE_OK ){
db->errSchema = i+1;
if( rc==SQLITE_BUSY ){
bBusy = 1;
rc = SQLITE_OK;
}
}
}
}
@@ -2793,6 +2796,25 @@ int sqlite3_extended_errcode(sqlite3 *db){
}
int sqlite3_system_errno(sqlite3 *db){
return db ? db->iSysErrno : 0;
}
/*
** 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 or if there have been
** no errors reported.
*/
const char *sqlite3_error_schema(sqlite3 *db){
if( db==0
|| !sqlite3SafetyCheckSickOrOk(db)
|| db->mallocFailed
|| db->errSchema==0 /* Schema information not available */
|| db->errSchema>db->nDb /* nDb might have reduced since error occurred */
){
return 0;
}
assert( db->errSchema>0 && db->errSchema<=db->nDb );
return db->aDb[db->errSchema-1].zDbSName;
}
/*
+17 -5
View File
@@ -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;
+14
View File
@@ -4155,6 +4155,7 @@ void sqlite3_free_filename(sqlite3_filename);
** <li> sqlite3_errmsg()
** <li> sqlite3_errmsg16()
** <li> sqlite3_error_offset()
** <li> sqlite3_error_schema()
** </ul>
**
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
@@ -4200,6 +4201,19 @@ const void *sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errstr(int);
int sqlite3_error_offset(sqlite3 *db);
/*
** CAPI3REF: Schema associated with an error
**
** The sqlite3_error_schema(D) interface returns the name of a database schema
** that was the origin of the most recent error. The database schema is the
** name assigned to the database, such as "main" or "temp" or the name associated
** with an attached database. The sqlite3_error_schema(D) interface returns
** NULL if the most recent error is generic and is not associated with a
** particular database file (for example if the error is SQLITE_NOMEM), or if
** there have been no errors, or if the error code has been reset.
*/
const char *sqlite3_error_schema(sqlite3 *db);
/*
** CAPI3REF: Prepared Statement Object
** KEYWORDS: {prepared statement} {prepared statements}
+1
View File
@@ -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 */
+1
View File
@@ -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);
}
+5 -1
View File
@@ -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;
}