Hi, there.
I just found some illegal processing of SQLite.
As I mentioned in title, "CREATE TABLE" query returns "database disk image
is malformed" when disk is full and "SQLITE_IOCAP_ATOMIC" and
"SQLITE_DEFAULT_AUTOVACUUM" is enabled.
Here is my test scripts.
sudo mkdir /mnt/db
sudo chmod 777 /mnt/db
sudo mount -t tmpfs -o size=16K tmpfs /mnt/db
/home/yi.jang/git/sqlite_source/sqlite3 /mnt/db/test.db
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma journal_mode=persist;
persist
sqlite> pragma page_size=4096;
sqlite> create table a (id);
sqlite> create table b (id);
*Error: database or disk is full*
sqlite> create table b (id);
*Error: database disk image is malformed*
sqlite>
What I attached options to Makefile are as following.
-DSQLITE_ENABLE_ATOMIC_WRITE
-DSQLITE_DEFAULT_AUTOVACUUM=1
-DSQLITE_DEFAULT_PAGE_SIZE=4096
sqlite3.c is also changed.
static int unixDeviceCharacteristics(sqlite3_file *id){
unixFile *p = (unixFile*)id;
if( p->ctrlFlags & UNIXFILE_PSOW ){
return SQLITE_IOCAP_POWERSAFE_OVERWRITE | SQLITE_IOCAP_ATOMIC;
}else{
return SQLITE_IOCAP_ATOMIC;
}
}
B.R.
Yongil Jang.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users