summaryrefslogtreecommitdiff
path: root/ext/pdo_sqlite/sqlite/src/attach.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo_sqlite/sqlite/src/attach.c')
-rw-r--r--ext/pdo_sqlite/sqlite/src/attach.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/ext/pdo_sqlite/sqlite/src/attach.c b/ext/pdo_sqlite/sqlite/src/attach.c
index 79c325f4c1..5c8953467c 100644
--- a/ext/pdo_sqlite/sqlite/src/attach.c
+++ b/ext/pdo_sqlite/sqlite/src/attach.c
@@ -32,7 +32,8 @@ void sqlite3Attach(
){
Db *aNew;
int rc, i;
- char *zFile, *zName;
+ char *zFile = 0;
+ char *zName = 0;
sqlite3 *db;
Vdbe *v;
@@ -55,34 +56,40 @@ void sqlite3Attach(
return;
}
- zFile = sqlite3NameFromToken(pFilename);;
- if( zFile==0 ) return;
+ zFile = sqlite3NameFromToken(pFilename);
+ if( zFile==0 ){
+ goto attach_end;
+ }
#ifndef SQLITE_OMIT_AUTHORIZATION
if( sqlite3AuthCheck(pParse, SQLITE_ATTACH, zFile, 0, 0)!=SQLITE_OK ){
- sqliteFree(zFile);
- return;
+ goto attach_end;
}
#endif /* SQLITE_OMIT_AUTHORIZATION */
zName = sqlite3NameFromToken(pDbname);
- if( zName==0 ) return;
+ if( zName==0 ){
+ goto attach_end;
+ }
for(i=0; i<db->nDb; i++){
char *z = db->aDb[i].zName;
if( z && sqlite3StrICmp(z, zName)==0 ){
- sqlite3ErrorMsg(pParse, "database %z is already in use", zName);
+ sqlite3ErrorMsg(pParse, "database %s is already in use", zName);
pParse->rc = SQLITE_ERROR;
- sqliteFree(zFile);
- return;
+ goto attach_end;
}
}
if( db->aDb==db->aDbStatic ){
aNew = sqliteMalloc( sizeof(db->aDb[0])*3 );
- if( aNew==0 ) return;
+ if( aNew==0 ){
+ goto attach_end;
+ }
memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
}else{
aNew = sqliteRealloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
- if( aNew==0 ) return;
+ if( aNew==0 ){
+ goto attach_end;
+ }
}
db->aDb = aNew;
aNew = &db->aDb[db->nDb++];
@@ -92,6 +99,7 @@ void sqlite3Attach(
sqlite3HashInit(&aNew->trigHash, SQLITE_HASH_STRING, 0);
sqlite3HashInit(&aNew->aFKey, SQLITE_HASH_STRING, 1);
aNew->zName = zName;
+ zName = 0;
aNew->safety_level = 3;
rc = sqlite3BtreeFactory(db, zFile, 0, MAX_PAGES, &aNew->pBt);
if( rc ){
@@ -126,7 +134,6 @@ void sqlite3Attach(
}
}
#endif
- sqliteFree(zFile);
db->flags &= ~SQLITE_Initialized;
if( pParse->nErr==0 && rc==SQLITE_OK ){
rc = sqlite3ReadSchema(pParse);
@@ -144,6 +151,10 @@ void sqlite3Attach(
pParse->rc = SQLITE_ERROR;
}
}
+
+attach_end:
+ sqliteFree(zFile);
+ sqliteFree(zName);
}
/*
@@ -158,6 +169,7 @@ void sqlite3Detach(Parse *pParse, Token *pDbname){
sqlite3 *db;
Vdbe *v;
Db *pDb = 0;
+ char *zName;
v = sqlite3GetVdbe(pParse);
if( !v ) return;
@@ -165,20 +177,22 @@ void sqlite3Detach(Parse *pParse, Token *pDbname){
sqlite3VdbeAddOp(v, OP_Halt, 0, 0);
if( pParse->explain ) return;
db = pParse->db;
+ zName = sqlite3NameFromToken(pDbname);
+ if( zName==0 ) return;
for(i=0; i<db->nDb; i++){
pDb = &db->aDb[i];
- if( pDb->pBt==0 || pDb->zName==0 ) continue;
- if( strlen(pDb->zName)!=pDbname->n ) continue;
- if( sqlite3StrNICmp(pDb->zName, pDbname->z, pDbname->n)==0 ) break;
+ if( pDb->pBt==0 ) continue;
+ if( sqlite3StrICmp(pDb->zName, zName)==0 ) break;
}
if( i>=db->nDb ){
- sqlite3ErrorMsg(pParse, "no such database: %T", pDbname);
+ sqlite3ErrorMsg(pParse, "no such database: %z", zName);
return;
}
if( i<2 ){
- sqlite3ErrorMsg(pParse, "cannot detach database %T", pDbname);
+ sqlite3ErrorMsg(pParse, "cannot detach database %z", zName);
return;
}
+ sqliteFree(zName);
if( !db->autoCommit ){
sqlite3ErrorMsg(pParse, "cannot DETACH database within transaction");
pParse->rc = SQLITE_ERROR;