Files
turso/CHANGELOG.md
2025-10-03 12:20:20 +03:00

1935 lines
97 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
## 0.2.0 -- 2025-10-03
### 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 `CAST` to 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_trim` code + 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 PLAN` like 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 `EXPLAIN` like 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: `readline` will write to `input_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_columns` when 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_cell` to 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)
## 0.1.5 -- 2025-09-10
### Added
* add missing module type for browser package (Nikita Sivukhin)
* Implement 2-args json_each (Mikaël Francoeur)
* Add OPFS support to JavaScript bindings (Nikita Sivukhin)
* test/fuzz: add UPDATE/DELETE fuzz test (Jussi Saurio)
* add gen-bigass-database.py (Jussi Saurio)
* Add assertion: we read a page with the correct id (Jussi Saurio)
* support float without fractional part (Lâm Hoàng Phúc)
* expr: use more efficient implementation for binary condition exprs (Jussi Saurio)
* Add json_each table-valued function (1-arg only) (Mikaël Francoeur)
* Add io_uring support to stress (Pekka Enberg)
* Refactor LIMIT/OFFSET handling to support expressions (bit-aloo)
* Encryption: add support for other AEGIS and AES-GCM cipher variants (Frank Denis)
* introduce package.json for separate *-browser package (both database and sync) (Nikita Sivukhin)
* introduce `eq/contains/starts_with/ends_with_ignore_ascii_case` macros (Lâm Hoàng Phúc)
* introduce `match_ignore_ascii_case` macro (Lâm Hoàng Phúc)
* core: Make strict schema support experimental (Pekka Enberg)
* core/printf: support for more basic substitution types (Luiz Gustavo)
* Return sqlite_version() without being initialized (Preston Thorpe)
* Support encryption for raw WAL frames (Gaurav Sarma)
* bindings/java: Implement date, time related methods under JDBC4PreparedStatement (Kim Seon Woo)
* Support cipher and encryption key URI options (William Souza)
* Implement UPSERT (Preston Thorpe)
* CLI: implement `Line` output .mode (Andrey Oskin)
* add sqlite integrity check back (Pedro Muniz)
* core: Initial pass on synchronous pragma (Pekka Enberg)
* Introduce and propagate `IOContext` as required (Avinash Sajjanshetty)
* Add some docs on encryption (Avinash Sajjanshetty)
* sqlite3: Implement sqlite3_malloc() and sqlite3_free() (Pekka Enberg)
* sqlite3: Implement sqlite3_next_stmt() (Pekka Enberg)
* core/translate: Add support (Pekka Enberg)
* sqlite3: Implement sqlite3_db_filename() (Pekka Enberg)
* flake.nix: add uv dependency to nativeBuildInputs (Ceferino Patino)
* sqlite3: Implement sqlite3_bind_parameter_index() (Pekka Enberg)
* sqlite3: Implement sqlite3_clear_bindings() (Pekka Enberg)
* sqlite3: Implement sqlite3_get_autocommit() (Pekka Enberg)
* Add support for AEGIS encryption algorithm (Avinash Sajjanshetty)
* bindings/java: Implement batch operations for JDBC4Statement (Kim Seon Woo)
* Add syntax highlighting for EXPLAIN and ANALYZE (Alex Miller)
* Add basic support for ANALYZE statement (Alex Miller)
* correctly implement offset() in parser (Lâm Hoàng Phúc)
* Switch to new parser in core (Levy A.)
* github: Remove Intel Mac support (Pekka Enberg)
* add remove_file method to the IO (Nikita Sivukhin)
* Add libc fault injection to Antithesis (Pekka Enberg)
* core/mvcc: support for MVCC (Pere Diaz Bou)
* SQLite C API improvements: add column type and column decltype (Danawan Bimantoro)
* Initial pass to support per page encryption (Avinash Sajjanshetty)
### Updated
* clean `print_query_result` (Lâm Hoàng Phúc)
* update update-script to properly handle JS workspace (Nikita Sivukhin)
* no need `QueryStatistics` if `self.opts.timer` is not set (Lâm Hoàng Phúc)
* optimizer: convert outer join to inner join if possible (Jussi Saurio)
* Handle case where null flag is set in op_column (Jussi Saurio)
* remove &1 (Lâm Hoàng Phúc)
* reduce cloning `Arc<Page>` (Lâm Hoàng Phúc)
* Evaluate left join seek key condition again after null row (Jussi Saurio)
* use mlugg/setup-zig instead of unmaintained action (Kingsword)
* Prevent setting of encryption keys if already set (Gaurav Sarma)
* Remove RefCell from Cursor (Pedro Muniz)
* Page Cache: optimize and use sieve/Gclock hybird algorithm in place of LRU (Preston Thorpe)
* core: handle edge cases for read_varint (Sonny)
* Persistence for DBSP-based materialized views (Glauber Costa)
* io_uring: prevent out of order operations that could interfere with durability (Preston Thorpe)
* core: Simplify WalFileShared life cycle (Pekka Enberg)
* prevent modification to system tables. (Glauber Costa)
* mark completion as done only after callback will be executed (Nikita Sivukhin)
* core/mvcc: make commit_txn return on I/O (Pere Diaz Bou)
* windows iterator returns no values for shorter slice (Lâm Hoàng Phúc)
* Unify resolution of aggregate functions (Piotr Rżysko)
* replace some matches with `match_ignore_ascii_case` macro (Lâm Hoàng Phúc)
* Make io_uring sound for connections on multiple threads (Preston Thorpe)
* build native package for ARM64 (Nikita Sivukhin)
* refactor parser fmt (Lâm Hoàng Phúc)
* string sometimes used as identifier quoting (Lâm Hoàng Phúc)
* CURRENT_TIMESTAMP can fallback TK_ID (Lâm Hoàng Phúc)
* remove `turso_sqlite3_parser` from `turso_parser` (Lâm Hoàng Phúc)
* Simulate I/O in memory (Pedro)
* Simulate I/O in memory (Pedro Muniz)
* Refactor encryption to manage authentication tag internally (bit-aloo)
* Unify handling of grouped and ungrouped aggregations (Piotr Rżysko)
* Evict page from cache if page is unlocked and unloaded (Pedro Muniz)
* Use u64 for file offsets in I/O and calculate such offsets in u64 (Preston Thorpe)
* Document how to use CDC (Pavan Nambi)
* Upgrade Rust version in simulator build Dockerfile (Preston Thorpe)
* Parse booleans to integer literals in expressions (Preston Thorpe)
* Simulator Profiles (Pedro Muniz)
* Change views to use DBSP circuits (Glauber Costa)
* core/wal: cache file size (Pere Diaz Bou)
* Remove some code duplication in the CLI (Preston Thorpe)
* core/translate: parse_table remove unnecessary clone of table name (Pere Diaz Bou)
* Update COMPAT.md to remove CREATE INDEX default disabled (Preston Thorpe)
* core/translate: remove unneessary agg clones (Pere Diaz Bou)
* core/vdbe: Micro-optimize "zero_or_null" opcode (Pekka Enberg)
* translate: with_capacity insns (Pere Diaz Bou)
* perf: avoid constructing PageType in helper methods (Jussi Saurio)
* refactor/perf: remove BTreePageInner (Jussi Saurio)
* Improve integrity check (Nikita Sivukhin)
* translate/insert: Improve string format performance (Pere Diaz Bou)
* core/schema: get_dependent_materialized_views_unnormalized (Pere Diaz Bou)
* core/util: emit literal, cow instead of replace (Pere Diaz Bou)
* core/translate: sanize_string fast path improvement (Pere Diaz Bou)
* core/io: Switch Unix I/O to use libc::pwrite() (Pekka Enberg)
* Update README.md for Go documentation (Preston Thorpe)
* improve sync engine (Nikita Sivukhin)
* Remove Go bindings (Preston Thorpe)
* core/storage: Micro-optimize Pager::commit_dirty_pages() (Pekka Enberg)
* Rename Go driver to `turso` to not conflict with sqlite3 (Preston Thorpe)
* Refactor: `Cell` instead of `RefCell` to store `CipherMode` in connection (Avinash Sajjanshetty)
* Improve documentation of page pinning (Jussi Saurio)
* Remove double indirection in the Parser (Pedro Muniz")
* Fail CI run if Turso output differs from SQLite in TPC-H queries (Jussi Saurio)
* Decouple SQL generation from Simulator crate (Pedro Muniz)
* Make fill_cell_payload() safe for async IO and cache spilling (Jussi Saurio)
* Remove Windows IO in place of Generic IO (Preston Thorpe)
* Improve encryption API (Avinash Sajjanshetty)
* Remove double indirection in the Parser (Pedro Muniz)
* Update TPC-H running instructions in PERF.md (Alex Miller)
* Truncate the WAL on last connection close (Preston Thorpe)
* DBSP projection (Pekka Enberg)
* Use vectored I/O for appending WAL frames (Preston Thorpe)
* Remove unnecessary argument from Pager::end_tx() (Nikita Sivukhin)
* refactor/btree: rewrite the find_free_cell() function (Jussi Saurio)
* refactor/btree: rewrite the free_cell_range() function (Jussi Saurio)
* Remove Result from signature (Mikaël Francoeur)
* Remove duplicated attribute in (bit-aloo)
* reduce cloning Token in parser (Lâm Hoàng Phúc)
* refactor encryption module and make it configurable (Avinash Sajjanshetty)
* Replace a couple refcells for types that trivially impl Copy (Preston Thorpe)
* wal-api: allow to mix frames insert with SQL execution (Nikita Sivukhin)
* move check code into parser (Lâm Hoàng Phúc)
* Serialize compat tests and use Mutex::lock() instead of Mutex::try_lock() in UnixIO (Jussi Saurio)
* sim: remove "run_once faults" (Jussi Saurio)
* should not return a Completion when there is a page cache hit (Pedro Muniz)
* github: Reduce Python build matrix (Pekka Enberg)
* Page cache truncate (Nikita Sivukhin)
* Wal api checkpoint seq (Nikita Sivukhin)
* Use more structured approach in translate_insert (Jussi Saurio)
* Remove hardcoded flag usage in DBHeader for encryption (Avinash Sajjanshetty)
* properly execute pragmas - they may require some IO (Nikita Sivukhin)
* Wal checkpoint upper bound (Nikita Sivukhin)
* Improve WAL checkpointing performance (Preston Thorpe)
* core/mvcc: store txid in conn and reset transaction state on commit (Pere Diaz Bou)
* core/mvcc: start first rowid at 1 (Pere Diaz Bou)
* refactor/vdbe: move insert-related seeking to VDBE from BTreeCursor (Jussi Saurio)
### Fixed
* Fix clear_page_cache method and rollback (Preston Thorpe)
* Fix read_entire_wal_dumb: incrementally build the frame cache (Preston Thorpe)
* Fix merge script to prompt if tests are still in progress (Preston Thorpe)
* SQL generation fixes (Pekka Enberg)
* Fix affinity handling in MakeRecord (Pekka Enberg)
* Fix infinite loop when IO failure happens on allocating first page (Preston Thorpe)
* Fix crash in Next opcode if cursor stack has no pages (Jussi Saurio)
* cli: Fix dump compatibility in "PRAGMA foreign_keys" (Pekka Enberg)
* Small fixes (Nikita Sivukhin)
* Avoid allocating and then immediately fallbacking errors in affinity (Jussi Saurio)
* Fix float formatting and comparison + Blob concat (Levy A.)
* Fix infinite loop when query starts comment token ("--") (Lâm Hoàng Phúc)
* Fix sqlite3 test cases (Pekka Enberg)
* Fix non-determinism in simulator (Pedro Muniz)
* Fix column count in ImmutableRow (Glauber Costa)
* Fix memory leak in page cache during balancing (Preston Thorpe)
* Fix `sim-schema` command (Pedro Muniz)
* Propagate decryption error from the callback (Avinash Sajjanshetty)
* Fix sorter column deduplication (Piotr Rżysko)
* Fix missing functions after revert (Pedro Muniz)
* ci: fix merge-pr issue to escape command-line backticks (Ceferino Patino)
* Fix several issues with integrity_check (Jussi Saurio)
* core/io: Fix build on Android and iOS (Pekka Enberg)
* WAL txn: fix reads from DB file (Nikita Sivukhin)
* Fix blob type handling in JavaScript (Pekka Enberg)
* Fix: all indexes need to be updated if the rowid changes (Jussi Saurio)
* Fix: in UPDATE, insert rowid into index instead of NULL (Jussi Saurio)
* Fix: normalize table name in DELETE (Jussi Saurio)
## 0.1.4 -- 2025-08-20
### Added
* bindings/rust: Add method (Pekka Enberg)
* Add helper to convert io::clock::Instant to useable format (Preston Thorpe)
* bindings/javascript: Add TypeScript declarations to package (Pekka Enberg)
* add missing closing tag (Glauber Costa)
* add metrics and implement the .stats command (Glauber Costa)
* Add bench-sqlite script and makefile command (Preston Thorpe)
* Fix simulator docker build by adding new sync directory (Preston Thorpe)
* core/mvcc: schema_did_change support and find last valid version (Pere Diaz Bou)
* Add list databases and open database commands to the MCP server (Glauber Costa)
* Add documentation and rename functions (Mikaël Francoeur)
* Add io_yield macros to reduce boilerplate (Preston Thorpe)
* Add --keep-files flag to allow for inspection of files for successful simulator runs (Preston Thorpe)
* core/printf: support for the %i operand (Luiz Gustavo)
* Add parser to Dockerfiles for cargo chef (Jussi Saurio)
* Add framework for testing extensions in TCL (Piotr Rżysko)
* Fix WAL initialization to last committed frame (Nikita Sivukhin)
* sim: add Property::TableHasExpectedContent (Jussi Saurio)
* Properly implement CLI command (Preston Thorpe)
* docs: add Claude Code MCP integration guide (Braden Wong)
* Add assertion for expected write amount in writev callback (Preston Thorpe)
* sim: add Property::ReadYourUpdatesBack (Jussi Saurio)
* Add support for unlikely(X) (bit-aloo)
* Implement normal views (Glauber Costa)
* turso-sync: support checkpoint (Nikita Sivukhin)
* bindings/javascript: Add async connect() function (Pekka Enberg)
* Direct schema mutation add RenameColumn instruction (Levy A.)
* Implement Aggregations for DBSP views (Glauber Costa)
* stop silently ignoring unsupported features in incremental view where clauses (Jussi Saurio)
* turso-sync: support updates and schema changes (Nikita Sivukhin)
* turso-cdc: add updates column for cdc table (Nikita Sivukhin)
* docs: improve README initialization section clarity (Braden Wong)
* Add support for Full checkpoint mode in the WAL (Preston Thorpe)
* Add support for PRAGMA freelist_count (bit-aloo)
* Initial pass on incremental view maintenance with DBSP (Glauber Costa)
* SQLite C API improvements: add bind_text and bind_blob (Danawan Bimantoro)
* perf/clickbench: enable rest of queries since we support DISTINCT and REGEXP_REPLACE (Jussi Saurio)
* Add table name to the delete bytecode (Glauber Costa)
* Initial pass on incremental view maintenance with DBSP (Glauber Costa)
* docs: fix CLI command and add homebrew install instructions for MacOS (Mattia)
* Reimplement LimboRwLock in the WAL (Preston Thorpe)
* BufferPool: add arena backed pool to support fixed opcodes and coalescing (Preston Thorpe)
* translate: return parse errors for unsupported features instead of silently ignoring (Jussi Saurio)
* Add query only pragma (bit-aloo)
* Direct schema mutation add instruction (Levy A.)
* Add .clone CLI command to copy database files (Preston Thorpe)
* PageContent: make read_x/write_x methods private and add dedicated methods (Jussi Saurio)
* SQLite C API improvements: add basic bind and column functions (Danawan Bimantoro)
* javascript: Implement Statement.iterate() (Pekka Enberg)
* Fix panic on loading extension on brand new connection (Preston Thorpe)
* implement the MaxPgCount opcode (Glauber Costa)
* Direct schema mutation add instruction (Levy A.)
* Add regexp capture (bit-aloo)
* Add load_insn macro for compiler hint in vdbe::execute hot path (Preston Thorpe)
* test/fuzz: add ALTER TABLE column ops to tx isolation fuzz test (Jussi Saurio)
* core/mvcc: implement exists (Pere Diaz Bou)
* tests/fuzz_transactions: add tests for fuzzing transactions with MVCC (Pere Diaz Bou)
* perf/btree: implement fast algorithm for defragment_page (Jussi Saurio)
* bindings/rust: add with_mvcc option, open with path too! (Pere Diaz Bou)
* core/mvcc: implement seeking operations with rowid (Pere Diaz Bou)
* bindings/rust: add with_mvcc option (Pere Diaz Bou)
* Add bitmap to track pages in arenas (Preston Thorpe)
* Direct schema mutation add instruction (Levy A.)
* core/mvcc: fix new rowid on restart (Pere Diaz Bou)
* Implement JavaScript bindings with minimal Rust core (Pekka Enberg)
* test/fuzz/transactions: add "PRAGMA wal_checkpoint" to txn isolation fuzz test (Jussi Saurio)
* Support the OFFSET clause for Compound select (meteorgan)
* Introduce some state machines in preparation for IO Completions refactor (Pedro Muniz)
* Add cli Dockerfile (Pere Diaz Bou)
* Implement the Cast opcode (Glauber Costa)
* Support VALUES clauses for compound select (meteorgan)
* fix: add packages to sim/antithesis dockerfiles for cargo-chef (Jussi Saurio)
* Add vector_concat and vector_slice support (bit-aloo)
* bindings/rust: Add Connection::execute_batch() (Rohith Suresh)
* bindings/java: Throw UnsupportedOperationException for unimplemented … (Pekka Enberg)
* turso-sync package: initial commit (Nikita Sivukhin)
### Updated
* JavaScript improvements (Pekka Enberg)
* bindings/javascript: Rename to (Pekka Enberg)
* Small pager cleanups (Jussi Saurio)
* Do not begin or end transactions in nested statement (Jussi Saurio)
* make the MCP server instructions more visible on the README (Glauber Costa)
* FaultyQuery enabled by default (Pedro Muniz)
* hide our age (Glauber Costa)
* make sure our responses are compliant with MCP (Glauber Costa)
* Move sync code to own directory (Pekka Enberg)
* Refactor: use regular save/restore context mechanism for delete balancing (Jussi Saurio)
* Improve handling of inserts with column names (Wallys Ferreira)
* emit SetCookie when creating a view (Glauber Costa)
* unify halts (Glauber Costa)
* Update stale in memory wal header after restarting log (Preston Thorpe)
* sync-engine: Use SQL over HTTP instead of WAL push (Nikita Sivukhin)
* Convert SQLite parser in Rust by hand (Lâm Hoàng Phúc)
* Ensure we fsync the db file in all paths that we checkpoint (Preston Thorpe)
* Revive async io extension PR (Preston Thorpe)
* sim: reduce frequency of compound selects and complex joins (Jussi Saurio)
* Use BufferPool owned by Database instead of a static global (Jussi Saurio)
* sync-engine: avoid unnecessary WAL push (Nikita Sivukhin)
* use virtual root page for sqlite_schema (Mikaël Francoeur)
* io_uring: Gracefully handle submission queue overflow (Preston Thorpe)
* Disable unused variables in cargo clippy for CI (Pedro Muniz)
* Refactor: atomic ordering (Preston Thorpe)
* Document the I/O model (Pedro Muniz)
* disable checkpoint: adjust semantic (Nikita Sivukhin)
* SDK: enable indices everywhere (Nikita Sivukhin)
* Manual updates (Pekka Enberg)
* Wait for I/O completions (Pedro Muniz)
* IO Cleanups to use and (Pedro Muniz)
* move our dbsp-based views to materialized views (Glauber Costa)
* More State machines (Pedro Muniz)
* Rename page -> slot for arenas + buffer pool (Preston Thorpe)
* Unify JavaScript package README files (Pekka Enberg)
* simple README with warning (Nikita Sivukhin)
* core/wal: Minor checkpointing cleanups and optimizations (Preston Thorpe)
* perf/btree: optimize op_column (Jussi Saurio)
* Update PERF.md with mobibench instructions (Preston Thorpe)
* Handle single, double and unquoted strings in values clause (Mikaël Francoeur)
* Use rusqlite 0.37 with bundled SQLite everywhere (Jussi Saurio)
* Feat/pragma module list (Lucas Forato)
* remove turso-sync as now we have turso-sync-engine (Nikita Sivukhin)
* Sorter IO Completions (Pedro Muniz)
* Simulator should delete files after a successful run (Pedro Muniz)
* turso-sync: js package (Nikita Sivukhin)
* global allocator should not be set for library, only for executables (Pedro Muniz)
* Evaluate WHERE conditions after LEFT JOIN (Piotr Rżysko)
* Btree cache usable space (Jussi Saurio)
* Rename JavaScript package to (Pekka Enberg)
* perf: a few small insert optimizations (Jussi Saurio)
* javascript: Organize test cases better (Pekka Enberg)
* only allow multiples of 64 for performance in arena bitmap (Preston Thorpe)
* btree: Use correct byte offsets for page 1 in defragmentation (Jussi Saurio)
* bench/insert: use PRAGMA synchronous=full (Jussi Saurio)
* JavaScript improvements (Pekka Enberg)
* turso-sync: rewrite (Nikita Sivukhin)
* bench/insert: use locking_mode EXCLUSIVE and journal_mode=WAL for sqlite (Jussi Saurio)
* IO More State Machine (Pedro Muniz)
* refactor/btree: cleanup write/delete/balancing states (Jussi Saurio)
* cdc: emit entries for schema changes (Nikita Sivukhin)
* Coll seq (Glauber Costa)
* Remove RefCell from Buffer in IO trait methods and PageContents (Preston Thorpe)
* Remove Clone impl for Buffer and PageContent (Preston Thorpe)
* More state machine + Return IO in places where completions are created (Pedro Muniz)
* cleanup: remove unused page uptodate flag (Jussi Saurio)
* Relax I/O configuration attribute to cover all Unixes (Pedro Muniz)
* Update defragment page to defragment in-place (João Severo)
* Integrate virtual tables with optimizer (Piotr Rżysko)
* Reprepare Statements when Schema changes (Pedro Muniz)
* More State Machines in preparation for tracking IO Completions (Pedro Muniz)
* coalesce any adjacent buffers from writev calls into fewer iovecs (Preston Thorpe)
* extend raw WAL API with few more methods (Nikita Sivukhin)
* Use pwrite for single buffer pwritev call in unix IO (Preston Thorpe)
* hide dangerous methods behind conn_raw_api feature (Nikita Sivukhin)
* preserve files in IO memory backend (Nikita Sivukhin)
* Improve SQLite3 TCL test suite (Pekka Enberg)
* Make completions idempotent (Preston Thorpe)
* perf/btree: skip seek in move_to_rightmost() if we are already on rightmost page (Jussi Saurio)
* perf/pager: dont clear page cache on commit (Jussi Saurio)
* Rename liblimbo_sqlite3 to libturso_sqlite3 (Pekka Enberg)
* core: Fold HeaderRef to pager module (Pekka Enberg)
* perf/vdbe: remove eager cloning in op_comparison (Jussi Saurio)
* Update cargo-dist to the latest official version (Hiroaki Yutani)
* bindings/rust: Enhance API by removing verbosity (Diego Reis)
* use state machine for NoConflict opcode (Mikaël Francoeur)
* state_machine: remove State associated type (Pere Diaz Bou)
* Single quotes inside a string literal have to be doubled in (Diego Reis)
* core/mvcc: Move commit_txn() to generic state machinery (Pere Diaz Bou)
* bindings/javascript: Reduce VM/native crossing overhead (Pekka Enberg)
* Enable indexes by default (Jussi Saurio)
* perf/btree: improve performance of rowid() function (Jussi Saurio)
* core/mvcc: Persist changes through pager on commit (Pere Diaz Bou)
* Open a temporary on-disk file for ephemeral tables (Jussi Saurio)
* Force Sqlite to parse schema on connection benchmark (Levy A.)
* more compat police (Glauber Costa)
* Bury limbo-wasm (Diego Reis)
* IN queries (Glauber Costa)
* IN queries (Glauber Costa)
* vdbe: Disallow checkpointing in transaction (Jussi Saurio)
* Serverless JavaScript driver improvements (Pekka Enberg)
* Direct `DatabaseHeader` reads and writes `with_header` and `with_header_mut` (Levy A.)
* refactor/btree: simplify get_next_record()/get_prev_record() (Jussi Saurio)
* Accumulate/batch vectored writes when backfilling during checkpoint (Preston Thorpe)
* remove non-existent opcode (Glauber Costa)
* skip invalid inputs in cosine distance prop test (bit-aloo)
* core/mvcc: Switch to parking_lot RwLock (Pekka Enberg)
* Rewrite the WAL (Preston Thorpe)
* turso-sync: bidirectional sync for local db (Nikita Sivukhin)
* Change more function signatures to return Completions (Pedro Muniz)
* Clean up conversion between InsnFunctionStepResult and StepResult (Diego Reis)
* core/mvcc: simplify mvcc cursor types (Pere Diaz Bou)
* bindings/javascript: Run tests serially (Diego Reis)
* Javascript testing cleanups (Pekka Enberg)
* Javascript API improvements (Pekka Enberg)
* Change function signatures to return IO Completions (Pedro Muniz)
### Fixed
* Fix page locked panic (Pedro Muniz)
* Remove assertions from Completion::complete() and Completion::error() (Jussi Saurio)
* Completion Error (Pedro Muniz)
* fix/sim: prevent sim from trying to create an existing table or index (Jussi Saurio)
* Fail simulator on parse errors (Jussi Saurio)
* fix pragma table_info for views (Glauber Costa)
* Fix two issues in simulator (Jussi Saurio)
* Fix distinct order by (Jussi Saurio)
* Fix UPDATE: Do not use an index for iteration if that index is going to be updated (Jussi Saurio)
* Fix non-4096 page sizes (Jussi Saurio)
* fix: Handle fresh INSERTs in materialized view incremental maintenance (Glauber Costa)
* Fix: do computations on usable_space as usize, not as u16 (Jussi Saurio)
* Sync engine fixes (Nikita Sivukhin)
* Fix tables renaming to existing index and rename indexed columns on (Levy A.)
* Fix max_frame determination and comments in WAL checkpointing (Preston Thorpe)
* turso-sync: fix schema bug (Nikita Sivukhin)
* Fix: Rename clickbench output file limbo/turso (Henrik Ingo)
* Reprepare fix on write statement (Pedro Muniz)
* Fix view processing in the VDBE (Jussi Saurio)
* Fix performance regression in prepare (Piotr Rżysko)
* Fix JavaScript bindings packaging (Nikita Sivukhin)
* bench/insert: fix expected return value from pragma (Jussi Saurio)
* Fix segfault on schema update for virtual tables (Preston Thorpe)
* core/btree: fix re-entrancy bug in insert_into_page() (Jussi Saurio)
* Fix performance regression (Jussi Saurio)
* fix/wal: remove start_pages_in_frames_hack to prevent checkpoint data loss (Jussi Saurio)
* fix/core/translate: ALTER TABLE DROP COLUMN: ensure schema cookie is updated even when target table is empty (Jussi Saurio)
* io_uring: setup plumbing for Fixed opcodes (Preston Thorpe)
* JavaScript serverless driver fixes (Pekka Enberg)
* Fix vector deserialization alignment and blob/text empty mismatch (bit-aloo)
* fix/wal: reset ongoing checkpoint state when checkpoint fails (Jussi Saurio)
* Fix parser error for repetition in row values (Diego Reis)
* fix/wal: only rollback WAL if txn was write + fix start state for WalFile (Jussi Saurio)
* fix/bindings/rust: return errors instead of swallowing them and returning None (Jussi Saurio)
* fix/wal: make db_changed check detect cases where max frame happens to be the same (Jussi Saurio)
* fix/wal: reset page cache when another connection checkpointed in between (Jussi Saurio)
* Fix merge script to prevent incorrectly marking merged contributor PRs as closed (Preston Thorpe)
* Fix concat_ws to match sqlite behavior (bit-aloo)
* bindings/rust: return errors instead of vibecoded numbers (Jussi Saurio)
## 0.1.3 -- 2025-07-29
### Added
* bindings/rust: Add WAL API support (Nikita Sivukhin)
* Implement the Returning statement for inserts and updates (Glauber Costa)
* implement the pragma encoding (Glauber Costa)
* support doubly qualified identifiers (Glauber Costa)
* mark detach as supported (Glauber Costa)
* Support ATTACH (read only) (Glauber Costa)
* serverless: Add DatabasError type (Pekka Enberg)
* btree/balance: support case where immediate parent page of unbalanced child page also overflows (Jussi Saurio)
* serverless: Add Statement.run() method (Pekka Enberg)
* make add dirty to change flag and also add page to the dirty list (Nikita Sivukhin)
* types: less noisy Debug implementation for ImmutableRecord (Jussi Saurio)
* Safe `AtomicUsize` wrapper for `db_state`: add `DbState` and `AtomicDbState` (Levy A.)
* Add Github workflow for Turso serverless package (Pekka Enberg)
* Add Rickrolling Turso blog post to contrib (Avinash Sajjanshetty)
* Add `@tursodatabase/serverless` package (Pekka Enberg)
* Implement pragma database_list (Glauber Costa)
* fix/test: fix and unignore incorrectly implemented test (Jussi Saurio)
* implement Debug for Database (Glauber Costa)
* implement pragma application_id (Glauber Costa)
* implement write side of pragma schema_version (Glauber Costa)
* Simplify blocking operations add `io.block(fn)` for IO trait implementors (Levy A.)
* bindings/rust: Initial support for transactions API (Diego Reis)
* claude sonnet forgot to run clippy when implementing mcp server (Jussi Saurio)
* bindings/js: support iterator, and more kinds of params (Mikaël Francoeur)
* Add a native MCP server (Glauber Costa)
* sim: add order by to some queries (Jussi Saurio)
* Core: Introduce external sorting (Iaroslav Zeigerman)
* forgot to set the state to NewTrunk if we have more leaf pages than free entries (Pedro Muniz)
* Implement IO latency correctly in simulator (Pedro Muniz)
* page cache: temporarily increase default size until WAL spill is implemented (Jussi Saurio)
* compat: add integrity_check (Pere Diaz Bou)
* sim: provide additional context in assertion failures (Jussi Saurio)
* btree: add some assertions related to #2106 (Jussi Saurio)
* bench: add insert benchmark (batch sizes: 1,10,100) (Jussi Saurio)
* Support page_size pragma setting (meteorgan)
### Updated
* bindings/javascript: Generate native npm packages at publish (Pekka Enberg)
* Replace custom wasm bindings with napi-rs (Diego Reis)
* core: Enforce shared database object per database file (Pekka Enberg)
* btree/pager: Improve update performance by reusing freelist pages in allocate_page() (Jussi Saurio)
* VDBE/op_column: use references to cursor payload instead of cloning (Jussi Saurio)
* io/unix: wrap file with Mutex (Pere Diaz Bou)
* core: Clone everything in schema (Pere Diaz Bou)
* core/translate: Handle Expr::Id in `CREATE INDEX` (Kristofer)
* Thread-safe `WindowsFile` (Levy A.)
* io_uring: use Arc pointer for user data of entries (Preston Thorpe)
* Stop checkpointing the entire WAL after every write when wal frame size > threshold (Preston Thorpe)
* compat police (Glauber Costa)
* remove upsert statement from COMPAT.md (Glauber Costa)
* Update limbo -> turso in manual.md (stano)
* bindings/javascript: Switch to napi v3 (Diego Reis)
* Simplify sum() aggregation logic (bit-aloo)
* Ignore WAL frames after bad checksum (Pere Diaz Bou)
* parser: Distinguish quoted identifiers and unify Id into Name enum (bit-aloo)
* btree: clear overflow pages when insert overwrites a cell (= UPDATE) (Jussi Saurio)
* Append WAL frames one by one (Pere Diaz Bou)
* pager: Clear stale page cache if database changed (Jussi Saurio)
* sim/aws: ignore child process exits with code 137 (Jussi Saurio)
* WAL insert API: force schema re-parse if necessary after WAL sync session end (Nikita Sivukhin)
* WAL insert: mark pages as dirty (Nikita Sivukhin)
* emit SetCookie after DropTable (Glauber Costa)
* Bail early for read-only virtual tables (Preston Thorpe)
* measure only the time it takes to open the actual connection (Glauber Costa)
* Explicit rowid insert (Nikita Sivukhin)
* Deserialize keys only once when sorting immutable records (Iaroslav Zeigerman)
* WAL insert API (Nikita Sivukhin)
* Pager: clear overflow cells when freeing page (Jussi Saurio)
* make readonly a property of the database (Glauber Costa)
* use default hasher for the sake of determinism (Nikita Sivukhin)
* Load static extensions once and store on Database instead of once per connection (Preston Thorpe)
* wal: write txn fail in case max_frame change midway (Pere Diaz Bou)
* Improve Antithesis tests (Pekka Enberg)
* core/lib: init_pager lock shared wal until filled (Pere Diaz Bou)
* test/stress&sim: enable indexes by default (Jussi Saurio)
* Usable space unwrap (Pedro Muniz)
* BTreeTable::to_sql: wrap special column names in brackets (Nils Koch)
* Avoid redundant decoding of record headers when reading sorted chunk files (Iaroslav Zeigerman)
* compat: change page_size pragma and RowData opcode to yes (meteorgan)
* Explain the Turso challenge (Glauber Costa)
* gh workflow for dart (test, precompile, publish), only test is activated (Andika Tanuwijaya)
* bindings/rust: Return number of rows changed from Connection::execute() (Rohith Suresh)
* bindings/java: Make TursoDB and TursoDB factory thread-safe (Mikaël Francoeur)
* use `wasm32-wasip1` target instead of `wasm32-wasi` (Nils Koch)
* improve handling of double quotes (Glauber Costa)
* Remove `find_cell`, allow overwrite of index interior cell (Jussi Saurio)
* sim: change --disable-create-index flag to --enable-create-index (default false) (Jussi Saurio)
* Reanimate MVCC (Pekka Enberg)
* Replace verbose IO Completion methods with helpers (Preston Thorpe)
* Use pread and pwrite in run_once (Ihor Andrianov)
* `make_from_btree` should wait for IO to complete (Pedro Muniz)
* chore: update rust to version 1.88.0 (Nils Koch)
* refactor/btree&vdbe: fold index key info (sort order, collations) into a single struct (Jussi Saurio)
* core: Copy-on-write for in-memory schema (Levy A.)
* simulator: Disable `INSERT INTO .. SELECT` for being slow (Pekka Enberg)
* Async IO: registration of file descriptors (Preston Thorpe)
* Clean up AST unparsing, remove `ToSqlString` (Levy A.)
* rename operation_xxx to change_xxx to make naming more consistent (Nikita Sivukhin)
* Separate user-callable cacheflush from internal cacheflush logic (Diego Reis)
* make unixepoch to return i64 (Nikita Sivukhin)
* sim: ignore fsync faults (Jussi Saurio)
* Updates to the simulator (Alperen Keleş)
* small refactor: rename "amount" to "extra_amount" (Nikita Sivukhin)
* refactor: Changes CursorResult to IOResult (Diego Reis)
* btree: unify table&index seek page boundary handling (Jussi Saurio)
* Treat table-valued functions as tables (Piotr Rżysko)
### Fixed
* perf: fix logic error in is_simple_count() (Jussi Saurio)
* Fix writing wal header for async IO (Preston Thorpe)
* bindings/javascript: Fix tracing and `SqliteError` message not populated (Levy A.)
* Fix sum() to follow the SQLite semantics (FamHaggs)
* Fix error handling when binding column references while translating the UPDATE statement (Iaroslav Zeigerman)
* Fix schema reparse logic (Nikita Sivukhin)
* Fix page_count pragma (meteorgan)
* sqlite3: Improve SQLite error handling and fix C-string safety (Ceferino Patino)
* fix: SUM returns correct float for mixed numeric/non-numeric types & return value on empty set (Axel Tobieson Rova)
* silence clippy errors with features disabled (Glauber Costa)
* fix raw read frame WAL API (Nikita Sivukhin)
* Work around CREATE TABLE whitespace issue (Jussi Saurio)
* Fix issues in alter table tests and fix a small error in BTreeTable::to_sql (Jussi Saurio)
* Fix duplicate SET statement compatibility with SQLite (Ihor Andrianov)
* test/clickbench: fix clickbench (Jussi Saurio)
* fix/sim: actually enable indexes by default (Jussi Saurio)
* fix/btree/balance: interior cell insertion can leave page overfull (Jussi Saurio)
* Fix `error: Stable 1.88.0 is not available` in Nix flake (Levy A.)
* Fix column order for multi-row insertion (Nikita Sivukhin)
* doc: fix intra-repo links for contribution guide and license, and expand binding links (bit-aloo)
* fix opcodes missing a database register (Glauber Costa)
* sorter: fix sorter panic on SortedChunkIOState::WaitingForRead (Jussi Saurio)
* Fix parent page stack location after interior node replacement (Jussi Saurio)
* Fix rollback for TxErrors (Diego Reis)
* make most instrumentation levels to be Debug or Trace instead (Pedro Muniz)
* Property `FaultyQuery` should fail if we encounter an error that is not expected (Pedro Muniz)
* translate/create index: fix wrong collations (Jussi Saurio)
* bind/java: Fix Linux x86 build release (Diego Reis)
* fix/btree: fix insert_into_cell() logic (Jussi Saurio)
* cli: fix not being able to redirect traces to a file from inline query (Jussi Saurio)
* bind/javascript: Fix presentation mode disabling logic (Diego Reis)
* btree: fix post-balancing seek bug in delete path (Jussi Saurio)
* btree: fix trying to go upwards when we are already at the end of the entire btree (Jussi Saurio)
* btree: fix interior cell replacement in btrees with depth >=3 (Jussi Saurio)
* extensions/vtab: fix i32 being passed as i64 across FFI boundary (Jussi Saurio)
* Fix CSV import in the shell (Jussi Saurio)
* fix record header size calculations and incorrect assumptions (Jussi Saurio)
* bindings/js: fix more tests (Mikaël Francoeur)
## 0.1.2 -- 2025-07-15
### Added
* Add `fuzz` to CI checks (Levy A.)
* Add async header accessor functionality (Zaid Humayun)
* core/vector: Euclidean distance support for vector search (KarinaMilet)
* Fix: OP_NewRowId to generate semi random rowid when largest rowid is `i64::MAX` (Krishna Vishal)
* vdbe: fix some issues with min() and max() and add ignored fuzz test (Jussi Saurio)
* github: Update to newest Nyrkiö Github action (Henrik Ingo)
* Add Nyrkiö to partners section in README (Henrik Ingo)
* Support except operator for Compound select (meteorgan)
* btree: fix incorrect comparison implementation in key_exists_in_index() (Jussi Saurio)
* bindings/java: Implement required methods to run on JetBrains Datagrip (Kim Seon Woo)
* add interactive transaction to property insert-values-select (Pere Diaz Bou)
* add pere to antithesis (Pere Diaz Bou)
* cli: Add support for `.headers` command (Pekka Enberg)
* stress: add a way to run stress with indexes enabled (Jussi Saurio)
* sim: add feature flags (indexes,mvcc) to CLI args (Jussi Saurio)
* Add multi select test in JDBC4StatementTest (Kim Seon Woo)
* bindings/dart initial implementation (Andika Tanuwijaya)
* bindings/javascript: Implement Database.open (Lucas Forato)
* add `libsql_disable_wal_checkpoint` (Pedro Muniz)
* Add a threshold for large page cache values (Krishna Vishal)
* Rollback schema support (Pere Diaz Bou)
* add a README for the rust bindings (Glauber Costa)
* add a basic readme for the typescript binding (Glauber Costa)
* add a benchmark for connection time versus number of tables (Glauber Costa)
* Add opening new connection from a sqlite compatible URI, read-only connections (Preston Thorpe)
* Simplify `PseudoCursor` implementation (Levy A.)
* bind/js: add tests for expand (Mikaël Francoeur)
### Updated
* Gopher is biologically closer to beavers than hamsters (David Shekunts)
* build: Update cargo-dist to 0.28.6 (Pekka Enberg)
* cli: Fail import command if table does not exists (Pekka Enberg)
* Assert I/O read and write sizes (Pere Diaz Bou)
* do not check rowid alias for null (Nikita Sivukhin)
* CDC functions (Nikita Sivukhin)
* Ignore double quotes around table names (Zaid Humayun)
* Efficient Record Comparison and Incremental Record Parsing (Krishna Vishal)
* `parse_schema_rows` optimizations (Levy A.)
* Simulator - only output color on terminal (Mikaël Francoeur)
* Btree: more balance docs (Jussi Saurio)
* btree: Improve balance non root docs (Jussi Saurio)
* properly set last_checksum after recovering wal (Pere Diaz Bou)
* btree/chore: remove unnecessary parameters to .cell_get() (Jussi Saurio)
* core/btree: Make cell field names consistent (Jussi Saurio)
* Enforce TCL 8.6+ in compatibility tests (Mikaël Francoeur)
* Minor refactoring of btree (meteorgan)
* bindings/python: Start transaction implicitly in execute() (Pekka Enberg)
* sqlite3_ondisk: generalize left-child-pointer reading function to both index/table btrees (Jussi Saurio)
* sim: post summary to slack (Jussi Saurio)
* stress clippy (Jussi Saurio)
* Synchronize WAL checkpointing (Pere Diaz Bou)
* Reachable assertions in Antithesis Python Test for better logging (Pedro Muniz")
* bindings/python: close connection only when reference count is one (Pere Diaz Bou)
* parser: use YYSTACKDEPTH (Lâm Hoàng Phúc)
* CI: remove duplicate fuzz run (Jussi Saurio)
* Use binary search in find_cell() (Ihor Andrianov)
* Use `str_to_f64` on float conversion (Levy A.)
* parser: replace KEYWORDS with matching (Lâm Hoàng Phúc)
* Reachable assertions in Antithesis Python Test for better logging (Pedro Muniz)
* treat ImmutableRecord as Value::Blob (Nikita Sivukhin)
* remove experimental_flag from script + remove -q flag default flag from `TestTursoShell` (Pedro Muniz)
* Change data capture (Nikita Sivukhin)
* Import subset of SQLite TCL tests (Pekka Enberg)
* bindings/java: Merge JavaScript test suites (Mikaël Francoeur)
* Import JavaScript bindings test suite from libSQL (Mikaël Francoeur)
* bindings/java: Rename to Turso (Diego Reis)
* Antithesis schema rollback tests (Pekka Enberg)
* Disable adaptive colors when output_mode is list (meteorgan)
* core/storage: Switch to turso_assert in btree.rs (Pekka Enberg)
* core: Disable `ROLLBACK` statement (Pekka Enberg")
* Rust binding improvements (Pedro Muniz")
* `from_uri` was not passing mvcc and indexes flag to database creation for memory path (Pedro Muniz)
* Turso, not Limbo, in pyproject.toml (Simon Willison)
* Rename Limbo -> Turso in python tests (Preston Thorpe)
* clarify discord situation (Glauber Costa)
* automatically select terminal colors for pretty mode (Glauber Costa)
* remote query_mode from ProgramBuilderOpts and from function arguments (Nikita Sivukhin)
* limbo -> turso (Glauber Costa)
* Rust binding improvements (Pedro Muniz)
### Fixed
* test/fuzz: fix rowid_seek_fuzz not being a proper fuzz test (Jussi Saurio)
* b-tree: fix bug in case when no matching rows was found in seek in the leaf page (Nikita Sivukhin)
* Fix clippy errors for Rust 1.88.0 (Nils Koch)
* sim: return LimboError::Busy when busy, instead of looping forever (Jussi Saurio)
* btree/balance/validation: fix divider cell insert validation (Jussi Saurio)
* btree/balance/validation: fix use-after-free in rightmost ptr validation (Jussi Saurio)
* core/translate: Fix "misuse of aggregate function" error message (Pekka Enberg)
* core/translate: Return error if SELECT needs tables and there are none (Mikaël Francoeur)
* antithesis: Fix transaction management (Pekka Enberg)
* core: Fix resolve_function() error messages (Pekka Enberg)
* VDBE: fix op_insert re-entrancy (Jussi Saurio)
* VDBE: fix op_idx_insert re-entrancy (Jussi Saurio)
* bindings/javascript: Improve error handling compatibility with `better-sqlite3` (Mikaël Francoeur)
* uv run ruff format && uv run ruff check --fix (Jussi Saurio)
* vdbe: fix compilation (Pere Diaz Bou)
* core/translate: Fix aggregate star error handling in prepare_one_sele… (Pekka Enberg)
* Fix infinite loops, rollback problems, and other bugs found by I/O fault injection (Pedro Muniz)
* core/translate: Unify no such table error messages (Pekka Enberg)
* Fix `ScalarFunc::Glob` to handle NULL and other value types (Krishna Vishal)
* fix: buffer pool is not thread safe problem (KaguraMilet)
* Fix index update when INTEGER PRIMARY KEY (rowid alias) (Adrian-Ryan Acala)
* Fix Python test import naming (Pedro Muniz)
* Fix boxed memory leaks (Ihor Andrianov)
* bindings/javascript: Formatting and typos (Mikaël Francoeur)
## 0.1.1 -- 2025-06-30
### Fixed
* JavaScript packaging (Pekka Enberg)
### Updated
* simulator: FsyncNoWait + Faulty Query (Pedro Muniz)
## 0.1.0 -- 2025-06-30
### Added
* bindings/rust: Add feature flag to enable indexes (Pekka Enberg)
* core: Add Antithesis-aware `turso_assert` (Pekka Enberg)
* Fix database header contents on initialization (Pere Diaz Bou)
* Support insersect operator for compound select (meteorgan)
* Simulator: add latency to File IO (Pedro Muniz)
* write page1 on database initialization (Pere Diaz Bou)
* `Rollback` simple support (Pere Diaz Bou)
* core/db&pager: fix locking for initializing empty database (Jussi Saurio)
* sim: add Fault::ReopenDatabase (Jussi Saurio)
* Fix database header initialization (Diego Reis)
* Add Pedro to email recipients for antithesis (Pedro Muniz)
* bindings/rust: Implement Debug for Connection (Charlie)
* Fix: add uv sync to all packages for pytest github action (Pedro Muniz)
* Implement RowData opcode (meteorgan)
* Support indent for Goto opcode when executing explain (meteorgan)
### Updated
* core: Disable `ROLLBACK` statement (Pekka Enberg)
* WAL record db_size frame on commit last frame (Pere Diaz Bou)
* Eliminate core extension dependencies (Pekka Enberg)
* Move completion extension dependency to CLI (Pekka Enberg)
* Rename `limbo` crate to `turso` (Pekka Enberg)
* Rename `limbo_sqlite3_parser` crate to `turso_sqlite3_parser` (Pekka Enberg)
* Rename `limbo_ext` crate to `turso_ext` (Pekka Enberg)
* Rename `limbo_macros` to `turso_macros` (Pekka Enberg)
* stress: Log reopen and reconnect (Pekka Enberg)
* Rename `limbo_core` crate to `turso_core` (Pekka Enberg)
* github: Run simulator on pull requests (Pekka Enberg)
* bindings/rust: Named params (Andika Tanuwijaya)
* Rename Limbo to Turso in the README and other files (Glauber Costa)
* Remove dependency on test extension pkg (Preston Thorpe)
* Cache `reserved_space` and `page_size` values at Pager init to prevent doing redundant IO (Krishna Vishal)
* cli: Rename CLI to Turso (Pekka Enberg)
* bindings/javascript: Rename package to `@tursodatabase/turso` (Pekka Enberg)
* bindings/python: Rename package to `pyturso` (Pekka Enberg)
* Rename Limbo to Turso Database (Pekka Enberg)
* Bring back TPC-H benchmarks (Pekka Enberg)
* Switch to runtime flag for enabling indexes (Pekka Enberg)
* stress: reopen db / reconnect to db every now and then (Jussi Saurio)
* Bring back some merge conflicts code (Pedro Muniz)
* simulator: integrity check per query (Pedro Muniz)
* stress: Improve progress reporting (Pekka Enberg)
* Improve extension compatibility testing (Piotr Rżysko)
* Ephemeral Table in Update (Pedro Muniz)
* Use UV more in python related scripts and actions (Pedro Muniz)
* Copy instrumented image and symbols in Dockerfile.antithesis (eric-dinh-antithesis)
* ` op_transaction` `end_read_tx` in case of `begin_write_tx` is busy (Pere Diaz Bou)
* antithesis-tests: Make test drivers robust when database is locked (Pekka Enberg)
### Fixed
* tests/integration: Fix write path test on Windows (Pekka Enberg)
* Fix deleting previous rowid when rowid is in the Set Clause (Pedro Muniz)
* Fix executing multiple statements (Pere Diaz Bou)
* Fix evaluation of ISNULL/NOTNULL in OR expressions (Piotr Rżysko)
* bindings/javascript: Fix StepResult:IO handling (Pekka Enberg)
* fix: use uv run instead of uvx for Pytest (Pedro Muniz)
* sim: when loading bug, dont panic if there are no runs (Jussi Saurio)
* sim: fix singlequote escaping and unescaping (Jussi Saurio)
* Fix btree balance and seek after overwritten cell overflows (Jussi Saurio)
* chore: fix clippy warnings (Nils Koch)
* Fix CI errors (Piotr Rżysko)
* Fix infinite aggregation loop when sorting is not required (Piotr Rżysko)
* Fix DELETE not emitting constant `WhereTerms` (Pedro Muniz)
* Fix handling of non-aggregate expressions (Piotr Rżysko)
* Fix fuzz issue #1763 by using the `log2` & `log10` functions where applicable (Luca Muscat)
## 0.0.22 -- 2025-06-19
### Added
* Implement pragma wal_checkpoint(<MODE>) (Pedro Muniz)
* Add abbreviated alias for `.quit` and `.exit` (Krishna Vishal)
* Add manual WAL sync before checkpoint in con.close, fix async bug in checkpoint (Preston Thorpe)
* Complete ALTER TABLE implementation (Levy A.)
* Add affinity-based type coercion for seek and comparison operation (Krishna Vishal)
* bindings/javascript: Add pragma() support (Anton Harniakou)
* Add sleep between write tests to avoid database locking issues (Pedro Muniz)
* bindings/java: Implement JDBC4DatabaseMetadata getTables (Kim Seon Woo)
* bindings/javascript: Add source property to Statement (Anton Harniakou)
* Support `sqlite_master` schema table name alias (Anton Harniakou)
* js-bindings/implement .name property (Anton Harniakou)
* bindings/java: Add support for Linux build (Diego Reis)
* bindings/javascript: Add database property to Statement (Anton Harniakou)
* simulator: add CREATE INDEX to interactions (Jussi Saurio)
* Add support for pragma table-valued functions (Piotr Rżysko)
* bindings/javascript: Add proper exec() method and raw() mode (Diego Reis)
* Add simulator-docker-runner for running limbo-sim in a loop on AWS (Jussi Saurio)
* simulator: add option to disable BugBase (Jussi Saurio)
* simulator: switch to tracing, run io.run_once and add update queries (Pere Diaz Bou)
* Fix: aggregate regs must be initialized as NULL at the start (Jussi Saurio)
* add stress test with 1 thread 10k iterations to ci (Pere Diaz Bou)
### Updated
* antithesis: Build Python package from sources (Pekka Enberg)
* overwrite sqlite3 in install_sqlite (Pere Diaz Bou)
* stress: Run integrity check for every iteration (Pekka Enberg)
* core: Clean up `integrity_check()` (Pekka Enberg)
* Simple integrity check on btree (Pere Diaz Bou)
* Make SQLite bindings thread-safe (Pekka Enberg)
* Switch Connection to use Arc instead of Rc (Pekka Enberg)
* Drop unused code in op_column (meteorgan)
* NOT NULL constraint (Anton Harniakou)
* Simulator Ast Generation + Simulator Unary Operator + Refactor to use `limbo_core::Value` in Simulator for massive code reuse (Pedro Muniz)
* Refactor compound select (meteorgan)
* Disable index usage in DELETE because it does not work safely (Jussi Saurio)
* Simulator: Better Shrinking (Pedro Muniz)
* Simulator integrity_check (Pedro Muniz)
* Remove leftover info trace (Jussi Saurio)
* Namespace functions that operate on `Value` (Pedro Muniz)
* Remove plan.to_sql_string() from optimize_plan() as it panics on TODOs (Jussi Saurio)
* Minor: use use_eq_ignore_ascii_case in some places (Anton Harniakou)
* Remove the FromValue trait (Anton Harniakou)
* bindings/javascript: Refactor presentation mode and enhance test suite (Diego Reis)
* Beginnings of AUTOVACUUM (Zaid Humayun)
* Reverse Parse Limbo `ast` and Plans (Pedro Muniz)
* simulator: log the interaction about to be executed with INFO (Jussi Saurio)
* stress: Use temporary file unless one explicitly specified (Jussi Saurio)
* Write database header via normal pager route (meteorgan)
* simulator: options to disable certain query types (Pedro Muniz)
* Make cursor seek reentrant (Pedro Muniz)
* Pass input string to `translate` function (Pedro Muniz)
* Small tracing enhancement (Pedro Muniz)
* Adjust write cursors for delete to avoid opening more than once. (Pedro Muniz)
* Convert u64 rowid to i64 (Pere Diaz Bou)
* Use tempfile in constraint test (Jussi Saurio)
* Remove frame id from key (Pere Diaz Bou)
* clear page cache on transaction failure (Pere Diaz Bou)
### Fixed
* Fix incorrect lossy conversion of `Value::Blob` to a utf-8 `String` (Luca Muscat)
* Fix update queries to set `n_changes` (Kim Seon Woo)
* bindings/rust: Fix Rows::next() I/O dispatcher handling (Pekka Enberg)
* cli: fix panic of queries with less than 7 chars (Nils Koch)
* Return parse error instead of corrupt error for `no such table` (Pedro Muniz)
* simulator: disable all ansi encodings for debug print log file (Pedro Muniz)
* Fix large inserts to unique indexes hanging (Jussi Saurio)
* betters instrumentation for btree related operations + cleaner debug for `RefValue` (Pedro Muniz)
* sim/aws: fix vibecoding errors in logic (Jussi Saurio)
* Fix incorrect handling of OR clauses in HAVING (Jussi Saurio)
* fix: Incorrect placeholder label in where clause translation (Pedro Muniz)
* Fix rowid to_sql_string (Pedro Muniz)
* Fix incorrect usage of indexes with non-contiguous columns (Jussi Saurio)
* BTree traversal refactor and bugfixes (Pere Diaz Bou)
* `LimboRwLock` write and read lock fixes (Pere Diaz Bou)
* fix: make keyword_token safe by validating UTF-8 input (ankit)
* Fix UPDATE straight up not working on non-unique indexes (Jussi Saurio)
* Fix: ensure `PRAGMA cache_size` changes persist only for current session (meteorgan)
* sim/aws: fix sim timeout handling (Jussi Saurio)
* Fix WAL frame checksum mismatch (Diego Reis)
* Set maximum open simulator-created issues (Jussi Saurio)
* Fix cursors not being opened for indexes in DELETE (Jussi Saurio)
* Fix: allow DeferredSeek on more than one cursor per program (Jussi Saurio)
* Fix stress test to ignore unique constraint violation (krishna sindhur)
* Fix ProgramBuilder::cursor_ref not having unique keys (Jussi Saurio)
* Fix `serialize()` unreachable panic (Krishna Vishal)
* Btree: fix cursor record state not being updated in insert_into_page() (Jussi Saurio)
## 0.0.21 - 2025-05-28
### Added
* Add Schema reference to Resolver - needed for adhoc subquery planning (Jussi Saurio)
* Use the SetCookie opcode to implement user_version pragma (meteorgan)
* Add libsql_wal_get_frame() API (Pekka Enberg)
* Fix bug: op_vopen should replace cursor slot, not add new one (Jussi Saurio)
* bind/js: Add support for bind() method and reduce boilerplate (Diego Reis)
* Add PThorpe92 to codeowners file for extensions + go bindings (Preston Thorpe)
* Refactor: add stable internal_id property to TableReference (Jussi Saurio)
* refactor: introduce walk_expr() and walk_expr_mut() to reduce repetitive pattern matching (Jussi Saurio)
* Add some comments for values statement (meteorgan)
* fix bindings/wasm wal file creation by implementing `generate_random_number` (오웬)
* core/pragma: Add support for update user_version (Diego Reis)
* Support values statement and values in select (meteorgan)
* Initial Support for Nested Translation (Pedro Muniz)
* bindings/rust: Add pragma methods (Diego Reis)
* Add collation column to Index struct (Jussi Saurio)
* Add support for DISTINCT aggregate functions (Jussi Saurio)
* bindings/javascript: Add Statement.iterate() method (Diego Reis)
* (btree): Implement support for handling offset-based payload access with overflow support (Krishna Vishal)
* Add labeler workflow and reorganize macros (Preston Thorpe)
* Update Nyrkiö change detection to newest version (Henrik Ingo)
* perf/ci: add basic tpc-h benchmark (Jussi Saurio)
* Add `libsql_wal_frame_count()` API (Pekka Enberg)
* Restructure optimizer to support join reordering (Jussi Saurio)
* Add `rustfmt` to rust-toolchain.toml (Pekka Enberg)
### Updated
* Make WhereTerm::consumed a Cell<bool> (Jussi Saurio)
* Use lifetimes in walk_expr() to guarantee that child expr has same lifetime as parent expr (Jussi Saurio)
* Small VDBE insn tweaks (Jussi Saurio)
* Reset idx delete state after successful finish (Pere Diaz Bou)
* feature: `INSERT INTO <table> SELECT` (Pedro Muniz)
* Small cleanups to pager/wal/vdbe - mostly naming (Jussi Saurio)
* bindings/javascript: API enhancements (Diego Reis)
* github: Migrate workflows to Blacksmith runners (blacksmith-sh[bot])
* UNION (Jussi Saurio)
* xConnect for virtual tables to query core db connection (Preston Thorpe)
* Reconstruct WAL frame cache when WAL is opened (Jussi Saurio)
* set non-shared cache by default (Pere Diaz Bou)
* TPC-H with criterion and nyrkio (Pedro Muniz)
* UNION ALL (Jussi Saurio)
* Drop Table OpCodes Use Ephemeral Table As Scratch Table (Zaid Humayun)
* sqlite3-parser: Remove scanner trace-logging (Pekka Enberg)
* sqlite3: Switch to tracing logger (Pekka Enberg)
* CSV virtual table extension (Piotr Rżysko)
* remove detection of comments in the middle of query in cli (Pedro Muniz)
* btree: Remove assumption that all btrees have a rowid (Jussi Saurio)
* Output rust backtrace in python tests (Preston Thorpe)
* Optimization: lift common subexpressions from OR terms (Jussi Saurio)
* refactor: replace Operation::Subquery with Table::FromClauseSubquery (Jussi Saurio)
* Feature: Collate (Pedro Muniz)
* Update README.md (Yusheng Guo)
* Mark WHERE terms as consumed instead of deleting them (Jussi Saurio)
* Cli config 2 (Pedro Muniz)
* pager: bump default page cache size from 10 to 2000 pages (Jussi Saurio)
* long fuzz tests ci on btree changes (Pere Diaz Bou)
* Document how to run `cargo test` on Ubuntu (Zaid Humayun)
* test page_free_array (Pere Diaz Bou)
* Rename OwnedValue -> Value (Pekka Enberg)
* Improve SQLite3 C API tests (Pekka Enberg)
* github: Disable setup-node yarn cache (Pekka Enberg)
* Update Unique constraint for Primary Keys and Indexes (Pedro Muniz)
### Fixed
* Fix LIMIT handling (Jussi Saurio)
* Fix off-by-one error in max_frame after WAL load (Jussi Saurio)
* btree: fix infinite looping in backwards iteration of btree table (Jussi Saurio)
* Fix labeler labeling everything as Extensions-Other (Jussi Saurio)
* Fix bug in op_decr_jump_zero() (Jussi Saurio)
* Page cache fixes (Pere Diaz Bou)
* cli/fix: Apply default config for app (Diego Reis)
* Fix labeler (Jussi Saurio)
* Improve debug build validation speed (Pere Diaz Bou)
* optimizer: fix order by removal logic (Jussi Saurio)
* Fix updating single value (Pedro Muniz)
* Autoindex fix (Pedro Muniz)
* use temporary db in sqlite3 wal tests to fix later tests failing (Preston Thorpe)
* fix labeler correct file name extension use .yml instead of .yaml (Mohamed A. Salah)
* Fix autoindex of primary key marked as unique (Pere Diaz Bou)
* Fix: unique contraint in auto index creation (Pedro Muniz)
## 0.0.20 - 2025-05-14
### Added
* Support isnull and notnull expr (meteorgan)
* Add drop index (Anton Harniakou)
* bindings/wasm: add types property for typescript setting (오병진)
* Implement transaction support in Go adapter (Jonathan Ness)
* Initial implementation of `ALTER TABLE RENAME` (Levy A.)
* Add time.Time and bool data types support in Go adapter (Jonathan Ness)
* Add tests for INSERT with specified column-name list (Anton Harniakou)
* GROUP BY: refactor logic to support cases where no sorting is needed (Jussi Saurio)
* Add embedded library support to Go adapter (Jonathan Ness)
* Add time.Time support to Go driver parameter binding (Jonathan Ness)
* Show explanation for the NewRowid opcode (Anton Harniakou)
* Add notion of join ordering to plan (Jussi Saurio)
* Add static feature to Cargo.toml to support extensions written inside core (Pedro Muniz)
* implement Clone for Arc<Mutex> types (Pete Hayman)
* Add PRAGMA schema_version (Anton Harniakou)
* Support literal-value current_time, current_date and current_timestamp (meteorgan)
* Add state machine for op_idx_delete + DeleteState simplification (Pere Diaz Bou)
* Add the .indexes command (Anton Harniakou)
* Optimization: only initialize `Rustyline` if we are in a tty (Pedro Muniz)
* Add Antithesis Tests (eric-dinh-antithesis)
* core/types: remove duplicate serialtype implementation (Jussi Saurio)
* bindings/rust: Add Statement.columns() support (Timo Kösters)
* docs: add Rust to "Getting Started" section (Timo Kösters)
* Support xBestIndex in vtab API (Preston Thorpe)
* Feat: add support for descending indexes (Jussi Saurio)
### Updated
* github: Ensure rustmft is installed (Pekka Enberg)
* btree: Coalesce free blocks in `page_free_array()` (Mohamed Hossam)
* Count optimization (Pedro Muniz)
* bindings/java: Remove disabled annotation for UPDATE and DELETE (Kim Seon Woo)
* Refactor numeric literal (meteorgan)
* EXPLAIN should show a comment for the Insert opcode (Anton Harniakou)
* bindings/javascript: Improve compatibility with better-sqlite (Diego Reis)
* bindings/go: Upgrade ebitengine/purego to allow for use with go 1.23.9 (Preston Thorpe)
* Adjust vtab schema creation to display the underlying columns (Preston Thorpe)
* Read only mode (Pedro Muniz)
* Test that DROP TABLE also deletes the related indices (Anton Harniakou)
* reset statement before executing in rust binding (Pedro Muniz)
* Bump assorted dependencies (Preston Thorpe)
* Eliminate a superfluous read transaction when doing PRAGMA user_version (Anton Harniakou)
* update index on updated indexed columns (Pere Diaz Bou)
* Save history on exit (Piotr Rżysko)
* btree/tablebtree_move_to: micro-optimizations (Jussi Saurio)
* refactor database open_file and open (meteorgan)
* Give name to hard-coded page_size values (Anton Harniakou)
* Performance: hoist entire expressions out of hot loops if they are constant (Jussi Saurio)
* Feature: Composite Primary key constraint (Pedro Muniz)
* types: refactor serialtype again to make it faster (Jussi Saurio)
* replace vec with array in btree balancing (Lâm Hoàng Phúc)
* Pragma page size reading (Anton Harniakou)
* perf/btree: use binary search for Index seek operations (Jussi Saurio)
* expr.is_nonnull(): return true if col.primary_key || col.notnull (Jussi Saurio)
* Numeric Types Overhaul (Levy A.)
* Python script to compare vfs performance (Preston Thorpe)
* Create an automatic ephemeral index when a nested table scan would otherwise be selected (Jussi Saurio)
* Bump julian_day_converter to 0.4.5 (meteorgan)
* btree: avoid reading entire cell when only rowid needed (Jussi Saurio)
* btree: use binary search in seek/move_to for table btrees (Jussi Saurio)
* Feat: Covering indexes (Jussi Saurio)
* allow index entry delete (Pere Diaz Bou)
### Fixed
* testing/py: rename debug_print() to run_debug() (Jussi Saurio)
* Fix handling of empty strings in prepared statements (Diego Reis)
* CREATE VIRTUAL TABLE fixes (Piotr Rżysko)
* Bindings/Go: Fix symbols for FFI calls (Preston Thorpe)
* Fix bound parameters on insert statements with out of order column indexes (Preston Thorpe)
* Fix memory leak caused by unclosed virtual table cursors (Piotr Rżysko)
* Fix panic on async io due to reading locked page (Preston Thorpe)
* Fix bug: we cant remove order by terms from the head of the list (Jussi Saurio)
* Fix setting default value for primary key on UPDATE (Pere Diaz Bou)
* Fix: allow page_size=65536 (meteorgan)
* Fix `page_count` pragma (meteorgan)
* Fix broken fuzz target due to old name (Levy A.)
* Emit `IdxDelete` instruction and some fixes on seek after deletion (Pere Diaz Bou)
* Bugfix: Explain command should display syntax errors in CLI (Anton Harniakou)
* Fix incorrect between expression documentation (Pedro Muniz)
* Fix bug: left join null flag not being cleared (Jussi Saurio)
* Fix out of bounds access on `parse_numeric_str` (Levy A.)
* Fix post balance validation (Pere Diaz Bou)
## 0.0.19 - 2025-04-16
### Added
* Add `BeginSubrtn`, `NotFound` and `Affinity` bytecodes (Diego Reis)
* Add Ansi Colors to tcl test runner (Pedro Muniz)
* support modifiers for julianday() (meteorgan)
* Implement Once and OpenAutoindex opcodes (Jussi Saurio)
* Add support for OpenEphemeral bytecode (Diego Reis)
* simulator: Add Bug Database(BugBase) (Alperen Keleş)
* feat: Add timediff data and time function (Sachin Kumar Singh)
* core/btree: Add PageContent::new() helper (Pekka Enberg)
* Add support to load log file with stress test (Pere Diaz Bou)
* Support UPDATE for virtual tables (Preston Thorpe)
* Add `.timer` command to print SQL execution statistics (Pere Diaz Bou)
* Strict table support (Ihor Andrianov)
* Support backwards index scan and seeks + utilize indexes in removing ORDER BY (Jussi Saurio)
* Add deterministic Clock (Avinash Sajjanshetty)
* Support offset clause in Update queries (Preston Thorpe)
* Support Create Index (Preston Thorpe)
* Support insert default values syntax (Preston Thorpe)
* Add support for default values in INSERT statements (Diego Reis)
### Updated
* Test: write tests for file backed db (Pedro Muniz)
* btree: move some blocks of code to more reasonable places (Jussi Saurio)
* Parse hex integers 2 (Anton Harniakou)
* More index utils (Jussi Saurio)
* Index utils (Jussi Saurio)
* Feature: VDestroy for Dropping Virtual Tables (Pedro Muniz)
* Feat balance shallower (Lâm Hoàng Phúc)
* Parse hexidecimal integers (Anton Harniakou)
* Code clean-ups (Diego Reis)
* Return null when parameter is unbound (Levy A.)
* Enhance robusteness of optimization for Binary expressions (Diego Reis)
* Check that index seek key members are not null (Jussi Saurio)
* Better diagnostics (Pedro Muniz)
* simulator: provide high level commands on top of a single runner (Alperen Keleş)
* build(deps-dev): bump vite from 6.0.7 to 6.2.6 in /bindings/wasm/test-limbo-pkg (dependabot[bot])
* btree: remove IterationState (Jussi Saurio)
* build(deps): bump pyo3 from 0.24.0 to 0.24.1 (dependabot[bot])
* Multi column indexes + index seek refactor (Jussi Saurio)
* Emit ANSI codes only when tracing is outputting to terminal (Preston Thorpe)
* B-Tree code cleanups (Pekka Enberg)
* btree index selection on rightmost pointer in `balance_non_root` (Pere Diaz Bou)
* io/linux: make syscallio the default (io_uring is really slow) (Jussi Saurio)
* Stress improvements (Pekka Enberg)
* VDBE code cleanups (Pekka Enberg)
* Memory tests to track large blob insertions (Pedro Muniz)
* Setup tracing to allow output during test runs (Preston Thorpe)
* allow insertion of multiple overflow cells (Pere Diaz Bou)
* Properly handle insertion of indexed columns (Preston Thorpe)
* VTabs: Proper handling of re-opened db files without the relevant extensions loaded (Preston Thorpe)
* Account divider cell in size while distributing cells (Pere Diaz Bou)
* Format infinite float as "Inf"/"-Inf" (jachewz)
* update sqlite download version to 2025 + remove www. (Pere Diaz Bou)
* Improve validation of btree balancing (Pere Diaz Bou)
* Aggregation without group by produces incorrect results for scalars (Ihor Andrianov)
* Dot command completion (Pedro Muniz)
* Allow reading altered tables by defaulting to null in Column insn (Preston Thorpe)
* docs(readme): update discord link (Jamie Barton)
* More VDBE cleanups (Pekka Enberg)
* Request load page on `insert_into_page` (Pere Diaz Bou)
* core/vdbe: Rename execute_insn_* to op_* (Pekka Enberg)
* Remove RWLock from Shared wal state (Pere Diaz Bou)
* VDBE with indirect function dispatch (Pere Diaz Bou)
### Fixed
* Fix truncation of error output in tests (Pedro Muniz)
* Fix Unary Negate Operation on Blobs (Pedro Muniz)
* Fix incompatibility `AND` Operation (Pedro Muniz)
* Fix: comment out incorrect assert in fuzz (Pedro Muniz)
* Fix two issues with indexes (Jussi Saurio)
* Fuzz fix some operations (Pedro Muniz)
* simulator: updates to bug base, refactors (Alperen Keleş)
* Fix overwrite cell with size less than cell size (Pere Diaz Bou)
* Fix `EXPLAIN` to be case insensitive (Pedro Muniz)
* core: Fix syscall VFS on Linux (Pekka Enberg)
* Index insert fixes (Pere Diaz Bou)
* Decrease page count on balancing fixes (Pere Diaz Bou)
* Remainder fixes (jachewz)
* Fix virtual table translation issues (Preston Thorpe)
* Fix overflow position in write_page() (Lâm Hoàng Phúc)
## 0.0.18 - 2025-04-02
### Added
* Jsonb support update (Ihor Andrianov)
* Add BTree balancing after `delete` (Krishna Vishal)
* Introduce Register struct (Pere Diaz Bou)
* Introduce immutable record (Pere Diaz Bou)
* Introduce libFuzzer (Levy A.)
* WAL frame checksum support (Daniel Boll)
* Initial JavaScript bindings with napi-rs (Pekka Enberg)
* Initial pass at `UPDATE` support (Preston Thorpe)
* Add `commit()` and placeholding insert to Python binding (Diego Reis)
### Updated
* Create plan for Update queries (Preston Thorpe)
* Validate cells inside a page after each operation (Pere Diaz Bou)
* Refactor Cli Repl Commands to use clap (Pedro Muniz)
* Allow balance_root to balance with interior pages (Pere Diaz Bou)
* Let remainder (%) accept textual arguments (Anton Harniakou)
* JSON code cleanups (Pekka Enberg)
* Allocation improvements with ImmutableRecord, OwnedRecord and read_record (Pere Diaz Bou)
* JavaScript binding improvements (Pekka Enberg)
* Kill test environment (Pekka Enberg)
* Remove public unlock method from `SpinLock` to prevent unsafe aliasing (Krishna Vishal)
* Handle limit zero case in query plan emitter (Preston Thorpe)
* Reduce MVCC cursor memory consumption (Ihor Andrianov)
* Unary `+` is a noop (Levy A.)
* JSON cache (Ihor Andrianov)
* Bump `rusqlite` to 0.34 (Pere Diaz Bou)
* core: Rename FileStorage to DatabaseFile (Pekka Enberg)
* Improve Python bindings (Diego Reis)
* Schema translation cleanups (Pekka Enberg)
* Various JSON improvements (Ihor Andrianov)
* Enable pretty mode in shell by default (Pekka Enberg)
* Improve CLI color scheme (Pekka Enberg)
* Impl Copy on some types in the pager to prevent explicit clones (Preston Thorpe)
* Syntax highlighting and hinting (Pedro Muniz)
* chore: gitignore files with an extension *.db (Anton Harniakou)
* Organize extension library and feature gate VFS (Preston Thorpe)
* fragment bench functions (Pere Diaz Bou)
### Fixed
* Remove unnecessary balance code that crashes (Pere Diaz Bou)
* Fix propagation of divider cell balancing interior page (Pere Diaz Bou)
* Fuzz test btree fix seeking. (Pere Diaz Bou)
* Fix IdxCmp insn comparisons (Jussi Saurio)
* Fixes probably all floating point math issues and floating point display issues. (Ihor Andrianov)
* Make BTreeCell/read_payload not allocate any data + overflow fixes (Pere Diaz Bou)
* Fix `compute_shl` negate with overflow (Krishna Vishal)
* Fix a typo in README.md (Tshepang Mbambo)
* Fix platform specific FFI C pointer type casts (Preston Thorpe)
* core: Fix Destroy opcode root page handling (Pekka Enberg)
* Fix `SELECT 0.0 = 0` returning false (lgualtieri75)
* bindings/python: Fix flaky tests (Diego Reis)
* Fix io_uring WAL write corruption by ensuring buffer lifetime (Daniel Boll)
## 0.0.17 - 2025-03-19
### Added
* `BEGIN DEFERRED` support (Diego Reis)
* Experimental MVCC integration (Pekka Enberg)
* `DROP TABLE` support (Zaid Humayun)
* Initial pass on Virtual FileSystem extension module (Preston Thorpe)
* JSONB support (Ihor Andrianov)
* Shell command completion (Pedro Muniz)
### Updated
### Fixed
* Fixes and improvements to Rust bindings (yirt grek and 南宫茜)
* Transaction management fixes (Pere Diaz Bou and Diego Reis)
* JSON function fixes (Ihor Andrianov)
## 0.0.16 - 2025-03-05
### Added
* Virtual table support (Preston Thorpe)
* Improvements to Java bindings (Kim Seon Woo)
* Improvements to Rust bindings (Pekka Enberg)
* Add sqlean ipaddr extension (EmNudge)
* Add "dump" and "load" to the help menu (EmNudge)
* Initial Antithesis testing tool (Pekka Enberg)
### Fixed
* SQLite B-Tree balancing algorithm (Pere Diaz Bou)
* B-Tree improves and fixes (Pere Diaz Bou and Perston Thorpe)
* Display blobs as blob literals in `.dump` (from Mohamed Hossam)
* Fix wrong count() result if the column specified contains a NULL (lgualtieri75)
* Fix casting text to integer to match SQLite' (Preston Thorpe)
* Improve `SELECT 1` performance to be on par with SQLite (Pekka Enberg)
* Fix offset_sec normalization in extensions/time (meteorgan)
* Handle parsing URI according to SQLite specification (Preston Thorpe)
* Escape character is ignored in LIKE function (lgualtieri75)
* Fix cast_text_to_number compatibility (Pedro Muniz)
* Modify the LIKE function to work with all types (Mohamed Hossam)
## 0.0.15 - 2025-02-18
### Added
**Core:**
* Initial pass on virtual tables (Preston Thorpe)
* Import MVCC code to the source tree -- not enabled (Pekka Enberg, Piotr Sarna, Avinash Sajjanshetty)
* Implement `json_set` (Marcus Nilsson)
* Initial support for WITH clauses (common table expressions) (Jussi Saurio)
* `BEGIN IMMEDIATE` + `COMMIT` support (Pekka Enberg)
* `BEGIN EXCLUSIVE` support (Pekka Enberg)
* Add Printf Support (Zaid Humayun)
* Add support for `delete` row (Krishna Vishal)
* Implement json_quote (Pedro Muniz)
* Add read implementation of user_version pragma with ReadCookie opcode (Jonathan Webb)
* Json path refine (Ihor Andrianov)
* cli: Basic dump support (Glauber Costa)
* Support numeric column references in GROUP BY (Jussi Saurio)
* Implement the legacy_file_format pragma (Glauber Costa)
* Added IdxLE and IdxLT opcodes (Omolola Olamide)
**Java bindings:*
* Improve JDBC support with, for example, prepared statements (Kim Seon Woo)
* Rename package name `tech.turso` (Kim Seon Woo)
**Extensions:**
* Sqlean Crypto extension (Diego Reis)
* Sqlean Time extension (Pedro Muniz)
* Add support for `regexp_replace()` (lgualtieri75)
**Simulator:**
* Add NoREC testing property (Alperen Keleş)
* Add `--differential` mode against SQLite (Alperen Keleş)
### Fixed
**Core:**
* Fix 24/48 bit width serial types parsing (Nikita Sivukhin)
* Fix substr (Nikita Sivukhin)
* Fix math binary (Nikita Sivukhin)
* Fix and predicate (Nikita Sivukhin)
* Fix IdxGt, IdxGe, IdxLt, and IdxLe instructions (Jussi Saurio)
* Fix not evaling constant conditions when no tables in query (Jussi Saurio)
* Fix remainder panic on zero right-hand-side (Jussi Saurio)
* Fix invalid text columns generated by dump (Kingsley Yung)
* Fix incorrect CAST text->numeric if valid prefix is 1 char long (Jussi Saurio)
* Improve SQL statement prepare performance (Jussi Saurio)
* Fix VCC write conflict handling (Jussi Saurio)
* Fix various bugs in B-Tree handling (Nikita Sivukhin)
* Fix case and emit (Nikita Sivukhin)
* Fix coalesce (Nikita Sivukhin)
* Fix cast (Nikita Sivukhin)
* Fix string funcs (Nikita Sivukhin)
* Fix floating point truncation in JSON #877 (lgualtieri75)
* Fix bug with `SELECT` referring to a mixed-case alias (Jussi Saurio)
## 0.0.14 - 2025-02-04
### Added
**Core:**
* Improve changes() and total_changes() functions and add tests (Ben Li)
* Add support for `json_object` function (Jorge Hermo)
* Implemented json_valid function (Harin)
* Implement Not (Vrishabh)
* Initial support for wal_checkpoint pragma (Sonny)
* Implement Or and And bytecodes (Diego Reis)
* Implement strftime function (Pedro Muniz)
* implement sqlite_source_id function (Glauber Costa)
* json_patch() function implementation (Ihor Andrianov)
* json_remove() function implementation (Ihor Andrianov)
* Implement isnull / not null for filter expressions (Glauber Costa)
* Add support for offset in select queries (Ben Li)
* Support returning column names from prepared statement (Preston Thorpe)
* Implement Concat opcode (Harin)
* Table info (Glauber Costa)
* Pragma list (Glauber Costa)
* Implement Noop bytecode (Pedro Muniz)
* implement is and is not where constraints (Glauber Costa)
* Pagecount (Glauber Costa)
* Support column aliases in GROUP BY, ORDER BY and HAVING (Jussi Saurio)
* Implement json_pretty (Pedro Muniz)
**Extensions:**
* Initial pass on vector extension (Pekka Enberg)
* Enable static linking for 'built-in' extensions (Preston Thorpe)
**Go Bindings:**
* Initial support for Go database/sql driver (Preston Thorpe)
* Avoid potentially expensive operations on prepare' (Glauber Costa)
**Java Bindings:**
* Implement JDBC `ResultSet` (Kim Seon Woo)
* Implement LimboConnection `close()` (Kim Seon Woo)
* Implement close() for `LimboStatement` and `LimboResultSet` (Kim Seon Woo)
* Implement methods in `JDBC4ResultSet` (Kim Seon Woo)
* Load native library from Jar (Kim Seon Woo)
* Change logger dependency (Kim Seon Woo)
* Log driver loading error (Pekka Enberg)
**Simulator:**
* Implement `--load` and `--watch` flags (Alperen Keleş)
**Build system and CI:**
* Add Nyrkiö change point detection to 'cargo bench' workflow (Henrik Ingo)
### Fixed
* Fix `select X'1';` causes limbo to go in infinite loop (Krishna Vishal)
* Fix rowid search codegen (Nikita Sivukhin)
* Fix logical codegen (Nikita Sivukhin)
* Fix parser panic when duplicate column names are given to `CREATE TABLE` (Krishna Vishal)
* Fix panic when double quoted strings are used for column names. (Krishna Vishal)
* Fix `SELECT -9223372036854775808` result differs from SQLite (Krishna Vishal)
* Fix `SELECT ABS(-9223372036854775808)` causes limbo to panic. (Krishna Vishal)
* Fix memory leaks, make extension types more efficient (Preston Thorpe)
* Fix table with single column PRIMARY KEY to not create extra btree (Krishna Vishal)
* Fix null cmp codegen (Nikita Sivukhin)
* Fix null expr codegen (Nikita Sivukhin)
* Fix rowid generation (Nikita Sivukhin)
* Fix shr instruction (Nikita Sivukhin)
* Fix strftime function compatibility problems (Pedro Muniz)
* Dont fsync the WAL on read queries (Jussi Saurio)
## 0.0.13 - 2025-01-19
### Added
* Initial support for native Limbo extensions (Preston Thorpe)
* npm packaging for node and web (Elijah Morgan)
* Add support for `rowid` keyword' (Kould)
* Add support for shift left, shift right, is and is not operators (Vrishabh)
* Add regexp extension (Vrishabh)
* Add counterexample minimization to simulator (Alperen Keleş)
* Initial support for binding values to prepared statements (Levy A.)
### Updated
* Java binding improvements (Kim Seon Woo)
* Reduce `liblimbo_sqlite3.a` size' (Pekka Enberg)
### Fixed
* Fix panics on invalid aggregate function arguments (Krishna Vishal)
* Fix null compare operations not giving null (Vrishabh)
* Run all statements from SQL argument in CLI (Vrishabh)
* Fix MustBeInt opcode semantics (Vrishabh)
* Fix recursive binary operation logic (Jussi Saurio)
* Fix SQL comment parsing in Limbo shell (Diego Reis and Clyde)
## 0.0.12 - 2025-01-14
### Added
**Core:**
* Improve JSON function support (Kacper Madej, Peter Sooley)
* Support nested parenthesized conditional expressions (Preston Thorpe)
* Add support for changes() and total_changes() functions (Lemon-Peppermint)
* Auto-create index in CREATE TABLE when necessary (Jussi Saurio)
* Add partial support for datetime() function (Preston Thorpe)
* SQL parser performance improvements (Jussi Saurio)
**Shell:**
* Show pretty parse errors in the shell (Samyak Sarnayak)
* Add CSV import support to shell (Vrishabh)
* Selectable IO backend with --io={syscall,io-uring} argument (Jorge López Tello)
**Bindings:**
* Initial version of Java bindings (Kim Seon Woo)
* Initial version of Rust bindings (Pekka Enberg)
* Add OPFS support to Wasm bindings (Elijah Morgan)
* Support uncorrelated FROM clause subqueries (Jussi Saurio)
* In-memory support to `sqlite3_open()` (Pekka Enberg)
### Fixed
* Make iterate() lazy in JavaScript bindings (Diego Reis)
* Fix integer overflow output to be same as sqlite3 (Vrishabh)
* Fix 8-bit serial type to encoding (Preston Thorpe)
* Query plan optimizer bug fixes (Jussi Saurio)
* B-Tree balancing fixes (Pere Diaz Bou)
* Fix index seek wrong on `SeekOp::LT`\`SeekOp::GT` (Kould)
* Fix arithmetic operations for text values' from Vrishabh
* Fix quote escape in SQL literals (Vrishabh)
## 0.0.11 - 2024-12-31
### Added
* Add in-memory mode to Python bindings (Jean Arhancet)
* Add json_array_length function (Peter Sooley)
* Add support for the UUID extension (Preston Thorpe)
### Changed
* Enable sqpoll by default in io_uring (Preston Thorpe)
* Simulator improvements (Alperen Keleş)
### Fixed
* Fix escaping issues with like and glob functions (Vrishabh)
* Fix `sqlite_version()` out of bound panics' (Diego Reis)
* Fix on-disk file format bugs (Jussi Saurio)
## 0.0.10 - 2024-12-18
### Added
* In-memory mode (Preston Thorpe)
* More CLI improvements (Preston Thorpe)
* Add support for replace() function (Alperen Keleş)
* Unary operator improvements (Jean Arhancet)
* Add support for unex(x, y) function (Kacper Kołodziej)
### Fixed
* Fix primary key handling when there's rowid and PK is not alias (Jussi Saurio)
## 0.0.9 - 2024-12-12
### Added
* Improve CLI (Preston Thorpe)
* Add support for iif() function (Alex Miller)
* Add support for last_insert_rowid() function (Krishna Vishal)
* Add support JOIN USING and NATURAL JOIN (Jussi Saurio)
* Add support for more scalar functions (Kacper Kołodziej)
* Add support for `HAVING` clause (Jussi Saurio)
* Add `get()` and `iterate()` to JavaScript/Wasm API (Jean Arhancet)
## 0.0.8 - 2024-11-20
### Added
* Python package build and example usage (Pekka Enberg)
## 0.0.7 - 2024-11-20
### Added
* Minor improvements to JavaScript API (Pekka Enberg)
* `CAST` support (Jussi Saurio)
### Fixed
* Fix issues found in-btree code with the DST (Pere Diaz Bou)
## 0.0.6 - 2024-11-18
### Fixed
- Fix database truncation caused by `limbo-wasm` opening file in wrong mode (Pere Diaz Bou)
## 0.0.5 - 2024-11-18
### Added
- `CREATE TABLE` support (Pere Diaz Bou)
- Add Add Database.prepare() and Statement.all() to Wasm bindings (Pekka Enberg)
- WAL improvements (Pere Diaz Bou)
- Primary key index scans and single-column secondary index scans (Jussi Saurio)
- `GROUP BY` support (Jussi Saurio)
- Overflow page support (Pere Diaz Bou)
- Improvements to Python bindings (Jean Arhancet and Lauri Virtanen)
- Improve scalar function support (Lauri Virtanen)
### Fixed
- Panic in codegen with `COUNT(*)` (Jussi Saurio)
- Fix `LIKE` to be case insensitive (RJ Barman)
## 0.0.4 - 2024-08-22
- Query planner rewrite (Jussi Saurio)
- Initial pass on Python bindings (Jean Arhancet)
- Improve scalar function support (Kim Seon Woo and Jean Arhancet)
### Added
- Partial support for `json()` function (Jean Arhancet)
## 0.0.3 - 2024-08-01
### Added
- Initial pass on the write path. Note that the write path is not transactional yet. (Pere Diaz Bou)
- More scalar functions: `unicode()` (Ethan Niser)
- Optimize point queries with integer keys (Jussi Saurio)
### Fixed
- `ORDER BY` support for nullable sorting columns and qualified identifiers (Jussi Saurio)
- Fix `.schema` command crash in the CLI ([#212](https://github.com/tursodatabase/limbo/issues/212) (Jussi Saurio)
## 0.0.2 - 2024-07-24
### Added
- Partial `LEFT JOIN` support.
- Partial `ORDER BY` support.
- Partial scalar function support.
### Fixed
- Lock database file with POSIX filesystem advisory lock when database
is opened to prevent concurrent processes from corrupting a file.
Please note that the locking scheme differs from SQLite, which uses
POSIX advisory locks for every transaction. We're defaulting to
locking on open because it's faster. (Issue #94)
### Changed
- Install to `~/.limbo/` instead of `CARGO_HOME`.
## 0.0.1 - 2024-07-17
### Added
- Partial `SELECT` statement support, including `WHERE`, `LIKE`,
`LIMIT`, `CROSS JOIN`, and `INNER JOIN`.
- Aggregate function support.
- `EXPLAIN` statement support.
- Partial `PRAGMA` statement support, including `cache_size`.
- Asynchronous I/O support with Linux io_uring using direct I/O and
Darwin kqueue.
- Initial pass on command line shell with following commands: