aboutsummaryrefslogtreecommitdiff
path: root/src/attach.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2009-04-30 13:30:32 +0000
committerdrh <drh@noemail.net>2009-04-30 13:30:32 +0000
commitc47fd8e031a411a66d1c57833c35a3db37cec476 (patch)
tree6e6e4acb06400663d397c24e89fa4b3ff356e92d /src/attach.c
parent9b3c24d15d2336db21d3bbafcaf6268f4e170eef (diff)
downloadsqlite-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.c10
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 ){