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

Use the difference between the SQLITE_IOERR_SHORT_READ and SQLITE_IOERR_READ

returns from sqlite3OsRead() to make decisions about what to do with the
error. (CVS 3503)

FossilOrigin-Name: 6324ea811eec1200cee89e6f377368eaf2fcda77
This commit is contained in:
drh
2006-11-06 21:20:25 +00:00
parent 382765866b
commit 551b77365e
8 changed files with 39 additions and 37 deletions

View File

@@ -1,5 +1,5 @@
C Fix\sa\sbug\sin\sthe\soptimizer\sthat\swas\scausing\sit\sto\smiss\san\sOR\soptimization\nopportunity.\s(CVS\s3502) C Use\sthe\sdifference\sbetween\sthe\sSQLITE_IOERR_SHORT_READ\sand\sSQLITE_IOERR_READ\nreturns\sfrom\ssqlite3OsRead()\sto\smake\sdecisions\sabout\swhat\sto\sdo\swith\sthe\nerror.\s(CVS\s3503)
D 2006-11-06T15:10:05 D 2006-11-06T21:20:26
F Makefile.in 8e14898d41a53033ecb687d93c9cd5d109fb9ae3 F Makefile.in 8e14898d41a53033ecb687d93c9cd5d109fb9ae3
F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -57,7 +57,7 @@ F src/alter.c 2c79ec40f65e33deaf90ca493422c74586e481a3
F src/analyze.c 7d2b7ab9a9c2fd6e55700f69064dfdd3e36d7a8a F src/analyze.c 7d2b7ab9a9c2fd6e55700f69064dfdd3e36d7a8a
F src/attach.c b11eb4d5d3fb99a10a626956bccc7215f6b68b16 F src/attach.c b11eb4d5d3fb99a10a626956bccc7215f6b68b16
F src/auth.c 902f4722661c796b97f007d9606bd7529c02597f F src/auth.c 902f4722661c796b97f007d9606bd7529c02597f
F src/btree.c 6c6a106d47e9c18047ab8740d3c9712b20ecd754 F src/btree.c c9d52b0827d80238e6ded523deec0cee20456fe2
F src/btree.h 061c50e37de7f50b58528e352d400cf33ead7418 F src/btree.h 061c50e37de7f50b58528e352d400cf33ead7418
F src/build.c 7199949a6a3449e9ec69408cc79a48ed04fd0b85 F src/build.c 7199949a6a3449e9ec69408cc79a48ed04fd0b85
F src/callback.c fd9bb39f7ff6b52bad8365617abc61c720640429 F src/callback.c fd9bb39f7ff6b52bad8365617abc61c720640429
@@ -77,16 +77,16 @@ F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
F src/os.c 59f05de8c5777c34876607114a2fbe55ae578235 F src/os.c 59f05de8c5777c34876607114a2fbe55ae578235
F src/os.h fa6fcf5e4614a20ca2c90cddda0b40199360f27e F src/os.h fa6fcf5e4614a20ca2c90cddda0b40199360f27e
F src/os_common.h 545426356f0868a6765e70cb59e319d3acad0ed6 F src/os_common.h 545426356f0868a6765e70cb59e319d3acad0ed6
F src/os_os2.c 361964755f361b5ba879549c201284ce61ee9431 F src/os_os2.c c1bfc0c326f63caf0c94ab5523010ce0f5458070
F src/os_os2.h e5f17dd69333632bbc3112881ea407c37d245eb3 F src/os_os2.h e5f17dd69333632bbc3112881ea407c37d245eb3
F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c
F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3
F src/os_unix.c 523b674d93e0017320bb48b83fc0f9c9d07d3548 F src/os_unix.c f9a46b57af055b2c02ec040c86ab74111eca12e8
F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e
F src/os_win.c 1be3a56e96eae0561c000ba70428294a1621960d F src/os_win.c 06e11389bd7680adb75865e5e8ee48e28d2352e5
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
F src/pager.c a1293bb4d318cfa9fa7100a08c38ad5598cb4436 F src/pager.c 3114c819a6cb86a2499396819c5fd6f4f8165546
F src/pager.h 0cff9de5e9019cb695a04d18df8caaaff933a272 F src/pager.h 2e6d42f4ae004ae748a037b8468112b851c447a7
F src/parse.y 8c79a1debbd92a4f5609511e9bf0222de78f5ecb F src/parse.y 8c79a1debbd92a4f5609511e9bf0222de78f5ecb
F src/pragma.c 2ef4353448e202961a22312f34695128bbb6d69a F src/pragma.c 2ef4353448e202961a22312f34695128bbb6d69a
F src/prepare.c 3d9a1bb0644e8bccb3b78cb0833d269719237f4e F src/prepare.c 3d9a1bb0644e8bccb3b78cb0833d269719237f4e
@@ -419,7 +419,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
P 35c8c4781736d45019d8b823b8517c24622d3313 P 9bf153b54c6e9ba16914dedd9e2949f32d7550ea
R 72648fe2d8ddbd1ade2ac2a1d6675f54 R b573ccb3eff0c85b71bcf63ab1ad1984
U drh U drh
Z 542e53251a657546cd65151f3319f13c Z 3b4e8d75bb8a7df67499084016ece007

