 
Small. Fast. Reliable.
Choose any three.
 
SQLite Release 3.23.1 On 2018-04-10
-  Fix two problems in the new LEFT JOIN strength reduction optimization.
     Tickets 1e39b966ae9ee739
     and fac496b61722daf2.
-  Fix misbehavior of the FTS5 xBestIndex method.  Ticket
     2b8aed9f7c9e61e8.
-  Fix a harmless reference to an uninitialized virtual machine register.
     Ticket 093420fc0eb7cba7.
-  Fix the CLI so that it builds with -DSQLITE_UNTESTABLE
-  Fix the eval.c extension
     so that it works with PRAGMA empty_result_callbacks=ON.
-  Fix the generate_series virtual table so that it correctly returns
     no rows if any of its constraints are NULL.
-  Performance enhancements in the parser.
Hashes:
 
- SQLITE_SOURCE_ID: "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
- SHA3-256 for sqlite3.c: 65750d1e506f416a0b0b9dd22d171379679c733e3460549754dc68c92705b5dc
Changes carried forward from version 3.23.0 (2018-04-02):
-  Add the sqlite3_serialize() and sqlite3_deserialize() interfaces when
     the SQLITE_ENABLE_DESERIALIZE compile-time option is used.
-  Recognize TRUE and FALSE as constants.  (For compatibility, if there
     exist columns named "true" or "false", then the identifiers refer to the
     columns rather than Boolean constants.)
-  Support operators IS TRUE, IS FALSE, IS NOT TRUE, and IS NOT FALSE.
-  Added the SQLITE_DBSTATUS_CACHE_SPILL option to sqlite3_db_status() for
     reporting the number of cache spills that have occurred.
-  The "alternate-form-2" flag ("!") on the built-in printf implementation
     now causes string substitutions to measure the width and precision in
     characters instead of bytes.
-  If the xColumn method in a virtual table implementation returns
     an error message using sqlite3_result_error() then give that error
     message preference over internally-generated messages.
-  Added the -A command-line option to the CLI to make it easier to manage
     SQLite Archive files.
-  Add support for INSERT OR REPLACE, INSERT OR IGNORE, and UPDATE OR REPLACE
     in the Zipfile virtual table.
-  Enhance the sqlite3changeset_apply() interface so that it is hardened
     against attacks from deliberately corrupted changeset objects.
-  Added the sqlite3_normalize()
     extension function.
-  Query optimizer enhancements:
  -  Improve the omit-left-join optimization so that it works in cases where
       the right-hand table is UNIQUE but not necessarily NOT NULL.
  
-  Improve the push-down optimization so that it works for many LEFT JOINs.
  
-  Add the LEFT JOIN strength reduction optimization that converts a LEFT
       JOIN into an ordinary JOIN if there exist terms in the WHERE clause
       that would prevent the extra all-NULL row of the LEFT JOIN from
       appearing in the output set.
  
-  Avoid unnecessary writes to the sqlite_sequence table when an
       AUTOINCREMENT table is updated with an rowid that is less than the
       maximum.
 
-  Bug fixes:
  -  Fix the parser to accept valid row value syntax.
       Ticket 7310e2fb3d046a5
  
-  Fix the query planner so that it takes into account dependencies in
       the arguments to table-valued functions in subexpressions in 
       the WHERE clause.
       Ticket 80177f0c226ff54
  
-  Fix incorrect result with complex OR-connected WHERE and STAT4.
       Ticket ec32177c99ccac2
  
-  Fix potential corruption in indexes on expressions due to automatic
       datatype conversions.
       Ticket 343634942dd54ab
  
-  Assertion fault in FTS4.
       Ticket d6ec09eccf68cfc
  
-  Incorrect result on the less-than operator in row values.
       Ticket f484b65f3d62305
  
-  Always interpret non-zero floating-point values as TRUE, even if
       the integer part is zero.
       Ticket 36fae083b450e3a
  
-  Fix an issue in the fsdir(PATH) table-valued function to the
       fileio.c extension,
       that caused a segfault if the fsdir() table was used as the inner table
       of a join. Problem reported on the mailing list and fixed by check-in
       7ce4e71c1b7251be
  
-  Issue an error rather instead of an assertion-fault or null-pointer
       dereference when the sqlite_master table is corrupted so that the
       sqlite_sequence table root page is really a btree-index page. Check-in
       525deb7a67fbd647
  
-  Fix the ANALYZE command so that it computes statistics on tables
       whose names begin with "sqlite".  Check-in
       0249d9aecf69948d
 
-  Additional fixes for issues detected by
     OSSFuzz:
  -  Fix a possible infinite loop on VACUUM for corrupt database files.
       Check-in 27754b74ddf64
  
-  Disallow parameters in the WITH clause of triggers and views.
       Check-in b918d4b4e546d
  
-  Fix a potential memory leak in row value processing.
       Check-in 2df6bbf1b8ca8
  
-  Improve the performance of the replace() SQL function for cases where
       there are many substitutions on megabyte-sized strings, in an attempt
       to avoid OSSFuzz timeouts during testing.
       Check-in fab2c2b07b5d3
  
-  Provide an appropriate error message when the sqlite_master table
       contains a CREATE TABLE AS statement. Formerly this caused either an
       assertion fault or null pointer dereference.  Problem found by OSSFuzz
       on the GDAL project. Check-in
       d75e67654aa96
  
-  Incorrect assert() statement removed. Check-in
       823779d31eb09cda.
  
-  Fix a problem with using the LIKE optimization on an
       INTEGER PRIMARY KEY.  Check-in
       b850dd159918af56.
 
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.