Dear group,

We encountered a somewhat obscure scenario that leaves an sqlite database in a 
corrupted state (tested with sqlite 3.8.8).

Our case deals with 

  - an in-memory database "db" with an attached file database "other.db". 
  - "db" starts a transaction,
  - "db" tries to create a table in the attached "other.db" using "create table 
... as select ...", but the "select" raises an error.
  - "db" commits the transaction. 

As a result, the attached database is corrupted. The corruption seems to take 
place during the final commit.

The following Tcl script reproduces the problem:

------------------------ 
package require sqlite3
sqlite3 db :memory:

catch {file delete other.db}

sqlite3 odb other.db
odb eval {create table dummy(whatever text);}
puts "check that other.db is ok:[odb eval {select count(*) from dummy}]"
rename odb ""

db function myerror myerror
proc myerror args {error "deliberate error"}

db eval {attach [other.db] as other}

catch {
 db transaction {
  catch {
   db eval {create table other.xxx as select myerror()}
  }
  # error "--- without this error the other.db gets corrupted ---"
 }
}

sqlite3 odb2 other.db
puts "check that other.db is ok:[odb2 eval {select count(*) from dummy}]"
------------------------ 

This is the output:
------------------------
check that other.db is ok:0
malformed database schema (?)
    while executing
"odb2 eval {select count(*) from dummy}"
    invoked from within
"puts "check that other.db is ok:[odb2 eval {select count(*) from dummy}]""
    (file "bugreport.tcl" line 26)
------------------------

If the commented line is activated the other.db is not corrupted.

Best Regards,
Christian

Reply via email to