Index: third_party/sqlite/src/src/test6.c |
diff --git a/third_party/sqlite/src/src/test6.c b/third_party/sqlite/src/src/test6.c |
index c9c8a4d20f5b8b95d7a1dc31b9de14df3e34aa21..306482dcd30964268958e854eae4fb87bda06ad0 100644 |
--- a/third_party/sqlite/src/src/test6.c |
+++ b/third_party/sqlite/src/src/test6.c |
@@ -87,7 +87,7 @@ typedef struct WriteBuffer WriteBuffer; |
** an aligned write() of an integer number of 512 byte regions, then |
** option (3) above is never selected. Instead, each 512 byte region |
** is either correctly written or left completely untouched. Similar |
-** logic governs the behaviour if any of the other ATOMICXXX flags |
+** logic governs the behavior if any of the other ATOMICXXX flags |
** is set. |
** |
** If either the IOCAP_SAFEAPPEND or IOCAP_SEQUENTIAL flags are set |
@@ -133,9 +133,9 @@ struct CrashFile { |
** OsFileSize() calls. Although both could be done by traversing the |
** write-list, in practice this is impractically slow. |
*/ |
- int iSize; /* Size of file in bytes */ |
- int nData; /* Size of buffer allocated at zData */ |
u8 *zData; /* Buffer containing file contents */ |
+ int nData; /* Size of buffer allocated at zData */ |
+ i64 iSize; /* Size of file in bytes */ |
}; |
struct CrashGlobal { |
@@ -173,11 +173,8 @@ static void *crash_realloc(void *p, int n){ |
static int writeDbFile(CrashFile *p, u8 *z, i64 iAmt, i64 iOff){ |
int rc = SQLITE_OK; |
int iSkip = 0; |
- if( iOff==PENDING_BYTE && (p->flags&SQLITE_OPEN_MAIN_DB) ){ |
- iSkip = 512; |
- } |
if( (iAmt-iSkip)>0 ){ |
- rc = sqlite3OsWrite(p->pRealFile, &z[iSkip], iAmt-iSkip, iOff+iSkip); |
+ rc = sqlite3OsWrite(p->pRealFile, &z[iSkip], (int)(iAmt-iSkip), iOff+iSkip); |
} |
return rc; |
} |
@@ -306,14 +303,14 @@ static int writeListSync(CrashFile *pFile, int isCrash){ |
} |
case 3: { /* Trash sectors */ |
u8 *zGarbage; |
- int iFirst = (pWrite->iOffset/g.iSectorSize); |
- int iLast = (pWrite->iOffset+pWrite->nBuf-1)/g.iSectorSize; |
+ int iFirst = (int)(pWrite->iOffset/g.iSectorSize); |
+ int iLast = (int)((pWrite->iOffset+pWrite->nBuf-1)/g.iSectorSize); |
assert(pWrite->zBuf); |
#ifdef TRACE_CRASHTEST |
- printf("Trashing %d sectors @ sector %d (%s)\n", |
- 1+iLast-iFirst, iFirst, pWrite->pFile->zName |
+ printf("Trashing %d sectors @ %lld (sector %d) (%s)\n", |
+ 1+iLast-iFirst, pWrite->iOffset, iFirst, pWrite->pFile->zName |
); |
#endif |
@@ -409,13 +406,17 @@ static int cfRead( |
sqlite_int64 iOfst |
){ |
CrashFile *pCrash = (CrashFile *)pFile; |
+ int nCopy = (int)MIN((i64)iAmt, (pCrash->iSize - iOfst)); |
+ |
+ if( nCopy>0 ){ |
+ memcpy(zBuf, &pCrash->zData[iOfst], nCopy); |
+ } |
/* Check the file-size to see if this is a short-read */ |
- if( pCrash->iSize<(iOfst+iAmt) ){ |
+ if( nCopy<iAmt ){ |
return SQLITE_IOERR_SHORT_READ; |
} |
- memcpy(zBuf, &pCrash->zData[iOfst], iAmt); |
return SQLITE_OK; |
} |
@@ -430,7 +431,7 @@ static int cfWrite( |
){ |
CrashFile *pCrash = (CrashFile *)pFile; |
if( iAmt+iOfst>pCrash->iSize ){ |
- pCrash->iSize = iAmt+iOfst; |
+ pCrash->iSize = (int)(iAmt+iOfst); |
} |
while( pCrash->iSize>pCrash->nData ){ |
u8 *zNew; |
@@ -454,7 +455,7 @@ static int cfTruncate(sqlite3_file *pFile, sqlite_int64 size){ |
CrashFile *pCrash = (CrashFile *)pFile; |
assert(size>=0); |
if( pCrash->iSize>size ){ |
- pCrash->iSize = size; |
+ pCrash->iSize = (int)size; |
} |
return writeListAppend(pFile, size, 0, 0); |
} |
@@ -468,15 +469,23 @@ static int cfSync(sqlite3_file *pFile, int flags){ |
const char *zName = pCrash->zName; |
const char *zCrashFile = g.zCrashFile; |
- int nName = strlen(zName); |
- int nCrashFile = strlen(zCrashFile); |
+ int nName = (int)strlen(zName); |
+ int nCrashFile = (int)strlen(zCrashFile); |
if( nCrashFile>0 && zCrashFile[nCrashFile-1]=='*' ){ |
nCrashFile--; |
if( nName>nCrashFile ) nName = nCrashFile; |
} |
+#ifdef TRACE_CRASHTEST |
+ printf("cfSync(): nName = %d, nCrashFile = %d, zName = %s, zCrashFile = %s\n", |
+ nName, nCrashFile, zName, zCrashFile); |
+#endif |
+ |
if( nName==nCrashFile && 0==memcmp(zName, zCrashFile, nName) ){ |
+#ifdef TRACE_CRASHTEST |
+ printf("cfSync(): name matched, g.iCrash = %d\n", g.iCrash); |
+#endif |
if( (--g.iCrash)==0 ) isCrash = 1; |
} |
@@ -505,6 +514,16 @@ static int cfCheckReservedLock(sqlite3_file *pFile, int *pResOut){ |
return sqlite3OsCheckReservedLock(((CrashFile *)pFile)->pRealFile, pResOut); |
} |
static int cfFileControl(sqlite3_file *pFile, int op, void *pArg){ |
+ if( op==SQLITE_FCNTL_SIZE_HINT ){ |
+ CrashFile *pCrash = (CrashFile *)pFile; |
+ i64 nByte = *(i64 *)pArg; |
+ if( nByte>pCrash->iSize ){ |
+ if( SQLITE_OK==writeListAppend(pFile, nByte, 0, 0) ){ |
+ pCrash->iSize = (int)nByte; |
+ } |
+ } |
+ return SQLITE_OK; |
+ } |
return sqlite3OsFileControl(((CrashFile *)pFile)->pRealFile, op, pArg); |
} |
@@ -603,25 +622,24 @@ static int cfOpen( |
pWrapper->flags = flags; |
} |
if( rc==SQLITE_OK ){ |
- pWrapper->nData = (4096 + pWrapper->iSize); |
+ pWrapper->nData = (int)(4096 + pWrapper->iSize); |
pWrapper->zData = crash_malloc(pWrapper->nData); |
if( pWrapper->zData ){ |
/* os_unix.c contains an assert() that fails if the caller attempts |
** to read data from the 512-byte locking region of a file opened |
** with the SQLITE_OPEN_MAIN_DB flag. This region of a database file |
** never contains valid data anyhow. So avoid doing such a read here. |
+ ** |
+ ** UPDATE: It also contains an assert() verifying that each call |
+ ** to the xRead() method reads less than 128KB of data. |
*/ |
- const int isDb = (flags&SQLITE_OPEN_MAIN_DB); |
- i64 iChunk = pWrapper->iSize; |
- if( iChunk>PENDING_BYTE && isDb ){ |
- iChunk = PENDING_BYTE; |
- } |
+ i64 iOff; |
+ |
memset(pWrapper->zData, 0, pWrapper->nData); |
- rc = sqlite3OsRead(pReal, pWrapper->zData, iChunk, 0); |
- if( SQLITE_OK==rc && pWrapper->iSize>(PENDING_BYTE+512) && isDb ){ |
- i64 iOff = PENDING_BYTE+512; |
- iChunk = pWrapper->iSize - iOff; |
- rc = sqlite3OsRead(pReal, &pWrapper->zData[iOff], iChunk, iOff); |
+ for(iOff=0; iOff<pWrapper->iSize; iOff += 512){ |
+ int nRead = (int)(pWrapper->iSize - iOff); |
+ if( nRead>512 ) nRead = 512; |
+ rc = sqlite3OsRead(pReal, &pWrapper->zData[iOff], nRead, iOff); |
} |
}else{ |
rc = SQLITE_NOMEM; |
@@ -695,17 +713,18 @@ static int processDevSymArgs( |
char *zName; |
int iValue; |
} aFlag[] = { |
- { "atomic", SQLITE_IOCAP_ATOMIC }, |
- { "atomic512", SQLITE_IOCAP_ATOMIC512 }, |
- { "atomic1k", SQLITE_IOCAP_ATOMIC1K }, |
- { "atomic2k", SQLITE_IOCAP_ATOMIC2K }, |
- { "atomic4k", SQLITE_IOCAP_ATOMIC4K }, |
- { "atomic8k", SQLITE_IOCAP_ATOMIC8K }, |
- { "atomic16k", SQLITE_IOCAP_ATOMIC16K }, |
- { "atomic32k", SQLITE_IOCAP_ATOMIC32K }, |
- { "atomic64k", SQLITE_IOCAP_ATOMIC64K }, |
- { "sequential", SQLITE_IOCAP_SEQUENTIAL }, |
- { "safe_append", SQLITE_IOCAP_SAFE_APPEND }, |
+ { "atomic", SQLITE_IOCAP_ATOMIC }, |
+ { "atomic512", SQLITE_IOCAP_ATOMIC512 }, |
+ { "atomic1k", SQLITE_IOCAP_ATOMIC1K }, |
+ { "atomic2k", SQLITE_IOCAP_ATOMIC2K }, |
+ { "atomic4k", SQLITE_IOCAP_ATOMIC4K }, |
+ { "atomic8k", SQLITE_IOCAP_ATOMIC8K }, |
+ { "atomic16k", SQLITE_IOCAP_ATOMIC16K }, |
+ { "atomic32k", SQLITE_IOCAP_ATOMIC32K }, |
+ { "atomic64k", SQLITE_IOCAP_ATOMIC64K }, |
+ { "sequential", SQLITE_IOCAP_SEQUENTIAL }, |
+ { "safe_append", SQLITE_IOCAP_SAFE_APPEND }, |
+ { "powersafe_overwrite", SQLITE_IOCAP_POWERSAFE_OVERWRITE }, |
{ 0, 0 } |
}; |