深入理解 SQL 如何从文本解析为抽象语法树 (AST)
SELECT 语句的根节点,包含 select_list、from_clause、where_clause、group_by、order_by 等子节点。
INSERT 语句的根节点,包含 table_reference、column_list、values_clause 或 select_stmt 子节点。
UPDATE 语句的根节点,包含 table_references、set_clause、where_clause 等子节点。
DELETE 语句的根节点,包含 table_references、where_clause、order_by、limit 等子节点。
表示表引用,包含数据库名、表名、别名等信息。JOIN 操作中会包含多个 TABLE_REF。
表示列引用,包含表名/别名前缀和列名,如 t1.id。
表示函数调用节点,包含函数名和参数列表,如 COUNT(*)、MAX(salary)。
表示二元运算表达式,如 =、<、>、AND、OR、+、- 等运算符。
表示标识符节点,存储表名、列名、别名等名称信息。
表示常量值,包括字符串、数字、NULL、布尔值等。
表示数字常量,如整数、浮点数。
表示字符串常量,用单引号或双引号包裹的文本。
表示 JOIN 操作节点,包含 JOIN 类型、左表、右表和 ON 条件。
表示 ORDER BY 子句,包含排序表达式和排序方向 (ASC/DESC)。
表示 GROUP BY 子句,包含分组表达式列表。
表示 LIMIT 子句,包含偏移量和行数限制。
| 节点类型 | 必需子节点 | 可选子节点 | 说明 |
|---|---|---|---|
| SELECT_STMT | select_list | from_clause, where_clause, group_by, having, order_by, limit | SELECT 语句根节点 |
| INSERT_STMT | table_ref, values_clause | column_list, on_duplicate | INSERT 语句根节点 |
| UPDATE_STMT | table_refs, set_clause | where_clause, order_by, limit | UPDATE 语句根节点 |
| DELETE_STMT | table_refs | where_clause, order_by, limit | DELETE 语句根节点 |
| FROM_CLAUSE | table_reference_list | join_clauses | FROM 子句节点 |
| WHERE_CLAUSE | condition_expr | - | WHERE 条件节点 |
| JOIN | left_table, right_table, join_type | on_condition | JOIN 操作节点 |
| BINARY_EXPR | left, operator, right | - | 二元表达式节点 |
| FUNC_CALL | func_name, args_list | distinct_flag | 函数调用节点 |
| SUBQUERY | select_stmt | correlation | 子查询节点 |
将 SQL 字符串分割成 Token 序列。识别关键字 (SELECT, FROM)、标识符、运算符、字面量等。
根据 MySQL 语法规则,将 Token 序列构建成语法树。检查语法正确性。
检查表名、列名是否存在,验证数据类型兼容性,解析别名引用。
基于语法树生成执行计划,选择最优的索引和 JOIN 顺序。