首页 > 数据库 >Calcite sql2rel 过程

Calcite sql2rel 过程

时间:2023-06-17 18:15:46浏览次数:40  
标签:bb root sql2rel EMPNO RelNode EMP Calcite 过程 DEPTNO

sql2rel的过程是将SqlNode 转化成RelNode的过程

SqlToRelConverterTest中添加样例测试

  @Test void testScan() {
    String sql = "SELECT * FROM EMP WHERE empno < 10";
    sql(sql).ok();
  }

会生成如下的relnode tree.

LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
  LogicalFilter(condition=[<($0, 10)])
    LogicalTableScan(table=[[CATALOG, SALES, EMP]])

转化的入口
org.apache.calcite.sql2rel.SqlToRelConverter#convertQuery
这里面最重要的就是通过 convertQueryRecursive递归的进行转化

convertSelect

SELECT `EMP`.`EMPNO`, `EMP`.`ENAME`, `EMP`.`JOB`, `EMP`.`MGR`, `EMP`.`HIREDATE`, `EMP`.`SAL`, `EMP`.`COMM`, `EMP`.`DEPTNO`, `EMP`.`SLACKER`
FROM `CATALOG`.`SALES`.`EMP` AS `EMP`
WHERE `EMP`.`EMPNO` < 10

我们这个query的主体是一个SqlSelect所以会通过convertSelect来转化

public RelNode convertSelect(SqlSelect select, boolean top) {
    final SqlValidatorScope selectScope = validator().getWhereScope(select);
    final Blackboard bb = createBlackboard(selectScope, null, top);
    convertSelectImpl(bb, select);
    return castNonNull(bb.root);
}

封装了两个对象 SqlValidatorScope 和 Blackboard。最后我们转化完成的RelNode的root会保存在blackboard中,也就是bb.root.

convertFrom

`CATALOG`.`SALES`.`EMP` AS `EMP`

convertSelect的第一步就是先转化From子句, from 子句有很多种可能, 例如以下这些

a single table ("SALES.EMP"),
an aliased table ("EMP AS E"),
a list of tables ("EMP, DEPT"),
an ANSI Join expression ("EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO"),
a VALUES clause ("VALUES ('Fred', 20)"),
a query ("(SELECT * FROM EMP WHERE GENDER = 'F')"),
or any combination of the above.

这个例子里是一个 CATALOG.SALES.EMP的 SqlIdentifer 然后就会根据这个identifier通过CatalogReader查找这个identifier所表示的table。然后会基于此创建出LogicalTableScan并将该RelNode设置到 BlackBoard中.

ConvertWhere

`EMP`.`EMPNO` < 10

通过Blackboard#convertExpression将上述的SqlBasicCall转化成RexCall (where条件中的是一个rex表达式)
然后会基于Blackboard的当前的root作为input创建一个LogicalFilter节点

final RelNode filter =
    filterFactory.createFilter(bb.root(), convertedWhere2, ImmutableSet.of());
final RelNode r;
final CorrelationUse p = getCorrelationUse(bb, filter);
if (p != null) {
  assert p.r instanceof Filter;
  Filter f = (Filter) p.r;
  r =
      LogicalFilter.create(f.getInput(), f.getCondition(),
          ImmutableSet.of(p.id));
} else {
  r = filter;
}

bb.setRoot(r, false);

这里会先基于前面创建的RexCall创建出filter节点,但是还会看一下这个filter中是否有 correlation variables. 如果有的话需要将这个CorrelationId 添加到Filter中, 这个样例中并没有使用。
到这里RelNode tree 已经是

LogicalFilter(condition=[<($0, 10)])
  LogicalTableScan(table=[[CATALOG, SALES, EMP]])

ConvertSelectList

中间还有convert Orderby,convert Aggregate的操作,不过这个样例中没有,最后就是转化selectList,selectList会被转成Project

LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
  LogicalFilter(condition=[<($0, 10)])
    LogicalTableScan(table=[[CATALOG, SALES, EMP]])

