1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

If an EXCEPTION_IN_PAGE_ERROR exception is caught, make the underlying OS error code available via sqlite3_system_errno().

FossilOrigin-Name: fdb20e9ee48465b94aa6ac3c5e263ecaa7c3b10f4a193e79f965b7c35944b08b
This commit is contained in:
dan
2021-09-10 21:28:56 +00:00
parent ee7c667a36
commit 9023444fea
9 changed files with 94 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
C Change\sthe\sstructuree\sexception\shandler\sin\swal.c\sto\scatch\sEXCEPTION_IN_PAGE_ERROR\sinstead\sof\sEXCEPTION_ACCESS_VIOLATION. C If\san\sEXCEPTION_IN_PAGE_ERROR\sexception\sis\scaught,\smake\sthe\sunderlying\sOS\serror\scode\savailable\svia\ssqlite3_system_errno().
D 2021-08-26T21:12:07.088 D 2021-09-10T21:28:56.797
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -531,8 +531,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5
F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.c 555cff0be2d255827dbc93761c0265d077faf34f31b65ccf16d76d053dfd0467
F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/pager.h 53b3ba002dbc7568608489f67c249224102d10f372c098a1a9dd58308bc76d3c
F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb
F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
@@ -546,7 +546,7 @@ F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
F src/select.c 0577308f097363b6ebac223e210418810acf74e677f580597f7d0718476fe3ef F src/select.c 0577308f097363b6ebac223e210418810acf74e677f580597f7d0718476fe3ef
F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346
F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite.h.in 79d8c9a7e9886851243183e4b610022d87e6dd73bf2e1218d3105ab4577af9a0
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510
F src/sqliteInt.h a65ddfb177549c82dcd1374a2f23260328eb65ced55b50843419386177e159be F src/sqliteInt.h a65ddfb177549c82dcd1374a2f23260328eb65ced55b50843419386177e159be
@@ -614,7 +614,7 @@ F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de
F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/util.c a14724ed2a504488c34bd3a510ae33e46be00d0b80296651aba3a3d36303e460
F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45
F src/vdbe.c e5cdac52d7163c032ae3c54f1cff9391acd23ba79cea0d5a9524c00cc0a856e8 F src/vdbe.c e5cdac52d7163c032ae3c54f1cff9391acd23ba79cea0d5a9524c00cc0a856e8
F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe
@@ -628,8 +628,8 @@ F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb7
F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c
F src/vtab.c 88404ac1517903b3eb2abe256772ee95bb09f81ac0a17e13afe5d467df4de4ee F src/vtab.c 88404ac1517903b3eb2abe256772ee95bb09f81ac0a17e13afe5d467df4de4ee
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 75bcffce59a3108ad3e24c186977821ffe5083ab2044ff477a5bbc4a9e8a5455 F src/wal.c 8cc813d34b345728987b78bcb0a02f7b6e4734031eea1feb1b6d1d0e56ac5a21
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/wal.h 04a9e53121d5076f2a173b0f2facb39d33047093fee71bd3bbe6b1f6f1f5fd4b
F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac
F src/where.c 99b6e13664a7bd9a553c554978d0e253066995dade621f44cffa8928c8b493b5 F src/where.c 99b6e13664a7bd9a553c554978d0e253066995dade621f44cffa8928c8b493b5
F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b
@@ -1739,7 +1739,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8
F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20
F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768
F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68
F test/walseh1.test 7aff09e275a10a4b140f0a34c9da55de2d3747582590f16b638831e1dd7396b2 F test/walseh1.test 5a94409fb1a7029070040286336fef5ce61315121123e25cfb7e0622b017e59d
F test/walsetlk.test 3185bebc90557e0d611442c8d64f7a0cb7b06f8e156eea37a4a7358f722715be F test/walsetlk.test 3185bebc90557e0d611442c8d64f7a0cb7b06f8e156eea37a4a7358f722715be
F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f
@@ -1921,7 +1921,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P e480146f49004c818ad93464289761d8a7246b502bd079f8140d0a6f684ebe4e P 0c6ab539cfbc908550fa993a587e85d644b6335853ff9781caae860c461c045d
R e565d7a955f7dfbceec6b3e9d7245e4b R 33294cd0e1de3328b05fc8fdf4f59e56
U dan U dan
Z 2c7b74af84f6da4d9875b4b1565fc82a Z ff4d8e1dd5c81ec2fdd90cee5190a162

