主要观点:
- 之前实现的
.tables命令有局限,假设所有数据都在文件第一页,此篇要解决表过大无法在单页显示的问题,为查询引擎打基础。 - 当表过大时,SQLite将其分割为不同类型的页,如包含实际记录的叶页和存储表记录所在页信息的内部页。
- 介绍了内部页的结构及相关数据结构的更新,包括页头结构、
PageType枚举、Page结构体等。 - 需更新扫描逻辑以处理内部页,引入
PositionedPage结构体和Scanner结构体来跟踪遍历的页面。 - 更改
display_tables函数以适应next_record签名的变化,现在可以显示长列表的表。
关键信息:
- 数据库页通常为 4096 字节,1000 个表无法存储在一页。
- 内部页结构:存储
(key, child_page_number)元组,按key升序逻辑排序,头包含额外的“最右指针”字段。 - 数据结构更新:在
PageHeader中添加rightmost_pointer字段和byte_size方法,更新Page结构体和相关解析函数。 - 扫描逻辑更新:通过
PositionedPage和Scanner结构体实现深度优先算法遍历树,处理内部页。 display_tables函数更新以显示表名。
重要细节:
- 解析内部页的函数
parse_table_interior_cell和叶页的函数parse_table_leaf_cell。 PositionedPage结构体的next_cell和next_page方法的实现。Scanner结构体的next_record、next_elem和current_page方法的逻辑。- 对
Cursor结构体的更改,使其拥有自身的有效载荷。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。