Index: third_party/sqlite/src/ext/async/sqlite3async.c |
diff --git a/third_party/sqlite/src/ext/async/sqlite3async.c b/third_party/sqlite/src/ext/async/sqlite3async.c |
index a351eaa92261ebc48177fe716713f2207edae419..4ab39cac351ace28e1f59e7ceeb3bc570234e655 100644 |
--- a/third_party/sqlite/src/ext/async/sqlite3async.c |
+++ b/third_party/sqlite/src/ext/async/sqlite3async.c |
@@ -944,7 +944,7 @@ static int asyncFileControl(sqlite3_file *id, int op, void *pArg){ |
return SQLITE_OK; |
} |
} |
- return SQLITE_ERROR; |
+ return SQLITE_NOTFOUND; |
} |
/* |
@@ -1044,15 +1044,18 @@ static int asyncOpen( |
char *z; |
int isAsyncOpen = doAsynchronousOpen(flags); |
- /* If zName is NULL, then the upper layer is requesting an anonymous file */ |
+ /* If zName is NULL, then the upper layer is requesting an anonymous file. |
+ ** Otherwise, allocate enough space to make a copy of the file name (along |
+ ** with the second nul-terminator byte required by xOpen). |
+ */ |
if( zName ){ |
- nName = (int)strlen(zName)+1; |
+ nName = (int)strlen(zName); |
} |
nByte = ( |
sizeof(AsyncFileData) + /* AsyncFileData structure */ |
2 * pVfs->szOsFile + /* AsyncFileData.pBaseRead and pBaseWrite */ |
- nName /* AsyncFileData.zName */ |
+ nName + 2 /* AsyncFileData.zName */ |
); |
z = sqlite3_malloc(nByte); |
if( !z ){ |
@@ -1507,6 +1510,7 @@ static void asyncWriterThread(void){ |
case ASYNC_DELETE: |
ASYNC_TRACE(("DELETE %s\n", p->zBuf)); |
rc = pVfs->xDelete(pVfs, p->zBuf, (int)p->iOffset); |
+ if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK; |
break; |
case ASYNC_OPENEXCLUSIVE: { |