计划树执行是SQL处理的第五步,也称为Implementor执行实现。Calcite主要提供两种Implementor实现方式:RelImplementor 和 SqlImplementor。
第一种实现方式:基于 RelImplementor 直接执行RelNode,将RelNode转换为可执行的代码。,由Calcite内置Iterator内存迭代器(EnumerableRelImplementor)实现。执行流程如下图所示,在两个阶段分别处理:
其中,RexToLixTranslator 通常与 EnumerableRelImplementor 配合使用。EnumerableRelImplementor 负责将逻辑计划(由 RelNode 组成)转换为基于 Linq4j 的可枚举(Enumerable)计划,而 RexToLixTranslator 负责将计划中的行表达式(RexNode)转换为 Linq4j 可执行表达式。
如图展示基于CodeGen生成的Java代码,示例:endWith(left, right) 函数 :
第二种实现方式:基于SqlImplementor 将RelNode转换回SQL语句,由外部引擎执行计算。其中,RelToSqlConverter是 SqlImplementor子类,基于Visitor模式自底向上逐层构建Result,最终将RelNode转回SqlNode,基于SqlNode反解析为可执行 SQL,下推到特定数据源执行。
SqlNode 反解析提供了unparse 方法,该方法能够将SqlNode语法树拼装成SQL语句。在unparse反解析过程中,可根据不同数据源/执行引擎的SqlDialect 适配生成不同的SQL方言,实现与不同的数据库系统的灵活交互。例如,基于SparkSqlDialect 可对应生成Spark引擎SQL方言,基于PrestoSqlDialect 可对应生成Presto引擎SQL方言。
备注:Dialect是可插拔的,可通过继承SqlDialect类实现自定义Dialect扩展
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。