diff options
author | drh <drh@noemail.net> | 2009-04-30 13:30:32 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-04-30 13:30:32 +0000 |
commit | c47fd8e031a411a66d1c57833c35a3db37cec476 (patch) | |
tree | 6e6e4acb06400663d397c24e89fa4b3ff356e92d /src/attach.c | |
parent | 9b3c24d15d2336db21d3bbafcaf6268f4e170eef (diff) | |
download | sqlite-c47fd8e031a411a66d1c57833c35a3db37cec476.tar.gz sqlite-c47fd8e031a411a66d1c57833c35a3db37cec476.zip |
Disallow attaching the same database multiple times to the same db connection
in shared cache mode, since doing so leads to deadlock. (CVS 6578)
FossilOrigin-Name: 715f14f1dcaf604d4794bf3e18e245d4f8c5d5a9
Diffstat (limited to 'src/attach.c')
-rw-r--r-- | src/attach.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/attach.c b/src/attach.c index d5495361b..d0f81766b 100644 --- a/src/attach.c +++ b/src/attach.c @@ -11,7 +11,7 @@ ************************************************************************* ** This file contains code used to implement the ATTACH and DETACH commands. ** -** $Id: attach.c,v 1.87 2009/04/30 05:40:34 drh Exp $ +** $Id: attach.c,v 1.88 2009/04/30 13:30:33 drh Exp $ */ #include "sqliteInt.h" @@ -119,7 +119,7 @@ static void attachFunc( if( aNew==0 ) return; } db->aDb = aNew; - aNew = &db->aDb[db->nDb++]; + aNew = &db->aDb[db->nDb]; memset(aNew, 0, sizeof(*aNew)); /* Open the database file. If the btree is successfully opened, use @@ -129,7 +129,11 @@ static void attachFunc( rc = sqlite3BtreeFactory(db, zFile, 0, SQLITE_DEFAULT_CACHE_SIZE, db->openFlags | SQLITE_OPEN_MAIN_DB, &aNew->pBt); - if( rc==SQLITE_OK ){ + db->nDb++; + if( rc==SQLITE_CONSTRAINT ){ + rc = SQLITE_ERROR; + zErrDyn = sqlite3MPrintf(db, "database is already attached"); + }else if( rc==SQLITE_OK ){ Pager *pPager; aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt); if( !aNew->pSchema ){ |