1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-14 00:22:38 +03:00

Fail an ATTACH if the auxiliary database is locked. Ticket #514. (CVS 1127)

FossilOrigin-Name: ac428c8d4a731678cc26cf198689814a8a56d141
This commit is contained in:
drh
2003-12-06 22:22:35 +00:00
parent 41743984bf
commit 447623d9aa
4 changed files with 100 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
C Always\suse\s"(char*)0"\sto\sterminate\sthe\sargument\slist\sof\ssqliteSetString().\nThis\sis\sneeded\sfor\s64-bit\ssystems\sthat\suse\sa\s32-bit\sinteger\sby\sdefault.\s(CVS\s1126) C Fail\san\sATTACH\sif\sthe\sauxiliary\sdatabase\sis\slocked.\s\sTicket\s#514.\s(CVS\s1127)
D 2003-12-06T21:43:56 D 2003-12-06T22:22:36
F Makefile.in 5cb273b7d0e945d47ee8b9ad1c2a04ce79927d2d F Makefile.in 5cb273b7d0e945d47ee8b9ad1c2a04ce79927d2d
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -21,7 +21,7 @@ F publish.sh 86b5e8535830a2588f62ce1d5d1ef00e1dede23a
F spec.template a38492f1c1dd349fc24cb0565e08afc53045304b F spec.template a38492f1c1dd349fc24cb0565e08afc53045304b
F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea
F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2 F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
F src/attach.c 9f78b4aaac02a2b09ff108e92cbaee3199e7962a F src/attach.c 9a3764bbccb1c8b39321630006fbaa0fb8bd1822
F src/auth.c c59ad0dab501888f8b1fccc25e2f5965d2265116 F src/auth.c c59ad0dab501888f8b1fccc25e2f5965d2265116
F src/btree.c bcb466c2939582a3a62f577cd8a9e5d637f3698d F src/btree.c bcb466c2939582a3a62f577cd8a9e5d637f3698d
F src/btree.h 9b7c09f1e64274d7bb74a57bbfc63778f67b1048 F src/btree.h 9b7c09f1e64274d7bb74a57bbfc63778f67b1048
@@ -69,7 +69,7 @@ F src/vdbeaux.c 877ae44ab42f43d38e8cd989087627508a4c98dd
F src/where.c d01a3506f3c1e3a205028068c8a14d713872c633 F src/where.c d01a3506f3c1e3a205028068c8a14d713872c633
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
F test/attach.test c26848402e7ac829e043e1fa5e0eb87032e5d81d F test/attach.test c26848402e7ac829e043e1fa5e0eb87032e5d81d
F test/attach2.test 6f98cc2b929d88dc5f82d95d04e9b89b3b5dead3 F test/attach2.test d0105f4e8b1debf0ac25ed7df986b5854620e172
F test/auth.test b7d6bdeffa804b96b7bcac2712e5f71ce014a1b8 F test/auth.test b7d6bdeffa804b96b7bcac2712e5f71ce014a1b8
F test/bigfile.test 1cd8256d4619c39bea48147d344f348823e78678 F test/bigfile.test 1cd8256d4619c39bea48147d344f348823e78678
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578 F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
@@ -176,7 +176,7 @@ F www/speed.tcl 2f6b1155b99d39adb185f900456d1d592c4832b3
F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
P e5e6a8481b2225e826c8e890ddc44f06759fe72b P 656c90387a4a714b4f31040ece9b0e15e30934af
R 486b33d90c9358024a2965d7fdcc35e3 R 9ba0dba1a5b0b6a0c4f493ffeeb808ce
U drh U drh
Z 6d642432b480eb97ee7365de7928480a Z 4d2d90a1bb0f4a7af58cf43ec43a116f

View File

@@ -1 +1 @@
656c90387a4a714b4f31040ece9b0e15e30934af ac428c8d4a731678cc26cf198689814a8a56d141

View File

