Highlights
- Busy retry budgets now behave on long-lived connections.
:max_elapsed_msis a per-contention budget, reset at the start of each busy event — previously a connection older than the ceiling gave up with zero retries. - Shared-handle stalls moved off the normal schedulers. The trivial connection-lock readers (
changes/1,db_path/1,transaction_status/1, and ~17 more) now run on dirty schedulers, so a reader blocked behind a slow query on the same handle can no longer stall a BEAM scheduler. Cost: ~0.85µs median per call — still sub-microsecond. - TEXT encoding can no longer panic on allocation failure. Returning a huge TEXT value under allocation failure now yields a structured
internal_encoding_error— matching the blob path — instead of panicking through the string encoder. - Elixir floor raised to
~> 1.17, matching what CI actually exercises (Elixir 1.17–1.20 × OTP 26–29). - Dependencies refreshed: rusqlite 0.40.2, libsqlite3-sys 0.38.2. Bundled SQLite unchanged at 3.53.2.
- Docs:
changeset_apply/2now states explicitly that:replaceaborts and rolls back the whole apply on a conflict SQLite forbids replacing — it never silently skips a change.
Full details in the CHANGELOG.