Calcite Parser 使用 Demo

Calcite 解析

SQL Parser 使用 Demo

    SchemaPlus rootSchema = Frameworks.createRootSchema(true);
    final FrameworkConfig config = Frameworks.newConfigBuilder()
            .parserConfig(SqlParser.configBuilder()
                    .setParserFactory(SqlParserImpl.FACTORY)
                    .setCaseSensitive(false)
                    .setQuoting(Quoting.BACK_TICK)
                    .setQuotedCasing(Casing.TO_UPPER)
                    .setUnquotedCasing(Casing.TO_UPPER)
                    .setConformance(SqlConformanceEnum.ORACLE_12)
                    .build())
            .build();

    String sql = "select ids, name from test where id < 5 and name = 'zhang'";
    SqlParser parser = SqlParser.create(sql, config.getParserConfig());
    try {
        SqlNode sqlNode = parser.parseStmt();
        System.out.println(sqlNode.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
  • 语法参数设置

    • setCaseSensitive() 大小是写否敏感,比如说列名、表名、函数名
    • setQuoting() 设置引用一个标识符,比如说MySQL中的是``, Oracle中的""
    • setQuotedCasing Quoting策略,不变,变大写或变成小写,代码中的全部设置成变大写
    • setUnquotedCasing 当标识符没有被Quoting后的策略,值同上
      更多可以更以参考Calcite类Lex, 你也可以直接设置成MySQL、Oracle、MySQL_ANSI语法,如果需要定制化的话可以单独设置上面4个参数
  • ParserConfig中其它需要注意的参数

    • setIdentifierMaxLength() 设置标识符的最大长度,如果你的列名、表较长可以相应的加大这个值
    • setConformance() 特定语法支持,比如是否支持差集等

Sql Parser 功能

Calcite SqlParser 只会去检验 SQL 的语法是否正确,识别关键字(Keyword)与标识符(Identifier), 上面Sql关键字有select、from、where、<、=,其他为标识符,而不会去验证语义部分是否正确。比如表名、列名、列数据类型等信息的检验会在 Validate 阶段。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Calcite是一个开源的SQL解析器,它可以将SQL语句解析成一个抽象语法树(AST),并提供了一些接口和工具来进行SQL查询优化和执行。 使用Calcite可以分为三个步骤: 1.定义数据源和表:在Calcite中,数据源和表可以通过实现接口`Schema`和`Table`来定义。`Schema`表示一个数据源,可以包含多个`Table`,每个`Table`表示数据源中的一个表。 2.解析SQL语句:使用Calcite提供的`SqlParser`类可以将SQL语句解析成AST。例如: ```java SqlParser parser = SqlParser.create(sql, SqlParser.Config.DEFAULT); SqlNode sqlNode = parser.parseStmt(); ``` 3.优化和执行SQL查询:通过`SqlToRelConverter`类可以将AST转换成逻辑执行计划(`RelNode`),然后可以使用`RelOptPlanner`对执行计划进行优化,最后将执行计划转换成物理执行计划并执行查询。例如: ```java SqlToRelConverter.Config config = SqlToRelConverter.configBuilder() .withTrimUnusedFields(false) .build(); SqlToRelConverter sqlToRelConverter = new SqlToRelConverter( new CalciteCatalogReader(rootSchema, CalciteSchema.from(rootSchema), typeFactory), planner, typeFactory, config); RelNode relNode = sqlToRelConverter.convertQuery(sqlNode, false, true); RelNode optRelNode = planner.optimize(relNode); Enumerable<Object[]> results = EnumerableInterpreter.create(optRelNode).bind( EnumerableRel.create(relNode.getCluster(), optRelNode)); ``` 以上是一个简单的示例,具体使用方式可以参考Calcite的官方文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值