Calcite

Calcite #

SqlNode #

RexNode 行表达式 #

RexNode 访问者 #

RelNode 关系表达式 #

RelNode是一个关系表达式。 关系表达式处理数据,因此它们的名称通常是动词:Sort、Join、Project、Filter、Scan、Sample。

解析 #

public static RelRoot genRelRoot(Connection connection, String sql) throws Exception {
    //从 conn 中获取相关的环境和配置,生成对应配置
    CalciteServerStatement st = connection.createStatement().unwrap(CalciteServerStatement.class);
    CalcitePrepare.Context prepareContext = st.createPrepareContext();
    final FrameworkConfig config = Frameworks.newConfigBuilder()
            .parserConfig(SqlParser.configBuilder().setLex(Lex.MYSQL).build())
            .defaultSchema(prepareContext.getRootSchema().plus())
//                .traitDefs(ConventionTraitDef.INSTANCE, RelDistributionTraitDef.INSTANCE)
            .build();
    Planner planner = Frameworks.getPlanner(config);
    RelRoot root = null;
    try {
        // 解析
        SqlNode parse1 = planner.parse(sql);
        // 校验
        SqlNode validate = planner.validate(parse1);
        root = planner.rel(validate);
        RelNode rel = root.rel;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return root;
}

String SQL -> SqlNode #

校验 #

SqlNode -> RelNode #

  1. Blackboard

SqlToRelConverter #

优化阶段 #

RelOptRule #

RelOptRule将一个表达式转换为另一个表达式。它有一个RelOptRuleOperand列表,用于确定规则是否可以应用于树的特定部分。 优化器找出适用的规则,然后在每个规则上调用onMatch 。