View File

@@ -1 +1 @@
9bf153b54c6e9ba16914dedd9e2949f32d7550ea 6324ea811eec1200cee89e6f377368eaf2fcda77

View File

@@ -9,7 +9,7 @@
** May you share freely, never taking more than you give. ** May you share freely, never taking more than you give.
** **
************************************************************************* *************************************************************************
** $Id: btree.c,v 1.329 2006/11/01 12:08:41 drh Exp $ ** $Id: btree.c,v 1.330 2006/11/06 21:20:26 drh Exp $
** **
** This file implements a external (disk-based) database using BTrees. ** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to ** For a detailed discussion of BTrees, refer to
@@ -1549,8 +1549,13 @@ int sqlite3BtreeOpen(
return SQLITE_NOMEM; return SQLITE_NOMEM;
} }
rc = sqlite3pager_open(&pBt->pPager, zFilename, EXTRA_SIZE, flags); rc = sqlite3pager_open(&pBt->pPager, zFilename, EXTRA_SIZE, flags);
if( rc==SQLITE_OK ){
rc = sqlite3pager_read_fileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);
}
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
if( pBt->pPager ) sqlite3pager_close(pBt->pPager); if( pBt->pPager ){
sqlite3pager_close(pBt->pPager);
}
sqliteFree(pBt); sqliteFree(pBt);
sqliteFree(p); sqliteFree(p);
*ppBtree = 0; *ppBtree = 0;
@@ -1563,7 +1568,6 @@ int sqlite3BtreeOpen(
pBt->pCursor = 0; pBt->pCursor = 0;
pBt->pPage1 = 0; pBt->pPage1 = 0;
pBt->readOnly = sqlite3pager_isreadonly(pBt->pPager); pBt->readOnly = sqlite3pager_isreadonly(pBt->pPager);
sqlite3pager_read_fileheader(pBt->pPager, sizeof(zDbHeader), zDbHeader);
pBt->pageSize = get2byte(&zDbHeader[16]); pBt->pageSize = get2byte(&zDbHeader[16]);
if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
|| ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){

View File

@@ -290,7 +290,7 @@ int os2Read( OsFile *id, void *pBuf, int amt ){
SimulateIOError( return SQLITE_IOERR ); SimulateIOError( return SQLITE_IOERR );
TRACE3( "READ %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); TRACE3( "READ %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype );
DosRead( ((os2File*)id)->h, pBuf, amt, &got ); DosRead( ((os2File*)id)->h, pBuf, amt, &got );
return (got == (ULONG)amt) ? SQLITE_OK : SQLITE_IOERR; return (got == (ULONG)amt) ? SQLITE_OK : SQLITE_IOERR_SHORT_READ;
} }
/* /*

View File

@@ -1026,7 +1026,7 @@ static int unixRead(OsFile *id, void *pBuf, int amt){
TRACE5("READ %-3d %5d %7d %d\n", ((unixFile*)id)->h, got, TRACE5("READ %-3d %5d %7d %d\n", ((unixFile*)id)->h, got,
last_page, TIMER_ELAPSED); last_page, TIMER_ELAPSED);
SEEK(0); SEEK(0);
SimulateIOError( got=0 ); SimulateIOError( got = -1 );
if( got==amt ){ if( got==amt ){
return SQLITE_OK; return SQLITE_OK;
}else if( got<0 ){ }else if( got<0 ){

View File

@@ -993,12 +993,14 @@ static int winRead(OsFile *id, void *pBuf, int amt){
SimulateIOError(return SQLITE_IOERR); SimulateIOError(return SQLITE_IOERR);
TRACE3("READ %d lock=%d\n", ((winFile*)id)->h, ((winFile*)id)->locktype); TRACE3("READ %d lock=%d\n", ((winFile*)id)->h, ((winFile*)id)->locktype);
if( !ReadFile(((winFile*)id)->h, pBuf, amt, &got, 0) ){ if( !ReadFile(((winFile*)id)->h, pBuf, amt, &got, 0) ){
got = 0; got = -1;
} }
if( got==(DWORD)amt ){ if( got==(DWORD)amt ){
return SQLITE_OK; return SQLITE_OK;
}else if( goc<0 ){
return SQLITE_IOERR_READ;
}else{ }else{
return SQLITE_IOERR; return SQLITE_IOERR_SHORT_READ;
} }
} }

View File

@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while ** file simultaneously, or one process from reading the database while
** another is writing. ** another is writing.
** **
** @(#) $Id: pager.c,v 1.274 2006/10/03 19:05:19 drh Exp $ ** @(#) $Id: pager.c,v 1.275 2006/11/06 21:20:26 drh Exp $
*/ */
#ifndef SQLITE_OMIT_DISKIO #ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -1798,14 +1798,19 @@ void enable_simulated_io_errors(void){
** response is to zero the memory at pDest and continue. A real IO error ** response is to zero the memory at pDest and continue. A real IO error
** will presumably recur and be picked up later (Todo: Think about this). ** will presumably recur and be picked up later (Todo: Think about this).
*/ */
void sqlite3pager_read_fileheader(Pager *pPager, int N, unsigned char *pDest){ int sqlite3pager_read_fileheader(Pager *pPager, int N, unsigned char *pDest){
int rc = SQLITE_OK;
memset(pDest, 0, N); memset(pDest, 0, N);
if( MEMDB==0 ){ if( MEMDB==0 ){
disable_simulated_io_errors(); disable_simulated_io_errors();
sqlite3OsSeek(pPager->fd, 0); sqlite3OsSeek(pPager->fd, 0);
sqlite3OsRead(pPager->fd, pDest, N);
enable_simulated_io_errors(); enable_simulated_io_errors();
rc = sqlite3OsRead(pPager->fd, pDest, N);
if( rc==SQLITE_IOERR_SHORT_READ ){
rc = SQLITE_OK;
}
} }
return rc;
} }
/* /*
@@ -2789,19 +2794,10 @@ int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage){
} }
TRACE3("FETCH %d page %d\n", PAGERID(pPager), pPg->pgno); TRACE3("FETCH %d page %d\n", PAGERID(pPager), pPg->pgno);
CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3);
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
i64 fileSize; pPg->pgno = 0;
int rc2 = sqlite3OsFileSize(pPager->fd, &fileSize); sqlite3pager_unref(PGHDR_TO_DATA(pPg));
if( rc2!=SQLITE_OK || fileSize>=pgno*pPager->pageSize ){ return rc;
/* An IO error occured in one of the the sqlite3OsSeek() or
** sqlite3OsRead() calls above. */
pPg->pgno = 0;
sqlite3pager_unref(PGHDR_TO_DATA(pPg));
return rc;
}else{
clear_simulated_io_error();
memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize);
}
}else{ }else{
TEST_INCR(pPager->nRead); TEST_INCR(pPager->nRead);
} }