View File

@@ -1 +1 @@
0c6ab539cfbc908550fa993a587e85d644b6335853ff9781caae860c461c045d fdb20e9ee48465b94aa6ac3c5e263ecaa7c3b10f4a193e79f965b7c35944b08b

View File

@@ -7706,4 +7706,10 @@ int sqlite3PagerWalFramesize(Pager *pPager){
} }
#endif #endif
#ifdef SQLITE_USE_SEH
int sqlite3PagerWalSystemErrno(Pager *pPager){
return sqlite3WalSystemErrno(pPager->pWal);
}
#endif
#endif /* SQLITE_OMIT_DISKIO */ #endif /* SQLITE_OMIT_DISKIO */

View File

@@ -239,4 +239,8 @@ void sqlite3PagerRekey(DbPage*, Pgno, u16);
# define enable_simulated_io_errors() # define enable_simulated_io_errors()
#endif #endif
#ifdef SQLITE_USE_SEH
int sqlite3PagerWalSystemErrno(Pager*);
#endif
#endif /* SQLITE_PAGER_H */ #endif /* SQLITE_PAGER_H */

View File

@@ -528,6 +528,7 @@ int sqlite3_exec(
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8))
#define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) #define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8))
#define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))

View File

@@ -136,6 +136,23 @@ void sqlite3ErrorClear(sqlite3 *db){
*/ */
void sqlite3SystemError(sqlite3 *db, int rc){ void sqlite3SystemError(sqlite3 *db, int rc){
if( rc==SQLITE_IOERR_NOMEM ) return; if( rc==SQLITE_IOERR_NOMEM ) return;
#ifdef SQLITE_USE_SEH
if( rc==SQLITE_IOERR_IN_PAGE ){
int ii;
int iErr;
sqlite3BtreeEnterAll(db);
for(ii=0; ii<db->nDb; ii++){
if( db->aDb[ii].pBt ){
iErr = sqlite3PagerWalSystemErrno(sqlite3BtreePager(db->aDb[ii].pBt));
if( iErr ){
db->iSysErrno = iErr;
}
}
}
sqlite3BtreeLeaveAll(db);
return;
}
#endif
rc &= 0xff; rc &= 0xff;
if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){
db->iSysErrno = sqlite3OsGetLastError(db->pVfs); db->iSysErrno = sqlite3OsGetLastError(db->pVfs);

View File

@@ -534,6 +534,7 @@ struct Wal {
#ifdef SQLITE_USE_SEH #ifdef SQLITE_USE_SEH
u32 lockMask; /* Mask of locks held */ u32 lockMask; /* Mask of locks held */
void *pFree; /* Pointer to sqlite3_free() if exception thrown */ void *pFree; /* Pointer to sqlite3_free() if exception thrown */
int iSysErrno; /* System error code following exception */
#endif #endif
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
u8 lockError; /* True if a locking error has occurred */ u8 lockError; /* True if a locking error has occurred */
@@ -628,7 +629,7 @@ struct WalIterator {
# define SEH_EXCEPT(X) \ # define SEH_EXCEPT(X) \
VVA_ONLY(pWal->nSehTry--); \ VVA_ONLY(pWal->nSehTry--); \
assert( pWal->nSehTry==0 ); \ assert( pWal->nSehTry==0 ); \
} __except( sehExceptionFilter(pWal, GetExceptionCode()) ){ X } } __except( sehExceptionFilter(pWal, GetExceptionCode(), GetExceptionInformation() ) ){ X }
# define SEH_INJECT_FAULT sehInjectFault(pWal) # define SEH_INJECT_FAULT sehInjectFault(pWal)
@@ -638,9 +639,12 @@ struct WalIterator {
** indicates that the exception may have been caused by accessing the *-shm ** indicates that the exception may have been caused by accessing the *-shm
** file mapping. Or EXCEPTION_CONTINUE_SEARCH otherwise. ** file mapping. Or EXCEPTION_CONTINUE_SEARCH otherwise.
*/ */
static int sehExceptionFilter(Wal *pWal, int eCode){ static int sehExceptionFilter(Wal *pWal, int eCode, EXCEPTION_POINTERS *p){
VVA_ONLY(pWal->nSehTry--); VVA_ONLY(pWal->nSehTry--);
if( eCode==EXCEPTION_IN_PAGE_ERROR ){ if( eCode==EXCEPTION_IN_PAGE_ERROR ){
if( p && p->ExceptionRecord && p->ExceptionRecord->NumberParameters>=3 ){
pWal->iSysErrno = (int)p->ExceptionRecord->ExceptionInformation[2];
}
return EXCEPTION_EXECUTE_HANDLER; return EXCEPTION_EXECUTE_HANDLER;
} }
return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_SEARCH;
@@ -653,10 +657,17 @@ static int sehExceptionFilter(Wal *pWal, int eCode){
** has been invalidated. ** has been invalidated.
*/ */
static void sehInjectFault(Wal *pWal){ static void sehInjectFault(Wal *pWal){
assert( pWal->nSehTry>0 ); int res;
if( sqlite3FaultSim(650) ){ assert( pWal->nSehTry>0 );
RaiseException(EXCEPTION_IN_PAGE_ERROR, 0, 0, NULL);
} res = sqlite3FaultSim(650);
if( res!=0 ){
ULONG aArg[3];
aArg[0] = 0;
aArg[1] = 0;
aArg[2] = (ULONG)res;
RaiseException(EXCEPTION_IN_PAGE_ERROR, 0, 3, aArg);
}
} }
/* /*
@@ -2353,7 +2364,7 @@ static int walHandleException(Wal *pWal){
} }
sqlite3_free(pWal->pFree); sqlite3_free(pWal->pFree);
pWal->pFree = 0; pWal->pFree = 0;
return SQLITE_IOERR; return SQLITE_IOERR_IN_PAGE;
} }
/* /*
@@ -2379,6 +2390,20 @@ static int walAssertLockmask(Wal *pWal){
} }
return 1; return 1;
} }
/*
** Return and zero the "system error" field set when an
** EXCEPTION_IN_PAGE_ERROR exception is caught.
*/
int sqlite3WalSystemErrno(Wal *pWal){
int iRet = 0;
if( pWal ){
iRet = pWal->iSysErrno;
pWal->iSysErrno = 0;
}
return iRet;
}
#else #else
# define walAssertLockmask(x) 1 # define walAssertLockmask(x) 1
#endif /* ifdef SQLITE_USE_SEH */ #endif /* ifdef SQLITE_USE_SEH */
@@ -3151,7 +3176,7 @@ int sqlite3WalSnapshotRecover(Wal *pWal){
SEH_TRY { SEH_TRY {
rc = walSnapshotRecover(pWal, pBuf1, pBuf2); rc = walSnapshotRecover(pWal, pBuf1, pBuf2);
} }
SEH_EXCEPT( rc = SQLITE_IOERR; ) SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
pWal->ckptLock = 0; pWal->ckptLock = 0;
} }
@@ -3436,7 +3461,7 @@ int sqlite3WalFindFrame(
SEH_TRY { SEH_TRY {
rc = walFindFrame(pWal, pgno, piRead); rc = walFindFrame(pWal, pgno, piRead);
} }
SEH_EXCEPT( rc = SQLITE_IOERR; ) SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
return rc; return rc;
} }
@@ -3526,7 +3551,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){
rc = SQLITE_BUSY_SNAPSHOT; rc = SQLITE_BUSY_SNAPSHOT;
} }
} }
SEH_EXCEPT( rc = SQLITE_IOERR; ) SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
@@ -3593,7 +3618,7 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
} }
if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal);
} }
SEH_EXCEPT( rc = SQLITE_IOERR; ) SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
} }
return rc; return rc;
} }
@@ -3640,7 +3665,7 @@ int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){
SEH_TRY { SEH_TRY {
walCleanupHash(pWal); walCleanupHash(pWal);
} }
SEH_EXCEPT( rc = SQLITE_IOERR; ) SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
} }
return rc; return rc;

