Small. Fast. Reliable.
Choose any three.
Search for:

## SQLite Release 3.8.8.1 On 2015-01-20

- Fix a bug in the sorting logic, present since version 3.8.4, that can cause output to appear in the wrong order on queries that contains an ORDER BY clause, a LIMIT clause, and that have approximately 60 or more columns in the result set. Ticket f97c4637102a3ae72b79.
- SQLITE_SOURCE_ID: "2015-01-20 16:51:25 f73337e3e289915a76ca96e7a05a1a8d4e890d55"
- SHA1 for sqlite3.c: 33987fb50dcc09f1429a653d6b47672f5a96f19e

Changes carried forward from version 3.8.8 (2015-01-16):

New Features:

- Added the PRAGMA data_version command that can be used to determine if a database file has been modified by another process.
- Added the SQLITE_CHECKPOINT_TRUNCATE option to the sqlite3_wal_checkpoint_v2() interface, with corresponding enhancements to PRAGMA wal_checkpoint.
- Added the sqlite3_stmt_scanstatus() interface, available only when compiled with SQLITE_ENABLE_STMT_SCANSTATUS.
- The sqlite3_table_column_metadata() is enhanced to work correctly on WITHOUT ROWID tables and to check for the existence of a a table if the column name parameter is NULL. The interface is now also included in the build by default, without requiring the SQLITE_ENABLE_COLUMN_METADATA compile-time option.
- Added the SQLITE_ENABLE_API_ARMOR compile-time option.
- Added the SQLITE_REVERSE_UNORDERED_SELECTS compile-time option.
- Added the SQLITE_SORTER_PMASZ compile-time option and SQLITE_CONFIG_PMASZ start-time option.
- Added the SQLITE_CONFIG_PCACHE_HDRSZ option to sqlite3_config() which makes it easier for applications to determine the appropriate amount of memory for use with SQLITE_CONFIG_PAGECACHE.
- The number of rows in a VALUES clause is no longer limited by SQLITE_LIMIT_COMPOUND_SELECT.
- Added the eval.c loadable extension that implements an eval() SQL function that will recursively evaluate SQL.

  Performance Enhancements:

- Reduce the number of memcpy() operations involved in balancing a b-tree, for 3.2% overall performance boost.
- Improvements to cost estimates for the skip-scan optimization.
- The automatic indexing optimization is now capable of generating a partial index if that is appropriate.

  Bug fixes:

- Ensure durability following a power loss with "PRAGMA journal_mode=TRUNCATE" by calling fsync() right after truncating the journal file.
- The query planner now recognizes that any column in the right-hand table of a LEFT JOIN can be NULL, even if that column has a NOT NULL constraint. Avoid trying to optimize out NULL tests in those cases. Fix for ticket 6f2222d550f5b0ee7ed.
- Make sure ORDER BY puts rows in ascending order even if the DISTINCT operator is implemented using a descending index. Fix for ticket c5ea805691bfc4204b1cb9e.
- Fix data races that might occur under stress when running with many threads in shared cache mode where some of the threads are opening and closing connections.
- Fix obscure crash bugs found by american fuzzy lop. Ticket a59ae93ee990a55.
- Work around a GCC optimizer bug (for gcc 4.2.1 on MacOS 10.7) that caused the R-Tree extension to compute incorrect results when compiled with -O3.

  Other changes:

- Disable the use of the strchrnul() C-library routine unless it is specifically enabled using the -DHAVE_STRCHRNULL compile-time option.
- Improvements to the effectiveness and accuracy of the likelihood(), likely(), and unlikely() SQL hint functions.

A complete list of SQLite releases in a single page and a chronology are both also available. A detailed history of every check-in is available at SQLite version control site.