注入需优化的 RelNode root:RelNode 是关系代数表达式的一种抽象结构,因此与关系表达式相似是一种类似树的结构(组合模式的应用),HepPlanner 会根据这个特点将其转换成一个有向无环图 DirectedGraph,图上的每个节点都是一个 RelNode,但这个 RelNode 不是原来的 RelNode,而是 RelNode 的另一个实现类 HepRelVertex,Hep...
首先会转换 from 部分,用最简单的例子看就是一个 table, 首先会找到上一步中的 tableNameSpace, 并用名字从前准备好的 catalogReader 中获取 table schema 信息, 之后根据 schema 创建 RelNode(e.g. 比如普通的LogicalTableScan并根据虚列信息决定是否添加 projection; 如果是 view 那会转换做一个 view 展开逻辑...
最后进行Parser/Validate并转化成RelNode 现在简要说明一下函数注册主要过程 Parser阶段,在Parser.jj文件中 有以下内容: LOOKAHEAD( [<SPECIFIC>] FunctionName() <LPAREN>) e = NamedFunctionCall() // NamedFunctionCall的主要内容如下 ... SqlNode NamedFunctionCall() : qualifiedName = FunctionName() create...
根据我们的需求,实际上只需要在扫描表的适合,对应的将源表替换为目标表即可, 所以,在onMatch(final RelOptRuleCall call)方法里,匹配到映射关系,将源表替换成重新生成的RelNode 代码语言:javascript 复制 TableScan tableScan=call.rel(0);for(String tn:tableScan.getTable().getQualifiedName()){if(srcName.equ...
【摘要】 问题场景:某个需求里,需要使用calcite, 将优化后的calcite逻辑计划树转成sql语句。 static String toSql(RelNode root, DataSourceType dataSourceType) { SqlDialect dialect; // 根据对应数据库类型决定dialect dialect = dat... 问题场景:
第一个 users.id (SqlIdentifier) 第二个 :5(SqlNumericLiteral)--SqlTypeName(是Decimal) 大概总结一下两者关系RelNode 和 RexNode 的区别 : 1 RelNode 关系表达式, 主要有TableScan, Project, Sort, Join等。如果SQL为查询的话,所有关系达式都可以在SqlSelect中找到, 如 where和having 对应的Filter, selectLis...
SqlNode.toSqlString方法 SUBSTRING转SUBSTR APPROX_COUNT_DISTINCT转APPROX_DISTINCT ROLLUP重写 小结 我们知道,Calcite一般会有四个阶段:parse、validate、optimize和execute。其中,在parse和validate阶段,会生成一个parse tree,树中的节点都是SqlNode的类型。在optimize节点,Calcite会将parse tree转换为RelNode,同时进行一些...
解析Flink SQL列级血缘 以Flink SQL任务中最为常见的单条INSERT INTO ... SELECT ...为例,首先我们需要取得SQL语句生成的RelNode对象,即逻辑计划树。 为了方便讲解,这里笔者简单粗暴地在o.a.f.table.api.internal.TableEnvironmentImpl类中定义了一个getInsertOperation()方法。它负责解析、验证SQL语句,生成CatalogSi...
Query Optimizer:这块概念较多,首先需要将 AST 转化成逻辑执行计划(即 SqlNode → RelNode),其次使用 Rules 优化逻辑执行计划。 3. SQL parser 上文提到,SQL Parser 的作用是将 SQL 文本切割成一个个 token 并生成 AST,每个 token 在 Calcite 中由 SqlNode 表示(即代表 AST 的一个个结点),SqlNode 也可以通...
SQL Validator:结合 Catalog 提供的元数据校验 AST,具体的实现都在 SqlValidatorImpl 中; Query Optimizer:这块概念较多,首先需要将 AST 转化成逻辑执行计划(即 SqlNode → RelNode),其次使用 Rules 优化逻辑执行计划。 3. SQL parser 上文提到,SQL Parser 的作用是将 SQL 文本切割成一个个 token 并生成 AST,每...