@@ -11,7 +11,7 @@
************************************************************************* *************************************************************************
** This file contains code used to implement the ATTACH and DETACH commands. ** This file contains code used to implement the ATTACH and DETACH commands.
** **
** $Id: attach.c,v 1.7 2003/06/14 12:04:08 drh Exp $ ** $Id: attach.c,v 1.8 2003/12/06 22:22:36 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -91,8 +91,16 @@ void sqliteAttach(Parse *pParse, Token *pFilename, Token *pDbname){
sqliteFree(zFile); sqliteFree(zFile);
db->flags &= ~SQLITE_Initialized; db->flags &= ~SQLITE_Initialized;
if( pParse->nErr ) return; if( pParse->nErr ) return;
if( rc==SQLITE_OK ){
rc = sqliteInit(pParse->db, &pParse->zErrMsg); rc = sqliteInit(pParse->db, &pParse->zErrMsg);
}
if( rc ){ if( rc ){
int i = db->nDb - 1;
assert( i>=2 );
if( db->aDb[i].pBt ){
sqliteBtreeClose(db->aDb[i].pBt);
db->aDb[i].pBt = 0;
}
sqliteResetInternalSchema(db, 0); sqliteResetInternalSchema(db, 0);
pParse->nErr++; pParse->nErr++;
pParse->rc = SQLITE_ERROR; pParse->rc = SQLITE_ERROR;

View File

@@ -12,7 +12,7 @@
# focus of this script is testing the ATTACH and DETACH commands # focus of this script is testing the ATTACH and DETACH commands
# and related functionality. # and related functionality.
# #
# $Id: attach2.test,v 1.2 2003/07/18 01:25:35 drh Exp $ # $Id: attach2.test,v 1.3 2003/12/06 22:22:37 drh Exp $
# #
@@ -27,6 +27,7 @@ do_test attach2-1.1 {
CREATE INDEX x1 ON t1(a); CREATE INDEX x1 ON t1(a);
} }
file delete -force test2.db file delete -force test2.db
file delete -force test2.db-journal
sqlite db2 test2.db sqlite db2 test2.db
db2 eval { db2 eval {
CREATE TABLE t1(a,b); CREATE TABLE t1(a,b);
@@ -37,6 +38,86 @@ do_test attach2-1.1 {
} }
} {0 {}} } {0 {}}
# Ticket #514
#
proc db_list {db} {
set list {}
foreach {idx name file} [execsql {PRAGMA database_list} $db] {
lappend list $idx $name
}
return $list
}
db eval {DETACH t2}
do_test attach2-2.1 {
# lock test2.db then try to attach it. Should get an error.
db2 eval {BEGIN}
catchsql {
ATTACH 'test2.db' AS t2;
}
} {1 {database is locked}}
do_test attach2-2.2 {
# make sure test2.db did not get attached.
db_list db
} {0 main 1 temp}
do_test attach2-2.3 {
# unlock test2.db and try to attach again. should work this time.
db2 eval {COMMIT}
catchsql {
ATTACH 'test2.db' AS t2;
}
} {0 {}}
do_test attach2-2.4 {
db_list db
} {0 main 1 temp 2 t2}
do_test attach2-2.5 {
catchsql {
SELECT name FROM t2.sqlite_master;
}
} {0 {t1 x1}}
do_test attach2-2.6 {
# lock test2.db and try to read from it. should get an error.
db2 eval BEGIN
catchsql {
SELECT name FROM t2.sqlite_master;
}
} {1 {database is locked}}
do_test attach2-2.7 {
# but we can still read from test1.db even though test2.db is locked.
catchsql {
SELECT name FROM main.sqlite_master;
}
} {0 {t1 x1}}
do_test attach2-2.8 {
# start a transaction on test.db even though test2.db is locked.
catchsql {
BEGIN;
INSERT INTO t1 VALUES(8,9);
}
} {0 {}}
do_test attach2-2.9 {
execsql {
SELECT * FROM t1
}
} {8 9}
do_test attach2-2.10 {
# now try to write to test2.db. the write should fail
catchsql {
INSERT INTO t2.t1 VALUES(1,2);
}
} {1 {database is locked}}
do_test attach2-2.11 {
# when the write failed in the previous test, the transaction should
# have rolled back.
execsql {
SELECT * FROM t1
}
} {}
do_test attach2-2.12 {
catchsql {
COMMIT
}
} {1 {cannot commit - no transaction is active}}
db close db close
for {set i 2} {$i<=15} {incr i} { for {set i 2} {$i<=15} {incr i} {
catch {db$i close} catch {db$i close}