View File

@@ -151,5 +151,9 @@ int sqlite3WalWriteLock(Wal *pWal, int bLock);
void sqlite3WalDb(Wal *pWal, sqlite3 *db); void sqlite3WalDb(Wal *pWal, sqlite3 *db);
#endif #endif
#ifdef SQLITE_USE_SEH
int sqlite3WalSystemErrno(Wal*);
#endif
#endif /* ifndef SQLITE_OMIT_WAL */ #endif /* ifndef SQLITE_OMIT_WAL */
#endif /* SQLITE_WAL_H */ #endif /* SQLITE_WAL_H */

View File

@@ -16,10 +16,11 @@ source $testdir/malloc_common.tcl
set testprefix walseh1 set testprefix walseh1
set ::seh_countdown 0 set ::seh_countdown 0
set ::seh_errno 10
proc seh_faultsim_callback {iFault} { proc seh_faultsim_callback {iFault} {
if {$iFault==650} { if {$iFault==650} {
incr ::seh_countdown -1 incr ::seh_countdown -1
if {$::seh_countdown==0} { return 1 } if {$::seh_countdown==0} { return $::seh_errno }
} }
return 0 return 0
} }
@@ -31,6 +32,7 @@ proc seh_injectuninstall {} {
sqlite3_test_control_fault_install sqlite3_test_control_fault_install
} }
proc seh_injectstart {iFail} { proc seh_injectstart {iFail} {
set ::seh_errno [expr 2+$iFail*10]
set ::seh_countdown $iFail set ::seh_countdown $iFail
} }
proc seh_injectstop {} { proc seh_injectstop {} {
@@ -47,6 +49,13 @@ set FAULTSIM(seh) [list \
-injectuninstall seh_injectuninstall \ -injectuninstall seh_injectuninstall \
] ]
proc test_system_errno {db expect} {
set serrno [sqlite3_system_errno $db]
if {$serrno!=$expect} {
error "surprising system_errno. Expected $expect, got $serrno"
}
}
do_execsql_test 1.0 { do_execsql_test 1.0 {
PRAGMA journal_mode = wal; PRAGMA journal_mode = wal;
CREATE TABLE t1(x, y); CREATE TABLE t1(x, y);
@@ -64,6 +73,7 @@ do_faultsim_test 1 -faults seh -prep {
execsql { SELECT * FROM t1 } db2 execsql { SELECT * FROM t1 } db2
} -test { } -test {
faultsim_test_result {0 {1 2 3 4}} faultsim_test_result {0 {1 2 3 4}}
if {$testrc} { test_system_errno db2 $::seh_errno }
} }
catch { db2 close } catch { db2 close }
@@ -76,6 +86,7 @@ do_faultsim_test 2 -faults seh -prep {
execsql { SELECT * FROM t1 } execsql { SELECT * FROM t1 }
} -test { } -test {
faultsim_test_result {0 {1 2 3 4}} faultsim_test_result {0 {1 2 3 4}}
if {$testrc} { test_system_errno db $::seh_errno }
} }
do_faultsim_test 3 -faults seh -prep { do_faultsim_test 3 -faults seh -prep {