Index: src/btree.c ================================================================== --- src/btree.c +++ src/btree.c @@ -2391,10 +2391,12 @@ rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, pageSize-usableSize); return rc; } if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){ + sqlite3_log(SQLITE_CORRUPT, "nPage=%d nPageFile=%d", nPage, nPageFile); + sqlite3PagerLogDiagnostics(pBt->pPager); rc = SQLITE_CORRUPT_BKPT; goto page1_init_failed; } if( usableSize<480 ){ goto page1_init_failed; Index: src/os_win.c ================================================================== --- src/os_win.c +++ src/os_win.c @@ -1303,26 +1303,24 @@ /* ** Determine the current size of a file in bytes */ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ - DWORD upperBits; - DWORD lowerBits; + BY_HANDLE_FILE_INFORMATION info; winFile *pFile = (winFile*)id; - DWORD error; assert( id!=0 ); SimulateIOError(return SQLITE_IOERR_FSTAT); - lowerBits = GetFileSize(pFile->h, &upperBits); - if( (lowerBits == INVALID_FILE_SIZE) - && ((error = GetLastError()) != NO_ERROR) ) - { - pFile->lastErrno = error; + + memset(&info, 0, sizeof(BY_HANDLE_FILE_INFORMATION)); + if( GetFileInformationByHandle(pFile->h, &info) ){ + *pSize = (((u64)info.nFileSizeHigh)<<32) + info.nFileSizeLow; + return SQLITE_OK; + }else{ + pFile->lastErrno = GetLastError(); return winLogError(SQLITE_IOERR_FSTAT, "winFileSize", pFile->zPath); } - *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; - return SQLITE_OK; } /* ** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. */ Index: src/pager.c ================================================================== --- src/pager.c +++ src/pager.c @@ -3089,10 +3089,29 @@ } *pnPage = nPage; return SQLITE_OK; } + +/* Log diagnostic information about the pager */ +void sqlite3PagerLogDiagnostics(Pager *pPager){ + int rc; + i64 n; + sqlite3_log(SQLITE_INTERNAL, "Pager filename=[%s]", pPager->zFilename); + sqlite3_log(SQLITE_INTERNAL, "Pager journal=[%s]", pPager->zJournal); + sqlite3_log(SQLITE_INTERNAL, + "Pager diagnostics: pWal=%p isOpen=%d pageSize=%d dbSize=%d eState=%d", + pPager->pWal, isOpen(pPager->fd)!=0, + pPager->pageSize, pPager->dbSize, pPager->eState + ); + if( isOpen(pPager->fd) ){ + n = 0; + rc = sqlite3OsFileSize(pPager->fd, &n); + sqlite3_log(SQLITE_INTERNAL, "Pager OsFileSize: %lld (%d)", n, rc); + } +} + #ifndef SQLITE_OMIT_WAL /* ** Check if the *-wal file that corresponds to the database opened by pPager ** exists if the database is not empy, or verify that the *-wal file does Index: src/pager.h ================================================================== --- src/pager.h +++ src/pager.h @@ -153,10 +153,11 @@ sqlite3_file *sqlite3PagerFile(Pager*); const char *sqlite3PagerJournalname(Pager*); int sqlite3PagerNosync(Pager*); void *sqlite3PagerTempSpace(Pager*); int sqlite3PagerIsMemdb(Pager*); +void sqlite3PagerLogDiagnostics(Pager*); /* Functions used to truncate the database file. */ void sqlite3PagerTruncateImage(Pager*,Pgno); #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) Index: src/printf.c ================================================================== --- src/printf.c +++ src/printf.c @@ -187,10 +187,11 @@ /* ** On machines with a small stack size, you can redefine the ** SQLITE_PRINT_BUF_SIZE to be less than 350. */ +#define SQLITE_PRINT_BUF_SIZE 2000 #ifndef SQLITE_PRINT_BUF_SIZE # if defined(SQLITE_SMALL_STACK) # define SQLITE_PRINT_BUF_SIZE 50 # else # define SQLITE_PRINT_BUF_SIZE 350