Release Notes
Added
- github/release: Add retry logic to network-dependent install steps (Pekka Enberg")
- github/release: Add retry logic to network-dependent install steps (Pekka Enberg)
- Add JS and Python concurrent write examples (Avinash Sajjanshetty)
- perf/react-native: add c++ getAllRows() helper (Jussi Saurio)
- perf: add compiler branching hints (Preston Thorpe)
- Add concurrent writes example in Rust (Avinash Sajjanshetty)
- Add SQLAlchemy dialect for Python bindings (Orthel Toralen)
- mvcc: add test that asserts no ghost commits after Busy errors happen (Jussi Saurio)
- core: Support views in MVCC mode (RJ Barman)
- add return type checking for Function calls for
CHECK constraints (Pedro Muniz)
- Add mobibench to gitignore (Preston Thorpe)
- Add native TCL extension for in-process SQLite test harness (Ahmad Alhour)
- bindings/rust: Add statement and row column inspection APIs (Pekka Enberg)
- cli/sync: add read timeout to prevent deadlock on Windows (Orthel Toralen)
- add SQL language reference documentation (Glauber Costa)
- add stable PRAGMA capture_data_changes_conn name and keep old one around for compatibility (Nikita Sivukhin)
- Improve Elle, add rw-register model and chaotic workloads (Avinash Sajjanshetty)
- Add Mobibench evaluation: SQLite vs Turso (Pekka Enberg)
- core/io: Add POSIX fallback for io_uring ftruncate (Pekka Enberg)
- temporarily remove new windows simulation runs (Preston Thorpe)
- feat: support encryption keys for attached databases via URI params (Glauber Costa)
- Finish implementing RAISE (Preston Thorpe)
- autofix: implement FkCheck opcode to prevent RETURNING rows after FK violations (Jussi Saurio)
- Support custom types (Glauber Costa)
- tests/fuzz: add fuzz_iterations helper and cut CI fuzz iters to 50% (Jussi Saurio)
- Add STRICT table support to differential fuzzer (Glauber Costa)
- Add support for RAISE() function (Glauber Costa)
- Add ATTACH support to simulator (Glauber Costa)
- partially implement FULL OUTER + LEFT and RIGHT hash joins (Preston Thorpe)
- EXPLAIN QUERY PLAN: fix incorrect join order, add missing annotations, convert some snapshot tests to EQP-only (Jussi Saurio)
- bindings/rust: add old multithreaded bug reproducers as mvcc regression tests (Jussi Saurio)
- core/mvcc: Implement Hekaton commit dependency tracking (Pere Diaz Bou)
- tests: add CTE regression tests for issue #4637 (Jussi Saurio)
- add serial test crate to make
fuzz_pending_byte_database serial for mvcc and wal (Pedro Muniz)
- Add more tests to foreign_keys.sqltest (Jussi Saurio)
- tests: add regression tests for expression index UPDATE correctness (Pedro Muniz)
- Implement named savepoints (Preston Thorpe)
- feat: Add materialized views support to Rust bindings and test runner (Martin Mauch)
- Fix STRICT ADD COLUMN default type validation (Kumar Ujjawal)
- Fix freelist_count dirty leak and add regression test (Kumar Ujjawal)
- core: reimplement PRAGMA integrity_check as VDBE and add sqlite parity corpus (Jussi Saurio)
- Restore new antithesis assertions (Mikaël Francoeur)
- Use new Antithesis assertions (Mikaël Francoeur")
- fix: NEW.rowid_alias in UPDATE Trigger WHEN Clause Evaluates to NULL (Jussi Saurio)
- Add MVCC Antithesis stress test configurations (Pekka Enberg)
- add tests verifying check constraints are evaluated before ON CONFLICT clauses (Jussi Saurio)
- Improve support for attach databases (Glauber Costa)
- translate: support row-valued comparison expressions (Jussi Saurio)
- fix: add
changes support to MVCC and adjust code to always emit it in one place only (Pedro Muniz)
- Add regression tests for correlated subqueries using MULTI-INDEX AND plans (Jussi Saurio)
- add tests verifying INSERT RETURNING does not skip index updates (Jussi Saurio)
- btree: add property tests & make a few functions not panic on corruption (Jussi Saurio)
- Use new Antithesis assertions (Mikaël Francoeur")
- add regression tests for correlated subqueries registers fix (Pedro Muniz)
- Use new Antithesis assertions (Mikaël Francoeur)
- Add regression tests for concurrent commit deadlock in VDBE yield-spin loop (Avinash Sajjanshetty)
- Add TPC-H benchmark README and plotting scripts (Pekka Enberg)
- fix: Panic on ALTER TABLE ADD COLUMN With Invalid Collation Name #5305 (Jussi Saurio)
- ci: add license checker to disallow GPL dependencies (Srinivas A)
- Add some makefile commands for test runner in repo root (Preston Thorpe)
- add exp-index-method to rust backend and for testing (Pavan Nambi)
- Add support for FROM-clause subquery materialization and CTE materialization (Jussi Saurio)
- Add new antithesis assertions (Mikaël Francoeur)
- concurrent-simulator: Add UPDATE and DELETE workloads (Pekka Enberg)
- Implement PRAGMA function_list with enum-derived function probing (Glauber Costa)
- Add hermitage tests (Avinash Sajjanshetty)
- Fix corruption errors caused by stale cursor positioning + add upsert support to simulator (Pavan Nambi)
- make transactions supported in compat.md (Glauber Costa)
- Add REGEXP operator support (Glauber Costa)
- Add test case for MVCC dual cursor transaction isolation (Jussi Saurio)
- Implement CHECK constraints (Glauber Costa)
- Replace panic/todo/unimplemented with proper errors (Mikaël Francoeur)
- testing/runner: Add @skip-if sqlite directive (Preston Thorpe)
- Implement multi-index scan access method (Preston Thorpe)
- add tests for ORDER BY aggregate not in SELECT with GROUP BY (Mikaël Francoeur)
- github: Add workflow to publish crates to crates.io on tags (Pekka Enberg)
- javascript: Add support for Statement.reader property (Pekka Enberg)
- javascript: Fix implicit connect support (Pekka Enberg)
- Add busy timeout and Connector pattern for go bindings (Preston Thorpe)
- core/mvcc: add to destroyed_tables when insert+delete in same checkpoint (Pere Diaz Bou)
- core/vdbe: fix newrowid Start state change on IO (Pere Diaz Bou)
- add duration and fix notebook name (Mikaël Francoeur)
- Add support for PRAGMA synchronous=NORMAL (Jussi Saurio)
- Use new Antithesis trigger action (Mikaël Francoeur)
- core/mvcc: update schema root pages with new allocated btree pages (Pere Diaz Bou)
- add --experimental-attach flag to test runner backends (Mikaël Francoeur)
- add index knowledge skill (Pedro Muniz)
- Implement
vacuum_into op (Avinash Sajjanshetty)
- fix: only initialize result registers for subqueries that have not been evaluated yet (Pedro Muniz)
- fix: add bounds checking to
cell_interior_read_left_child_page (Avinash Sajjanshetty)
- Add Namespace field for go-sync package (Preston Thorpe)
- Add "release-official" compilation profile (Jussi Saurio)
- Add support for local encryption in SDKs (Avinash Sajjanshetty)
- fix build.rs rebuilding every time due to always getting new timestamp (Jussi Saurio)
- add turso test runner to workspace member (Pedro Muniz)
- fix dockerfile to add dbhash tool (Pedro Muniz)
- add ReadableName strategy for differential fuzzer so that we mostly generate readable identifiers (Pedro Muniz)
- implement
PRAGMA temp_store optimization (Preston Thorpe)
- Add
dbhash tool calculate hash of logical db content (Avinash Sajjanshetty)
- Add local encryption support for Go (Avinash Sajjanshetty)
- mac: introduce PRAGMA fullfsync (Jussi Saurio)
- Reintroduce record header caching (Jussi Saurio")
- Add new insert/write performance benchmarks (Preston Thorpe)
- compat.md: add generated + md reformat (Pere Diaz Bou)
- Add support for remote encryption in sync operations (Avinash Sajjanshetty)
- core/mvcc: add savepoints to mvcc with
begin/end_statment (Pere Diaz Bou)
- Add benchmark for hash table/spilling performance (Preston Thorpe)
- Reintroduce record header caching (Jussi Saurio"' from Jussi Saurio)
- Reintroduce record header caching (Jussi Saurio")
- Reintroduce record header caching (Jussi Saurio)
- Implement remaining ON CONFLICT ResolveTypes for INSERT and UPDATE statements (Preston Thorpe)
- feat(cli): add .read command to execute SQL from a file (i cook code)
- add bench feature to run benchmarks in nyrkio (Pedro Muniz)
- Implement partial ON CONFLICT support for UPDATE statements (Preston Thorpe)
- Support CTE visibility in VALUES+RETURNING subqueries and allow explicit col names (Preston Thorpe)
- Add ECS task to run sqlancer nightly along with simulator (Preston Thorpe)
- implement simple strategy to restart WAL log if possible (Nikita Sivukhin)
- Add VSCode syntax highlighter for .sqltest files (Jussi Saurio)
- DEFAULT value handling of NON-NULL columns in ADD COLUMN (Preston Thorpe)
- Implement Full Text Search feature (Preston Thorpe)
- add codspeed (Pedro Muniz)
- core/mvcc: Add support for synchronous off mode (Pekka Enberg)
- Add support for subqueries in the WHERE position for DML statements (Preston Thorpe)
- Add vibecoded stress-go testing tool (Jussi Saurio)
- fix: implement IS TRUE/IS FALSE with correct SQLite semantics (Jussi Saurio)
- Add shuttle tests for IO trait (Pedro Muniz)
- bindings/rust: support
prepare_cached (Pere Diaz Bou)
- Add more comprehensive PRAGMA integrity_check, and add PRAGMA quick_check (Jussi Saurio)
- tests: add some shuttle tests (Pedro Muniz)
- benchmarks: add micro benchmarks with divan (Pedro Muniz)
- AGENTS.MD: add some magic words about max-turns (Jussi Saurio)
- Add more instructions to AGENTS.MD and use Opus model instead of Claude for github bot (Jussi Saurio)
- bindings/dotnet: implement IsDBNull check (Alex)
- Implement json_object(*) to create JSON object from all columns (Martin Mauch)
- Add some more guidelines to AGENTS.MD (Jussi Saurio)
- Add id-token: write permission to claude action for OIDC (Jussi Saurio)
- Add claude code github action and CLAUDE.MD file (Jussi Saurio)
- antithesis: Add test case for WAL checkpointing (Pekka Enberg)
- implement .dbtotxt and dbpage vtab (Pavan Nambi)
- bindings/java: Add transaction support (Kim Seon Woo)
Updated
- core/mvcc: disable autoincrement for MVCC (Pere Diaz Bou)
- testing/stress: Allow --seed parameter for non-deterministic runs (Pekka Enberg)
- Update authors in Cargo.toml (Preston Thorpe)
- refactor: reorganize emitter.rs into its own module (Preston Thorpe)
- core/vector: Avoid simsimd on Windows AArch64 (Marc-André Moreau)
- core/storage: Reject non-UTF-8 encoded databases on open (Mikaël Francoeur)
- core/mvcc: Atomic timestamps when preparing commit (Avinash Sajjanshetty)
- Differential fuzzer: detect more false positive with limit and order by (Pedro Muniz)
- core/mvcc: move
payload_size to frame header (Avinash Sajjanshetty)
- Fast path no-op update in vdbe (Preston Thorpe)
- Rename experimental_mvcc to mvcc (Eren Türkoğlu)
- Update or replace ordering (Preston Thorpe)
- Hash joins: partition spilling improvements (Preston Thorpe)
- core/translate: Apply explicit view column aliases (Karthik Koralla)
- core/translate: cache GROUP BY compound expressions properly (Jussi Saurio)
- core: per-database MVCC transactions for attached databases (Glauber Costa)
- Logical log tweaks (Jussi Saurio)
- Assert that no two transaction timestamps are ever same (Avinash Sajjanshetty)
- Update sqlite_sequence on ALTER TABLE ... RENAME TO (Kumar Ujjawal)
- core/mvcc: Increase op count and tx payload size in logical log tx record format (Jussi Saurio)
- core/translate: Use usable constraint even if preceded by unusable constraint on same column (Jussi Saurio)
- Preserve BLOB-vs-no-affinity semantics in comparison coercion (Kumar Ujjawal)
- compat: defer CTE column count check until its used (Pedro Muniz)
- Improve SQLite3 tests (Pekka Enberg)
- Accept trailing named column constraints in column defs (Kumar Ujjawal)
- Enable index method table access for DML stmts (Preston Thorpe)
- update unique_sets when renaming a column to prevent schema corruption (Glauber Costa)
- Pretty print elle status progress (Avinash Sajjanshetty)
- Decorrelate simple EXISTS / NOT EXISTS subqueries as semi/antijoins (Jussi Saurio)
- Disable index-method access for DML (Kumar Ujjawal)
- Avoid panic in DecrJumpZero on non-integer register (Kumar Ujjawal)
- core/io: Track write buffer in completion (Jussi Saurio)
- core/schema: Emit table-level UNIQUE constraints in BTreeTable::to_sql() (Jussi Saurio)
- Avoid modulo-by-zero in WAL frame API fuzz rollback (Kumar Ujjawal)
- enable async io in rust bindings (Pedro Muniz)
- Make strict mode non-experimental (Glauber Costa)
- Update misleading comment in MVCC (Avinash Sajjanshetty)
- core/mvcc: Monotonic lockfree rowid allocation (Jussi Saurio)
- core/mvcc: Use hash set to track commit dependencies (Avinash Sajjanshetty)
- core/mvcc: check conflict delete btree resident tombstone (Pere Diaz Bou)
- Adjust React Native example app instructions (Jussi Saurio)
- Update example for VFS extensions in extensions/core/README.md (Preston Thorpe)
- Enable partial indexes in MVCC mode (Preston Thorpe)
- Enable Expression indexes in MVCC mode (Preston Thorpe)
- Gate sqlite_dbpage writes behind --unsafe-testing (Kumar Ujjawal)
- Enable FTS for JavaScript SDK (Nikita Sivukhin)
- Sqltest cross check integrity (Jussi Saurio)
- properly split sql statements for JS runner backend + enable triggers (Pedro Muniz)
- Differential fuzzer improvements (Pedro Muniz)
- core/translate: Remove spurious Affinity instruction from integrity_check (Pekka Enberg)
- Remove some clones from MVCC code (Preston Thorpe)
- remove
Arc<RwLock<Statement>> from Insn::Program (Pedro Muniz)
- ci: split bench into multiple jobs (Jussi Saurio)
- Refactor core_tester fuzz module (Preston Thorpe)
- Replace panic! and assert! with turso_macros assertions (Mikaël Francoeur)
- SQLite compat: restrict ANY affinity special-casing to STRICT tables (Hossam Khero)
- Enable MVCC for a bunch of fuzz tests (Preston Thorpe)
- JS SDK: remote writes experimental (Nikita Sivukhin)
- Reject triggers on virtual tables (Kumar Ujjawal)
- serverless: Export Session and SessionConfig types (Nikita Sivukhin)
- prevent scalar blob into JSONB (김선우)
- install-sqlite: dont fail at get_download_url if sqlite3 already installed (Jussi Saurio)
- refactor: stop using
connection.with_schema inside translate module (Pedro Muniz)
- Reject duplicate CTE names in WITH clause (Kumar Ujjawal)
- Comment out flaky vector jaccard test (Preston Thorpe)
- mvcc: disable cross-incompatible features (Jussi Saurio)
- Random code cleanups to lib.rs (Pekka Enberg)
- Reject column-level multi-column FK refs in ALTER TABLE (Kumar Ujjawal)
- core: Make version functions non-deterministic (ratnesh mishra)
- Experimental SQLRight setup (Mikaël Francoeur)
- Reject FILTER clauses in view definitions (Kumar Ujjawal)
- test/mvcc: re-enable database reopen logic in MVCC transaction fuzzer (Jussi Saurio)
- perf: optimizations for FTS (Preston Thorpe)
- CDC v2: transaction IDs and per-statement COMMIT records (Nikita Sivukhin)
- Enable using Search for WHERE rowid= predicate instead of full scan (Preston Thorpe)
- Reject reserved JSONB element types (Kumar Ujjawal)
- core/mvcc: reparse schema on get_index_info (Pere Diaz Bou)
- refactor: change translate functions to accept
&mut ProgramBuilder (Pedro Muniz)
- testing/stress: Remove multi-threading warning (Pekka Enberg)
- github: Improve license check (Pekka Enberg)
- core/mvcc: check for unique conflicts (Pere Diaz Bou)
- Btree dump vtab (Nikita Sivukhin)
- Cdc version table (Nikita Sivukhin)
- vector8 + vector1bit (Nikita Sivukhin)
- stress: Use single Database object (Pekka Enberg)
- continue execution if IO was completed immediately (Nikita Sivukhin)
- Lower Windows CI test timeout from 60 to 20 minutes (Pekka Enberg)
- Multi index operator constraint (Pedro Muniz)
- bench: gate nanosecond-level tests behind nanosecond-bench feature (Jussi Saurio)
- use full link in JS SDK README so that links will be correct at npm (Nikita Sivukhin)
- adjust is_constant check for
IN and emit_no_constant_insn to avoid panic in VDBE cursor (Pedro Muniz)
- concurrent-simulator: Explore in fast mode (Pekka Enberg)
- Rewrite printf for full SQLite compatibility (Glauber Costa)
- Pragmas (Glauber Costa)
- testing/stress: Re-enable reopen and reconnect in stress tester (Pekka Enberg)
- make
Numeric the source of truth for number comparisons (Pedro Muniz)
- Mvcc garbage collection (Jussi Saurio)
- Remove unmaintained dart bindings (Avinash Sajjanshetty)
- Convert antithesis from feature to cfg flag (Mikaël Francoeur)
- core/storage: Remove unused FxHashSet import in btree.rs (Pekka Enberg)
- core/mvcc: check integer primary key conflicts (Pere Diaz Bou)
- use blocking IO for local databases for now (Nikita Sivukhin)
- Make Github actions even more robust (Pekka Enberg)
- bindings/wasm: Switch to notification-based I/O completion (Pekka Enberg)
- Clippy more rules (Nikita Sivukhin)
- properly handle url callback in react native bindings (Nikita Sivukhin)
- Reduce antithesis stdout logging and log sql/tracing to files (Mikaël Francoeur)
- Make Github workflows more robust (Pekka Enberg)
- Change crate types in Dockerfile to restore Antithesis instrumentation (Mikaël Francoeur)
- Whopper elle (Pedro Muniz)
- allow url as function in react native bindings (Nikita Sivukhin)
- JavaScript serverless driver improvements (Pekka Enberg)
- MVCC: enable autocheckpoint at 1000 * 4120 bytes logical log size (Jussi Saurio)
- Validate header (Nikita Sivukhin)
- avoid unnecessary slow worker tasks in JS (Nikita Sivukhin)
- do not cache chunks for .tantivy-meta.lock file (Nikita Sivukhin)
- Destroy any custom index methods while dropping parent table (Preston Thorpe)
- Stress progress bars (Pedro Muniz)
- More snapshot tests (Pedro Muniz)
- pin compiler and runner versions for codspeed benchmark (Pedro Muniz)
- Move test runner to
testing/runner (Pedro Muniz)
- remove flaky test (Preston Thorpe)
- Updates to COMPAT.MD (Jussi Saurio)
- mark attach as experimental (Jussi Saurio)
- run test with llvm-cov at linux (Nikita Sivukhin)
- sim: generate unique constraints and verify statement rolls back correctly on failure (Pavan Nambi)
- Bump urllib3 from 2.5.0 to 2.6.3 (app/dependabot)
- Bump crossbeam-channel from 0.5.14 to 0.5.15 (app/dependabot)
- JIT query generation in turso_stress (Mikaël Francoeur)
- update determinism to match SQLite (Mikaël Francoeur)
- core: database open is now async (Nikita Sivukhin)
- bump claude code max turns (Pedro Muniz)
- return NULL when there is no record in
op_column (Pedro Muniz)
strftime should accept any kind of input not only text (Pedro Muniz)
- React native example more tests (Nikita Sivukhin)
- Document Rust sync API (Mikaël Francoeur)
- Tpch snapshot testing (Pedro Muniz)
- test runner: Snapshot testing (Pedro Muniz)
- agressively black box benchmarks (Pedro Muniz)
- Go driver time (Nikita Sivukhin)
CHAR should return \0 for NULL (Pedro Muniz)
- core/mvcc: use dual_peek in exists (Pere Diaz Bou)
- update npm for trusting publishing features (Nikita Sivukhin)
- Separate Connection from a prepared statement to enable proper caching (Preston Thorpe)
- substitute HashMap for FxHashMap in core (Pedro Muniz)
- adjust agents.md to call tursodb cli correctly (Pedro Muniz)
- remove NODE_AUTH_TOKEN (Nikita Sivukhin)
- React native (Nikita Sivukhin)
- sql_generation: reduce likelihood of index name collisions (Jussi Saurio)
- retry on reader contention for
TursoRwLock::read (Pedro Muniz)
- differential fuzzer + general purpose sql generation (Pedro Muniz)
- cleanup: centralize optimizer params and make them loadable from json (Jussi Saurio)
- remove accesses_db flag (Nikita Sivukhin)
- Migrate more tcl tests (Pedro Muniz)
- testing/system: allow specifying rowcounts for gen-bigass-database.py (Jussi Saurio)
- tests/fuzz/cte_fuzz: try to prevent pathological queries (Jussi Saurio)
- improvements of the whopper (Nikita Sivukhin)
- Some Insert performance improvements (Preston Thorpe)
- Performance improvements for hash joins (Preston Thorpe)
- WAL auto truncation: increase epoch to prevent stale pages reuse (Nikita Sivukhin)
- core/mvcc: reparse schema after stream of schema changes (Pere Diaz Bou)
- Reduce CLI release build time by ~60% (Jussi Saurio)
- cleanup/vdbe: remove unused IndexKeyOwned and remove unused IndexKeyUnpacked::cursor_id (Jussi Saurio)
- Refactor: remove encryption key field from Database struct (Avinash Sajjanshetty)
- Migrate more TCL tests (Pedro Muniz)
- convert agent docs to skills (Pedro Muniz)
- Some optimizations for tpc-h queries (Pavan Nambi)
- Refactor AggContext to use flat payload representation (Jussi Saurio)
- more testing cleanups - move simulators (Pedro Muniz)
- more testing cleanups (Pedro Muniz)
- react-native: prepare (Nikita Sivukhin)
- Move stress to
testing/stress (Pedro Muniz)
- Move tcl test to
testing/system (Pedro Muniz)
- ci/bench: increase timeout to 45mins as workaround (Jussi Saurio)
- Remove fts/tantivy as default dependency in turso-core (Preston Thorpe)
- Move antithesis test to
testing/antithesis (Pedro Muniz)
- feat/perf: use HashTable machinery for DISTINCT instead of ephemeral btree (Jussi Saurio)
- ci: split simulator into separate jobs (Jussi Saurio)
- CI: Reduce iterations in cte fuzzer (Preston Thorpe)
- ci: longer timeout for cargo nextest on windows (Jussi Saurio)
- fuzz/cte: reduce iterations (Jussi Saurio)
- docs: split AGENTS.MD into separate agent-guides files (Jussi Saurio)
- Js test runner (Jussi Saurio)
- refactor/pager: small cleanups (Jussi Saurio)
- sim: only run turso integrity check 10% of the time (Jussi Saurio)
- Rewrite BETWEEN statements for partial indexes in DML paths (Preston Thorpe)
- Create global directive for skipping mvcc in test runner (Preston Thorpe)
- stress: run stress with shuttle (Pedro Muniz)
- Validate Send + Sync for
ProgramState + change registers to hold a Box<[Register]> (Pedro Muniz)
- test-runner: rust backend (Pedro Muniz)
- test-runner: start migrating TCL tests (Pedro Muniz)
- Give Antithesis tests better names (Mikaël Francoeur)
- core/vdbe: Allow leading + sign in numeric string parsing (Pere Diaz Bou)
- core/vdbe: trim return text with integer and float (Pere Diaz Bou)
- Reset ProgramState::once on statement reset (Mikaël Francoeur)
- return blob if we concat blobs (Nikita Sivukhin)
- Replace GPL-2.0 bloom crate with MIT-licensed fastbloom (Jussi Saurio)
- Refactor core/lib.rs Connection impl out to its own file (Preston Thorpe)
- Disallow WITHOUT ROWID tables (Jussi Saurio)
- core: Use fast monotonic time when possible (Pekka Enberg)
- core/vdbe: move mutable fields from Program to ProgramState (Pere Diaz Bou)
- replace custom SmallVec with smallvec crate (Ankush)
- Open autovacuum databases in readonly mode when experimental flag not set (app/copilot-swe-agent)
- remove unused lints, variables and functions (Pedro Muniz)
- separate Sync module (Pedro Muniz)
- Btree: optimize defragment_page (Khashayar Fereidani)
- avoid recursive read locks (Nikita Sivukhin)
- Track WAL state in savepoints for proper rollback (Pavan Nambi)
- vdbe: Resize deferred_seeks on program state reset (Pekka Enberg)
- Reset checkpoint state when PRAGMA wal_checkpoint fails (Jussi Saurio)
- Increase test_eval_param_only_once timeout threshold for CI reliability (app/copilot-swe-agent)
- stress: switch to WAL mode before SQLite integrity check (Pekka Enberg)
- planner: hash-join planning with safe build-side materialization (Preston Thorpe)
- core/mvcc: rollback index rows (Pere Diaz Bou)
- core/vdbe: check negative root pages with
integrity_check (Pere Diaz Bou)
- antithesis/stress: run in verbose mode (Jussi Saurio)
- docs: change test build instructions (Mason Hall)
- btree:
get_prev_record and get_next_record automatically invalidate_record (Pedro Muniz)
- bindings/dotnet: allow setting TursoParameter.Direction (Alex)
- VDBE micro-optimizations for read path (Jussi Saurio)
Fixed
- concurrent-simulator: Fix DDL inside BEGIN CONCURRENT transactions (Pekka Enberg)
- core/json: Fix stale cursor crash in json_tree correlated subqueries (Pekka Enberg)
- Avoid panic on unresolved qualified column in DO UPDATE (Kumar Ujjawal)
- Fix unsound schema access when loading extensions (Preston Thorpe)
- Fix unresolved IfNot label in scalar count(*) subqueries (Kumar Ujjawal)
- core/translate: Fix non-literal defaults in Column instruction (Jussi Saurio)
- core/mvcc: Fix header-only write durability (Jussi Saurio)
- fix: IN(subquery) data corruption in ungrouped aggregates with NOT NULL columns (Vimal Prakash)
- temporarily remove big sqltest to fix all the CI errors (Preston Thorpe)
- Fix regression improperly consuming hash join WHERE terms (Preston Thorpe)
- fix: UPDATE OR REPLACE does not fire FK CASCADE on implicitly-deleted row (Pedro Muniz)
- Fix wal truncate on shutdown even after restart (Kumar Ujjawal)
- fix: UPDATE RETURNING correlated subquery uses pre-UPDATE values (Pedro Muniz)
- Make MVCC Elle check errors fail CI build (Pekka Enberg)
- Overflow fix (Nikita Sivukhin)
- fix: Window function with GROUP BY and ORDER BY causes optimizer assertion failure #5552 (Pedro Muniz)
- Fix sync replay generator (Nikita Sivukhin)
- fix: always reset pager state for attached databases (Pedro Muniz)
- Fix three FULL OUTER JOIN bugs (Jussi Saurio)
- fix snapshot isolation in MVCC (Preston Thorpe)
- fix: clean up db-log and fix WAL extension for attached DBs in simulator (Glauber Costa)
- fix: Expression index with correlated EXISTS subquery causes panic #5551 (Pedro Muniz)
- Fix --experimental-strict incorrectly enabling custom types (Glauber Costa)
- autofix: Aggregate COLLATE leaks to subsequent aggregates in same query (Jussi Saurio)
- fix/mvcc: prevent persistent "Database is busy" after failed IO during checkpoint (Jussi Saurio)
- autofix: CTE with UNION ALL corrupts first-column literals when any branch has aggregates (Jussi Saurio)
- autofix: Triggers during FK CASCADE see pre-delete state of parent table (Jussi Saurio)
- autofix: Correlated subquery with explicit JOIN returns wrong results after first row (Jussi Saurio)
- autofix: LEFT JOIN incorrectly converted to INNER JOIN when WHERE uses CASE/IIF (Jussi Saurio)
- autofix: Row value IN expression crashes with register allocation error (Jussi Saurio)
- fix: BEFORE UPDATE trigger corrupts outer cursor position for correlated subqueries (Jussi Saurio)
- autofix: DELETE with LIMIT ignores OFFSET clause (Preston Thorpe)
- fix: UPSERT ON CONFLICT fails to match expression indexes #5550 (Preston Thorpe)
- fix/optimizer: enable multi-index OR scans more widely and fix bad CTE query plans (Jussi Saurio)
- Fix REAL affinity to preserve non-numeric text (Kumar Ujjawal)
- Fix rowid resolution for views/WITHOUT ROWID (Kumar Ujjawal)
- fix: Use pure-rust for macos for aegis to prevent macos compilation issues (Amodh Dhakal)
- fix RETURNING, Statement::reset() and Program::abort() (Jussi Saurio)
- Fix DEFAULT affinity handling (Jussi Saurio)
- Improve I/O error message (Pekka Enberg)
- fix: Handle IVM old record capture when REQUIRE_SEEK is set (Martin Mauch)
- fix: MVCC cursor ignored left join null flag (Jussi Saurio)
- fix: adjust
jump_if_null branch offset as incorrectly failed NULL in check constraints in integrity checks (Pedro Muniz)
- fix: emit RealAffinity when reading subquery columns from ephemeral indexes (Jussi Saurio)
- fix: default
generate_series STOP to SQLite Default (4294967295) when omitted (Damian Melia)
- fix: mvcc: DDL statement inside BEGIN CONCURRENT returns a confusing error #3380 (Pedro Muniz)
- fix: do not do unchecked indexing to non-static page offsets #4736 (Pedro Muniz)
- fix: use consistent M_PI constant in degrees/radians for test parity with SQLite (Pedro Muniz)
- fix: Register DBSP state index in schema for integrity_check (Martin Mauch)
- fix: Panic on correlated subquery in IN clause referencing outer table alias #5213 (Pedro Muniz)
- fix(wal): release WAL read lock on rollback to prevent checkpoint busy (Ahmad Alhour)
- sqlite3: Fix segfault in sqlite3_free_table() (Pekka Enberg)
- fix: OR in Partial Index WHERE Clause Causes Unresolved Label Panic (Jussi Saurio)
- fix: No-op UPDATE causes datatype mismatch #5410 (Jussi Saurio)
- fix: Expression Index Key Computed From Pre-Affinity Value During UPDATE (Jussi Saurio)
- fix: ALTER TABLE RENAME COLUMN Does Not Update Partial Index WHERE Clauses (Jussi Saurio)
- fix: Create materialized view in same transaction as source (Martin Mauch)
- fix: "Cursor not found" when delete has a correlated subquery #5434 (Jussi Saurio)
- fix: INSERT INTO With CTE + Compound SELECT Produces Garbled Data #5425 (Jussi Saurio)
- fix: DELETE with correlated subquery sees in-flight deletions #5426 (Jussi Saurio)
- fix: Panic When CTE Is Used in UPDATE SET Clause on Keyed Table (Jussi Saurio)
- Fix FTS LIMIT 0/-1 handling to avoid Tantivy overflow (Kumar Ujjawal)
- fix/correctness: use ephemeral table for UPDATE when expression index refers to updated columns (Mikaël Francoeur)
- fix: update changes() and total_changes() inside explicit transactions (Damian Melia)
- Fix: Fully enable foreign keys for MVCC (Preston Thorpe)
- fix(cli): prevent extra space in multiline readline input (Karthik Koralla)
- Fix materialized view re-entrancy bug (Martin Mauch)
- fix affinity handling in check constraint evaluation (Jussi Saurio)
- fix affinity calculation for index seeks, subqueries and ctes (Jussi Saurio)
- fix: COLLATE Specification Lost in Concatenation with CHECK #5171 (Jussi Saurio)
- fix: INSERT OR IGNORE + CHECK Failure Does Not Update sqlite_sequence (Jussi Saurio)
- fix: Subquery in Trigger Body UPDATE SET Creates Poison Trigger (Jussi Saurio)
- fix: WHERE clause returns wrong result for INT64_MAX compared against overflowed float (Jussi Saurio)
- Fix prepare panic on comment/whitespace-only SQL (Kumar Ujjawal)
- fix: Panic on Scalar Subquery Referencing CTE by Original Name After Alias (Jussi Saurio)
- Fix SUM() type for BLOB inputs to return REAL (Kumar Ujjawal)
- Unify error codes in LibsqlError for serverless package (Pekka Enberg)
- Fix panic with duplicate expressions in window PARTITION BY (Mikaël Francoeur)
- Fix panic and wrong results for window function in EXISTS subquery (Mikaël Francoeur)
- fix: handle NULL properly in composite index seek/termination (Jussi Saurio)
- fix: panic in PRAGMA integrity_check with expression indexes #5117 (Sanjeev)
- fix: avoid cursor panic in SUM(TRUE IS TRUE) (Jussi Saurio)
- Fix CLI exit code on query failure (Ahmad Alhour)
- Fix MVCC trigger recovery rootpage handling (Jussi Saurio)
- Fix collation with reordered hash joins (Preston Thorpe)
- fix/btree: return error instead of panic if parent is unexpectedly a leaf (Jussi Saurio)
- Fix panic on duplicate ORDER BY expressions with GROUP BY (Jussi Saurio)
- fix: Align REAL→INTEGER cast with SQLite clamp semantics (Kumar Ujjawal)
- fix: INSERT with auto-assigned rowid skips explicit index on IPK column (Jussi Saurio)
- Fix affinity conversion of nan/inf text in numeric columns (Kumar Ujjawal)
- fix: Correlated Subquery + Window Function in WHERE Hoisted Before Scan Loop (Jussi Saurio)
- fix: more recursive read locks detected by shuttle with mvcc (Pedro Muniz)
- fix/mvcc: dropped_root_pages tracking must survive restart (Jussi Saurio)
- core/mvcc: Fix MVCC checkpoint panic when deleting index keys in inte… (Pekka Enberg)
- fix: backward table scan skips rows on deep B-trees (ORDER BY DESC) (Pedro Muniz)
- Phantom row fix (Pedro Muniz)
- Insert or fix (Pedro Muniz)
- fix: Panic on SELECT with 32767+ Columns (No SQLITE_MAX_COLUMN Limit) (Jussi Saurio)
- fix: GROUP BY With Constant Expression Causes Infinite Loop #5300 (Jussi Saurio)
- fix: propagate affinity for
IN Subquery (Pedro Muniz)
- fix(optimizer): fix correctness bugs in LEFT->INNER join optimization (Jussi Saurio)
- fix/mvcc: fix test_logical_log_header_reserved_bytes_rejected test (Jussi Saurio)
- Fix livelock in MVCC commit when pager_commit_lock is contended (Jussi Saurio)
- Fix: handle multiplication overflow in time_date (Zohaib)
- Fix panic on ROLLBACK TO by replacing assert! with bail_parse_error (codingbot24-s)
- fix: Panic on CREATE TABLE with UNIQUE ... ON CONFLICT IGNORE #5221 (Jussi Saurio)
- mvcc: define crash recovery / correctness semantics, rewrite logical log (Jussi Saurio)
- Fix UPDATE incorrectly changing last_insert_rowid() (Kumar Ujjawal)
- Fix panic in sum() with large floating-point values (Jussi Saurio)
- fix(core): Handle PRAGMA cache_size overflow (fixes #5250) (ratnesh mishra)
- fix: allow CTEs to shadow schema objects (Jussi Saurio)
- fix: Panic on INSERT INTO t(nonexistent) SELECT ... FROM t #5226 (Jussi Saurio)
- fix: Panic on Unresolved Table Reference in UPSERT DO UPDATE SET #5281 (Jussi Saurio)
- core/storage: Fix pager commit completion (Pekka Enberg)
- Fix throughput plot colors and hatching to match TPC-H plot (Pekka Enberg)
- fix: Panic on 3+ Way MULTI-INDEX AND Query (RowSet State Violation) #… (Jussi Saurio)
- fix: u16 Overflow in page_free_array Panics on 65536-Byte Pages #5276 (Jussi Saurio)
- fix: handle PRAGMA database_list with argument without panicking (creativcoder)
- fix: INSERT ... RETURNING panics with multi-column scalar subquery #5243 (Jussi Saurio)
- fix: Panic When IN Subquery Used in LIMIT Expression #5247 (Jussi Saurio)
- fix: ALTER TABLE RENAME COLUMN Fails on Case Mismatch #5246 (Jussi Saurio)
- fix: read non-aggregate columns during AggStep for mixed expressions (Glauber Costa)
- fix: null coroutine registers in ungrouped aggregate empty-result path (Glauber Costa)
- fix: json_valid() With Zero Arguments Panics Instead of Returning Error (Jussi Saurio)
- fix: LIMIT With i64::MIN Panics Due to Subtract Overflow in DecrJumpZ… (Jussi Saurio)
- Fix missing dot in NOT NULL constraint error (Eren Türkoğlu)
- fix: Materialized View Panics on Arithmetic With Text Column Values #… (Jussi Saurio)
- fix: Panic on Scalar Subquery Referencing Rowid of Derived Table #5249 (Jussi Saurio)
- Fix MVCC savepoint rollback leaving stale write set entries (Pekka Enberg)
- fix: varint_len returned 10 for values with 58-64 significant bits (Jussi Saurio)
- fix: do not apply numeric affinity of converted float is a NaN (Pedro Muniz)
- try to fix js ci (Nikita Sivukhin)
- fix: QUOTE should emit float in scientific notation (Pedro Muniz)
- fix: GROUP BY sort order for extra columns (Pedro Muniz)
- fix(core): fix ColumnUsedMask::is_only for overflow indices beyond vector length (Pedro Muniz)
- Clear bloomfilters on rewind + hash table fix (Preston Thorpe)
- fix: correctly jump to second OR expression if first expression is NULL (Pedro Muniz)
- bindings/go: Fix spurious test failures from port conflicts (Pekka Enberg)
- Fix changes() value for DELETE (Preston Thorpe)
- core/mvcc: Fix transaction end version visibility check (Pere Diaz Bou)
- Rn locking fix (Nikita Sivukhin)
- fix prevent AUTOINCREMENT on non-INTEGER PKs with mixed-case names (김선우)
- fix: cannot use index seek if the constraining expression references the same table being scanned (Pedro Muniz)
- fix: evaluate result rows on exists subquery with DISTINCT clause (Pedro Muniz)
- Fix multiple index corruption bugs involving INSERT OR <conflict_resolution_mode> (Jussi Saurio)
- scripts/release-status.py: Classify issues as bugs by default (Pekka Enberg)
- Fix broken build (Pavan Nambi)
- Fix segfault in uuid_str/uuid_ts with no arguments (Preston Thorpe)
- fix build (Mikaël Francoeur)
- Strict fixes (Glauber Costa)
- fix: prevent overflow panic in JsonArrayLength with malformed JSONB (Jussi Saurio)
- Fix LEFT JOIN with virtual tables producing wrong results (Glauber Costa)
- Fix user-defined columns named oid/rowid/rowid resolving to internal rowid (Glauber Costa)
- Rn fixes 2 (Nikita Sivukhin)
- fix: emit offset after Distinct deduplication (Pedro Muniz)
- fix: increase tolerance in vector L2 distance test to match simsimd vs rust precision (Pedro Muniz)
- fix/encryption: do not panic if accessing db with missing or incorrect keys (Avinash Sajjanshetty)
- fix: overflow handling in
cast_real_to_integer (Pedro Muniz)
- fix: convert text and blobs into bytes for correct parsing of strings into numbers (Pedro Muniz)
- fix:
handle_text_sum treat certain text values as approximate (Pedro Muniz)
- Fix ruff check errors (Avinash Sajjanshetty)
- Fix panic when CTE with indexed subquery is referenced twice (Mikaël Francoeur)
- Fix STRICT tables incorrectly rejecting NULL values (Glauber Costa)
- fix: allow qualified column references in partial index WHERE clause functions (Jussi Saurio)
- Fix deadlock in MVCC mode when loading extensions on file databases (Jussi Saurio)
- fix: WHERE clause treats string literals with numeric prefixes correctly (Jussi Saurio)
- fix(update): apply affinity before MakeRecord to prevent index corruption (Pedro Muniz)
- fix: JSON path UTF-8 char boundary panic (Jussi Saurio)
- MVCC: fix checkpoint consistency and durability bugs (Jussi Saurio)
- Fix CLI ".open" command to preserve experimental flags (Jussi Saurio)
- fix/pager: properly reuse last empty trunk page for page allocation (Jussi Saurio)
- Fix Antithesis CI config (Mikaël Francoeur)
- Fix missing STRICT keyword in BTreeTable::to_sql() (Glauber Costa)
- fix/connection: release wal locks on connection drop to prevent DB from being permalocked (Jussi Saurio)
- Fix JavaScript driver error message to match libSQL (Pekka Enberg)
- MVCC fixes found using whopper (Jussi Saurio)
- Fix bug when empty namespace is provided in go sync driver (Preston Thorpe)
- Fix passing namespace in to config in Go sync driver (Preston Thorpe)
- fix: -0.0 and 0.0 should have the same hash (Pedro Muniz)
- core/mvcc: fix btree row verification (Pere Diaz Bou)
- fix: group concat did not convert values to text on output (Pedro Muniz)
- Fix datetime modifier UTF-8 slicing panic (Mikaël Francoeur)
- fix
is_nonnull check for primary key columns (Pedro Muniz)
- page cache: fix aggressive spilling logic (Preston Thorpe)
- Fix bug in hash join table mask calculations (Jussi Saurio)
- Fix broken encryption SDK tests (Avinash Sajjanshetty)
- Fix correlated subquery issues (Jussi Saurio)
- fix: avoid exponential CTE re-planning during query compilation (Jussi Saurio)
- ivm: Fix comparison of Integer <-> Float (Martin Mauch)
- Fix cross-link in Claude skills (Ofek Lev)
- mvcc: fix for schema conflict on COMMIT (Nikita Sivukhin)
- Fix bugs in hash-join materialization subplans (Jussi Saurio)
- fix: prevent integer overflow panic in JSONB serialization (Jussi Saurio)
- sqlancer dockerfile fix (Jussi Saurio)
- fix: infer subquery result list column types (Jussi Saurio)
- fix/vdbe: fix QUOTE() - should convert ints&floats to text (Jussi Saurio)
- fix/optimizer: fix output cardinality estimation for index seeks (Jussi Saurio)
- fix: truncate ORDER BY after rowid when rowid is first (Jussi Saurio)
- fix: PRINTF converts non-text format argument to string (Jussi Saurio)
- fix: substr returns NULL when provided NULL length (Jussi Saurio)
- fix docker builds (Pedro Muniz)
- fix: handle EXISTS in expr_vector_size instead of panicing with todo!() (Jussi Saurio)
- fix: move subqueries to ephemeral plan when WHERE clause is moved (Jussi Saurio)
- fix: eagerly remove ORDER BY if single aggregate, no groups/windows (Jussi Saurio)
- fix: IN/NOT IN subqueries return NULL when value not found and subquery contains NULLs (Jussi Saurio)
- fix/optimizer/stats: fix incorrectly named distinct_per_prefix field (Jussi Saurio)
- fix antithesis dockerfile: download libvoidstar.so in Dockerfile instead of COPY (Jussi Saurio)
- Optimizer: fix bugs, improve cost model (Jussi Saurio)
- Fix wal checkpoint (Nikita Sivukhin)
- Busy snapshot bugfix (Nikita Sivukhin)
- fix/translate: revert change that allowed index cursor with stale position to be read (Jussi Saurio)
- try_for_float: use Dekker algorithm to avoid precision error (Jussi Saurio)
- fix: type affinity comparison for TEXT columns with numeric literals (#4745) (Srinivas A)
- fix sync-wasm package to properly handle case when no url is provided (Nikita Sivukhin)
- Fix JSON panics and incompatibility issues (Jussi Saurio)
- Fix misuse of encryption key in the database manager cache (Avinash Sajjanshetty)
- Run cargo clippy --fix --all in turso-test-runner (Preston Thorpe)
- Fix ON CONFLICT resolution propagation to trigger statements (Preston Thorpe)
- Fix sqlancer-runner image name in GH action build (Preston Thorpe)
- Fix misleading turso-test-runner comments regarding mvcc&readonly (Jussi Saurio)
- turso-test-runner: fix flakiness with Rust bindings + MVCC combo (Jussi Saurio)
- Fix datetime parse_modifier() panicing on multibyte utf-8 (Jussi Saurio)
- Ci fixes (Jussi Saurio)
- Scalarfunc fuzzer + fixes (Jussi Saurio)
- bugfix: fix corruption by setting
reserved_bytes if requested (Avinash Sajjanshetty)
- fix(vdbe): CHAR() function should handle full Unicode range (Mikaël Francoeur)
- do not call unlock_after_restart in case of error during wal truncation - because we already released these locks earlier (Nikita Sivukhin)
- WAL: ignore error from auto-checkpoint and fix bug (Nikita Sivukhin)
- fix: dont create nested aggregates in cte_fuzz (Jussi Saurio)
- properly unlock WriteLock if restart failed and ignore Busy errors when attempt to restart WAL file failed (Nikita Sivukhin)
- fix(parser): reject duplicate PRIMARY KEY clauses on a single column (Mikaël Francoeur)
- Cte fixes (Jussi Saurio)
- fix/connect: read page1 in transaction to prevent illegal WAL read (Jussi Saurio)
- fix: dont panic if decryption or checksum verification fails (Jussi Saurio)
- fix: fsync DB file before truncating WAL after checkpoint (Jussi Saurio)
- Return error instead of panicing when 1. short read occurs 2. page type is invalid (Jussi Saurio)
- Checkpoint restart fix (Nikita Sivukhin)
- fix: nullif/instr/concat should alloc regs for both args upfront (Jussi Saurio)
- core/vdbe/sorter: Propagate write errors instead of corrupting data (Preston Thorpe)
- fix(parser): BETWEEN and LIKE operator precedence with IS NOT NULL (Jussi Saurio)
- fix: allow CTEs to be referenced multiple times (Jussi Saurio)
- fix(parser): reject ?0 parameter with proper error instead of panicking (Jussi Saurio)
- more recursive read lock fixes (Pedro Muniz)
- fix: allow float literals in ORDER BY clause (Jussi Saurio)
- fix: correct operator precedence in replace() argument check (Jussi Saurio)
- fix: reject literal-only index expressions and fix JNI panic (Jussi Saurio)
- fix: handle CAST without type name for SQLite compatibility (Jussi Saurio)
- fix/vdbe: convert BusySnapshot to Busy if conn rolled back (Jussi Saurio)
- sdk-kit: Export busy snapshot error to callers (Pekka Enberg)
- fix: return NULL instead of panicking in uuid7_timestamp_ms for invalid blobs (Jussi Saurio)
- fix: handle parse errors gracefully in LIMIT clause (Jussi Saurio)
- fix: prevent panic on multi-byte UTF-8 in datetime functions (Jussi Saurio)
- fix: INSERT INTO ... SELECT ... UNION ... inserts all rows (Jussi Saurio)
- Fix DEFAULT value handling in integrity check (Jussi Saurio)
- Fix stale overflow page read bug and improper re-entrancy handling in integrity_check (Jussi Saurio)
- Fix integrity_check NOT NULL validation false positive (Jussi Saurio)
- Fix compilation after cross-pollution with unused vars PR and integrity check PR (Jussi Saurio)
- fix: use
checked_cast_text_to_numeric for Numeric cast in exec_cast (Pedro Muniz)
- fix: resolve label in ungrouped aggregation with SELECT DISTINCT (Jussi Saurio)
- fix/checkpoint: always read page1 from db file when truncating (Jussi Saurio)
- whopper: Handle BusySnapshot error gracefully (Pekka Enberg)
- Fix WAL truncate checkpoint discarding uncheckpointed frames (Jussi Saurio)
- btree.rs: make #[instrument] conditional on debug_assertions (Jussi Saurio)
- Fix path not fsyncing the DB file after truncate checkpoint (Preston Thorpe)
- core: make datetime functions faster and fix bugs (Jussi Saurio)
- Valueiterator with fixes (Jussi Saurio)
- stress: handle I/O error gracefully instead of panicking (Pekka Enberg)
- stress: dont panic if get BusySnapshot error (Jussi Saurio)
- bindings/rust: return error on out of bounds Row::get access (Jussi Saurio)
- vector: increase fuzz error tolerance on windows (Jussi Saurio)
- sim: fix yet another apply_snapshot() edge case (Jussi Saurio)
Install turso_cli 0.5.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/tursodatabase/turso/releases/download/v0.5.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.5.0/turso_cli-installer.ps1 | iex"
Download turso_cli 0.5.0
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>