v0.3.0
What's New
DDL WAL Replay
- Schema mutations (CREATE TABLE, DROP TABLE, ADD COLUMN, DROP COLUMN) are now logged to the WAL with record types 6-9
- Crash recovery replays DDL operations idempotently — if the table/column already exists or was already dropped, replay skips gracefully
- WAL records are flushed immediately before filesystem mutations for durability
CRC32 Checksums on B+ Tree Nodes
- Every serialized B+ tree node now includes a CRC32 checksum (last 4 bytes)
- Checksum is verified on load — returns
io::Error(InvalidData)on mismatch - Protects against silent corruption of index data on disk
Hardened Hot Paths
- Bounds-checked compiled predicates in
CompiledLeaf::eval()— no panics on corrupt row data - Bounds checks in sort+limit fast path and mmap heap scan slot directory reads
- Fixed UTF-8 slicing bug found by fuzzer:
&s[..20]→&s[..s.floor_char_boundary(20)]in token display
CI Improvements
- Added Miri job (scoped to non-mmap modules: btree, page, row, types, tx, view)
- Added AddressSanitizer job (hard gate, leak detection disabled for mmap regions)
- Fixed fuzz workflow
cargo-fuzzinstall (removed--lockedto avoid stale transitive deps) - Updated required status check names in branch protection
Other
TypeId::from_u8()convenience method on storage types- Doc-tests added across lexer, parser, executor, and storage modules
- Fixed clippy
collapsible_iflint in connection management tests
What's Changed
Full Changelog: v0.2.1...v0.3.0