首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Calcite SQL解析器-- SELECT语句根节点类型并不总是SqlSelect

确实,Calcite SQL解析器中的SELECT语句根节点类型并不总是SqlSelect。实际上,Calcite SQL解析器会根据SQL语句的类型生成不同的根节点。以下是一些可能的根节点类型:

  1. SqlSelect:当SQL语句是一个标准的SELECT查询时,根节点类型为SqlSelect。
  2. SqlJoin:当SQL语句涉及到多个表的连接操作时,根节点类型为SqlJoin。
  3. SqlProject:当SQL语句包含SELECT DISTINCT或者GROUP BY子句时,根节点类型为SqlProject。
  4. SqlFilter:当SQL语句包含WHERE子句时,根节点类型为SqlFilter。
  5. SqlAggregate:当SQL语句包含聚合函数(如COUNT、SUM、AVG等)时,根节点类型为SqlAggregate。
  6. SqlSort:当SQL语句包含ORDER BY子句时,根节点类型为SqlSort。
  7. SqlLimit:当SQL语句包含LIMIT子句时,根节点类型为SqlLimit。
  8. SqlUnion:当SQL语句包含UNION、INTERSECT或EXCEPT操作时,根节点类型为SqlUnion。
  9. SqlSetOperator:当SQL语句包含SET操作(如INTERSECT ALL、EXCEPT ALL等)时,根节点类型为SqlSetOperator。
  10. SqlWithItem:当SQL语句包含WITH子句时,根节点类型为SqlWithItem。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Calcite系列(六):执行流程-语法解析

    、标识符、标识符、字面量等 语法分析:识别出AST的树状语法结构,可基于递归下降算法(自顶向下)构造,其中节点(RootNode)可代表整个语法树 目前广泛使用的语法解析框架主要包括ANTLR、JavaCC...SQL Statement列表 词法分析器 词法分析器:定义Token解析器,基于正则文法匹配对应类型,分为四类: SKIP:词法解析忽略处理 MORE:需继续读取下一个文本符 TOKEN:匹配TOKEN...类似 抽象语法树 在Calcite中,基于SqlNode表示AST抽象语法树,一个SqlNode可对应语法树中的一个节点,即对应SQL语句中的一个元素。...;也可以用于描述语法结构,如 SELECT(SqlSelect)、INSERT(SqlInsert) SqlIdentifier:代表 SQL标识符,例如表名、列名等 SqlLiteral:代表 SQL...字面量,例如字符串、数字、日期等 SqlDataTypeSpec:代表数据类型规范,描述数据类型的各种属性,包括基本类型、精度、字符集等 在Calcite中,SqlOperator代表SQL语句中的运算符

    63273

    Calcite源码学习】SqlNode方言转换

    其中,在parse和validate阶段,会生成一个parse tree,树中的节点都是SqlNode的类型。...在optimize节点Calcite会将parse tree转换为RelNode,同时进行一些优化,这属于logical plan。...在使用Calcite的parser进行解析之后,SQL就会被转换成一颗parse tree,树中每一个节点都对应一个SqlNode。对于非叶子结点,基本都是一个SqlCall,继承SqlNode。...而我们常见的各种SQL类型,都是继承了SqlCall,例如select查询,对应的是SqlSelect;create、drop等ddl,对应的是SqlDdl等。...这里我们看下一个SqlSelect的组成: 可以看到一个SqlSelect的parse tree主要包含了select list、from、where等部分,每个部分又由其各自的成员组成。

    3.9K20

    Calcite - 看懂 Parser.jj 中的 SqlSelect

    javacc 会根据 parser.jj 中定义的相互穿插的 Token、Java 代码来自动生成 org.apache.calcite.sql.parser.impl.SqlParserImpl 的代码...本文期望以一个简单的 Select 语句为例来说清楚 Sql 语句Sql 语法定义、SqlParser 之间的关系。...sql 文本如下: select * from emp where empno > 5 and gender = 'F' Parser.jj(语法定义文件)和类 SqlParserImpl 中的 SqlSelect...我们知道,词法解析器会将一段 Sql 解析为一个 Token list(有序的),当我们拿一组 Token 去匹配一段语法定义时,每次遇到语法中如上所述的 Token 定义(我们这里称之为 expectedToken...如果两者类型不一致,说明 Sql 文本(可能是局部的)与当前的定义不匹配,抛异常 jj_consume_token 的主要实现逻辑如下(去除了一些非关键代码): // SELECT 的 kind 值为

    2.1K20

    使用Calcite解析Sql做维表关联(一)

    看一个sql语句select * from orders o join gdsInfo g on o.gdsId=g.gdsId orders表示流表,gdsInfo 表示维表。...根据sql解析顺序先 from 部分、然后where 部分、最后select,那么对于join 方式,相当于join生成了一张临时表,然后去select 这张临时表,因此可以确认 sql解析流程: 1....解析join部分,生成临时表 3. select 临时表 现在使用calcite解析这条语句 public class ParseDemo { public static void main(...节点与SqlJoin节点,执行逻辑就是根据SqlJoin节点做维表关联之后生成新的表,然后去select这样新的表。...sql解析部分已经完成,既然使用sql化方式,因此也需要定义源表与维表,数据源一般是kafka, 定义源表需要:表名称、字段名称、字段类型、数据格式、topic;维表假设为mysql,需要定义:表名称、

    84930

    统一元数据:数据血缘

    Hive Hook生成的血缘信息会发送到消息中间件,基于Hive原生的HookContext中获取血缘信息,支持血缘解析的Hive SQL类型: CREATETABLE_AS_SELECT:基于Select...Calcite也可支持数据血缘解析,由于Calcite主要针对统一的SQL方言,对原生多方言支持较弱,因此会有很多工作量在于扩展原生的SQL方言,该实现可参考 Linkedin Coral 处理。...示例(CREATE AS SELECT 语句):create table table_02 as select id,name from table_01,获取语法解析的AST如下: ROOT:为AST...的节点信息,SQL解析的起点; SQL关键字(绿色框):如CREATE、TABLE、EXTERNAL等; SQL表达式(紫色框):每个SQL表达式都维护父节点信息; SQL解析器(黄色框):解析指定SQL...语句类型,根据不同SQLParser解析器,可生成不同AST子树; 通过对AST语法树的遍历,可得到如下 表血缘:table_01 → table_02 字段血缘:table_01.id → table

    2K95

    如何实现一个SQL解析器

    比如如下SQL语句SQL示例SELECT name FROM tab WHERE id=1001;约定规则如下:上表中,红色的内容通常表示终结符,它们一般是大写的关键字或者符号等,小写的内容是非终结符...比如如下语句SQL示例SELECT name FROM tab WHERE id=1001;上述SQL语句,语义分析任务会做如下检查:SQL语句中表名是否存在;字段name是否存在于表tab中;WHERE...四、 如何选择SQL解析器?在了解了解析器的核心知识点后,如何选择合适的SQL解析器来应用到我们的实际业务当中呢?下面,我们来对比一下主流的两种SQL解析器。它们分别是ANTLR和Calcite。...Token流再最终组装成一棵语法分析树,其中包含叶子节点(TerminalNode)和非叶子节点(RuleNode)。...比如,如下两个例子:例子1:作为一个SQL解析器,关键的SQL解析,Calcite没有重复造轮子,而是直接使用了开源的JavaCC,来将SQL语句转化为Java代码,然后进一步转化成一棵抽象语法树(AST

    2.5K31

    10分钟教你写一个数据库

    今天教大家借助一款框架快速实现一个数据库,这个框架就是Calcite,下面会带大家通过两个例子快速教会大家怎么实现,一个是可以通过 SQL 语句的方式可以直接查询文件内容,第二个是模拟 Mysql 查询功能...SqlSelect,当前 SqlNode 也能反解析为 SQL 文本。...最后 至此我们需要准备的东西:库、表名称、字段名称、字段类型都有了,接下来我们去写我们的 SQL 语句查询我们的数据文件。...SQL 解析器解析,解析器的工作内容就是将 SQL 中的 Token 解析成抽象语法树,每个树的节点都是一个 SqlNode,这个过程其实就是 Sql Text => SqlNode 的过程。...SQL Validator SQL 语句先经过 Parser,然后经过语法验证器,注意 Parser 并不会验证语法的正确性。

    1K20

    使用Calcite解析Sql做维表关联(二)

    继上一篇中使用Calcite解析Sql做维表关联(一) 介绍了建表语句解析方式以及使用calcite解析解析流表join维表方法,这一篇将会介绍如何使用代码去实现将sql变为可执行的代码。...实现流程分析: 注册表 根据对create语句解析的结果:表名称、字段信息、表属性,注册成为相应的源表、结果表; join 拆解 使用calcite 解析后得到两个部分join部分、insert部分,join...以异步查询mysql为例分析:需要根据维表定义的字段、join的关联条件解析生成一条sql语句,根据流入数据解析出sql的查询条件值,然后查询得到对应的维表值,将流入数据与查询得到的维表数据拼接起来输出到下游...StringBuilder(); StringBuilder selects=new StringBuilder(); sql.append("select ");...字段根据上面得到新的字段名称hashBasedTable进行替换: SqlInsert sqlInsert=(SqlInsert)sqlNode1; SqlSelect source=(SqlSelect

    58220

    flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)

    自定义 sql 解析器:比如说我们新发明了一个引擎,然后我们要在这个引擎上来创造一套基于 sql 的接口,那么我们就可以使用直接 calcite,不用自己去写一套专门的 sql解析器,以及执行以及优化引擎...,对象很重要,有了这些对象(SqlSelect、SqlNode),就可以根据这些对象做具体逻辑处理了。...举个例子,如下图,一条简单的 select c,d from source where a = '6' sql,经过 calcite 的解析之后,就可以得到 AST model(SqlNode)。...5 如上图,引擎 sql 解析器的生成是有一个输入的,就是 用户自定义语法分析规则变量,具体引擎的 sql 解析器其实也是根据用户自定义的 解析规则 去生成的 解析器。...其 解析器 的动态生成依赖 javacc 这样的组件。calcite 提供的是统一的 sql AST 模型、优化模型接口等,而具体的解析实现交给了用户自己去决定。

    2.2K20

    我也能写数据库 —— UDF

    org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:225) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression...) ... 26 more 对于开发者来说,有变化总是好事,说明可能找到问题点了,再仔细看看日志,果然,编码问题,搞起。...在写过滤的时候,其实就发现了,没有正确的数据类型,是走不远的,所以有必要把数据类型对应好,既然是模拟数据库,那么数据基本类型,还是使用SQL习惯的类型,而这里对java还是需要有一个映射关系。...java.util.Set;/** * 这里使用了GUAVA的table 作为存SQL和JAVA数据类型的数据结构 * 这并不是一个好的设计,而是为了让大家更容易理解而做的设计 */ public class...,第二个是SQL数据类型,第三个参数是对应的JAVA类型

    1.5K50

    【Flink】第二十九篇:源码分析 Blink Planner

    Blink SQL执行过程: 在Blink Planner中,Tabel API和SQL语句两者在Operation层面进行了统一。...SQL的执行过程分为两个大的阶段: 从SQL语句到Operation 从Operation到Transformation 源码中的入口在:TableEnvironmentImpl 从SQL语句到Operation...语法解析器 Parser:语法解析器通常作为 编译器 或 解释器 出现。它的作用是进行语法检查,并构建由输入单词(Token)组成的数据结构(AST)。...主要就是做两方面校验: 有状态校验,是否符合SQL规范 无状态校验,通过与元数据结合验证SQL中的Schema、Field、Function是否存在,输入输出类型是否匹配 3....SqlToOperationConverter#toQueryOperation, 代码的关系位置已经给出注释:将经过验证后的qlNode转换为relational tree(关系树)即我们理解的RelNode(节点

    1.9K10

    如何使用calcite rule做SQL重写(上)

    rule 做sql重写 下篇介绍如何自定义 rule 来实现rewrite sql 第三篇作为番外,不限于calcite,泛化倒使用 AST + Vistor,来完成真正意义上的SQL语句重写。...在这里可能伴随着Sql语句得优化,也可能是对执行计划的优化。 下面我们以SQL优化为例,来看看calcite如何做。...Calcite优化器 Calcite提供了两类型的优化器,即上述所说的RBO优化器和CBO优化器,在Calcite中的具体实现类对应HepPlanner(RBO)和VolcanoPlanner(CBO...HepPlanner优化器 HepPlanner简单理解就是两个循环,第一个循环会遍历用户提供的rule,第二个循环会遍历SQL树的节点,每当rule匹配到对应树节点的时候,会重新进行一遍循环。...自定义SQL解析器 基于JDBC实现VPD:SQL解析篇 如何成为一个成功的首席数据官 基于Win10单机部署kubernetes应用 浅谈基于JDBC实现虚拟专用数据库(VPD)

    1.3K21

    个推基于Flink SQL建设实时数仓实践

    、topic from source_table解析成SqlNode(SqlSelect)并生成相应的RelNode。...也就是说,执行创建视图的语句时,最终创建的临时表仅仅是缓存了查询部分的SQL语句,当其他命令使用这个临时表时还需要重新解析临时表中的查询语句,而重新解析带来的问题就是创建新的RelNode,产生不同的摘要...目前有2种解决方案: 方案1:框架先使用正则匹配判断SQL类型,之后提取出临时表名和查询逻辑,比如上面的SQL经过正则匹配提取组之后可以得到表名为tmp,查询逻辑为'select SBSTR(data...org.apache.calcite.sql....✦1.3 增加语法解析模版 除了关键字和SqlNode,还需要相应的语法模版,让解析器能够把SQL解析为SqlRegisterTable。

    1.3K40

    带你梳理 Flink SQL Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 本文将简述Flink SQL / Table API的内部实现,为大家把 "从SQL语句到具体执行" 这个流程串起来...SQL流程中涉及到几个重要的节点举例如下: // NOTE : 执行顺序是从上至下, " -----> " 表示生成的实例类型 * * +-----> "left outer JOIN"...它以Apache Calcite这个SQL解析器SQL语义解析,统一生成为 Calcite Logical Plan(SqlNode 树);随后验证;再利用 Calcite的优化器优化转换规则和logical...Flink Sql 执行流程 一条stream sql从提交到calcite解析、优化最后到Flink引擎执行,一般分为以下几个阶段: Sql Parser: 将sql语句通过java cc解析成AST...@4746} "SELECT *\nFROM `UnnamedTable$0`\nWHERE `amount` > 2" 1 = {SqlSelect@4747} "SELECT *\nFROM `

    3.2K30
    领券