Calcite针对SQL parse提供了很多的配置项,可以针对不同的SQL方言进行解析。相关的配置项都存储在SqlParser.Config这个结构中,常见的用法如下所示:

SqlParser.Config config = SqlParser.config();
String sql = xxx;
SqlParser sqlParser = SqlParser.create(sql, config);
SqlNode sqlNode = sqlParser.parseStmt();

最终,我们就可以将一个字符串的sql,转换成一个SqlNode,这是一个Calcite中抽象语法树的代码标识。而这个config()就是Calcite默认提供的一个配置集合,如下所示:

public static Config config() {return Config.DEFAULT;
}/** Default configuration. */
Config DEFAULT = ImmutableBeans.create(Config.class).withLex(Lex.ORACLE).withIdentifierMaxLength(DEFAULT_IDENTIFIER_MAX_LENGTH).withConformance(SqlConformanceEnum.DEFAULT).withParserFactory(SqlParserImpl.FACTORY);

可以看到,Calcite默认设置了四个属性,除了这四个,还有其他的属性也可以设置,下面我们就看一下常用的一些配置项。

引用标识符

相关的结构如下所示:

/** Syntax for quoting identifiers in SQL statements. */
public enum Quoting {/** Quote identifiers in double-quotes. For example, {@code "my id"}. */DOUBLE_QUOTE("\""),/** Quote identifiers in back-quotes. For example, {@code `my id`}. */BACK_TICK("`"),/** Quote identifiers in brackets. For example, {@code [my id]}. */BRACKET("[");public String string;Quoting(String string) {this.string = string;}
}

使用方法如下所示:

SqlParser.Config config = SqlParser.config().withQuoting(Quoting.BACK_TICK)

此时,我们就可以针对列名、表名等,使用反引号包围起来,如下所示:

select `c1` from `t`
select `c1` as `id` from t
select c1,`sum`(c2) from t group by c1

上面的三种值,分别表示双引号、反引号和括号。因此,如果我们设置quoting为BACK_TICK,那么使用双引号则会报错,如下所示:

select "c1" from "t"
select c1 as "id" from t
select c1,"sum"(c2) from t group by c1

标识符大小写转换

相关的结构如下所示:

/** Policy for converting case of identifiers before storing them.** <p>A database often has policies for quoted versus unquoted identifiers.* For example, Oracle converts unquoted identifiers to upper-case, but* quoted identifiers are unchanged.</p> */
public enum Casing {/** The case of identifiers is not changed. */UNCHANGED,/** Identifiers are converted to upper-case. */TO_UPPER,/** Identifiers are converted to lower-case. */TO_LOWER
}

这是针对引用标识符可以设置是否进行大小写转换,通过SqlParser.Config的两个方法可以进行设置,如下所示:

//针对使用了引用标识符包围的列、表名等,进行大小写转换
Config withQuotedCasing(Casing casing);
//针对没有引用标识符包围的列、表名等,进行大小写转换
Config withUnquotedCasing(Casing casing);

我们看如下所示的例子:

SqlParser.Config config = SqlParser.config().withQuoting(Quoting.BACK_TICK).withQuotedCasing(Casing.UNCHANGED).withUnquotedCasing(Casing.TO_UPPER);String sql = "select `Col1`,sum(col2) from t group by Col1";
SqlParser sqlParser = SqlParser.create(sql, config);
SqlNode sqlNode = sqlParser.parseQuery();
System.out.println(sqlNode.toString());

最终输出的SQL如下所示:

SELECT `Col1`, SUM(`COL2`)
FROM `T`
GROUP BY `COL1`

可以看到,被反引号包围的Col1保持了大小写不变,而没有标识符包围的col2和Col1则都被转换成了大写。

字符常量值格式

格式如下所示:

/** Styles of character literal.** @see Lex#charLiteralStyles */
public enum CharLiteralStyle {/** Standard character literal. Enclosed in single quotes, using single quotes* to escape. Example: {@code 'Won''t'}. */STANDARD,/** Single-quoted character literal with backslash escapes, as in BigQuery.* Example: {@code 'Won\'t'}. */BQ_SINGLE,/** Double-quoted character literal with backslash escapes, as in BigQuery.* Example: {@code "Won\'t"}. */BQ_DOUBLE
}

这里指的主要就是字符串的格式,包括转义字符,例如STANDARD的格式就是单引号包围,如果字符串包含单引号,则使用单引号进行转移,如下所示:

// Config配置如下:
SqlParser.config().withCharLiteralStyles(ImmutableSet.of(CharLiteralStyle.STANDARD))
// 解析成功
select 'I''m super man'
// 解析失败
select 'I\'m super man'
select "I''m super man"

而BQ_SINGLE和BQ_DOUBLE分别表示使用单引号和双引号来包围字符串,但是转义符号用的则是反斜杠,这两种格式是BigQuery的语法。

其他配置

除了上述的配置项,SqlParser.Config还提供了一些额外的配置,如下所示:

// 匹配时,大小写是否敏感
Config withCaseSensitive(boolean caseSensitive);
// 标识符最大长度
Config withIdentifierMaxLength(int identifierMaxLength);

使用模板进行配置

语法特性Lex

Calcite针对当前主流的一些方言,构造了专门的模板,我们可以使用这些模板快速创建对应的config,如下所示:

public enum Lex {BIG_QUERY(Quoting.BACK_TICK, Casing.UNCHANGED, Casing.UNCHANGED, true,CharLiteralStyle.BQ_SINGLE, CharLiteralStyle.BQ_DOUBLE),ORACLE(Quoting.DOUBLE_QUOTE, Casing.TO_UPPER, Casing.UNCHANGED, true,CharLiteralStyle.STANDARD),// 省略其余部分代码

这里设置的配置项就是我们上面提到的几种,例如我们要创建BigQuery的语法,可以这样使用:

SqlParser.Config config = SqlParser.config().withLex(Lex.BIG_QUERY);

SqlConformance

除了上面提到的Lex,还有一个与之搭配使用的变量就是SqlConformanceEnum,这个枚举里面定义了一系列的SQL行为模式,例如是否支持group by alias,group by ordinal等,如下所示:

public boolean isGroupByAlias() {switch (this) {case BABEL:case LENIENT:case BIG_QUERY:case MYSQL_5:return true;default:return false;}
}

这个枚举里面也定义了一系列的常用方言的SQL行为,如下所示:

public enum SqlConformanceEnum implements SqlConformance {DEFAULT,LENIENT,BABEL,// 省略其余部分代码

因此,我们通常就可以结合上面的Lex来使用,如下所示:

SqlParser.Config config = SqlParser.config().withLex(Lex.BIG_QUERY).withConformance(SqlConformanceEnum.BIG_QUERY);

小结

基本到这里Calcite得parser config的配置就基本已经设置介绍完了。通过上面的介绍我们可以发现,Calcite提供了比较多的配置项组合,可以解析不同的SQL方言,还是很强大的。除了parse,Calcite还有一个unparse的过程,可以将RelNode转换成不同方言的sql,后续有时间再做介绍。

Calcite parser config介绍相关推荐

  1. calcite parser

    https://blog.csdn.net/weixin_35297190/article/details/114489238 https://www.jb51.net/article/210438. ...

  2. Calcite JavaCC简单介绍及使用

    JavaCC 使用递归降低语法解析,LL(k).其中,第一个L表示从左到右扫描输入:第二个L表示每次都进行最左推导(在推导语法树的过程当中每次都替换句型中最左的非终结符为终结符.相似还有最右推导):k ...

  3. Web.Config介绍

    我们都知道,平时我们都会把项目中容易变化的量都在web.config中配置,这样在后期的修改中,就不用重新编译了,这样也有利于后期的维护更灵活,web.config是xml格式的文档,严格区分大小写, ...

  4. 【Git配置技巧】01. 配置文件git config介绍

    Git有一个工具被称为git config,它允许你获得和设置配置变量:这些变量可以控制Git的外观和操作的各个方面. 一. 配置文件的存储位置 这些变量可以被存储在三个不同的位置: 1./etc/g ...

  5. Creo服务器管理器配置文件,Creo配置文件Config介绍及设置方法 | 坐倚北风

    1.Config的作用 Config文件是Creo的系统配置文件,它几乎可以满足你对Creo的所有要求.包括系统的精度.显示设置.单位.打印机的设置.快捷键的设置.输入输出设置等.通过这些设置你可以把 ...

  6. 【SQL】血缘解析 SQL parser 工具介绍

    1.概述 2. git 大数据解析:https://github.com/0xqq/bigdata-sql-parser 基于hook机制实现数据血缘系统 [Flink]第三十二篇:Flink SQL ...

  7. Apache Calcite概念介绍

    一.介绍 1.简介 ● Apache Calcite是面向Hadoop新的查询引擎,它提供了标准的SQL语言.多种查询优化和连接各种数据源的能力. ● Calcite的目标是" one si ...

  8. SpringCloud config 配置中心介绍与基本配置使用

    一.SpringCloud Config 介绍 出现背景:在微服务架构中,在没有配置中心出现时,我们每个应用的配置信息都在其配置文件application.properties中维护.加入整个系统中有 ...

  9. Apache Calcite 处理流程详解(一)

    关于 Apache Calcite 的简单介绍可以参考 Apache Calcite:Hadoop 中新型大数据查询引擎 这篇文章,Calcite 一开始设计的目标就是 one size fits a ...

最新文章

  1. WSAStartup函数
  2. VR/AR标准委员会成立OpenXR工作组:Oculus、Valve领头
  3. Plist文件的创建与读写
  4. server sql 将出生日期转为年龄_在sql server表中有一个出生日期字段我怎么才能在当前年份改变时自动更新年龄字段...
  5. 前端学习(2570):template和jsx的对比
  6. java8 按条件过滤集合
  7. OpenGL中投影矩阵(Projection Matrix)详解
  8. eBPF学习记录(四)使用libbpf开发eBPF程序
  9. Java匹马行天下之 Java国出了个Java——举国欢庆
  10. Microsoft Deployment Toolkit 2010 新功能实战之三
  11. 三维点云配准方法(两帧)
  12. 模拟cmos集成电路 第二版 razavi
  13. 解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题
  14. 小迪安全第10天 信息收集,资产监控拓展
  15. python小白社区_Python小白教学系列| 初识python-Go语言中文社区
  16. 超级实用的分时图指标 有了本分时图你根本不用看K线了
  17. 天干地支计算公式_天干地支计算方法
  18. 【Xilinx】如何根据芯片封装尺寸绘制3D模型
  19. Axure的增删改查
  20. 关于常用python编程软件有哪些,你可能还不知道

热门文章

  1. 投资人为什么盯上了这些“小巨人”?
  2. Ubuntu 16.04 安装 uTorrent
  3. 在钉钉如何愉快地给老师点很多赞
  4. 【Unity】Obi插件系列(二)—— Backends、Updaters、Simulation
  5. linux下执行php命令echo不输出,linux echo命令以及linux echo命令提示权限不够的方法...
  6. 山东艾思软件科技有限公司-公司介绍
  7. 10寸、10.1寸、10.4寸液晶屏解决方案
  8. QT 设置label内字体,字体颜色,背景色 ; 字体的中英对照
  9. Linux下DMA驱动
  10. OSChina 周二乱弹 —— 春节假期已经完全结束