主要观点:
- SQLite 在页 1 开始的特殊“模式表”中存储表的元数据,需从中提取更多信息以评估 SQL 查询。
- 要为每个表获取表名、根页、各列名称和类型等信息,前两者易提取,列信息需解析
CREATE TABLE
语句。 - 扩展 SQL 解析器以支持
CREATE TABLE
语句,添加新的标记类型到标记器,扩展 AST 表示新语句类型,实现解析类型和列定义等功能。 - 更新
parse_statement
方法处理新语句类型,使其能处理CREATE TABLE
语句且可选分号终止符。 - 扩展
Database
结构体存储表元数据,通过TableMetadata::from_cursor
方法从Cursor
对象构建TableMetadata
结构体,在Db::collect_metadata
中迭代收集表元数据。 - 更新
.table
命令以使用新的元数据。
关键信息:
- 相关代码在GitHub。
- 新增标记类型:
Create
、Table
、(
,)
。 CreateTableStatement
结构体包含表名、列列表等字段,ColumnDef
结构体包含列名和类型字段,Type
枚举有Integer
、Real
、Text
、Blob
等类型。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
命令更新以使用新的表元数据显示表名。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。