Presto 源码分析(二):SQL 解析

提交 SQL

Presto 客户端向 Presto Coordinator 提交 SQL。通过 StatementClient 发送 HTTP 请求 StatementResource 接口创建查询、获取查询结果。

提交 SQL

生成 AST

Presto 使用 ANTLR4 对 SQL 进行词法分析和语法分析生成抽象语法树(Abstract Syntax Tree,AST)。语法在 presto-parser 模块下 SqlBase.g4 文件中定义。

抽象语法树节点继承自 Node 抽象类,定义在 presto-parser 模块下 io.prestosql.sql.tree 包中。

生成 AST

语义分析

Statement 经过 StatementRewrite 重写,经过 StatementAnalyzer 进行语义分析。

语义分析的过程,使用访问者(Visitor)模式遍历抽象语法树,实现在 io.prestosql.sql.analyzer.StatementAnalyzer.Visitor 类中。

语义分析

生成逻辑计划

使用 AnalysisStatement 生成逻辑计划节点 PlanNode,优化之后,生成逻辑计划。

逻辑计划节点,在 io.prestosql.sql.planner.plan 包下。

Presto 支持 RBO (基于规则的优化 Rule based Optimization)和 CBO (基于成本的优化 Cost based Optimization)。RBO 在 io.prestosql.sql.planner.optimizations 包下,CBO 在 io.prestosql.cost 包下。

生成逻辑计划

生成分布式计划

逻辑计划 Plan 经过 Fragmenter 切分为 SubPlan 子任务。

生成分布式计划

参考