From 6dd5e1aaedf04ed2b7513876bd8bd75fab23d5ed Mon Sep 17 00:00:00 2001 From: Dan Reynolds Date: Tue, 16 Jun 2026 14:03:01 -0400 Subject: [PATCH] Release 0.5.0 Performance and reliability release since 0.4.0. No breaking changes and no public export-surface changes. - New API: Diagnostics.unknownDependencyFallbackCount (#151) - Bug fix: diagnostics() reader-isolate SEGV under load - Perf: writer pipelining, selectBytes native-view transfer, Row/RowSchema lookup fast paths, six-param + nullable batch packing Bump resqlite 0.4.0 -> 0.5.0 and move README + workspace pins to ^0.5.0. Cut companion compatibility releases resqlite_vector/resqlite_js 0.1.0 -> 0.1.1 (require resqlite ^0.5.0) so extension users can upgrade alongside 0.5.0. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 44 +++++++++++++++++++ README.md | 4 +- packages/resqlite_extension_test/pubspec.yaml | 2 +- packages/resqlite_js/CHANGELOG.md | 5 +++ packages/resqlite_js/pubspec.yaml | 4 +- packages/resqlite_vector/CHANGELOG.md | 5 +++ packages/resqlite_vector/pubspec.yaml | 4 +- pubspec.yaml | 2 +- 8 files changed, 62 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91492d7b..989e64e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +## 0.5.0 + +Performance and reliability release. No breaking changes, and no changes to the +public export surface — safe to upgrade from 0.4.x. + +**Wins at a glance:** up to **45% faster concurrent writes**, **~1.8× faster large +`selectBytes` reads** (>256 KB), faster `Row` lookups and batch writes, a new +diagnostics counter for silent re-query fallbacks, and a reader-isolate crash fix +for `diagnostics()` under load. + +- **New API:** `Diagnostics.unknownDependencyFallbackCount` — a cumulative counter + of writes that conservatively re-queried *every* registered stream because native + dependency tracking overflowed its caps (or hit OOM). Surfaces workloads silently + paying full re-query fan-out on every write, which was previously unobservable + ([#151](https://github.com/danReynolds/resqlite/pull/151)). +- **Bug fix:** `Database.diagnostics()` could intermittently crash a reader isolate + (SEGV) when polled while readers were mid-query — it toggled SQLite memory + accounting on live `NOMUTEX` reader connections. Read workers now bracket each + request with a real busy guard, and diagnostics reports busy readers as a partial + snapshot ([#156](https://github.com/danReynolds/resqlite/pull/156)). +- **Performance.** Each accepted experiment below; see the [interactive benchmark dashboard](https://danreynolds.github.io/resqlite/benchmarks/) + for current cross-library numbers. + - **Writer-request pipelining** over a persistent reply port — −36% to −45% on + concurrent standalone writes ([#153](https://github.com/danReynolds/resqlite/pull/153), + [exp 159](https://github.com/danReynolds/resqlite/blob/main/experiments/159-writer-pipelining.md)). + - **`selectBytes` native-view transfer** — sends a view over the reader's native + `json_buf` instead of taking the sacrifice/respawn path; −44% (~1.8×) on large + (>256 KB) byte reads, at a bounded ~+15 MB RSS ([#169](https://github.com/danReynolds/resqlite/pull/169), + [exp 174](https://github.com/danReynolds/resqlite/blob/main/experiments/174-selectbytes-view-transfer.md)). + - **`Row.containsKey` identity fast path** — pointer-identity membership scan for + interned keys on schemas ≤ 32 columns; −23% on the `containsKey` lane + ([#173](https://github.com/danReynolds/resqlite/pull/173), + [exp 176](https://github.com/danReynolds/resqlite/blob/main/experiments/176-row-containskey-identity-fastpath.md)). + - **`RowSchema` lookup fast path** — schema-name identity scan with `HashMap` + fallback; ~2× faster main-isolate map consumption at 10K rows + ([#150](https://github.com/danReynolds/resqlite/pull/150), + [exp 158](https://github.com/danReynolds/resqlite/blob/main/experiments/158-row-schema-hash-index.md)). + - **Six-parameter batch packing** — extends guarded ASCII batch packing to the + six-parameter shape; `executeBatch` p50 88 → 75 µs ([#141](https://github.com/danReynolds/resqlite/pull/141), + [exp 149](https://github.com/danReynolds/resqlite/blob/main/experiments/149-six-param-batch-packing.md)). + - **Nullable batch packing** — nullable-aware packed batch encoder for first-row + `NULL` text columns; nullable ASCII 10k×20 25.7 → 21.7 ms ([#145](https://github.com/danReynolds/resqlite/pull/145), + [exp 150](https://github.com/danReynolds/resqlite/blob/main/experiments/150-nullable-batch-packing.md)). + ## 0.4.0 - Added open-scoped SQLite extension loading via `Database.open(extensions: ...)` diff --git a/README.md b/README.md index 453b8c4e..a150cfde 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Visit the [project site](https://danreynolds.github.io/resqlite/) to browse inte ```yaml dependencies: - resqlite: ^0.4.0 + resqlite: ^0.5.0 ``` Or via the CLI: @@ -220,7 +220,7 @@ each extension on the writer and reader connections in that database pool. ```yaml dependencies: - resqlite: ^0.4.0 + resqlite: ^0.5.0 resqlite_vector: ^0.1.0 resqlite_js: ^0.1.0 ``` diff --git a/packages/resqlite_extension_test/pubspec.yaml b/packages/resqlite_extension_test/pubspec.yaml index 7d5ae745..aa2d5e39 100644 --- a/packages/resqlite_extension_test/pubspec.yaml +++ b/packages/resqlite_extension_test/pubspec.yaml @@ -10,7 +10,7 @@ environment: resolution: workspace dependencies: - resqlite: ^0.4.0 + resqlite: ^0.5.0 resqlite_js: ^0.1.0 resqlite_vector: ^0.1.0 diff --git a/packages/resqlite_js/CHANGELOG.md b/packages/resqlite_js/CHANGELOG.md index c1938d92..b0e2a4a3 100644 --- a/packages/resqlite_js/CHANGELOG.md +++ b/packages/resqlite_js/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.1 + +- Require `resqlite: ^0.5.0`. Compatibility release for the resqlite 0.5.0 bump; + no functional changes. + ## 0.1.0 - Initial resqlite wrapper for SQLite JS native extension loading. diff --git a/packages/resqlite_js/pubspec.yaml b/packages/resqlite_js/pubspec.yaml index 6088a3db..adfecea4 100644 --- a/packages/resqlite_js/pubspec.yaml +++ b/packages/resqlite_js/pubspec.yaml @@ -1,6 +1,6 @@ name: resqlite_js description: SQLite JavaScript extension support for resqlite. -version: 0.1.0 +version: 0.1.1 repository: https://github.com/danReynolds/resqlite/tree/main/packages/resqlite_js environment: @@ -12,7 +12,7 @@ dependencies: code_assets: ^1.0.0 hooks: ^1.0.0 path: ^1.9.0 - resqlite: ^0.4.0 + resqlite: ^0.5.0 dev_dependencies: test: ^1.26.3 diff --git a/packages/resqlite_vector/CHANGELOG.md b/packages/resqlite_vector/CHANGELOG.md index f69dbb88..170a35b9 100644 --- a/packages/resqlite_vector/CHANGELOG.md +++ b/packages/resqlite_vector/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.1 + +- Require `resqlite: ^0.5.0`. Compatibility release for the resqlite 0.5.0 bump; + no functional changes. + ## 0.1.0 - Initial resqlite wrapper for SQLite Vector native extension loading. diff --git a/packages/resqlite_vector/pubspec.yaml b/packages/resqlite_vector/pubspec.yaml index ad027a82..65442eb6 100644 --- a/packages/resqlite_vector/pubspec.yaml +++ b/packages/resqlite_vector/pubspec.yaml @@ -1,6 +1,6 @@ name: resqlite_vector description: SQLite vector extension support for resqlite. -version: 0.1.0 +version: 0.1.1 repository: https://github.com/danReynolds/resqlite/tree/main/packages/resqlite_vector environment: @@ -12,7 +12,7 @@ dependencies: code_assets: ^1.0.0 hooks: ^1.0.0 path: ^1.9.0 - resqlite: ^0.4.0 + resqlite: ^0.5.0 dev_dependencies: test: ^1.26.3 diff --git a/pubspec.yaml b/pubspec.yaml index 9d7c5231..156473fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: >- High-performance, reactive SQLite for Dart and Flutter. Reads, writes, and reactive re-queries run on persistent worker isolates with zero main-isolate jank. -version: 0.4.0 +version: 0.5.0 repository: https://github.com/danReynolds/resqlite topics: - sqlite