On Wed, Jun 29, 2016 at 2:17 AM, R Smith <rsm...@rsweb.co.za> wrote: > In response to a recent forum post and many other posts, where SQLite > corrupt files or Index integrity was the problem at hand, I was wondering if > we could ask for an API function that would corrupt a DB for us.
I have done some things like this in Chromium's sql/ wrapper. There are helpers at: https://cs.chromium.org/chromium/src/sql/test/test_helpers.h sql::test::CorruptSizeInHeader() is a helper function which uses mostly libc operations to modify the page count in the header, which results in SQLITE_CORRUPT for most operations. In the same file, sql::test::CorruptTableOrIndex() is a helper which snapshots the root page of a table or index, runs a given update query, then restores the snapshot. This can be used to build mis-matched indices or tables. These have example use in: https://cs.chromium.org/chromium/src/sql/connection_unittest.cc https://cs.chromium.org/chromium/src/sql/recovery_unittest.cc Of course, none of this would be directly useful, since it's written in Chromium C++. But it would be straightforward to write them using libc and the SQLite C API, or your appropriate wrapper. Unfortunately, one thing I found in this is that it's kind of hard to inject real corruption reliably. You have to figure out ways to be wrong enough to be noticeable, and right enough that SQLite can make progress to see the corruption, and then you have to make sure SQLite is running through the code paths which will actually expose the corruption. It might be cleaner to just have a way to do error injection. Like maybe something like the authorizer interface, but where it could detect the table row/column being touched and introduce an error. Or maybe you could write a vtable which proxies a real table and introduces errors. -scott _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users