4 releases

Uses new Rust 2024

new 0.1.3 May 14, 2026
0.1.2 Mar 22, 2026
0.1.1 Feb 22, 2026
0.1.0 Feb 21, 2026

#1145 in Database interfaces

Download history 681/week @ 2026-02-20 535/week @ 2026-02-27 232/week @ 2026-03-06 314/week @ 2026-03-13 575/week @ 2026-03-20 347/week @ 2026-03-27 297/week @ 2026-04-03 415/week @ 2026-04-10 549/week @ 2026-04-17 544/week @ 2026-04-24 578/week @ 2026-05-01 896/week @ 2026-05-08

2,655 downloads per month
Used in 15 crates (4 directly)

Custom license

4.5MB
96K SLoC

fsqlite-btree

B-tree storage engine for fsqlite. This crate implements the on-disk B-tree data structures that organize database tables and indexes, providing cursor-based navigation and mutation through a sealed trait interface.

Overview

fsqlite-btree is the storage engine layer that the VDBE uses to read and write rows. It implements both SQLite B-tree variants:

  • Table B-trees (intkey): Keyed by i64 rowid, leaf pages store serialized record payloads.
  • Index B-trees (blobkey): Keyed by arbitrary byte sequences, leaf pages are key-only.

The crate provides cursor-based traversal (first, last, next, prev, seek), point mutations (insert, delete), and tree rebalancing. It also includes several advanced indexing structures: a write-optimized Be-tree (buffered epsilon tree), adaptive learned indexes, database cracking, and pointer swizzling for hot-path optimization.

All page access goes through fsqlite-pager traits, so the B-tree engine is agnostic to whether pages come from the page cache, WAL, or MVCC version chains.

Position in the dependency graph:

   fsqlite-vfs
        |
   fsqlite-pager
      /    \
fsqlite-wal  fsqlite-btree    <-- you are here
      \    /
   fsqlite-mvcc

Key Types

Cursor Trait (sealed)

  • BtreeCursorOps -- The primary interface consumed by the VDBE. Supports seek (index_move_to, table_move_to), navigation (first, last, next, prev), mutation (index_insert, table_insert, delete), and access (payload, rowid, eof). Sealed to enforce MVCC safety invariants.
  • SeekResult -- Result of a seek: Found (exact match) or NotFound (cursor at successor position).
  • MockBtreeCursor -- Test mock with pre-seeded entries, exported for cross-crate testing.

Cursor Implementation

  • BtCursor -- The real B-tree cursor implementation. Bound to a single transaction and root page.
  • TransactionPageIo / PageReader / PageWriter -- Page I/O adapters that connect the cursor to the pager.
  • MemPageStore -- In-memory page store for unit testing.

Cell and Page Layout

  • BtreePageHeader / BtreePageType -- On-disk page header parsing (leaf table, interior table, leaf index, interior index).
  • CellRef -- Reference to a single cell within a B-tree page.
  • read_cell_pointers / write_cell_pointers -- Cell pointer array serialization.
  • local_payload_size / max_local_payload / min_local_payload -- Payload spill threshold computation.
  • has_overflow -- Check whether a cell spills to overflow pages.

Overflow and Payload

  • overflow (module) -- Overflow page chain reading and writing for large payloads.
  • payload (module) -- Payload serialization and deserialization.

Tree Balancing

  • balance (module) -- B-tree rebalancing (split and merge) after insertions and deletions.
  • freelist (module) -- Free page list management.

Advanced Indexing

  • BeTree / BeTreeConfig -- Write-optimized buffered epsilon tree. Batches updates in internal node buffers and flushes them down lazily.
  • LearnedIndex / LearnedIndexConfig -- Learned index structures that use key distribution models to predict page positions, reducing binary search steps.
  • CrackedColumn -- Database cracking: incrementally partitions data in response to query predicates for adaptive physical layout.

Pointer Swizzling

  • SwizzlePtr / SwizzleState / PageTemperature -- Replaces on-disk page numbers with direct memory pointers for frequently accessed ("hot") pages, eliminating hash-table lookups on the critical path.

Cooling

  • CoolingStateMachine / CoolingConfig -- Manages the transition of hot swizzled pointers back to cold page numbers when memory pressure increases.

Instrumentation

  • BtreeMetricsSnapshot / BtreeOpType -- Per-operation counters (seek, next, insert, delete) with snapshot export.

Key Comparison

  • compare_key_bytes_contiguous -- Hot-path byte-slice comparison with sequential memory access and no pointer chasing.

Usage

use fsqlite_btree::{BtreeCursorOps, MockBtreeCursor, SeekResult};
use fsqlite_types::cx::Cx;

let cx = Cx::new();

// Create a cursor with some pre-seeded table entries.
let entries = vec![
    (1, b"alice".to_vec()),
    (2, b"bob".to_vec()),
    (3, b"charlie".to_vec()),
];
let mut cursor = MockBtreeCursor::new(entries);

// Navigate to the first entry.
assert!(cursor.first(&cx).unwrap());
assert_eq!(cursor.rowid(&cx).unwrap(), 1);
assert_eq!(cursor.payload(&cx).unwrap(), b"alice");

// Seek by rowid.
let result = cursor.table_move_to(&cx, 2).unwrap();
assert_eq!(result, SeekResult::Found);
assert_eq!(cursor.payload(&cx).unwrap(), b"bob");

// Insert a new row.
cursor.table_insert(&cx, 4, b"dave").unwrap();

Dependencies

  • fsqlite-types -- Shared type definitions.
  • fsqlite-error -- Unified error/result types.
  • fsqlite-pager -- Page-level storage interface (traits and page buffers).
  • tracing -- Structured logging.
  • hashbrown -- Fast hash maps for internal bookkeeping.

License

MIT

Dependencies

~12–28MB
~491K SLoC