mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Fix for ticket #146: Correctly handle reads of unused disk blocks at the
end of the file. (CVS 743) FossilOrigin-Name: f5c2654768a6201fc554b59f1b2f56bcce738bc4
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Always\sfill\sin\sthe\s5th\sparameter\sto\ssqlite_exec\sif\sthere\sis\san\serror.\s(CVS\s742)
|
C Fix\sfor\sticket\s#146:\sCorrectly\shandle\sreads\sof\sunused\sdisk\sblocks\sat\sthe\nend\sof\sthe\sfile.\s(CVS\s743)
|
||||||
D 2002-09-03T19:43:24
|
D 2002-09-05T16:08:27
|
||||||
F Makefile.in 420fada882179cb72ffd07313f3fd693f9f06640
|
F Makefile.in 420fada882179cb72ffd07313f3fd693f9f06640
|
||||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@@ -30,9 +30,9 @@ F src/hash.h cd0433998bc1a3759d244e1637fe5a3c13b53bf8
|
|||||||
F src/insert.c a2f5455009904476b43ec5304a181b505235f72f
|
F src/insert.c a2f5455009904476b43ec5304a181b505235f72f
|
||||||
F src/main.c 367c0d2c72457dacddea28b5ba6634ffeaa9aa67
|
F src/main.c 367c0d2c72457dacddea28b5ba6634ffeaa9aa67
|
||||||
F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
|
F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
|
||||||
F src/os.c 00d10655e1dc9a52b4aabca58c8d8e45048057b0
|
F src/os.c 091a89297bf80927cde146cd1dbf89c908864f3a
|
||||||
F src/os.h 3009379b06941e7796a9812d1b6cbc59b26248c8
|
F src/os.h 3009379b06941e7796a9812d1b6cbc59b26248c8
|
||||||
F src/pager.c 4b0169e91b34f6ff91e8feb57545c43e4d6eb370
|
F src/pager.c b5365348606252dee8d831912d916218df8f8720
|
||||||
F src/pager.h 6991c9c2dc5e4c7f2df4d4ba47d1c6458f763a32
|
F src/pager.h 6991c9c2dc5e4c7f2df4d4ba47d1c6458f763a32
|
||||||
F src/parse.y 818b03a73f6b3b8b284b515c5b1d9998d4663dc3
|
F src/parse.y 818b03a73f6b3b8b284b515c5b1d9998d4663dc3
|
||||||
F src/printf.c 5c50fc1da75c8f5bf432b1ad17d91d6653acd167
|
F src/printf.c 5c50fc1da75c8f5bf432b1ad17d91d6653acd167
|
||||||
@@ -151,7 +151,7 @@ F www/speed.tcl a20a792738475b68756ea7a19321600f23d1d803
|
|||||||
F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
|
F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
|
||||||
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
||||||
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
||||||
P dd8867fc479891ed8fa36c5cf2359e49c6754a8c
|
P 7f8fd5c75d614f81ef87f0fc952c341cbc5076d0
|
||||||
R cad73f796bba24cb230a5c691e09b6af
|
R e7c2b185d8c4a6f19fc472c4852f3827
|
||||||
U drh
|
U drh
|
||||||
Z 60c2dd392b7d08c0b58d2cfa671b9836
|
Z fa53bc156cff8bbf22e6de1d4e9ed324
|
||||||
|
@@ -1 +1 @@
|
|||||||
7f8fd5c75d614f81ef87f0fc952c341cbc5076d0
|
f5c2654768a6201fc554b59f1b2f56bcce738bc4
|
44
src/os.c
44
src/os.c
@@ -479,8 +479,12 @@ int sqliteOsRead(OsFile *id, void *pBuf, int amt){
|
|||||||
SimulateIOError(SQLITE_IOERR);
|
SimulateIOError(SQLITE_IOERR);
|
||||||
TRACE2("READ %d\n", last_page);
|
TRACE2("READ %d\n", last_page);
|
||||||
got = read(id->fd, pBuf, amt);
|
got = read(id->fd, pBuf, amt);
|
||||||
if( got<0 ) got = 0;
|
/* if( got<0 ) got = 0; */
|
||||||
return got==amt ? SQLITE_OK : SQLITE_IOERR;
|
if( got==amt ){
|
||||||
|
return SQLITE_OK;
|
||||||
|
}else{
|
||||||
|
return SQLITE_IOERR;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if OS_WIN
|
#if OS_WIN
|
||||||
DWORD got;
|
DWORD got;
|
||||||
@@ -488,7 +492,11 @@ int sqliteOsRead(OsFile *id, void *pBuf, int amt){
|
|||||||
if( !ReadFile(id->h, pBuf, amt, &got, 0) ){
|
if( !ReadFile(id->h, pBuf, amt, &got, 0) ){
|
||||||
got = 0;
|
got = 0;
|
||||||
}
|
}
|
||||||
return got==amt ? SQLITE_OK : SQLITE_IOERR;
|
if( got==amt ){
|
||||||
|
return SQLITE_OK;
|
||||||
|
}else{
|
||||||
|
return SQLITE_IOERR;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,17 +506,27 @@ int sqliteOsRead(OsFile *id, void *pBuf, int amt){
|
|||||||
*/
|
*/
|
||||||
int sqliteOsWrite(OsFile *id, const void *pBuf, int amt){
|
int sqliteOsWrite(OsFile *id, const void *pBuf, int amt){
|
||||||
#if OS_UNIX
|
#if OS_UNIX
|
||||||
int wrote;
|
int wrote = 0;
|
||||||
SimulateIOError(SQLITE_IOERR);
|
SimulateIOError(SQLITE_IOERR);
|
||||||
TRACE2("WRITE %d\n", last_page);
|
TRACE2("WRITE %d\n", last_page);
|
||||||
wrote = write(id->fd, pBuf, amt);
|
while( amt>0 && (wrote = write(id->fd, pBuf, amt))>0 ){
|
||||||
if( wrote<amt ) return SQLITE_FULL;
|
amt -= wrote;
|
||||||
|
pBuf = &((char*)pBuf)[wrote];
|
||||||
|
}
|
||||||
|
if( amt>0 ){
|
||||||
|
return SQLITE_FULL;
|
||||||
|
}
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
#endif
|
#endif
|
||||||
#if OS_WIN
|
#if OS_WIN
|
||||||
|
int rc;
|
||||||
DWORD wrote;
|
DWORD wrote;
|
||||||
SimulateIOError(SQLITE_IOERR);
|
SimulateIOError(SQLITE_IOERR);
|
||||||
if( !WriteFile(id->h, pBuf, amt, &wrote, 0) || (int)wrote<amt ){
|
while( amt>0 && (rc = WriteFile(id->h, pBuf, amt, &wrote, 0))!=0 && wrote>0 ){
|
||||||
|
amt -= wrote;
|
||||||
|
pBuf = &((char*)pBuf)[wrote];
|
||||||
|
}
|
||||||
|
if( !rc || amt>(int)wrote ){
|
||||||
return SQLITE_FULL;
|
return SQLITE_FULL;
|
||||||
}
|
}
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
@@ -537,10 +555,18 @@ int sqliteOsSync(OsFile *id){
|
|||||||
SimulateIOError(SQLITE_IOERR);
|
SimulateIOError(SQLITE_IOERR);
|
||||||
TRACE1("SYNC\n");
|
TRACE1("SYNC\n");
|
||||||
#if OS_UNIX
|
#if OS_UNIX
|
||||||
return fsync(id->fd)==0 ? SQLITE_OK : SQLITE_IOERR;
|
if( fsync(id->fd) ){
|
||||||
|
return SQLITE_IOERR;
|
||||||
|
}else{
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if OS_WIN
|
#if OS_WIN
|
||||||
return FlushFileBuffers(id->h) ? SQLITE_OK : SQLITE_IOERR;
|
if( FlushFileBuffers(id->h) ){
|
||||||
|
return SQLITE_OK;
|
||||||
|
}else{
|
||||||
|
return SQLITE_IOERR;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
src/pager.c
18
src/pager.c
@@ -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.51 2002/08/13 00:01:17 drh Exp $
|
** @(#) $Id: pager.c,v 1.52 2002/09/05 16:08:27 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "pager.h"
|
#include "pager.h"
|
||||||
@@ -1003,7 +1003,13 @@ int sqlitepager_get(Pager *pPager, Pgno pgno, void **ppPage){
|
|||||||
sqliteOsSeek(&pPager->fd, (pgno-1)*SQLITE_PAGE_SIZE);
|
sqliteOsSeek(&pPager->fd, (pgno-1)*SQLITE_PAGE_SIZE);
|
||||||
rc = sqliteOsRead(&pPager->fd, PGHDR_TO_DATA(pPg), SQLITE_PAGE_SIZE);
|
rc = sqliteOsRead(&pPager->fd, PGHDR_TO_DATA(pPg), SQLITE_PAGE_SIZE);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
return rc;
|
int fileSize;
|
||||||
|
if( sqliteOsFileSize(&pPager->fd,&fileSize)!=SQLITE_OK
|
||||||
|
|| fileSize>=pgno*SQLITE_PAGE_SIZE ){
|
||||||
|
return rc;
|
||||||
|
}else{
|
||||||
|
memset(PGHDR_TO_DATA(pPg), 0, SQLITE_PAGE_SIZE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pPager->nExtra>0 ){
|
if( pPager->nExtra>0 ){
|
||||||
@@ -1155,7 +1161,9 @@ int sqlitepager_begin(void *pData){
|
|||||||
}
|
}
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
rc = pager_unwritelock(pPager);
|
rc = pager_unwritelock(pPager);
|
||||||
if( rc==SQLITE_OK ) rc = SQLITE_FULL;
|
if( rc==SQLITE_OK ){
|
||||||
|
rc = SQLITE_FULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
@@ -1363,7 +1371,9 @@ int sqlitepager_commit(Pager *pPager){
|
|||||||
|
|
||||||
if( pPager->errMask==PAGER_ERR_FULL ){
|
if( pPager->errMask==PAGER_ERR_FULL ){
|
||||||
rc = sqlitepager_rollback(pPager);
|
rc = sqlitepager_rollback(pPager);
|
||||||
if( rc==SQLITE_OK ) rc = SQLITE_FULL;
|
if( rc==SQLITE_OK ){
|
||||||
|
rc = SQLITE_FULL;
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
if( pPager->errMask!=0 ){
|
if( pPager->errMask!=0 ){
|
||||||
|
Reference in New Issue
Block a user