Release Notes
Added
- Add rule on helper functions (Mikaël Francoeur)
- core/schema: Fix ALTER TABLE ADD/DROP COLUMN dropping column type size parameters (Sergei Iarymov)
- testing: add an FTS stress workload and Antithesis singleton (Pedro Muniz)
- core/translate: run ADD COLUMN DEFAULT type check only on STRICT tables (Ryan Lin)
- perf/fts: add search benchmarks, CPU profiles, and peak heap measurements (Pedro Muniz)
- core/vdbe: add AggStep fast paths for float sum, avg and count (Pekka Enberg)
- sqlite/conformance: add generated-column coverage from the issue backlog (Glauber Costa)
- simulator: add power loss (Pavan Nambi)
- add valgrind to the devcontainer (Mikaël Francoeur)
- Add aristo intent on partial writes (Mikaël Francoeur)
- perf: add join optimizer benchmarks and metrics (Jussi Saurio)
- postgres: support WITHIN GROUP aggregates (Joe Sluis)
- Add per-seed timeouts to differential_fuzzer CI runs so pathological queries fail faster (Jussi Saurio)
- bindings/c: implement sqlite3_strnicmp (Ishwar)
- bindings/dotnet: support batches on embedded replicas (Marc-André Moreau)
- fts/testing: add FTS workload to concurrent simulator (Preston Thorpe)
- serverless/compat: add reconnect support (Ishwar)
- serverless/js: fix broken README links and add repository field (Pure Tech)
- bindings/c: implement sqlite3_total_changes64 (Ishwar)
- bindings/dotnet: add connection-string embedded replicas (Marc-André Moreau)
- postgres: support quit and exit commands in tursopg cli (Joe Sluis)
- bindings/dotnet: add advanced sync database options (Marc-André Moreau)
- core/schema: add collation property in to_sql output for btree table (thomas kim)
- bindings/dotnet: add managed pull replica API (Marc-André Moreau)
- postgres: implement pg_get_expr function (Joe Sluis)
- core: make autovacuum an additive cargo feature (Pekka Enberg)
- Add snapshot tests for multi-index with intersection (Mikaël Francoeur)
- serverless/rust: add Builder::with_auth_token_fn for rotating tokens (Glauber Costa)
- Add ARGS variable to
run-cliMakefile target (Mikaël Francoeur) - Introduce Affinity::None (Mikaël Francoeur)
- add sqltest instructions (Mikaël Francoeur)
- Add EXPLAIN QUERY PLAN format=json (Mikaël Francoeur)
- bindings/tcl: implement [db status] statement counters (Pekka Enberg)
- core/storage: add more tests for codec interface (Avinash Sajjanshetty)
- Support virtual columns in covering indexes (Mikaël Francoeur")
- Support virtual columns in covering indexes (Mikaël Francoeur)
- bindings/c: implement sqlite3_set_authorizer, sqlite3_db_config, sqlite3_extended_result_codes (Glauber Costa)
- add select star benchmark (Mikaël Francoeur)
- core: implement PRAGMA count_changes (roboturso)
- add missing field to fix build (Mikaël Francoeur)
- core: support NULLS FIRST/LAST in indexes (Mikaël Francoeur)
- core/translate: add full window frame support (Jussi Saurio)
- core/storage: add page codec interface (Avinash Sajjanshetty)
- add missing argument to fix build (Mikaël Francoeur)
- postgres: implement session information functions (Michael)
- testing/antithesis: add VACUUM driver to stress-composer (Pekka Enberg)
- add comprehensive prepare-time benchmarks across SQL statement shapes (Pedro Muniz)
- core: add cume_dist()/percent_rank() window functions and add window funcs to fuzzer (Jussi Saurio)
- core/schema: Fix ALTER TABLE ADD COLUMN with explicit NULL stored as NOT NULL (Matt Van Horn)
- serverless/go: add serverless driver and conformance tests (Pekka Enberg)
- serverless/python: add serverless driver and conformance tests (Pekka Enberg)
- postgres: support CREATE TABLE AS and SELECT INTO (roboturso)
- bindings/rust: add Concurrent to TransactionBehavior (Pekka Enberg)
- Add serverless driver for Rust (Pekka Enberg)
- serverless: add differential test suite for serverless drivers (Pekka Enberg)
- Add SQL over HTTP protocol specification (Pekka Enberg)
- core/types: add fallible reusable value cloning (Pedro Muniz)
- core/benches: add targeted record-recycling benchmarks (Pedro Muniz)
- core: add nth_value() window function (Jussi Saurio)
- core: implement first_value() and last_value() window functions (Jussi Saurio)
- core: implement dense_rank() window function (Jussi Saurio)
- postgres: add sqltest pg backend and conformance corpus (Pekka Enberg)
- Add more window function plumbing and implement rank() function (Jussi Saurio)
- add LogTxFrameInfo with chaining crc32c in mvcc commit hook (Preston Thorpe)
- Feat: Added
IoBackendenum for vfs setting (Nur) - core/connection: add passive mode support in checkpoint api (Pere Diaz Bou)
- postgres: Add upstream PostgreSQL regression test harness (Pekka Enberg)
- Add PostgreSQL-compatible get_byte and set_byte functions (Glauber Costa)
- Experimental Postgres support (Pekka Enberg)
- Initial pass on SQL dialect support (Pekka Enberg)
- bindings/dotnet: add HTTP client packages (Marc-André Moreau)
- bindings/python: enable SQLAlchemy reflection now supported by turso, bump min version to 2.0.45 (Orthel Toralen)
- core/mvcc: add tests for speculative checkpoint root mappings and add cleanup for journal mode checkpoint state (Pedro Muniz)
Updated
- core/storage: read nbackfills under the checkpoint lock (Pekka Enberg)
- core: make connect-time and post-ANALYZE stats refresh resumable (Nikita Sivukhin)
- Refactor hash join selection (Mikaël Francoeur)
- core/translate: evaluate row-dependent predicates through index methods (Pedro Muniz)
- core/schema: omit empty parent column list when rebuilding FOREIGN KEY text (roboturso)
- core/mvcc: stop copying and re-looking-up state in the commit state machine (Jussi Saurio)
- core/mvcc: sync group commit log for FULL waiters (roboturso)
- core/schema: keep DESC on primary keys when rebuilding CREATE TABLE text (roboturso)
- core/schema: keep ON CONFLICT clauses when rebuilding CREATE TABLE text (roboturso)
- core/vdbe: reduce work in common execution paths (Jussi Saurio)
- optimizer: skip multi-index analysis when no candidate is possible (Jussi Saurio)
- Use fast paths for common record values (Jussi Saurio)
- Reuse buffers when decoding record TEXT (Jussi Saurio)
- fts: inject allocation failures during builds and merges (Pedro Muniz)
- core/storage: read table leaf header from one cell slice (Jussi Saurio)
- core/storage: streamline page and varint reads (Jussi Saurio)
- perf/latency: retry SQLite BEGIN IMMEDIATE on SQLITE_BUSY (Pekka Enberg)
- core/storage: reduce work on cell write paths (Jussi Saurio)
- core/storage: skip the leaf search after the last rowid (Jussi Saurio)
- testing/stress: only fail the FTS workload on corruption (Pekka Enberg)
- build(deps-dev): bump browserslist from 4.28.2 to 4.29.0 in /bindings/react-native (app/dependabot)
- core/storage: reuse the current leaf when appending rows (Jussi Saurio)
- sqlite/parser: quote identifiers that start with a digit when rendering names (roboturso)
- core/vdbe: reduce work when matching LIKE operands (Jussi Saurio)
- core/vdbe: reuse index key info during cursor reads (Jussi Saurio)
- core/mvcc: advance log offset after on_log_write_complete (Pere Diaz Bou)
- core: finalize external aggregates exactly once (Pekka Enberg)
- core/storage: read index keys from pages without copying (Jussi Saurio)
- docs: stop calling MVCC experimental (Pekka Enberg)
- core/schema: quote identifiers in table-level PRIMARY KEY and FOREIGN KEY when rebuilding CREATE TABLE text (roboturso)
- core/translate: refuse DROP TRIGGER and write pragmas in query_only mode (roboturso)
- core/translate: decode blob literals in materialized view plans (roboturso)
- testing/antithesis: use stable messages for stress composer assertions (Avinash Sajjanshetty)
- optimizer: allow unnesting correlated subqueries with non-equality comparisons (Jussi Saurio)
- sqlite/conformance: cover OFFSET paging past a join outer row (Ryan Lin)
- ci: speed up python, rust and test-limbo; stop running codspeed nightly benchmarks on PRs (Jussi Saurio)
- core/stats: publish refreshed ANALYZE stats to the shared schema (roboturso)
- core/io: report why io_uring_setup failed (Pekka Enberg)
- optimizer: improve join estimates for OR filters and hash joins (Jussi Saurio)
- core/fts: benchmark warm queries under byte-cache pressure (Pedro Muniz)
- simulator: accept checkpoint rejected by an open transaction (Pekka Enberg)
- core/mvcc: schema-first forward collect (Pere Diaz Bou)
- fts: use the database allocator for build buffers and metadata (Pedro Muniz)
- testing/antithesis: check integrity outside unreliable-libc (Pekka Enberg)
- github: give native library builds 60 minutes (Pekka Enberg)
- bindings/dotnet: let native code own function callback handles (Pekka Enberg)
- core/translate: avoid table reads after covering-index hash builds (Jussi Saurio)
- optimizer: permit hash joins when indexes cannot seek join keys (Jussi Saurio)
- core: refresh reserved bytes after WAL frame imports (Pedro Muniz)
- optimizer: cost repeated index seeks and required grouping sorts (Jussi Saurio)
- github: Set up MSVC environment for Windows jobs (Pekka Enberg)
- sqlite/conformance: Convert suitable rust transaction tests to SQLtests (Sergei Iarymov)
- fts: accept null and non-text search inputs (Pedro Muniz)
- core: group database allocators by subsystem (Pedro Muniz)
- fts: reuse rowid readers across queries (Pedro Muniz)
- fts: reject non-finite field weights (Pedro Muniz)
- core/mvcc: notify dependents when cleaning up abandoned commits (Pedro Muniz)
- bindings/javascript: stop the sync loops in the concurrent-updates test (Pekka Enberg)
- scripts: keep paragraph breaks when wrapping merge commit messages (Pekka Enberg)
- Reduce Nyrkio runtime (Pekka Enberg)
- core/vdbe: compare two texts without the comparison slow path (Pekka Enberg)
- core/storage: let readers start while a checkpoint holds read-mark 0 (Pere Diaz Bou)
- core/optimizer: preserve OFFSET when choosing index methods (Pedro Muniz)
- build(deps-dev): bump baseline-browser-mapping from 2.10.16 to 2.11.24 in /bindings/react-native (app/dependabot)
- core/translate: refresh index deletion values after BEFORE UPDATE trigger by UPSERT (writemorecode)
- core/translate: retain group-by expressions for output (may)
- core/mvcc: clear checkpoint pager lock flags after pager commit (Pekka Enberg)
- core/fts: avoid quadratic segment searches during deletes (Pedro Muniz)
- core/fts: benchmark deletes and registry scans across segment counts (Pedro Muniz)
- core: Optimize text decoding (Mikaël Francoeur)
- ci: run string_expr_benchmark in the nightly Nyrkiö benchmarks (Pekka Enberg)
- build(deps): bump baseline-browser-mapping from 2.10.16 to 2.11.24 in /examples/react-native (app/dependabot)
- build(deps-dev): bump @humanfs/node from 0.16.7 to 0.16.8 in /examples/react-native (app/dependabot)
- core/vdbe: use arithmetic fast path for floats too (Pekka Enberg)
- testing/differential: skip aggregates that depend on input order (Jussi Saurio)
- core/vdbe: use larger chunk read buffers within sorter in-memory budget (Pekka Enberg)
- bindings/javascript: update vitest to 4.1.11 (Pekka Enberg)
- core/btree: reuse the loaded table leaf for nearby rowid seeks (Jussi Saurio)
- perf/tpc-h: bold the fastest median in the results table (Pekka Enberg)
- perf/tpc-h: draw query runtimes on a linear axis (Pekka Enberg)
- core/translate: match upsert conflict targets against generated-column indexes (Glauber Costa)
- Refactoring (Mikaël Francoeur)
- core/translate: report STRICT type violations from integrity_check (Glauber Costa)
- core: type-check virtual generated columns in STRICT tables (Glauber Costa)
- sqlite/conformance: Convert suitable rust vacuum tests to SQLtests (Sergei Iarymov)
- bindings/js: enable experimental vacuum flag in sqltest runner (Sergei Iarymov)
- sqlite/parser: keep GENERATED ALWAYS in rendered schema text (Glauber Costa)
- sqlite/conformance: Convert materialized subquery tests to SQLtests (Sergei Iarymov)
- core: Compute column affinity once when constructing Column (Mikaël Francoeur)
- core/mvcc: rename IndexShadowFinger to IndexShadowScan (Pere Diaz Bou)
- core/mvcc: stop negative MVCC roots from reaching the pager (Pere Diaz Bou)
- core/fts: replace the merge lease with per-segment MVCC row claims (Pedro Muniz)
- mvcc: drop exclusive slot 0 before publish_backfill (Pere Diaz Bou)
- core/mvcc: park group commit waiters instead of spinning (Pekka Enberg)
- core/mvcc: do not reuse rowid after rollback (Avinash Sajjanshetty)
- sqlite/conformance: Convert page1 tests to SQLtests (Sergei Iarymov)
- tests/wal: assert checkpoint results and durable bytes with asserting (Mikaël Francoeur)
- tests/mvcc: assert attach failures and empty results with asserting (Mikaël Francoeur)
- tests/storage: assert header versions and short reads with asserting (Mikaël Francoeur)
- tests/attach: assert opcode db ids and file sizes with asserting (Mikaël Francoeur)
- tests/functions: compare function results against plain literals (Mikaël Francoeur)
- tests/conflict resolution: assert failures and rows with asserting (Mikaël Francoeur)
- tests/write path: compare result rows against plain literals (Mikaël Francoeur)
- core/translate: apply REPLACE defaults before computing virtual generated columns (Glauber Costa)
- sqlite/conformance: Convert rowid tests to SQLtests (Sergei Iarymov)
- core/fts: key tombstones by document identity so deletes and merges commute (Pedro Muniz)
- sqlite/parser: reject invalid generated-column clauses (Glauber Costa)
- tests: pick result columns with the column assertion (Mikaël Francoeur)
- tests: migrate pragma, query plan and row checks to asserting (Mikaël Francoeur)
- core/vdbe: read text values without rendering them again (|| up to 2.3x faster) (Mikaël Francoeur)
- ci: stop installing Android SDK packages these jobs never use (Mikaël Francoeur)
- tests: assert with the asserting crate (Mikaël Francoeur)
- core/mvcc: reject conflicting deletes of B-tree rows at statement time (Pedro Muniz)
- core/mvcc: recheck LWM before GC drops a row (Pekka Enberg)
- core/mvcc: remove reachable antithesis assertions (Avinash Sajjanshetty)
- core: split DatabaseFull into a unit variant and SequenceExhausted (Pekka Enberg)
- sqlite/conformance: Convert affinity tests to SQLtests (Sergei Iarymov)
- core/json: make json106.test pass (Pekka Enberg)
- core/translate: match PRAGMA names without regard to case (Thanadon Kongkanun)
- sqlite/conformance: run every file in the upstream TCL suite (Pekka Enberg)
- core/mvcc: enable group commit by default (Pekka Enberg)
- core/optimizer: keep required sorts across hash joins (may)
- core: accept UUID blobs in STRICT tables (may)
- fuzz: build all libFuzzer targets in CI (Daniel Karlsson)
- optimizer: use COUNT(*) instead of COUNT(col) when col is NOT NULL (Sergei Iarymov)
- core: skip unnecessary foreign-key bytecode for UPDATE and UPSERT (Pavan Nambi)
- core/mvcc: retire materialized current versions instead of dropping them (Pere Diaz Bou)
- sync: count only relevant cdc changes to expose in the stats (Nikita Sivukhin)
- core/index_method: give index methods a core-owned backing store handle (Pedro Muniz)
- perf/tpc-h: run tursodb with the io_uring backend (Pekka Enberg)
- perf/tpc-h: measure query time with EPOCHREALTIME instead of bash time (Pekka Enberg)
- core/benches: make the MVCC recovery benchmark cheap to set up (Pekka Enberg)
- core/io: drop SQPOLL from io_uring backend (Pekka Enberg)
- core: Optimize index seek opcodes and count aggregate (Mikaël Francoeur)
- core/translate: honor INSERT target aliases in UPSERT (Wu Shuwen)
- core: Optimize table and index seek loops (Mikaël Francoeur)
- core: apply probe-side filters to hash join null-extended rows (Pekka Enberg)
- core: upgrade tantivy to 0.26.2 (Pedro Muniz)
- tests: remove test_ephemeral_temp_files_cleaned_up (Pekka Enberg)
- core/translate: set the column collation in DML index expressions (Joao Faria)
- make is_nonnull return false for the array operators @> and && (Sergei Iarymov)
- perf/tpc-h: run the benchmark five times and draw whiskers on the bars (Pekka Enberg)
- github: skip the apt install when jq and coreutils are present (Mikaël Francoeur)
- github: check Android native sync exports from ELF dynsym (Marc-André Moreau)
- core: cut the cost of index seeks and the per-statement bookkeeping (13/15) (Mikaël Francoeur)
- replace raw unsafe affinity with safe comparison one (Sergei Iarymov)
- build(deps-dev): bump @humanfs/node from 0.16.7 to 0.16.8 in /bindings/react-native (app/dependabot)
- github: Disable Criterion plots in nightly benchmarks (Pekka Enberg)
- docs: update JavaScript contribution guide links (Wu Shuwen)
- core/fts: merge segments on the write path past a threshold (Preston Thorpe)
- perf/memory: benchmark FTS queries and concurrent transactions (Pedro Muniz)
- core/vdbe: make scalar min keep the last of two tied args (Mikhailov Egor)
- core: inline the hot opcodes and the plain b-tree cursor reads (12/15) (Mikaël Francoeur)
- core: return instruction results and cursor advances in registers (Mikaël Francoeur)
- Improve TCP-H benchmark harness and plotting (Pekka Enberg)
- optimizer: correct join cardinality and connectivity (Jussi Saurio)
- core: Optimize comparisons, cell parsing and record stores (Mikaël Francoeur)
- bindings/dotnet: validate packaged remote and replica consumers (Marc-André Moreau)
- json: skip NULL labels in object aggregates (Wu Shuwen)
- json: preserve SQL NULL in jsonb() (Wu Shuwen)
- core: Optimize insert path, If, Compare and dispatch loop (Mikaël Francoeur)
- Cargo.lock: bump turso-join-benchmark to the workspace version (Mikaël Francoeur)
- bindings/dotnet: enable EF Core remote and replica backends (Marc-André Moreau)
- agent instructions (Mikaël Francoeur)
- core/storage: expose page-cache internals for differential testing behind aristo-instr (app/aretta-ci)
- sqlite/parser: reject DEFAULT clause on generated columns (Pure Tech)
- core/translate: reset collation before comparison (Mikhailov Egor)
- core: expose join estimates in JSON query plans (Jussi Saurio)
- core/vector: set C-dependent simsimd as an opt-out feature (Stef | ステフ)
- github: cache dist across release workflow runs (Abyss Lab)
- core/functions: read a BLOB date/time argument as text (Jerry Xiao)
- github: create the target directory before the nightly bench build wr… (Pekka Enberg)
- PRs that were already merged (Mikaël Francoeur)
- core: cut the per-statement cost of transaction start and cursor open (3/15) (Mikaël Francoeur)
- core: cut the per-statement cost of statement reset, metrics and seeks (4/15) (Mikaël Francoeur)
- core: skip the shared schema lock in maybe_update_schema inside a transaction (Pere Diaz Bou)
- eqp: mark left-join table scans (Jussi Saurio)
- core/mvcc: append rows at the rightmost leaf without re-seeking (Pere Diaz Bou)
- core/database: report a garbage header as "file is not a database" (Pekka Enberg)
- core/io: keep waiting when io_uring_enter is interrupted by a signal (Pere Diaz Bou)
- reset table-valued PRAGMA rowids for each scan (Jussi Saurio)
- core: Optimize step loop the cursor advance (Mikaël Francoeur)
- core/storage: bound-check table-leaf cell pointer array on read (Han Damin)
- bindings/dotnet: route sqlite facade through managed backends (Marc-André Moreau)
- orb: preload repository toolchains and dependencies (Pedro Muniz)
- core: format multi-index UPDATE plans (may)
- core/btree: advance synchronously within a leaf page in next() (Glauber Costa)
- core/vdbe: validate short text without alignment-sensitive utf8 checks (Glauber Costa)
- whopper: accept post-wrap values in sequence cycle check (Glauber Costa)
- bindings/dotnet: complete ADO.NET compatibility and stream recovery (Marc-André Moreau)
- core/vdbe: dispatch through a direct match with register-sized results (Glauber Costa)
- core/translate: enforce 2,000 max columns limit on tables (Kanad Bajpai)
- core/vdbe: check for interrupts every 64 instructions instead of every one (Glauber Costa)
- core/mvcc: batch concurrent logical-log commits behind one fsync (Pere Diaz Bou)
- core/translate: refuse ALTER TABLE RENAME onto an existing view name (Joao Faria)
- github: run each nightly Nyrkiö benchmark in its own step under a memory cap (Pekka Enberg)
- bindings/react-native: update @babel/core to 7.29.7 (Pekka Enberg)
- perf/throughput: Rewrite concurrent write throughput benchmark (Pekka Enberg)
- core/io: link completions to their group before submitting them (Pekka Enberg)
- core/translate: remove formatting allocation in schema (Kanad Bajpai)
- perf/latency: Rewrite transaction latency benchmark (Pekka Enberg)
- bindings/dotnet: pool replicas and schedule automatic pulls (Marc-André Moreau)
- build(deps-dev): bump esbuild from 0.27.7 to 0.28.2 in /examples/javascript/sync-wasm-vite (app/dependabot)
- examples/js: update esbuild to 0.28.2 (Pekka Enberg)
- core/translate: Pre-filter ephemeral indexes and improve subquery unnesting tests (Jussi Saurio)
- Update to Antithesis SDK 0.3.0 (Pekka Enberg)
- build(deps): bump json from 2.19.2 to 2.19.9 in /examples/react-native (app/dependabot)
- core/btree: rebuild required indexes for the ALTER column op (Avinash Sajjanshetty)
- perf/memory: Remove Cargo.lock (Pekka Enberg)
- examples/react-native: update dependencies for security advisories (Pekka Enberg)
- serverless/js: pin esbuild to 0.28.2 (Pekka Enberg)
- perf/tpc-h: run Q15 on Turso (Pekka Enberg)
- bindings/js: pin esbuild to 0.28.2 and drop the npm lockfile (Pekka Enberg)
- serverless/python: split batch step building out of Connection.batch (Pekka Enberg)
- testing/js: update vulnerable conformance dependencies (Pedro Muniz)
- serverless/js: update vulnerable transitive dependencies (Pedro Muniz)
- examples/js: update vulnerable Vite dependencies (Pedro Muniz)
- bindings/react-native: update vulnerable transitive dependencies (Pedro Muniz)
- bindings/js: update vulnerable development dependencies (Pedro Muniz)
- deps: update vulnerable Rust transitive dependencies (Pedro Muniz)
- bindings/dotnet: expose managed sync controls (Marc-André Moreau)
- bindings/dotnet: expose the native sync ABI (Marc-André Moreau)
- core/optimizer: disjunct terms of partial index predicate should be usable for covering index searches (Harsh Patel)
- core/pragma: apply auto_vacuum on a fresh database (Pekka Enberg)
- core: CDC code cleanups (Pekka Enberg)
- update devcontainer for codex (Mikaël Francoeur)
- remove benchmark that made no sense (Mikaël Francoeur)
- cli/import: prepare insert once instead of per batch (Sergei Iarymov)
- SQLite TCL harness improvements (Pekka Enberg)
- sqlite/parser: report bad parameter names as unrecognized tokens (Pekka Enberg)
- bindings/c: always finalize/reset a statement whose execution cannot complete (Pekka Enberg)
- sqlite/conformance: skip TCL tests for rollback journal modes (Pekka Enberg)
- core: skip vertical tab (0x0B) as whitespace in numeric affinity/cast (aetos)
- core: protect internal tables regardless of identifier case (may)
- core/storage: return Corrupt instead of panicking on damaged pages (Preston Thorpe)
- core/fts: make backing state transactional under MVCC (Preston Thorpe)
- extract column_info module (Mikaël Francoeur)
- build(deps): bump quinn-proto from 0.11.14 to 0.11.17 (app/dependabot)
- github: Run Rust tests on stacked PRs (Mikaël Francoeur)
- sqlite/parser: accept namespace-qualified and array-element parameter names (Pekka Enberg)
- core: prevent explicit checkpoints and root statements on the same connection (Denys Zhak)
- consider partial index predicates for covering index access (Mikaël Francoeur)
- Document a function (Mikaël Francoeur)
- replace some slices with BitSet (Mikaël Francoeur)
- Improve JSON function compatibility (Pekka Enberg)
- core/index-method: open backing storage through MVCC cursors (Preston Thorpe)
- cli/mcp: reject extra statements in family-scoped tools (Pere Diaz Bou)
- sqlite/conformance: normalize expected results in do_execsql_test (Pekka Enberg)
- github: publish dotnet packages with nuget trusted publishing (Pekka Enberg)
- bindings/js: report StepResult::Yield as STEP_SLEEP instead of STEP_IO (roboturso)
- Unify SQLite tracking version to 3.50.4 (Pekka Enberg)
- core/vdbe: only count codegen-marked steps as fullscan steps (Pekka Enberg)
- Flush index-method cursors when a subprogram halts (Vartan Babayan)
- testing/stress: stop replaying the same RNG stream after reopens (Pekka Enberg)
- testing/stress: exercise WAL checkpoints in the stress loop (Pekka Enberg)
- Improve unreliable-libc (Pekka Enberg)
- core/vdbe: fill NULLs when ColumnRange reads a never-opened cursor (Pavan Nambi)
- core: Reduce VDBE instruction memory footprint (Pekka Enberg)
- core/optimizer: use join-then-group subquery rewrite when group-first is unsafe (Jussi Saurio)
- sqlite/conformance: import wal_common.tcl from upstream SQLite (Pekka Enberg)
- core: report plain column names from RETURNING like SELECT does (Mike Murray)
- core/index_method: validate FTS WITH keys and make ngram window configurable (roboturso)
- test/perf/tpch: disable tpc-h query q20 again at least temporarily (Jussi Saurio)
- Sleep step result (Nikita Sivukhin)
- core/optimizer: unnest more correlated subqueries (Jussi Saurio)
- Make the SQLite TCL conformance harness actually run the upstream suite (Pekka Enberg)
- core/translate: allow PRAGMA auto_vacuum=NONE without the experimental flag (Pekka Enberg)
- core, sqlite/parser: reject LIMIT and ORDER BY on DELETE and UPDATE (Pekka Enberg)
- core/optimizer: use index for ORDER BY/GROUP BY on virtual generated columns (Mikaël Francoeur)
- show covering indexes in EXPLAIN QUERY PLAN (Mikaël Francoeur)
- postgres: explain simple queries (Rajat Venkatesh)
- sdk-kit: expose page codecs through C ABI (Marc-André Moreau)
- core/mvcc: Minor boolean logic simplification (Mikaël Francoeur)
- core/functions: anchor negative timediff on the later date (roboturso)
- core/storage: clear connection tx state before post-commit auto-checkpoint (roboturso)
- bindings/c: statement introspection, column conversions, and a C API oracle (Glauber Costa)
- serverless: send the remote encryption key with every request in all drivers (Glauber Costa)
- core: use index seeks for IS, like SQLite (Preston Thorpe)
- bindings/c: statement introspection, column conversions, and a C API oracle (Glauber Costa)
- core/index-method: declare MVCC capabilities (Preston Thorpe)
- tests: delete temporary databases instead of leaking them (Pekka Enberg)
- core: report one SQLite version everywhere (Pekka Enberg)
- bindings/tcl: enable ATTACH for the upstream TCL harness (Pekka Enberg)
- enable more tests (Mikaël Francoeur)
- core: stop scalar VALUES subqueries after first row (AYOUB NABIL BOUBAGRAT)
- core/vdbe: accept i64::MIN when applying numeric affinity to text (Martin Mauch)
- core/mvcc: reclaim Passive checkpoint versions and empty SkipMap slots (Pere Diaz Bou)
- testing/differential: make differential fuzzer reliable enough to run in CI, and run it in CI (Jussi Saurio)
- core/translate: route CREATE TEMP VIEW to the temp schema (roboturso)
- scripts: merge PRs through the asynchronous merge REST API (Mikaël Francoeur)
- core/vdbe: fuse consecutive Column reads into ColumnRange for O(N) record walks (Mikaël Francoeur)
- Import more Postgres upstream conformance tests (Pekka Enberg)
- sqlite/conformance: Import more upstream test files (Pekka Enberg)
- sqlite/conformance: run all upstream test files with pass/fail/skip statuses (Pekka Enberg)
- cli: show all lines of multi-line values in pretty mode (roboturso)
- core/incremental: re-drive yielded cursor ops in WriteRow instead of advancing state (Martin Mauch)
- core: move Database into its own database.rs module (Pekka Enberg)
- core/vdbe: roll back attached implicit transaction on statement abort (Pekka Enberg)
- bindings/dotnet: split NuGet runtime packages (Marc-André Moreau)
- core/pager: fsync synchronous=FULL commits in a fresh WAL generation (Pekka Enberg)
- core/schema: give unique set columns a named struct (Mikaël Francoeur)
- core: match SQLite for i64::MIN hex literal negation in defaults (roboturso)
- cli: print blob bytes raw in list output mode (roboturso)
- core/vdbe: use Cursor::NullRow variant when NullRow targets unopened slot (roboturso)
- testing/antithesis: create stress-composer database with random page size (Pekka Enberg)
- fossier: vouch for @haze518 (Mikaël Francoeur)
- mvcc: mark internal-only commits in the logical log (Preston Thorpe)
- core/mvcc: call on_checkpoint_end before releasing checkpoint locks (Pere Diaz Bou)
- allow picking emails to notify in Antithesis Experiment workflow (Mikaël Francoeur)
- core/mvcc: handle abort on inner transaction of sequence properly (Avinash Sajjanshetty)
- Instruct AI agents to prefer simple language (Jussi Saurio)
- WITH RECURSIVE (Jussi Saurio)
- FTS performance, memory, and maintenance improvements (Preston Thorpe)
- core: reject invalid UTF-8 in TEXT record payloads (roboturso)
- perf/core: inline short reused value copies (Jussi Saurio)
- perf: core/storage: specialize record payload extraction (Jussi Saurio)
- postgres: evaluate = ANY(array) and <> ALL(array) instead of stubbing to false (Michael)
- core/mvcc: clear pending running CRC when a deferred log write aborts (roboturso)
- github: Cache Rust toolchain for Codspeed jobs (Pekka Enberg)
- sync: auto-detect the remote pull protocol (Preston Thorpe)
- bindings: accept turso:// scheme in sync remote URLs (Pekka Enberg)
- cli: switch syntect back to crates.io release (Pekka Enberg)
- docs: document CDC commit records and change_txn_id (Pekka Enberg)
- github: Reclaim Windows runner disk space before cross-platform simulator tests (Pekka Enberg)
- core/storage: make B-tree buffer growth fallible (Pedro Muniz)
- core/vdbe: reuse sorter, aggregate, and cast buffers (Pedro Muniz)
- core/mvcc: transfer write set during rollback (Pedro Muniz)
- core/translate: report composite primary key position in table_info (Chris Siddall)
- core/vdbe: reject even argument counts in json_insert/json_replace (roboturso)
- ci: use canonical bindings/* labels in auto-labeler (Pekka Enberg)
- postgres: honor NULLS FIRST/LAST in ORDER BY (Oliver Rice)
- bindings/javascript: pin playwright to 1.61.0 to match container image (Pekka Enberg)
- core/translate: report zero result columns for
CREATE TABLE ... AS SELECT(Pekka Enberg) - serverless: drop reserved replication_index fields from PROTOCOL.md (Pekka Enberg)
- github: Switch workflows from EOL Node 20 to Node 22/24 (Pekka Enberg)
- core/translate: repay deferred FK violations per matching child on parent INSERT (Martin Mauch)
- core/vdbe: recycle records through pseudo registers (Pedro Muniz)
- Some refactoring around comparison and null handling (Mikaël Francoeur)
- core/vdbe: recycle record-producing opcode buffers (Pedro Muniz)
- Serverless transaction async no exec lock (Nikita Sivukhin)
- core: make typed row conversions checked and accept integers as f64 (Pekka Enberg)
- make single-variant enum IOCompletions into unit struct (Preston Thorpe)
- core/vdbe: reuse staged value buffers (Pedro Muniz)
- core/storage: use allocator-backed B-tree buffers (Pedro Muniz)
- core/vdbe: recycle register copies (Pedro Muniz)
- use try_vec for random/zeroblob allocation (Preston Thorpe)
- core/types: recycle serialized record buffers (Pedro Muniz)
- core/translate: apply explicit COLLATE in compound SELECT ORDER BY (Martian)
- build(deps-dev): bump brace-expansion from 2.1.0 to 2.1.2 in /testing/conformance/javascript (app/dependabot)
- core/translate: reject NULLS FIRST/LAST in index definitions and upsert targets (roboturso)
- core/translate: evaluate subqueries in aggregate args/FILTER before group by loop (Preston Thorpe)
- translate: use covering indexes for column-free scans (GoodGoodMan)
- build(deps-dev): bump shell-quote from 1.8.4 to 1.10.0 in /bindings/react-native (app/dependabot)
- sync/engine: temporarily use truncate checkpoint only in mvcc mode (Preston Thorpe)
- core/translate: report row value misused on arity mismatch (roboturso)
- core/mvcc: use dynamic allocator for logical-log buffers (Pedro Muniz)
- core/mvcc: annotate and instrument logical-log durability invariants (Sushant Dinesh)
- core/vdbe: hoist per-instruction bookkeeping out of the dispatch loop (Glauber Costa)
- simulator: Model per-row UNIQUE checks in UPDATE shadow (Jussi Saurio)
- bindings/js, serverless/js: collapse duplicate column names in expanded rows (Pekka Enberg)
- core/mvcc: allocate portable logical logs with TursoAllocator (Pedro Muniz)
- Agentic instructions (Mikaël Francoeur)
- serverless: remove Connection.execute() from the main API (Pekka Enberg)
- ci: give every build-native leg a 60 minute timeout (Pekka Enberg)
- postgres: accept COMMENT ON as a no-op (Rajat Venkatesh)
- core/incremental: keep compound IS NULL predicates on the native filter path (Martin Mauch)
- tests: replace iteration-capped nextval retry spin with stall deadline (Pekka Enberg)
- core: reject journal_mode changes while CDC capture is active (russell romney)
- ci: enable Rust backtraces in the Rust workflow (Pekka Enberg)
- sql_generation: exclude i64::MAX from shadow integer affinity conversion (Pekka Enberg)
- core: Clean up
Database::open()variants withOpenOptions(Pekka Enberg) - testing: rename sqltests runner to sqltest (Pekka Enberg)
- serverless/javascript: await async prepare() in integration tests (Glauber Costa)
- perf(vdbe): decode pseudo-cursor columns in place and skip Column op-state (Glauber Costa)
- perf(translate): evaluate a subquery once when shared by GROUP BY and SELECT (Glauber Costa)
- core/mvcc: stream logical log serialization (Pedro Muniz)
- fossier: vouch for @nightscape (Mikaël Francoeur)
- core/mvcc: return if truncate did truncate or not (Pere Diaz Bou)
- allow to pass arbitrary request headers in the queries through queryOptions (Nikita Sivukhin)
- core/mvcc: retain checkpointed superseded versions in GC until overwrite is durable (roboturso)
- Clean up SQLite conformance tests (Pekka Enberg)
- core/mvcc: benchmark logical log serialization (Pedro Muniz)
- core/vdbe: close vtab cursors before transaction finalization (Luther Monson)
- core/mvcc: allocate stored records through MVStore allocator (Pedro Muniz)
- readme: position Turso as multi-frontend (SQLite + Postgres) (Glauber Costa)
- ci: switch x64 windows jobs to blacksmith runners (Pekka Enberg)
- tests: reduce iteration counts in slow mvcc stress tests (Pekka Enberg)
- ci: split no-checksum integrity tests into a dedicated Linux job (Pekka Enberg)
- ci: pin nightly toolchains to nightly-2025-12-17 (Pekka Enberg)
- ci: run Nyrkiö benchmark workflow only on push to main (Pekka Enberg)
- ci: run whopper simulator iterations concurrently (Pekka Enberg)
- core/json: propagate JSONB allocation failures (Pedro Muniz)
- core: use ValueBlob in blob functions (Pedro Muniz)
- core: propagate incremental blob allocation failures (Pedro Muniz)
- core: propagate ValueBlob allocation failures (Pedro Muniz)
- core: incremental blob I/O (sqlite3_blob_*) backed by the VDBE (Glauber Costa)
- core: kill Connection::prepare_stmt() (Pekka Enberg)
- docs: refresh SQL reference for Turso 0.7 (Glauber Costa)
- core: dedup statement parsing into Connection::parse_sql() (Pekka Enberg)
- testing/sqltests: replace param-hoisting timing test with bytecode snapshot (Pekka Enberg)
- tests/fuzz: loosen float tolerance in math expression fuzz (Pekka Enberg)
- core: pass TursoAllocator through Value::Blob (Pedro Muniz)
Fixed
- testing/stress: handle Busy errors from
integrity_check(Avinash Sajjanshetty) - core/io: Fix completion group memory leak (Pedro Muniz)
- core/vdbe: fix wrong schema_version after VACUUM INTO on an MVCC database (roboturso)
- core/translate: resolve REINDEX targets past collation false positives (Glauber Costa)
- optimizer: integrate hash joins better into cost model and fix hash-join associated bugs (Jussi Saurio)
- tests/database and types: assert opens, uuid errors and reprepares (Mikaël Francoeur)
- tests/read path: assert plans, errors and rows with asserting (Mikaël Francoeur)
- tests: assert errors and their messages with asserting (Mikaël Francoeur)
- core/translate: resolve collation for generated-column references in row values (Glauber Costa)
- bench: separate FTS query fixtures from automatic merging (Pedro Muniz)
- core/wal: fix multiprocess database file reader race (Pekka Enberg)
- sdk: return commit dependency errors as busy (Avinash Sajjanshetty)
- core: report SQLITE_FULL without a "Database is full: " prefix (Pekka Enberg)
- core/mvcc: fix group commit retry leak (Pekka Enberg)
- core/translate: Fix handling of NULLs for row-value comparison against literal list (thomas kim)
- core: Fix concurrent view expansion (Mikaël Francoeur)
- Fix empty wal checkpoint sync (Nikita Sivukhin)
- docs: fix simulator runner links (Wu Shuwen)
- Fix RENAME COLUMN with collated table constraints (Wu Shuwen)
- fix(optimizer): is_nonnull must return false for JSON arrow operators and LIKE with nullable ESCAPE (Diwakar Ray Yadav)
- Fix generate_series bugs (Jussi Saurio)
- Fix column affinity calculation for CREATE TABLE AS SELECT (Jussi Saurio)
- sync/bindings: fix memory issues with JS/NAPI buffers (Preston Thorpe)
- core/functions: fix datetime rounding (Mikhailov Egor)
- Fix attached database paths that incorrectly use main database state (Pavan Nambi)
- core/json: fix json_each/json_tree over null column (Mikhailov Egor)
- core/mvcc: fix MVCC begin race with blocking checkpoint (Avinash Sajjanshetty)
- Fix documentation typos (committed/occurred) (KAWACU Kennedy)
- fix dead Discord invite links (Hernan Gonzalez)
- Fix clone_test_db.sh to clone the real testing database path (KAWACU Kennedy)
- core/io: fix completion group hang when child finishes during build (Pekka Enberg)
- core/translate: fix autoindex construction to read virtual generated-column dependencies from the source table instead of the index being built (Harsh Patel)
- Fixes for Nyrkiö nightly run (Pekka Enberg)
- bindings/rust: fix Windows panic when sync sends a request body over 4 GiB (Preston Thorpe)
- Fix b-tree corruption with cells below minimum size (Pekka Enberg)
- More SQLite JSON function fixes (Pekka Enberg)
- core/vdbe: roll back explicit transaction after WAL write error (Pavan Nambi)
- postgres: fix current date and time expressions being treated as columns (Joe Sluis)
- Fixes for json_valid() SQL function (Pekka Enberg)
- core/translate: Fix correlated rowid reads from covering index scans (Pavan Nambi)
- core: fix affinity loss for FROM-subquery/CTE/view columns with no real type (Sergei Iarymov)
- sync: fix WAL session double-end after commit error (Avinash Sajjanshetty)
- Fix WAL frame-1 checksum after savepoint rollback and cache spill (Pavan Nambi)
- core: Fix snapshot isolation violation for passive MVCC checkpoint (Preston Thorpe)
- core/fts: Fix ngram tokenizer casing (Ghxst ☠️)
- SQLite-compatible error messages (Pekka Enberg)
- Fixes for MVCC sync issues found by fuzzer (Preston Thorpe)
- core/translate: fix REAL-affinity index seeks losing integer precision (Sergei Iarymov)
- core: make committed WAL data survive a crash before the first checkpoint (roboturso)
- sqlite/parser: match SQLite error for ORDER BY before compound operator (roboturso)
- fts: fix duplicate rowids when index build flushes full batches (Pavan Nambi)
- core: fix MVCC+CDC panic on empty COMMIT after a failed captured write (Glauber Costa)
- tests/integration: extract shared UnreliableIo crash-simulation module (Pekka Enberg)
- Fix partial index alias panic (Nikita Sivukhin)
- core/wal: fsync WAL before checkpoint backfill for crash atomicity (roboturso)
- core/vdbe: fix round() to break exact ties away from zero (Sergei Iarymov)
- github: strip debug info from Linux JS native libraries (Pekka Enberg)
- fix: wasm32 unknow unknow compilation (Marc-Anthony)
- core: fix attached-database tx handling (Preston Thorpe)
- Fix encrypted fresh DB page-size retargeting (Ahmad Alhour)
- github: Never mark issues as stale (Pekka Enberg)
- sync: fix DELETE and upsert replay for tables with composite PK (Preston Thorpe)
- mvcc: fix rootpage resolution for portable changes (Preston Thorpe)
- fix/core/views: derive star columns from joined sources (Jussi Saurio)
- build: fix uv project reference in Makefile test targets (Michael)
- testing/stress: handle busy errors during
integrity_check(Avinash Sajjanshetty) - core: Fix change count leaking from sequences in MVCC mode (Preston Thorpe)
- bindings/python: Reject sqlite3.Row when used as a row_factory with an explicit TypeError (Orthel Toralen)
- Fix panics (Nikita Sivukhin)
- Fix Rust IOCP multiprocess WAL execute_batch hang (Marc-André Moreau)
- parser: preserve blob literal prefix case (Martian)
- core/vdbe: fix dropped comparison result in spilled sort merge (Pekka Enberg)
- Fix JavaScript serverless driver URL normalization (Pekka Enberg)
- core/mvcc: fix passive checkpoint races with concurrent DROP (Pere Diaz Bou)
- bindings/tcl: resolve cargo target dir via scripts/cargo-target-dir (Pekka Enberg)
- core/translate: Fix "no such column" error to echo query casing, not schema casing (Vibhas Goyal)
- Fix sync engine transform (Nikita Sivukhin)
- core/vdbe: Fix panic in EXPLAIN on compound select with ORDER BY (Shubham Mishra)
- Random fixes for upstream SQLite TCL test failures (Pekka Enberg)
- core/vdbe: resolve aggregate argument collation at translation time (Glauber Costa)
- perf(sorter): compare records via a normalized 8-byte key prefix (Glauber Costa)
- Fix async transaction API in JavaScript SDKs (Nikita Sivukhin)
- core/storage: assert checkpoint backfill crash-atomicity (reveals a NORMAL-mode torn-recovery bug) (Sushant Dinesh)
- core/windows: fix WAL lock coordination (Marc-André Moreau)
- fix: do not resolve schema-qualified references as cte (howen)
- serverless/javascript: fix stale inTransaction after execute and batch (Pekka Enberg)
- fix compilation for integration test (Nikita Sivukhin)
- postgres/cli: fix port collisions in wire-protocol tests (Pekka Enberg)
- core/translate: Fix missing index after UPSERT due to pre-constraint check index mutation (Preston Thorpe)
- core/translate: Fix cost model for InSeek for IN LIST query (Preston Thorpe)
Install turso_cli 0.8.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/tursodatabase/turso/releases/download/v0.8.0/turso_cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/tursodatabase/turso/releases/download/v0.8.0/turso_cli-installer.ps1 | iex"Download turso_cli 0.8.0
| File | Platform | Checksum |
|---|---|---|
| turso_cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| turso_cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| turso_cli-aarch64-pc-windows-msvc.zip | ARM64 Windows | checksum |
| turso_cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| turso_cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| turso_cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo tursodatabase/tursoYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>