构建你自己的 SQLite,第 4 部分:读取表元数据

主要观点:

  • SQLite 在页 1 开始的特殊“模式表”中存储表的元数据,需从中提取更多信息以评估 SQL 查询。
  • 要为每个表获取表名、根页、各列名称和类型等信息,前两者易提取,列信息需解析CREATE TABLE语句。
  • 扩展 SQL 解析器以支持CREATE TABLE语句,添加新的标记类型到标记器,扩展 AST 表示新语句类型,实现解析类型和列定义等功能。
  • 更新parse_statement方法处理新语句类型,使其能处理CREATE TABLE语句且可选分号终止符。
  • 扩展Database结构体存储表元数据,通过TableMetadata::from_cursor方法从Cursor对象构建TableMetadata结构体,在Db::collect_metadata中迭代收集表元数据。
  • 更新.table命令以使用新的元数据。

关键信息:

  • 相关代码在GitHub
  • 新增标记类型:CreateTable(, )
  • CreateTableStatement结构体包含表名、列列表等字段,ColumnDef结构体包含列名和类型字段,Type枚举有IntegerRealTextBlob等类型。
  • parse_create_table方法用于解析CREATE TABLE语句,parse_statement方法更新以处理新语句类型。
  • TableMetadata结构体包含表名、列列表、根页等字段,collect_tables_metadata方法用于收集表元数据。

重要细节:

  • 标记器tokenize方法根据输入字符串生成标记列表。
  • parse_type方法根据输入标识符匹配预定义类型。
  • parse_create_statement方法用于解析创建表语句。
  • from_cursor方法从Cursor对象构建TableMetadata结构体,需检查类型字段确保是表。
  • Db::from_file方法从文件创建Db实例并收集表元数据。
  • .table命令更新以使用新的表元数据显示表名。
阅读 7
0 条评论