Release Notes
Added
- docs: Add section on MVCC limitations (Pekka Enberg)
- sim: add Profile::SimpleMvcc (Jussi Saurio)
- Add encryption internals docs (Avinash Sajjanshetty)
- core/storage: Apple platforms support (Charly Delaroche)
- Reject unsupported FROM clauses in UPDATE (Mikaël Francoeur)
- Add Database::indexes_enabled() (Jussi Saurio)
- Add Mold linker setup to CONTRIBUTING.md (Pekka Enberg)
- support multiple conflict clauses in upsert (Nikita Sivukhin)
- stress: add option to choose how many tables to generate (Pere Diaz Bou)
- add manual page about materialized views (Glauber Costa)
- support mixed integer and float expressions in the expr_compiler (Glauber Costa)
- github: Add 30 minute timeout to all jobs (Pekka Enberg)
- Add
CASTto fuzzer (Levy A.) - Implement json_tree (Mikaël Francoeur)
- translate: disable support for UPDATE ... ORDER BY (Jussi Saurio)
- MVCC: support alter table (Jussi Saurio)
- mvcc: add blocking checkpoint (Jussi Saurio)
- Add built-in manual pages for Turso (Glauber Costa)
- Support referring to rowid as rowid or oid (Jussi Saurio)
- translate: implement Sequence opcode and fix sort order (Preston Thorpe)
- mvcc: add blocking checkpoint lock (Jussi Saurio)
- translate/emitter: Implement partial indexes (Preston Thorpe)
- Support UNION queries in DBSP-based Materialized Views (Glauber Costa)
- Add encryption throughput test (Avinash Sajjanshetty)
- Support JOINs in DBSP materialized views (Glauber Costa)
- Fix C API compatibility tests and add a minimal CI (Andrea Peruffo)
- Introduce instruction VTABLE (Lâm Hoàng Phúc)
- core/mvcc: introduce with_header for MVCC header update tracking (Pere Diaz Bou)
- Inital support for window functions (Piotr Rżysko)
- Implement Min/Max aggregators (Glauber Costa)
- Add quoted identifier test cases for
ALTER TABLE(Levy A.) - add perf/throughput/rusqlite to workspace (Pedro Muniz)
- add perf/throughput/turso to workspace (Pedro Muniz)
- Add per page checksums (Avinash Sajjanshetty)
- core/throughput: Add per transaction think time support (Pekka Enberg)
- Fix simulator docker build chef by adding whopper directory (Preston Thorpe)
- Implement the balance_quick algorithm (Jussi Saurio)
- benchmark: introduce simple 1 thread concurrent benchmark for mvcc/sq… (Pere Diaz Bou)
- perf: Add simple throughput benchmark (Pekka Enberg)
- Add BEGIN CONCURRENT support for MVCC mode (Pekka Enberg)
- add explicit usize type annotation to range iterator in test (Denizhan Dakılır)
- whopper: A new DST with concurrency (Pekka Enberg)
- serverless: Add Connection.reconnect() method (Mayank)
- Return parse error for unsupported exprs (Jussi Saurio)
- translate: return parse error for unsupported join types (Jussi Saurio)
- Add scripts that help debug bugs from simulator (Jussi Saurio)
- core: Support ceiling modifier in datetime (Ceferino Patino)
Updated
- CI: run long fuzz tests and stress on every PR, use 2 threads for stress (Jussi Saurio)
- Disallow INDEXED BY / NOT INDEXED in select (Jussi Saurio)
- core/mvcc: Rename "-lg" to "-log" (Pekka Enberg)
- docs: Document more CLI command line options (Pekka Enberg)
- Update man pages for encryption (Avinash Sajjanshetty)
- core/mvcc: Return completions from logical log methods (Pedro Muniz)
- Improve MCP configuration docs (Jamie Barton)
- Enable encryption properly in Rust bindings, whopper, and throughput tests (Avinash Sajjanshetty)
- Enable checksums only if its opted in via feature flag (Avinash Sajjanshetty)
- Sync engine defered sync (Nikita Sivukhin)
- core/vdbe: Avoid cloning Arc<MvStore> on every VDBE step (Pekka Enberg)
- mvcc: dont try to end pager tx on connection close (Jussi Saurio)
- Allow workflow_dispatch for all CI to allow for re-running jobs (Preston Thorpe)
- printf should truncates floats (Pavan Nambi)
- simulator: reopen database with mvcc and indexes when necessary (Pedro Muniz)
- core/storage: Switch page cache queue to linked list (Pekka Enberg)
- Improve throughput benchmarks (Pekka Enberg)
- Beta (Pekka Enberg)
- make connect() method optional and call it implicitly on first query execution (Nikita Sivukhin)
- mvcc: dont use mv store for ephemeral tables (Jussi Saurio)
- Simulator: Concurrent transactions (Pedro Muniz)
- Measure read/write latencies in encryption benchmarks (Avinash Sajjanshetty)
- simplify
exec_trimcode + only pattern match on whitespace char (Pedro Muniz) - MVCC: Handle table ID / rootpages properly for both checkpointed and non-checkpointed tables (Jussi Saurio)
- Make encryption opt in via flag (Avinash Sajjanshetty)
- core/mvcc: Optimize exclusive transaction check (Pekka Enberg)
- core: change root_page to i64 (Pere Diaz Bou)
- core/storage: Remove unused import from encryption.rs (Pekka Enberg)
- small improvement of stress testing tool (Nikita Sivukhin)
- sum() can throw integer overflow (Duy Dang)
- correct span in ParseUnexpectedToken (Lâm Hoàng Phúc)
- Remove double-quoted identifier assert (Diego Reis)
- substr scalar should also work with non-text values (Diego Reis)
- core: Disallow CREATE INDEX when MVCC is enabled (Pekka Enberg)
- javascript: Rename "browser" packages to "wasm" (Pekka Enberg)
- core/vdbe: Wrap Program::n_change with AtomicI64 (Pekka Enberg)
- use explicit null if it set instead of column default value (Nikita Sivukhin)
- Improve encryption module (Avinash Sajjanshetty)
- Remove vendored parser now that we have our own (Preston Thorpe)
- core/storage: Wrap Pager::commit_info with RwLock (Pekka Enberg)
- core/storage: Wrap WalFile::{max,min}_frame with AtomicU64 (Pekka Enberg)
- core/storage: Wrap WalFile::max_frame_read_lock_index with AtomicUsize (Pekka Enberg)
- core/storage: Mark Page as Send and Sync (Pekka Enberg)
- Move turso.png image to assets directory (Preston Thorpe)
- core/translate: rewrite default column value from identifier to string literal (Preston Thorpe)
- core/translate: Persist NOT NULL column constraint to schema table (Preston Thorpe)
- Sqlean fuzzy string (Danawan Bimantoro)
- Make Sorter Send and Sync (Pekka Enberg)
- length shall not count when it sees nullc (Pavan Nambi)
- core/storage: Wrap WalFile::syncing with AtomicBool (Pekka Enberg)
- Make MVCC code Send and Sync (Pekka Enberg)
- core: recover logical log on
Database::connect(Pere Diaz Bou) - core/storage: Display page category for rowid integrity check failure (Pekka Enberg)
- translate: refactor arguments and centralize parameter context (Preston Thorpe)
- translate: disallow creating/dropping internal tables (Jussi Saurio)
- Improve DBSP view serialization (Glauber Costa)
- Disallow multiple primary keys in table definition (Jussi Saurio)
- Display nothing for .schema command when table not found (Preston Thorpe)
- Make Connection Send (Pekka Enberg)
- core/mvcc/logical-log: refactor get log path in tests (Pere Diaz Bou)
- Disallow ORDER BY and LIMIT in a non-compound VALUES() statement (Jussi Saurio)
- core: Wrap Connection::mv_tx with RwLock (Pekka Enberg)
- Autoincrement (Pavan Nambi)
- core/mvcc/logical-log: load logical log from disk (Pere Diaz Bou)
- Normalize target table name identifier on table or column rename (Iaroslav Zeigerman)
- use a different seed for
gen_rng(Pedro Muniz) - core: Wrap Connection::attached_databases with RwLock (Pekka Enberg)
- core/mvcc/logical-log: on disk format for logical log (Pere Diaz Bou)
- Wrap more Connection fields with atomics (Pekka Enberg)
- core/mvcc: Wrap Transaction::database_header with RwLock (Pekka Enberg)
- core: Wrap Connection::capture_data_changes in RwLock (Pekka Enberg)
- antithesis-tests: Rename "utils.py" to "helper_utils.py" (Pekka Enberg)
- Make some Connection fields atomic (Pekka Enberg)
- Simulator Runtime generation (Pedro Muniz)
- Use SQL over HTTP batch statements for sync push (Nikita Sivukhin)
- JavaScript bindings browser tests (Nikita Sivukhin)
- core: Wrap Connection::transaction_state with RwLock (Pekka Enberg)
- core: Wrap Connection::autocommit in AtomicBool (Pekka Enberg)
- use wasm-runtime from NPM instead of patched sources (Nikita Sivukhin)
- core: Wrap Connection::database_schemas in RwLock (Pekka Enberg)
- core: Wrap Connection::schema in RwLock (Pekka Enberg)
- Stop incrementing n_changes for idx delete (Preston Thorpe)
- core: Wrap Connection::pager in RwLock (Pekka Enberg)
- Disable extension loading at runtime (Preston Thorpe)
- mvcc: simplify StateMachine (Jussi Saurio)
- core: Wrap Pager::io_ctx in RwLock (Pekka Enberg)
- Enable checksum tests if checksum feature is on (Kacper Kołodziej)
- Wrap Pager vacuum state in RwLock (Pekka Enberg)
- Enhancement to Sim Snapshot isolation code (Pedro Muniz)
- core/io: Ensure callbacks are invoked once (Pedro Muniz)
- Upgrade dist to 0.30.0 (Pekka Enberg)
- Sync improvements (Nikita Sivukhin)
- Remove some unnecessary unsafe impls (Pedro Muniz)
- Pragma busy timeout (Nikita Sivukhin)
- translate/optimize: centralize AST/expr traversal (Preston Thorpe)
- prevent alter table with materialized views (Glauber Costa)
- core/mvcc: Wrap LogicalLog in RwLock (Pekka Enberg)
- mvcc: remove unused code related to is_logical_log() (Jussi Saurio)
- Put the unused variable behind a flag as intended (Avinash Sajjanshetty)
- whopper: Gracefully handle file size limits in simulator (Avinash Sajjanshetty)
- core/storage: Wrap Pager::header_ref_state in RwLock (Pekka Enberg)
- core/mvcc: Kill noop storage (Pekka Enberg)
- core/mvcc: LogicalLog simple append serializer (Pere Diaz Bou)
- core/storage: Wrap Pager::free_page_state with RwLock (Pekka Enberg)
- core: Rename Connection::_db to db (Pekka Enberg)
- core/storage: Switch Pager::max_page_count to AtomicU32 (Pekka Enberg)
- core/storage: Use AtomicU16 for Pager::reserved_space (Pekka Enberg)
- remove io.blocks from btree balancing code (Nikita Sivukhin)
- core: Use sequential consistency for atomics by default (Pekka Enberg)
- core/storage: Use AtomicU32 for Pager::page_size (Pekka Enberg)
- Convert more Pager fields towards being Send (Pekka Enberg)
- More async (Nikita Sivukhin)
- Enable encryption option in Whopper (Avinash Sajjanshetty)
- Compat: Translate the 2nd argument of group_concat / string_agg (Iaroslav Zeigerman)
- Reduce allocations needed for
break_predicate_at_and_boundaries(Lâm Hoàng Phúc) - Simulator Multiple Connections (Pedro Muniz)
- translation: rewrite expressions and properly handle quoted identifiers in UPSERT (Preston Thorpe)
- Remove serialization of normal write/commit path (Preston Thorpe)
- core/vtab: Wrap InternalVirtualTable with RwLock (Pekka Enberg)
- Clean up encryption feature flag usage (Avinash Sajjanshetty)
- core/storage: Wrap Pager::checkpoint_state in RwLock (Pekka Enberg)
- core: Wrap Pager dirty_pages in RwLock (Pekka Enberg)
- core: Wrap MvCursor in Arc<RwLock<>> (Pekka Enberg)
- core/incremental: Wrap ViewTransactionState in Arc (Pekka Enberg)
- core/function: Wrap ExtFunc in Arc (Pekka Enberg)
- core/vtab: Mark VTabModuleImpl as Send and Sync (Pekka Enberg)
- core/vtab: Use AtomicPtr for table_ptr (Pekka Enberg)
- Remove LimboResult enum and InsnFunctionStepResult::Busy variant (Jussi Saurio)
- core: Wrap symbol table with RwLock (Pekka Enberg)
- core/ext: Switch vtab_modules from Rc to Arc (Pekka Enberg)
- core/storage: Clean up unused import warning in encryption.rs (Pekka Enberg)
- core: Convert Rc<Pager> to Arc<Pager> (Pekka Enberg)
- whopper: Handle write-write conflict (Pekka Enberg)
- mvcc: handle properly the case where starting pager read tx fails with busy (Jussi Saurio)
- core/mvcc: Specify level for tracing (Pekka Enberg)
- Switch to GitHub runners for performance workflows (Diego Reis)
- Move common dependencies to workspace (Pedro Muniz)
- avoid unnecessary cloning when formatting Txn for Display (Avinash Sajjanshetty)
- Busy handler (Pedro Muniz)
- test/fuzz: improve maintainability/usability of tx isolation test (Jussi Saurio)
- mvcc: Complete commit state machine early if write set is empty (Jussi Saurio)
- make whopper run with checksums (Avinash Sajjanshetty)
- Whopper + MVCC (Pekka Enberg)
- Dont grab page cache write lock in a loop (Preston Thorpe)
- perf/throughput/turso: Async transactions with concurrent mode (Pekka Enberg)
- Handle partial writes in unix IO for pwrite and pwritev (Preston Thorpe)
- remove Stmt clone (Lâm Hoàng Phúc)
- core/storage: Remove unused import warning (Pekka Enberg)
- Handle
EXPLAIN QUERY PLANlike SQLite (Lâm Hoàng Phúc) - Update epoch on each checkpoint to prevent using stale pages for backfilling (Preston Thorpe)
- MVCC: remove reliance on BTreeCursor::has_record() (Jussi Saurio)
- Refactor UPSERT to use wal_expr_mut to walk AST. (Preston Thorpe)
- Commit uncommitted whopper lockfile (Jussi Saurio)
- core/schema: Optimize get_dependent_materialized_views() when no views (Pekka Enberg)
- core/mvcc: Eliminate RwLock wrapping Transaction (Pekka Enberg)
- bindings/java: PreparedStatement executeUpdate (zongkx)
- handle
EXPLAINlike sqlite (Lâm Hoàng Phúc) - Document DEFERRED and IMMEDIATE transaction modes (Pekka Enberg)
- Refactor parseschema (Jussi Saurio)
- Remove some traces in super hot paths in btree (Preston Thorpe)
- Sync package opfs (Nikita Sivukhin)
- Ensure that Connection::query() checks whether its schema is up to date (Jussi Saurio)
- refactor cli:
readlinewill write toinput_buf(Lâm Hoàng Phúc) - check freelist count in integrity check (Jussi Saurio)
- Enable the use of indexes in DELETE statements (Jussi Saurio)
- core: Rename IO::run_once() to IO::step() (Pekka Enberg)
- simulator: Clean up code to use extract_if() (Pavan Nambi)
Fixed
- fix sync-engine bug when auth token is provided as dynamic function (Nikita Sivukhin)
- Fix COLLATE (Jussi Saurio)
- core/translate: fix rowid affinity (Preston Thorpe)
- Improve error handling for cyclic views (Duy Dang)
- Fix MVCC drop table (Jussi Saurio)
- Fix MVCC startup infinite loop when using existing DB (Jussi Saurio)
- Fix: JOIN USING should pick columns from left table, not right (Jussi Saurio)
- fix/vdbe: reset op_transaction state properly (Jussi Saurio)
- Resolve appropriate column name for rowid alias/PK (Preston Thorpe)
- fix/mvcc: deserialize table_id as i64 (Jussi Saurio)
- Substr fix UTF-8 (Pedro Muniz)
- fix/mvcc: set log offset to end of file after recovery finishes (Jussi Saurio)
- Fix index bookkeeping in DROP COLUMN (Jussi Saurio)
- Fix self-insert with nested subquery (Mikaël Francoeur)
- Fix SQLite database file pending byte page (Pedro Muniz)
- Index search fixes (Nikita Sivukhin)
- Anonymous params fix (Nikita Sivukhin)
- core/vdbe: Fix BEGIN after BEGIN CONCURRENT check (Pekka Enberg)
- sum should identify if there is num in strings/prefix of strings (Pavan Nambi)
- remove UnterminatedBlockComment error (Lâm Hoàng Phúc)
- core/printf: Compatibility tests and fixes for printf() (Luiz Gustavo)
- Fix materialized views with complex expressions (Glauber Costa)
- Fix column fetch in joins (Glauber Costa)
- quoting fix (Nikita Sivukhin)
- translate/upsert: fix explicit conflict target of non-rowid primary key in UPSERT (Preston Thorpe)
- Fix zero limit (Nikita Sivukhin)
- Correct spelling issue in ForeignKey ast node (Preston Thorpe)
- resolve column alias after rewritting column access in the expression in returning insert clause (Nikita Sivukhin)
- Fix materialized views where clause issues (Glauber Costa)
- Fix various ALTER TABLE bugs (Jussi Saurio)
- Fix offset variable handling (Nikita Sivukhin)
- fix encryption config in the sync-client (Nikita Sivukhin)
- fix avg aggregation (Nikita Sivukhin)
- Fix CREATE INDEX with quoted identifiers (Iaroslav Zeigerman)
- Fix ungrouped aggregate with offset clause (Preston Thorpe)
- Fix incorrect "column is ambiguous" error with USING clause (Jussi Saurio)
- parser: fix incorrect LIMIT/OFFSET parsing of form LIMIT x,y (Jussi Saurio)
- Fix .schema command for empty databases (Diego Reis)
- Fix JavaScript bindings (Nikita Sivukhin)
- Fix result columns binding precedence (Jussi Saurio)
- Fix program counter update in sequence test op (Preston Thorpe)
- Fix INSERT INTO t DEFAULT VALUES (Jussi Saurio)
- fix: CTE alias resolution in planner (Mayank)
- Differential testing fixes (Pedro Muniz)
- Fix busy handler (Lâm Hoàng Phúc)
- DBSP: Return a parse error for a non-equality join (Glauber Costa)
- sqlite3: Fix compatibility test error by canonicalizing path (Samuel Marks)
- bugfix: clear reserved space for a reused page (Avinash Sajjanshetty)
- Fix MVCC concurrency bugs (Jussi Saurio)
- Fix math functions compatibility issues (Levy A.)
- simulator: Fix shrinking (Pedro Muniz)
- Fix some Rust compilation warnings (Samuel Marks)
- translate/insert: fix
program.result_columnswhen inserting multiple rows (Preston Thorpe) - stress: Retry sync on error to avoid a panic, take 2 (Pekka Enberg)
- translate: couple fixes from testing with Gorm (Preston Thorpe)
- Fix is_nonnull returns true on 1 / 0 (Lâm Hoàng Phúc)
- Fix 3 different MVCC bugs (Jussi Saurio)
- fix re-entrancy issue in Pager::free_page (Jussi Saurio)
- stress: Retry sync on error to avoid a panic (Pekka Enberg)
- move
divider_cell_is_overflow_cellto debug assertions (Pedro Muniz) - Fix SharedWalFile deadlock in multithreaded context (Jussi Saurio)
- Fix MVCC update (Jussi Saurio)
- Various fixes to sync (Nikita Sivukhin)
- mvcc: fix hang when CONCURRENT tx tries to commit and non-CONCURRENT tx is active (Jussi Saurio)
- mvcc: fix two sources of panic (Jussi Saurio)
- Fix MVCC rollback (Jussi Saurio)
- Random fixes for MVCC (Jussi Saurio)
- core: Panic on fsync() error by default (Pekka Enberg)
- fix(btree): advance cursor after interior node replacement in delete (Jussi Saurio)
- core/vdbe: Fix BEGIN CONCURRENT transactions (Pekka Enberg)
- Fix incompatible math functions (Levy A.)
- fix wasm-runtime package.json (Nikita Sivukhin)
- fix CI for apple builds (Nikita Sivukhin)
- hack imports of wasm due to the issues in Vite and Next.js build systems (Nikita Sivukhin)
- Fix tests for views (Preston Thorpe)
- Fixes views (Glauber Costa)
- core: Fix reprepare to properly reset statement cursors and registers (Pedro Muniz)
- Fix automatic indexes (Jussi Saurio)
- Fix tx isolation test semantics after #3023 (Jussi Saurio)
- Fix: read transaction cannot be allowed to start with a stale max frame (Jussi Saurio)
- Fix value conversion for function parameters (Levy A.)
- IO: handle errors properly in io_uring (Preston Thorpe)
- core: Fix integer/float comparison (Pavan Nambi)
- pager: fix incorrect freelist page count bookkeeping (Jussi Saurio)
Install turso_cli 0.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/tursodatabase/turso/releases/download/v0.2.0/turso_cli-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/tursodatabase/turso/releases/download/v0.2.0/turso_cli-installer.ps1 | iex"
Download turso_cli 0.2.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-x86_64-pc-windows-msvc.zip | x64 Windows | 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/turso
You 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>Fetched April 3, 2026


