Support for Python 3.8 removed (APSW issue 539).
The readonly database statistics virtual table (dbstat) is enabled by default for PyPI builds, and when --enable-all-extensions is passed to manual builds.
Added recursive triggers and optimize to apsw.bestpractice.
Multiple callbacks can be present for Connection.trace_v2() with APSW ensuring they are all called (APSW issue 502)
Connection.trace_v2() callback information now has trigger, id, and total_changes fields.
Added Connection.data_version for getting a change counter. pragma data_version doesn’t update when changes are made on the same connection, only others.
Added apsw.ext.ShowResourceUsage() for getting resource and SQLite usage in a context block, and also use it for the shell timer command.
Added apsw.ext.Trace() for tracing SQL execution, row and change counting, and timing per statement for use in a context block.
Added FTS5 support including registering and calling tokenizers, and auxiliary functions. The apsw.fts5 module provides many additional classes and methods for working with FTS5, including tokenizers for HTML, JSON, regular expressions, support tokenizers for synonyms, stop words, transformers, and a Table class that wraps access to a FTS5 table (including creating one) with search(), more_like(), and query_suggest(). apsw.fts5query can parse, modify, and reconstruct queries. The shell gets a ftsq command for issuing queries.
Added apsw.unicode which implements Unicode algorithms for determining codepoint groups making up a user perceived character, word and sentence splitting, and where line breaks can be made. These are used to make provided FTS5 tokenizers and auxiliary functions fully Unicode aware. There are many additional methods such as getting categories, stripping diacritics, case folding, width when output to a terminal, text wrapping, and more.
apsw.ext.format_query_table() uses apsw.unicode to get widths and line breaks more accurate. As a side effect it loses the word_wrap parameter (breaking change).