主要观点:
- 之前实现的
.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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。