这样通过不断递归convert,完成了SqlNode到RelNode的转化,中间会借助RelBuilder来创建各个RelNode 并通过BlackBoard维护当前的root节点,用于构建整个tree的结构

标签:bb,root,sql2rel,EMPNO,RelNode,EMP,Calcite,过程,DEPTNO
From: https://www.cnblogs.com/Aitozi/p/17487816.html

相关文章

  • 地理坐标系及投影坐标系的构建过程全解析
    [GIS]地理坐标系及投影坐标系的构建过程全解析_哔哩哔哩_bilibili地图坐标系快速入门之地理坐标系_哔哩哔哩_bilibili......
  • HotSpare 9361Raid卡热备盘的设置过程
    HotSpare9361Raid卡热备盘的设置过程摘要公司最近一批服务器到位(去年生产)插满24盘位的960G的SSD的超融合服务器.(硬盘是镁光的!-_-!)想着Raid6虽然数据保护比较好,但是写入是在是太垃圾了.所以想可以增加两块热备的Raid5这样的话虽然比raid6还要多损失一块960G的容......
  • 达梦数据库最新版安装过程
    达梦数据库最新版安装过程背景好久不用达梦数据库了.都是用的两年前安装好的数据库一直在跑(比较稳定,没太宕机)今天有一个新的机器,里面的达梦数据库版本实在是太低了.想着升级一下版本.本地删除重新搭建.但是没想到,两年没用全都忘记了.之前记录的文档也是各种零散.所......
  • 在 Windows 下部署 ChatGLM-6B 过程记录
    1、为git安装lfs模块下载模型文件前,需要安装gitlfs模块以支持大文件的下载。下载地址:https://git-lfs.com/验证:gitlfsinstall2、下载模型文件gitclonehttps://huggingface.co/THUDM/chatglm-6b-int43、......
  • Latex生成pdf过程中遇到cannot run的问题怎么处理?
    如:Latex生成pdf过程中遇到cannotrun的问题怎么处理?提示在生成pdf过程中出现了问题。这说明使用的pdf浏览器地址有问题为了后面修改代码过程中不会出现代码修改了pdf没变的情况,建议直接添加sumatraPDF阅读器直接到官网下载安装包即可。查看准确的安装位置右键->属性 在Late......
  • 2023.6.15 07.数据库存储过程
    07.数据库存储过程存储过程MySQL存储过程是⼀组预编译的SQL语句,可以在MySQL数据库中定义和存储,并在需要时执⾏。存储过程可以接受参数、执⾏条件判断、循环、异常处理等操作,使得开发⼈员可以把⼀系列操作组合成⼀个可重复使⽤的单元,从⽽提⾼代码的复⽤性和可维护......
  • 项目思考过程
    排课系统实现功能分析需求描述(陈述功能地细节)教务处排好课程之后学生选课,最终生成完整的课程表。‚前提条件(想要开启本功能需要提前准备什么,聚集)记录所有课程得课程总表。ƒ操作该功能的人员所在岗位的名称(尽量准确描述员工工作岗位,而非管理员)专业负责人制定培养方案,教务......
  • python篇:在编程过程中遇到的工具问题记录
    1,用pipinstallopencv-python安装cv2后,发现pycharm中importcv2不报错,但是cv2不能点出相关函数   1>使用pipuninstallopencv-python命令,卸载了通过pip安装的cv2包   2>在https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应的安装包,例如我的python是3.8,电脑是6......
  • 从 SpringApplication 认识 Spring 应用启动过程
    一、SpringApplication是什么?Spring应用的启动类。二、SpringApplication执行了什么?创建ApplicationContext实例ApplicationContext就是我们所说的容器实例。注册CommandLinePropertySourceCommandLinePropertySource的作用是将命令行参数输出为Spring属性。......
  • 同步表的存储过程
    四家公司数据同步目录四家公司数据同步MaterialTransactionsView需要的表已同步的表未同步的表(transfer_mst)转移单同步存储过程(prodvar_mst)产品码同步存储过程(projmatl_mst)项目物料表同步存储过程(matltran_amt_mst)物料处理金额表同步存储过程(citemh_mst)客户订单物料历史记录表同......