> -----Original Message-----
> From: sqlite-users-boun...@sqlite.org 
> [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Stephan Beal
> Sent: Saturday, October 25, 2014 3:32 AM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] quasi-bug related to locking,and 
> attached databases....
...
> 
> Simon, FYI: this is the "'main' db aliasing" problem i 
> brought up a couple
> months ago, which we solved by using your suggestion: re-attach the db
> directly after opening it, so that (as Dave said) all DBs 
> have well-known
> internal names regardless of what order they get opened in.
> 
> Reproduced here with 3.8.6 on Linux/x64:
> 
> sqlite>  insert or replace into main.dest ( name, value ) values
> ('allow',(select value from aux.source where name = 'allow'));
> Error: database is locked
....

Really, it's a fundamental problem irrespective of 'self attached
databases', it happens any time you attach a database more than once.  I
wish I realized that when I first reported it.  E.g.:

C:\Documents and Settings\person>sqlite3 db2.db
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table dest ( name text, value text );
sqlite> create table source ( name text, value text );
sqlite> insert into source ( name, value ) values ( 'allow', 'yes' );
sqlite> .exit

C:\Documents and Settings\person>sqlite3 db1.db
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> attach database 'db2.db' as dest;
sqlite> attach database 'db2.db' as src;
sqlite> .datavases
unknown command or invalid arguments:  "datavases". Enter ".help" for help
sqlite> .databases
seq  name             file
---  ---------------
----------------------------------------------------------
0    main             C:\Documents and Settings\person\db1.db
2    dest             C:\Documents and Settings\person\db2.db
3    src              C:\Documents and Settings\person\db2.db
sqlite> insert or replace into dest.dest (name, value) values
('allow',(select value from src.source where name = 'allow' ));
SQL error: database is locked


I would imagine that a possible clean fix would be for the pager to have a
'lock count', locking only when it goes from 0 to 1.  If that is actually
workable, then all the rest of sqlite can blythely carry on with no
modification.

-dave


_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to