> On Apr 18, 2017, at 2:20 AM, Deon Brewis <de...@outlook.com> wrote: > > It's not like it was subtle - it's a dead on repro. I was able to repro this > by doing a power cycle 2 hours after shutting the app down. OSX didn't seem > to have any interest in flushing mmap files until you soft reboot the machine.
OK, hang on — I just reread the docs on memory-mapped I/O in SQLite. Memory-mapping is *only used for reads*, never for writes: >> When updating the database file, SQLite always makes a copy of the page >> content into heap memory before modifying the page. This is necessary for >> two reasons. First, changes to the database are not supposed to be visible >> to other processes until after the transaction commits and so the changes >> must occur in private memory. Second, SQLite uses a read-only memory map to >> prevent stray pointers in the application from overwriting and corrupting >> the database file. — https://www.sqlite.org/mmap.html Therefore I can’t imagine how using it could trigger database corruption. It doesn’t affect the way data is written at all! I accept that both of you have experimentally seen that memory-mapping leads to corruption, so I can only assume that either the above documentation is wrong, or that there’s some subtle bug in SQLite that alters the way data is written when memory-mapping is enabled. —Jens _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users