View File

@@ -13,7 +13,7 @@
** subsystem. The page cache subsystem reads and writes a file a page ** subsystem. The page cache subsystem reads and writes a file a page
** at a time and provides a journal for rollback. ** at a time and provides a journal for rollback.
** **
** @(#) $Id: pager.h,v 1.51 2006/08/08 13:51:43 drh Exp $ ** @(#) $Id: pager.h,v 1.52 2006/11/06 21:20:26 drh Exp $
*/ */
#ifndef _PAGER_H_ #ifndef _PAGER_H_
@@ -75,7 +75,7 @@ void sqlite3pager_set_busyhandler(Pager*, BusyHandler *pBusyHandler);
void sqlite3pager_set_destructor(Pager*, void(*)(void*,int)); void sqlite3pager_set_destructor(Pager*, void(*)(void*,int));
void sqlite3pager_set_reiniter(Pager*, void(*)(void*,int)); void sqlite3pager_set_reiniter(Pager*, void(*)(void*,int));
int sqlite3pager_set_pagesize(Pager*, int); int sqlite3pager_set_pagesize(Pager*, int);
void sqlite3pager_read_fileheader(Pager*, int, unsigned char*); int sqlite3pager_read_fileheader(Pager*, int, unsigned char*);
void sqlite3pager_set_cachesize(Pager*, int); void sqlite3pager_set_cachesize(Pager*, int);
int sqlite3pager_close(Pager *pPager); int sqlite3pager_close(Pager *pPager);
int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage); int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage);