https://blog.csdn.net/weixin_35297190/article/details/114489238

https://www.jb51.net/article/210438.htm

https://blog.csdn.net/u013516966/article/details/104191190

https://www.shangmayuan.com/a/4f973e2ce7dc439e9eff2cf5.html

SqlNode

通过Parser, 可以将Sql转化成SqlNode

select id, cast(score as int), 'hello' from T where id < ?

以上SQL中,

  • id, score, T 等为SqlIdentifier
  • cast()为SqlCall
  • int 为SqlDataTypeSpec
  • ‘hello’ 为SqlLiteral
  • ‘?’ 为SqlDynamicParam
// Sql语句
String sql = "select id, cast(score as int), 'hello' from T where id < ?";
// 解析配置
SqlParser.Config mysqlConfig = SqlParser.configBuilder().setLex(Lex.MYSQL).build();
// 建立解析器
SqlParser parser = SqlParser.create(sql, mysqlConfig);
// 解析sql
SqlNode sqlNode = parser.parseQuery();

SqlCall

所有的操作都是一个SqlCall, 如查询是一个SqlSelect, 删除是一个SqlDelete等

public abstract class SqlCall extends SqlNode {protected SqlCall(SqlParserPos pos) {super(pos);}public boolean isExpanded() {return false;}public void setOperand(int i, @Nullable SqlNode operand) {throw new UnsupportedOperationException();}//操作符类型  @Overridepublic SqlKind getKind() {return getOperator().getKind();}//操作符public abstract SqlOperator getOperator();//节点public abstract List<SqlNode> getOperandList();
}

常见SqlCall节点

  • SqlUpdate:update语句
  • SqlInsert:insert语句
  • SqlCase:case语句
  • SqlDelete:delete语句
  • SqlWithItem:with 列语句,mysql不支持,oracle支持
  • SqlOrderBy:order by 语句
  • SqlJoin:join语句
  • SqlWindow:window语句
  • SqlSelect:select语句

SqlSelect

public class SqlSelect extends SqlCall {public static final int FROM_OPERAND = 2;public static final int WHERE_OPERAND = 3;public static final int HAVING_OPERAND = 5;SqlNodeList keywordList;SqlNodeList selectList;@Nullable SqlNode from;@Nullable SqlNode where;@Nullable SqlNodeList groupBy;@Nullable SqlNode having;SqlNodeList windowDecls;@Nullable SqlNodeList orderBy;@Nullable SqlNode offset;@Nullable SqlNode fetch;@Nullable SqlNodeList hints;
}

SqlLiteral


调用getValue()getValueAs获取字段值

public class SqlLiteral extends SqlNode {protected final @Nullable Object value;private final SqlTypeName typeName;public @Nullable Object getValue() {return value;}public <T extends Object> T getValueAs(Class<T> clazz) {Object value = this.value;if (clazz.isInstance(value)) {return clazz.cast(value);}if (typeName == SqlTypeName.NULL) {return clazz.cast(NullSentinel.INSTANCE);}requireNonNull(value, "value");switch (typeName) {case CHAR:if (clazz == String.class) {return clazz.cast(((NlsString) value).getValue());}break;case BINARY:if (clazz == byte[].class) {return clazz.cast(((BitString) value).getAsByteArray());}break;case DECIMAL:if (clazz == Long.class) {return clazz.cast(((BigDecimal) value).longValueExact());}............................default:break;}throw new AssertionError("cannot cast " + value + " as " + clazz);}
}

常见子类

  • SqlNumericLiteral:数字常量
  • SqlAbstractStringLiteral:字符和二进制字符串文字常量
    SqlBinaryStringLiteral: 二进制(或十六进制)字符串。
    SqlCharStringLiteral:类型为SqlTypeName.CHAR的信息
  • SqlAbstractDateTimeLiteral: 表示日期、时间或时间戳值的常量
    SqlDateLiteral : 2004-10-22
    SqlTimestampLiteral:1969-07-21 03:15 GMT
    SqlTimeLiteral : 14:33:44.567
  • SqlIntervalLiteral:时间间隔常量
INTERVAL '1' SECOND
INTERVAL '1:00:05.345' HOUR
INTERVAL '3:4' YEAR TO MONTH

SqlIdentifier

Sql中标示符

SqlNodeList

SqlNode的集合

SqlDataTypeSpec

SQL数据类型规范

public class SqlDataTypeSpec extends SqlNode {private final SqlTypeNameSpec typeNameSpec;private final @Nullable TimeZone timeZone;private final @Nullable Boolean nullable;
}

SqlDynamicParam

表示SQL语句中的动态参数标记

SqlIntervalQualifier

标示区间定义

INTERVAL '1:23:45.678' HOUR TO SECOND
INTERVAL '1 2:3:4' DAY TO SECOND
INTERVAL '1 2:3:4' DAY(4) TO SECOND(4)

SqlKind

SqlNode类型

SqlOperator

Sql解析的节点类型,包括:函数,操做符(=),语法结构(case)等操做

SqlParser.Config

public interface Config {//默认配置Config DEFAULT = ImmutableBeans.create(Config.class).withLex(Lex.ORACLE).withIdentifierMaxLength(DEFAULT_IDENTIFIER_MAX_LENGTH).withConformance(SqlConformanceEnum.DEFAULT).withParserFactory(SqlParserImpl.FACTORY);//最大字符长度,默认128int identifierMaxLength();//转义标识符大小写转换Casing quotedCasing();//未转义标识符大小写转换Casing unquotedCasing();//转义字符(常见转义字符`,",[)Quoting quoting();//是否区分大小写boolean caseSensitive();//sql标准SqlConformance conformance();default Config withLex(Lex lex) {return withCaseSensitive(lex.caseSensitive).withUnquotedCasing(lex.unquotedCasing).withQuotedCasing(lex.quotedCasing).withQuoting(lex.quoting).withCharLiteralStyles(lex.charLiteralStyles);}}

Calcite SQL 方言

public class SqlDialect {//支持的内置定义函数或者运算符  protected static final Set<SqlOperator> BUILT_IN_OPERATORS_LIST//标识符的开始符号protected final @Nullable String identifierQuoteString;//标识符的结束符号protected final @Nullable String identifierEndQuoteString;//protected final @Nullable String identifierEscapedQuote;//常量的开始符号protected final String literalQuoteString;//常量的结束符号protected final String literalEndQuoteString;protected final String literalEscapedQuote;//在进行排序查询式,空值的返回顺序protected final NullCollation nullCollation;//数据库类型private final DatabaseProduct databaseProduct;//数据类型private final RelDataTypeSystem dataTypeSystem;//未转义标识符大小写转换(TO_UPPER,TO_LOWER,UNCHANGED)  private final Casing unquotedCasing;//转义标识符大小写转换(TO_UPPER,TO_LOWER,UNCHANGED)private final Casing quotedCasing;//是否大小写敏感(列名 表明 函数名等)private final boolean caseSensitive;
}
DataTypeSystem dataTypeSystem;//未转义标识符大小写转换(TO_UPPER,TO_LOWER,UNCHANGED) private final Casing unquotedCasing;//转义标识符大小写转换(TO_UPPER,TO_LOWER,UNCHANGED)private final Casing quotedCasing;//是否大小写敏感(列名 表明 函数名等)private final boolean caseSensitive;
}

calcite parser相关推荐

  1. Calcite parser config介绍

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

  2. Apache Calcite教程-SQL解析-Calcite自定义语法解析

    Calcite自定义SQL解析 常用方法和配置 config.fmpp 配置和Parser.jj文件结合说明 package,class,imports keywords nonReservedKey ...

  3. Calcite Sql解析

    Calcite自定义SQL解析(经常使用的方法和配置)(mvn版本:1.21.0) 1.config.fmpp(calcite模板配置) data: {parser: {# Generated par ...

  4. SuperSQL:跨数据源、跨DC、跨执行引擎的高性能大数据SQL中间件

    导语:SuperSQL是腾讯数据平台部自研的跨数据源.跨数据中心.跨执行引擎的统一大数据SQL分析平台/中间件,支持对接适配多类外部开源SQL执行引擎,如Spark.Hive等. 背景 SuperSQ ...

  5. [flink]flink-sql-gateway的调试过程(一)

    目录 前言: 1. 测试脚本的启动过程 1.1 http://localhost:8083/v1/sessions 1.2 发送heartbeat 2. 其他的api 2.1 get_info 2.2 ...

  6. flinksql 解析学习

    Flink sql 之sql 解析篇: 1.主要是为了实现 利用flink 原生引擎去解析sql 生成语法树,打印日志信息便于去维护. 2.flink解析之Calcite和sql 解析过程 sql 解 ...

  7. SQL解析引擎Apache Calcite

    1. 什么是Apache Calcite ? Apache Calcite 是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通 ...

  8. 95-910-330-源码-FlinkSQL-Calcite-Flink结合Calcite

    1.世界 2.概述 Apache Calcite是什么东东? ​ Apache Calcite面向Hadoop新的sql引擎,它提供了标准的SQL语言.多种查询优化和连接各种数据源的能力.除此之外,C ...

  9. 自定义sql_基于Calcite自定义SQL解析器

    这本应该是<我也能写数据库>系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了. 本文会介绍如何扩展Calcite的SQL解析器使之更符合你的业 ...

最新文章

  1. OpenCV简介与安装
  2. p2148 [SDOI2009]ED
  3. js中Blob对象一般用法
  4. Markdown中数学公式整理
  5. android stackview,Android StackView 使用示例
  6. 【电路】简易的桥式整流电路---选取滤波电容
  7. Python之网络爬虫(Xpath语法、Scrapy框架的认识)
  8. ModBus通信协议的【Modbus RTU 协议使用汇总】
  9. 黑马JAVA P177 定时器
  10. ScreenFlow for mac(最强大的屏幕录像软件)
  11. 还说治理类项目不性感?这个DAO上线半年吸金700万美元
  12. mysql 免安装版 启动_mysql 免安装版服务启动
  13. Excel给文档设置(取消)密码(打开密码和修改密码)
  14. 信息熵:什么是信息熵?
  15. Google退出中国了
  16. 快递100快递java_快递100 java 示例API 返回结果乱码 之替代方案
  17. Android设置顶部状态栏颜色
  18. PUTT(psftp)文件上传下载
  19. BIOS知识枝桠——Event
  20. Mikrotik RouterOS-脚本-花生壳动态域名解析

热门文章

  1. (转) 咖啡猫的至理名言
  2. 职场人需要的2大礼物
  3. web应用开发 -- 课堂作业 个人简介
  4. 幽夜至,辞夏迎秋月抒怀
  5. python入门学习(excel导入mysql)
  6. C#表达式目录树系列之5 –动态创建查询表达式
  7. 基于K-Means聚类算法对NBA球员数据的聚类分析
  8. 漂亮的非主流图片(38p)
  9. 关于微信群、QQ群和其他发布平台
  10. Python中的算数运算符