aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-12-06 17:23:38 +0000
committerdrh <drh@noemail.net>2013-12-06 17:23:38 +0000
commit3fee8a63c8bea86450439c3320cb1d5f9050413a (patch)
tree4b8c3b24c3fc501384418b757fc87fd6b7c1b3a2 /src
parent1b1f30bb5e9fe8e508c8953f4d29d29cb155a510 (diff)
downloadsqlite-3fee8a63c8bea86450439c3320cb1d5f9050413a.tar.gz
sqlite-3fee8a63c8bea86450439c3320cb1d5f9050413a.zip
Only error out on a database file move when attempting to start a write
transaction. Assume read transactions are still safe. And make the error SQLITE_READONLY_DBMOVED instead of SQLITE_IOERR_NODB. FossilOrigin-Name: 28348f2ada98c616241a51aecb70b63e87e6ddbb
Diffstat (limited to 'src')
-rw-r--r--src/pager.c28
-rw-r--r--src/sqlite.h.in2
-rw-r--r--src/test_vfstrace.c2
3 files changed, 17 insertions, 15 deletions
diff --git a/src/pager.c b/src/pager.c
index 78cb78ab2..5803b2927 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -4799,7 +4799,7 @@ int sqlite3PagerOpen(
/* Verify that the database file has not be deleted or renamed out from
** under the pager. Return SQLITE_OK if the database is still were it ought
-** to be on disk. Return non-zero (SQLITE_IOERR_NODB or some other error
+** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error
** code from sqlite3OsAccess()) if the database has gone missing.
*/
static int databaseIsUnmoved(Pager *pPager){
@@ -4814,7 +4814,7 @@ static int databaseIsUnmoved(Pager *pPager){
dc = sqlite3OsDeviceCharacteristics(pPager->fd);
if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK;
rc = sqlite3OsAccess(pPager->pVfs, pPager->zFilename, SQLITE_ACCESS_EXISTS, &x);
- if( rc==SQLITE_OK && !x ) rc = SQLITE_IOERR_NODB;
+ if( rc==SQLITE_OK && !x ) rc = SQLITE_READONLY_DBMOVED;
return rc;
}
@@ -4991,10 +4991,6 @@ int sqlite3PagerSharedLock(Pager *pPager){
goto failed;
}
- /* Verify that the database is unmoved and undeleted */
- rc = databaseIsUnmoved(pPager);
- if( rc ) goto failed;
-
/* If a journal file exists, and there is no RESERVED lock on the
** database file, then it either needs to be played back or deleted.
*/
@@ -5498,13 +5494,19 @@ static int pager_open_journal(Pager *pPager){
(SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
(SQLITE_OPEN_MAIN_JOURNAL)
);
- #ifdef SQLITE_ENABLE_ATOMIC_WRITE
- rc = sqlite3JournalOpen(
- pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
- );
- #else
- rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
- #endif
+
+ /* Verify that the database still has the same name as it did when
+ ** it was originally opened. */
+ rc = databaseIsUnmoved(pPager);
+ if( rc==SQLITE_OK ){
+#ifdef SQLITE_ENABLE_ATOMIC_WRITE
+ rc = sqlite3JournalOpen(
+ pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
+ );
+#else
+ rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
+#endif
+ }
}
assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
}
diff --git a/src/sqlite.h.in b/src/sqlite.h.in
index de6b59b0b..f4692f286 100644
--- a/src/sqlite.h.in
+++ b/src/sqlite.h.in
@@ -475,7 +475,6 @@ int sqlite3_exec(
#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8))
#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8))
#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8))
-#define SQLITE_IOERR_NODB (SQLITE_IOERR | (27<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
@@ -487,6 +486,7 @@ int sqlite3_exec(
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
+#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8))
#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8))
#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8))
diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c
index 8d56cf894..c1792f116 100644
--- a/src/test_vfstrace.c
+++ b/src/test_vfstrace.c
@@ -262,7 +262,7 @@ static void vfstrace_print_errcode(
case SQLITE_IOERR_SEEK: zVal = "SQLITE_IOERR_SEEK"; break;
case SQLITE_IOERR_GETTEMPPATH: zVal = "SQLITE_IOERR_GETTEMPPATH"; break;
case SQLITE_IOERR_CONVPATH: zVal = "SQLITE_IOERR_CONVPATH"; break;
- case SQLITE_IOERR_NODB: zVal = "SQLITE_IOERR_NODB"; break;
+ case SQLITE_READONLY_DBMOVED: zVal = "SQLITE_READONLY_DBMOVED"; break;
case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break;
case SQLITE_BUSY_RECOVERY: zVal = "SQLITE_BUSY_RECOVERY"; break;
case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break;