sqlite_embedded/sqlite_page.rs
1//! Lightweight SQLite page classification for the VFS prefetch planner.
2//!
3//! A table scan over rows with overflowing payloads reads B-tree leaf pages and
4//! overflow pages interleaved (for example `leaf 2, overflow 20, leaf 3,
5//! overflow 21`). The two classes usually live in separate physical regions, so
6//! a single stride/forward-scan tracker sees large alternating deltas and never
7//! detects the per-class monotonic scan. Classifying each accessed page lets the
8//! planner keep one tracker per class so the leaf scan can escalate read-ahead
9//! independently of the overflow accesses.
10
11/// Coarse page classification used to separate prefetch tracking streams. Any
12/// page that is not a B-tree page (overflow, freelist, or pointer-map) falls
13/// into [`PageClass::Overflow`].
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum PageClass {
16 Btree,
17 Overflow,
18}
19
20/// Classify a page from its raw bytes using the one-byte B-tree page type at the
21/// header offset (0x02 interior index, 0x05 interior table, 0x0a leaf index,
22/// 0x0d leaf table). Page 1 carries the 100-byte database header before its
23/// B-tree header. Any other type byte is treated as a non-B-tree page.
24pub fn classify(pgno: u32, page: &[u8]) -> PageClass {
25 let hdr = if pgno == 1 { 100 } else { 0 };
26 match page.get(hdr) {
27 Some(0x02 | 0x05 | 0x0a | 0x0d) => PageClass::Btree,
28 _ => PageClass::Overflow,
29 }
30}