From: drh Date: Mon, 19 Dec 2005 16:29:07 +0000 (+0000) Subject: Backport the fix for ticket #1567 into the 3.2 branch. (CVS 2829) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=523de6a830d449434238c24d9f544ee849137d17;p=thirdparty%2Fsqlite.git Backport the fix for ticket #1567 into the 3.2 branch. (CVS 2829) FossilOrigin-Name: 33397742282425351157a92785f83f10ad564af7 --- diff --git a/manifest b/manifest index 2710153f78..a8f3f09d8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.2.7\s(CVS\s2736) -D 2005-09-24T15:25:02 +C Backport\sthe\sfix\sfor\sticket\s#1567\sinto\sthe\s3.2\sbranch.\s(CVS\s2829) +D 2005-12-19T16:29:07 F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1 F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -51,13 +51,9 @@ F src/main.c 422014201f22aa17b96c76650163178a91a825af F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070 F src/os.h c51f2747f7bd1840447e2c7d26db749604626814 F src/os_common.h 1ff88c7e7e6bd3e5f85443106c91cc26a4f8600b -F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c -F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 F src/os_unix.c 407dd07818d13807c396acf3f7570af81cbb666c -F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e F src/os_win.c fbccc85e7011174068c27d54256746321a1f0059 -F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c adbb27f13ac75cd5bc29a3d84803e0cab1edfa88 +F src/pager.c b74ebe5aca00ad5f831e19ae17193fe7b83a7ddf F src/pager.h e7b41ce8e7b5f629d456708b7ad9a8c8ede37140 F src/parse.y 5602d5cb894dda2932bf50b7e88782a4440ae3ae F src/pragma.c 126149668aa7086e86cfa3e32c8523513c19dd63 @@ -313,7 +309,7 @@ F www/tclsqlite.tcl ddcf912ea48695603c8ed7efb29f0812ef8d1b49 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 70937d5cfa10eda66d926d378f30f9961a7822bf -R af00b18d3b228afdf6d336b083e69571 +P bd141a7c12c779d15d81acc8f919c37b9a4aa40b +R c2a2bdbb8d671b0a1ed76ecafc6f275d U drh -Z 9a3b0e42ce1a552d5db88eb833f8f0b1 +Z d0a414841c8beaeb0e58d8273f2508f2 diff --git a/manifest.uuid b/manifest.uuid index 4bf401c461..2ea0c2865b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd141a7c12c779d15d81acc8f919c37b9a4aa40b \ No newline at end of file +33397742282425351157a92785f83f10ad564af7 \ No newline at end of file diff --git a/src/os_test.c b/src/os_test.c deleted file mode 100644 index 9b1c0e206f..0000000000 --- a/src/os_test.c +++ /dev/null @@ -1,463 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains code that is specific to Unix systems. It is used -** for testing SQLite only. -*/ -#if OS_TEST /* This file is used for the test backend only */ -#include "sqliteInt.h" -#include "os.h" /* Must be first to enable large file support */ - -#define sqlite3OsOpenReadWrite sqlite3RealOpenReadWrite -#define sqlite3OsOpenExclusive sqlite3RealOpenExclusive -#define sqlite3OsOpenReadOnly sqlite3RealOpenReadOnly -#define sqlite3OsOpenDirectory sqlite3RealOpenDirectory -#define sqlite3OsClose sqlite3RealClose -#define sqlite3OsRead sqlite3RealRead -#define sqlite3OsWrite sqlite3RealWrite -#define sqlite3OsSeek sqlite3RealSeek -#define sqlite3OsSync sqlite3RealSync -#define sqlite3OsTruncate sqlite3RealTruncate -#define sqlite3OsFileSize sqlite3RealFileSize -#define sqlite3OsLock sqlite3RealLock -#define sqlite3OsUnlock sqlite3RealUnlock -#define sqlite3OsCheckReservedLock sqlite3RealCheckReservedLock - -#define OsFile OsRealFile -#define OS_UNIX 1 -#include "os_unix.c" -#undef OS_UNIX -#undef OsFile - -#undef sqlite3OsOpenReadWrite -#undef sqlite3OsOpenExclusive -#undef sqlite3OsOpenReadOnly -#undef sqlite3OsOpenDirectory -#undef sqlite3OsClose -#undef sqlite3OsRead -#undef sqlite3OsWrite -#undef sqlite3OsSeek -#undef sqlite3OsSync -#undef sqlite3OsTruncate -#undef sqlite3OsFileSize -#undef sqlite3OsLock -#undef sqlite3OsUnlock -#undef sqlite3OsCheckReservedLock - -#define BLOCKSIZE 512 -#define BLOCK_OFFSET(x) ((x) * BLOCKSIZE) - - -/* -** The following variables control when a simulated crash occurs. -** -** If iCrashDelay is non-zero, then zCrashFile contains (full path) name of -** a file that SQLite will call sqlite3OsSync() on. Each time this happens -** iCrashDelay is decremented. If iCrashDelay is zero after being -** decremented, a "crash" occurs during the sync() operation. -** -** In other words, a crash occurs the iCrashDelay'th time zCrashFile is -** synced. -*/ -static int iCrashDelay = 0; -char zCrashFile[256]; - -/* -** Set the value of the two crash parameters. -*/ -void sqlite3SetCrashParams(int iDelay, char const *zFile){ - sqlite3OsEnterMutex(); - assert( strlen(zFile)<256 ); - strcpy(zCrashFile, zFile); - iCrashDelay = iDelay; - sqlite3OsLeaveMutex(); -} - -/* -** File zPath is being sync()ed. Return non-zero if this should -** cause a crash. -*/ -static int crashRequired(char const *zPath){ - int r; - int n; - sqlite3OsEnterMutex(); - n = strlen(zCrashFile); - if( zCrashFile[n-1]=='*' ){ - n--; - }else if( strlen(zPath)>n ){ - n = strlen(zPath); - } - r = 0; - if( iCrashDelay>0 && strncmp(zPath, zCrashFile, n)==0 ){ - iCrashDelay--; - if( iCrashDelay<=0 ){ - r = 1; - } - } - sqlite3OsLeaveMutex(); - return r; -} - - -static OsTestFile *pAllFiles = 0; - -/* -** Initialise the os_test.c specific fields of pFile. -*/ -static void initFile(OsFile *id, char const *zName){ - OsTestFile *pFile = (OsTestFile *) - sqliteMalloc(sizeof(OsTestFile) + strlen(zName)+1); - pFile->nMaxWrite = 0; - pFile->nBlk = 0; - pFile->apBlk = 0; - pFile->zName = (char *)(&pFile[1]); - strcpy(pFile->zName, zName); - *id = pFile; - pFile->pNext = pAllFiles; - pAllFiles = pFile; -} - -/* -** Undo the work done by initFile. Delete the OsTestFile structure -** and unlink the structure from the pAllFiles list. -*/ -static void closeFile(OsFile *id){ - OsTestFile *pFile = *id; - if( pFile==pAllFiles ){ - pAllFiles = pFile->pNext; - }else{ - OsTestFile *p; - for(p=pAllFiles; p->pNext!=pFile; p=p->pNext ){ - assert( p ); - } - p->pNext = pFile->pNext; - } - sqliteFree(pFile); - *id = 0; -} - -/* -** Return the current seek offset from the start of the file. This -** is unix-only code. -*/ -static i64 osTell(OsTestFile *pFile){ - return lseek(pFile->fd.h, 0, SEEK_CUR); -} - -/* -** Load block 'blk' into the cache of pFile. -*/ -static int cacheBlock(OsTestFile *pFile, int blk){ - if( blk>=pFile->nBlk ){ - int n = ((pFile->nBlk * 2) + 100 + blk); - /* if( pFile->nBlk==0 ){ printf("DIRTY %s\n", pFile->zName); } */ - pFile->apBlk = (u8 **)sqliteRealloc(pFile->apBlk, n * sizeof(u8*)); - if( !pFile->apBlk ) return SQLITE_NOMEM; - memset(&pFile->apBlk[pFile->nBlk], 0, (n - pFile->nBlk)*sizeof(u8*)); - pFile->nBlk = n; - } - - if( !pFile->apBlk[blk] ){ - i64 filesize; - int rc; - - u8 *p = sqliteMalloc(BLOCKSIZE); - if( !p ) return SQLITE_NOMEM; - pFile->apBlk[blk] = p; - - rc = sqlite3RealFileSize(&pFile->fd, &filesize); - if( rc!=SQLITE_OK ) return rc; - - if( BLOCK_OFFSET(blk)fd, blk*BLOCKSIZE); - if( BLOCK_OFFSET(blk+1)>filesize ){ - len = filesize - BLOCK_OFFSET(blk); - } - if( rc!=SQLITE_OK ) return rc; - rc = sqlite3RealRead(&pFile->fd, p, len); - if( rc!=SQLITE_OK ) return rc; - } - } - - return SQLITE_OK; -} - -/* #define TRACE_WRITECACHE */ - -/* -** Write the cache of pFile to disk. If crash is non-zero, randomly -** skip blocks when writing. The cache is deleted before returning. -*/ -static int writeCache2(OsTestFile *pFile, int crash){ - int i; - int nMax = pFile->nMaxWrite; - i64 offset; - int rc = SQLITE_OK; - - offset = osTell(pFile); - for(i=0; inBlk; i++){ - u8 *p = pFile->apBlk[i]; - if( p ){ - int skip = 0; - int trash = 0; - if( crash ){ - char random; - sqlite3Randomness(1, &random); - if( random & 0x01 ){ - if( random & 0x02 ){ - trash = 1; -#ifdef TRACE_WRITECACHE -printf("Trashing block %d of %s\n", i, pFile->zName); -#endif - }else{ - skip = 1; -#ifdef TRACE_WRITECACHE -printf("Skiping block %d of %s\n", i, pFile->zName); -#endif - } - }else{ -#ifdef TRACE_WRITECACHE -printf("Writing block %d of %s\n", i, pFile->zName); -#endif - } - } - if( rc==SQLITE_OK ){ - rc = sqlite3RealSeek(&pFile->fd, BLOCK_OFFSET(i)); - } - if( rc==SQLITE_OK && !skip ){ - int len = BLOCKSIZE; - if( BLOCK_OFFSET(i+1)>nMax ){ - len = nMax-BLOCK_OFFSET(i); - } - if( len>0 ){ - if( trash ){ - sqlite3Randomness(len, p); - } - rc = sqlite3RealWrite(&pFile->fd, p, len); - } - } - sqliteFree(p); - } - } - sqliteFree(pFile->apBlk); - pFile->nBlk = 0; - pFile->apBlk = 0; - pFile->nMaxWrite = 0; - - if( rc==SQLITE_OK ){ - rc = sqlite3RealSeek(&pFile->fd, offset); - } - return rc; -} - -/* -** Write the cache to disk. -*/ -static int writeCache(OsTestFile *pFile){ - if( pFile->apBlk ){ - int c = crashRequired(pFile->zName); - if( c ){ - OsTestFile *p; -#ifdef TRACE_WRITECACHE - printf("\nCrash during sync of %s\n", pFile->zName); -#endif - for(p=pAllFiles; p; p=p->pNext){ - writeCache2(p, 1); - } - exit(-1); - }else{ - return writeCache2(pFile, 0); - } - } - return SQLITE_OK; -} - -/* -** Close the file. -*/ -int sqlite3OsClose(OsFile *id){ - if( !(*id) ) return SQLITE_OK; - if( (*id)->fd.isOpen ){ - /* printf("CLOSE %s (%d blocks)\n", (*id)->zName, (*id)->nBlk); */ - writeCache(*id); - sqlite3RealClose(&(*id)->fd); - } - closeFile(id); - return SQLITE_OK; -} - -int sqlite3OsRead(OsFile *id, void *pBuf, int amt){ - i64 offset; /* The current offset from the start of the file */ - i64 end; /* The byte just past the last byte read */ - int blk; /* Block number the read starts on */ - int i; - u8 *zCsr; - int rc = SQLITE_OK; - OsTestFile *pFile = *id; - - offset = osTell(pFile); - end = offset+amt; - blk = (offset/BLOCKSIZE); - - zCsr = (u8 *)pBuf; - for(i=blk; i*BLOCKSIZE end ){ - len = len - (BLOCK_OFFSET(i+1)-end); - } - - if( inBlk && pFile->apBlk[i]){ - u8 *pBlk = pFile->apBlk[i]; - memcpy(zCsr, &pBlk[off], len); - }else{ - rc = sqlite3RealSeek(&pFile->fd, BLOCK_OFFSET(i) + off); - if( rc!=SQLITE_OK ) return rc; - rc = sqlite3RealRead(&pFile->fd, zCsr, len); - if( rc!=SQLITE_OK ) return rc; - } - - zCsr += len; - } - assert( zCsr==&((u8 *)pBuf)[amt] ); - - rc = sqlite3RealSeek(&pFile->fd, end); - return rc; -} - -int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){ - i64 offset; /* The current offset from the start of the file */ - i64 end; /* The byte just past the last byte written */ - int blk; /* Block number the write starts on */ - int i; - const u8 *zCsr; - int rc = SQLITE_OK; - OsTestFile *pFile = *id; - - offset = osTell(pFile); - end = offset+amt; - blk = (offset/BLOCKSIZE); - - zCsr = (u8 *)pBuf; - for(i=blk; i*BLOCKSIZEapBlk[i]; - assert( pBlk ); - - if( BLOCK_OFFSET(i) < offset ){ - off = offset-BLOCK_OFFSET(i); - } - len = BLOCKSIZE - off; - if( BLOCK_OFFSET(i+1) > end ){ - len = len - (BLOCK_OFFSET(i+1)-end); - } - memcpy(&pBlk[off], zCsr, len); - zCsr += len; - } - if( pFile->nMaxWritenMaxWrite = end; - } - assert( zCsr==&((u8 *)pBuf)[amt] ); - - rc = sqlite3RealSeek(&pFile->fd, end); - return rc; -} - -/* -** Sync the file. First flush the write-cache to disk, then call the -** real sync() function. -*/ -int sqlite3OsSync(OsFile *id, int dataOnly){ - int rc; - /* printf("SYNC %s (%d blocks)\n", (*id)->zName, (*id)->nBlk); */ - rc = writeCache(*id); - if( rc!=SQLITE_OK ) return rc; - rc = sqlite3RealSync(&(*id)->fd, dataOnly); - return rc; -} - -/* -** Truncate the file. Set the internal OsFile.nMaxWrite variable to the new -** file size to ensure that nothing in the write-cache past this point -** is written to disk. -*/ -int sqlite3OsTruncate(OsFile *id, i64 nByte){ - (*id)->nMaxWrite = nByte; - return sqlite3RealTruncate(&(*id)->fd, nByte); -} - -/* -** Return the size of the file. If the cache contains a write that extended -** the file, then return this size instead of the on-disk size. -*/ -int sqlite3OsFileSize(OsFile *id, i64 *pSize){ - int rc = sqlite3RealFileSize(&(*id)->fd, pSize); - if( rc==SQLITE_OK && pSize && *pSize<(*id)->nMaxWrite ){ - *pSize = (*id)->nMaxWrite; - } - return rc; -} - -/* -** The three functions used to open files. All that is required is to -** initialise the os_test.c specific fields and then call the corresponding -** os_unix.c function to really open the file. -*/ -int sqlite3OsOpenReadWrite(const char *zFilename, OsFile *id, int *pReadonly){ - initFile(id, zFilename); - return sqlite3RealOpenReadWrite(zFilename, &(*id)->fd, pReadonly); -} -int sqlite3OsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){ - initFile(id, zFilename); - return sqlite3RealOpenExclusive(zFilename, &(*id)->fd, delFlag); -} -int sqlite3OsOpenReadOnly(const char *zFilename, OsFile *id){ - initFile(id, zFilename); - return sqlite3RealOpenReadOnly(zFilename, &(*id)->fd); -} - -/* -** These six function calls are passed straight through to the os_unix.c -** backend. -*/ -int sqlite3OsSeek(OsFile *id, i64 offset){ - return sqlite3RealSeek(&(*id)->fd, offset); -} -int sqlite3OsCheckReservedLock(OsFile *id){ - return sqlite3RealCheckReservedLock(&(*id)->fd); -} -int sqlite3OsLock(OsFile *id, int locktype){ - return sqlite3RealLock(&(*id)->fd, locktype); -} -int sqlite3OsUnlock(OsFile *id, int locktype){ - return sqlite3RealUnlock(&(*id)->fd, locktype); -} -int sqlite3OsOpenDirectory(const char *zDirname, OsFile *id){ - return sqlite3RealOpenDirectory(zDirname, &(*id)->fd); -} - -#endif /* OS_TEST */ diff --git a/src/os_test.h b/src/os_test.h deleted file mode 100644 index dc0a04aae2..0000000000 --- a/src/os_test.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -*/ -#ifndef _SQLITE_OS_TEST_H_ -#define _SQLITE_OS_TEST_H_ - -#define OsFile OsRealFile -#define OS_UNIX 1 -#include "os_unix.h" -#undef OS_UNIX -#undef OsFile -#undef SET_FULLSYNC - -/* Include sqliteInt.h now to get the type u8. */ -#include "sqliteInt.h" - -typedef struct OsTestFile* OsFile; -typedef struct OsTestFile OsTestFile; -struct OsTestFile { - u8 **apBlk; /* Array of blocks that have been written to. */ - int nBlk; /* Size of apBlock. */ - int nMaxWrite; /* Largest offset written to. */ - char *zName; /* File name */ - OsRealFile fd; - OsTestFile *pNext; -}; - -void sqlite3SetCrashParams(int iDelay, char const *zFile); - -#endif /* _SQLITE_OS_UNIX_H_ */ diff --git a/src/os_unix.h b/src/os_unix.h deleted file mode 100644 index 5fdfc2ff4c..0000000000 --- a/src/os_unix.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file defined OS-specific features for Unix. -*/ -#ifndef _SQLITE_OS_UNIX_H_ -#define _SQLITE_OS_UNIX_H_ - -/* -** Helpful hint: To get this to compile on HP/UX, add -D_INCLUDE_POSIX_SOURCE -** to the compiler command line. -*/ - -/* -** These #defines should enable >2GB file support on Posix if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: RedHat 7.2) but you want your code to work -** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in RedHat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for MacOS. LFS is only supported on MacOS 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -/* -** standard include files. -*/ -#include -#include -#include -#include - -/* -** Macros used to determine whether or not to use threads. The -** SQLITE_UNIX_THREADS macro is defined if we are synchronizing for -** Posix threads and SQLITE_W32_THREADS is defined if we are -** synchronizing using Win32 threads. -*/ -#if defined(THREADSAFE) && THREADSAFE -# include -# define SQLITE_UNIX_THREADS 1 -#endif - -/* -** The OsFile structure is a operating-system independing representation -** of an open file handle. It is defined differently for each architecture. -** -** This is the definition for Unix. -** -** OsFile.locktype takes one of the values SHARED_LOCK, RESERVED_LOCK, -** PENDING_LOCK or EXCLUSIVE_LOCK. -*/ -typedef struct OsFile OsFile; -struct OsFile { - struct Pager *pPager; /* The pager that owns this OsFile. Might be 0 */ - struct openCnt *pOpen; /* Info about all open fd's on this inode */ - struct lockInfo *pLock; /* Info about locks on this inode */ - int h; /* The file descriptor */ - unsigned char locktype; /* The type of lock held on this fd */ - unsigned char isOpen; /* True if needs to be closed */ - unsigned char fullSync; /* Use F_FULLSYNC if available */ - int dirfd; /* File descriptor for the directory */ -#ifdef SQLITE_UNIX_THREADS - pthread_t tid; /* The thread authorized to use this OsFile */ -#endif -}; - -/* -** A macro to set the OsFile.fullSync flag, if it exists. -*/ -#define SET_FULLSYNC(x,y) ((x).fullSync = (y)) - -/* -** Maximum number of characters in a temporary file name -*/ -#define SQLITE_TEMPNAME_SIZE 200 - -/* -** Minimum interval supported by sqlite3OsSleep(). -*/ -#if defined(HAVE_USLEEP) && HAVE_USLEEP -# define SQLITE_MIN_SLEEP_MS 1 -#else -# define SQLITE_MIN_SLEEP_MS 1000 -#endif - -/* -** Default permissions when creating a new file -*/ -#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS -# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 -#endif - - -#endif /* _SQLITE_OS_UNIX_H_ */ diff --git a/src/os_win.h b/src/os_win.h deleted file mode 100644 index baf937b211..0000000000 --- a/src/os_win.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file defines OS-specific features for Win32 -*/ -#ifndef _SQLITE_OS_WIN_H_ -#define _SQLITE_OS_WIN_H_ - -#include -#include - -/* -** The OsFile structure is a operating-system independing representation -** of an open file handle. It is defined differently for each architecture. -** -** This is the definition for Win32. -*/ -typedef struct OsFile OsFile; -struct OsFile { - HANDLE h; /* Handle for accessing the file */ - unsigned char locktype; /* Type of lock currently held on this file */ - unsigned char isOpen; /* True if needs to be closed */ - short sharedLockByte; /* Randomly chosen byte used as a shared lock */ -}; - - -#define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) -#define SQLITE_MIN_SLEEP_MS 1 - - -#endif /* _SQLITE_OS_WIN_H_ */ diff --git a/src/pager.c b/src/pager.c index 74b55aa1cf..9b58e20eb5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.215 2005/09/17 15:20:27 drh Exp $ +** @(#) $Id: pager.c,v 1.215.2.1 2005/12/19 16:29:07 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -2981,7 +2981,7 @@ void sqlite3pager_dont_write(Pager *pPager, Pgno pgno){ pPg = pager_lookup(pPager, pgno); pPg->alwaysRollback = 1; - if( pPg && pPg->dirty ){ + if( pPg && pPg->dirty && !pPager->stmtInUse ){ if( pPager->dbSize==(int)pPg->pgno && pPager->origDbSizedbSize ){ /* If this pages is the last page in the file and the file has grown ** during the current transaction, then do NOT mark the page as clean.