KaiwuDB 解析器之语义解析

news2024/11/13 20:48:52

KaiwuDB 解析器介绍

解析器是数据库系统的重要组成部分之一,主要的功能是将客户端输入的 SQL 语句分解为语法单元,然后将这些语法单元转化成数据库内部可识别的数据结构,最终生成数据库可以执行的计划。

KaiwuDB 的一条 SQL 执行的整个生命周期:

  • 从客户端输入一个 SQL 指令(文本格式),数据库执行器无法直接执行该文本指令,会先通过词法解析和语法解析将文本指令生成数据库能识别的数据结构 AST;
  • 语义解析对 AST 进行有效性校验,生成优化器需要的 Memo 数据结构;
  • 通过优化器(包括 RBO、CBO)优化后选出一个最优的 Memo 结构;
  • 经过逻辑计划构建,生成一个 Plan 数据结构;
  • 通过物理计划构建,生成数据库可执行的数据结构 Physical Plan,最终执行返回结构。

image.png

KaiwuDB 的解析器在整个 SQL 生命周期所处的位置比较靠前,介于客户端和优化器之间,主要功能是将客户端发来的文本指令转化成数据库能识别的数据结构,最后转成优化器需要的数据结构,具体包括三部分:词法解析,语法解析,语义解析。

  • 词法解析:从左到右逐个字符地读入文本,根据构词规则以及空格,将 SQL 文本切成词和符号;
  • 语法解析:在词法分析的基础上将单词序列按照定义好的语法规则组合成各类语法短语,语法分析程序判断源程序在结构上是否正确,并构建出抽象语法树 AST;
  • 语义解析:主要对获得的 AST 进行审查。

KaiwuDB 语义解析原理

在 KaiwuDB 语义解析阶段,会获取到对应 SQL 的 AST,通过解析完 AST 中需要解析的部分,比如下图 AST 中,查询列表的未解析名称、From Clause 中的表名、Where Clause 中未解析名称,最后转化成 Memo 数据结构,供后面优化器优化使用。

对应的,From Clause 转成 Scan Expr,Where Clause 转成 Select Expr,查询列表转成 Project Expr,其中解析完之后表名会用表 ID 表示,列名用列 ID 表示,这就是语义解析主要功能。

image.png
image.png
image.png

表名解析

1、校验前缀:如果没有则直接校验表名,否则,先校验前缀是否存在,如果不存在需要报错,如果存在就继续解析表名。
2、解析表名:校验表名在缓存中是否存在,获取到表的元数据供后续解析使用。

image.png

列名解析

简单列名解析

1、判断是否有前缀,如果没有,直接校验表名;否则,先校验这个表前缀是不是前面解析出来的表,如果都不是,则应报错。
2、检验列名,通过对应表的元数据校验有没有该列,如果没有,则应报错;如果有,则解析成功,获取到列的元数据供后面解析使用。

image.png

函数列解析

1、先解析函数名称,会有一份定义列表,从定义列表查看该函数是否已定义的函数,如果不是应报错。
2、解析函数参数,如果函数的参数存在列,那么就需要校验列的有效性。
3、校验列的类型是否与事先定义好的参数类型一致,如不一致需要报错;如都解析过了,就会获得函数列的信息供后续使用。

image.png图片

复合运算列解析

1、先校验操作符是否被定义过,操作符也有一个定义列表,如在定义列表中没找到则需要报错;如能找到,就会获取该操作符定义的所有表达式。
2、遍历操作符左右表达式,比如 a+5,左表达式是 a 列,右表达式是 5。
3、判断是否是列,如果是就校验列的有效性。
4、根据左表达式类型筛选出部分操作符表达式,后再根据右表达式类型筛选出最终操作符表达式。
5、如操作符最终表达式个数为 0,说明没匹配上,需要报错,操作符最终表达式个数为 1 才是解析成功,最后获得复合运算列的信息,供后续使用。

image.png

点击视频观看完整版回放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

事件知识图谱 - EventKGE_Event knowledge graph embedding with event causal transfer

EventKGE: Event knowledge graph embedding with event causal transfer 作者:Daiyi Li(南航) 来源:2023 Knowledge-Based Systems(中科院一区,影响因子8.8) 论文:[ScienceDirec…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月6日,星期一

每天一分钟,知晓天下事! 2024年5月6日 星期一 农历三月廿八 1、 五一假期全社会跨区域人员流动量预计约13.6亿人次,日均超2.7亿人次。 2、 祝贺!国羽男队第11次夺得汤姆斯杯冠军,国羽女队第16次夺得尤伯杯冠军。 3、…

Windows系统本地部署Net2FTP文件管理网站并实现远程连接上传下载

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…

我独自升级崛起加速器推荐 用什么加速器好用 免费加速器推荐

新韩漫公司所发布的这项动作游戏已向玩家们敞开大门,为大家带来了前所未有的游戏体验和乐趣。这个游戏内包含了大量令人着迷的故事、令人印象深刻的战斗场景以及丰富多样的娱乐元素。在这其中最为引人注目的一点就是游戏内容中融入了“虚拟角色”的元素,…

Docker Compose:简化多容器应用部署

序言 在当今的软件开发中,容器化技术的使用已经很普遍了。而 Docker 作为其中最流行的容器化平台之一,为开发者提供了方便、快捷、一致的开发和部署环境。但是,当我们的应用开始变得更加复杂,涉及到多个容器时,手动管…

HTML_CSS学习:定位

一、相对定位 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>相对定位</title><style>.outer{width: 500px;background-color: #999ff0;border: 1px solid #000;p…

vue-cli+vue3+vite+ts 搭建uniapp项目全过程(一)

unapp官方提供了cli 脚手架创建 uni-app 项目的文档 Vue3/Vite版要求 node 版本 18、20使用Vue3/Vite版创建不会提示选择模板&#xff0c;目前只支持创建默认模板 本文以vue3vitets为例 1、初始化项目 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 执行完生成…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务&#xff0c;可以请求独立的绘制帧率进行内容开发&#xff0c;如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明&#xff1a; 本范例是通过Drawing在Native侧实现图形的绘制&#xff0c;并将其呈现在NativeWindow上 1.定义Ark…

与Apollo共创生态:助力自动驾驶迈向新台阶

引言Apollo七周年大会企业协同工具链携手伙伴共创生态未来展望与总结 引言 2024年4月19日&#xff0c;一场智能汽车未来的盛宴正朝我们走来——Apollo开放平台的七周年大会。 此次大会主题为“破晓•拥抱智变时刻”其中“破晓”象征着新时代的曙光&#xff0c;意味着智能汽车技…

电脑问题2【彻底删除CompatTelRunner】

彻底删除CompatTelRunner 电脑偶尔会运行CompatTelRunner造成CPU占用的资源非常大,所以这里要想办法彻底关闭他 本文摘录于&#xff1a;https://mwell.tech/archives/539只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 解决办法是进入W…

软件测试,软件评测师

如果你想考软件评测师证书&#xff0c;那这篇文章可以帮你少走很多弯路&#xff0c;估计你用别人一半的时间备考就可以通过考试&#xff0c;以下为本人亲身经验哈&#xff0c;你可以先收藏后看哦&#xff0c;提前祝你考试过过过。 如果以后想从事一份软件测试工程师的工作&…

2024.5.6

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口大小this->resize(1000,740);//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\Administrator\\Desktop\\pictrue\\Plants.png"));//设置窗口标题this-…

柯桥西语培训之在西班牙旅游点菜哪些坑不能踩?

Por muy bien que se coma en Espaa —que es mucho— hay una cosa innegable: lo que pasa en la cocina se queda en la cocina. No todos los alimentos son igualmente seguros o sabrosos cuando se encuentran fuera de la comodidad de nuestra propia casa. Ya sea po…

保持 Hiti 证卡打印机清洁的重要性和推荐的清洁用品

在证卡印刷业务中&#xff0c;保持印刷设备的清洁至关重要。特别是对于 Hiti 证卡打印机来说&#xff0c;它们是生产高质量证卡的关键工具。保持设备清洁不仅可以保证打印质量和效率&#xff0c;还可以延长其使用寿命。本文将探讨保持 Hiti 证卡打印机清洁卡的重要性&#xff0…

StreamingT2V

下面首先是参考的一些博客 https://blog.csdn.net/qq_44681809/article/details/137081515 qustion SDEdit:就是给图片加一点噪声然后再用模型去噪&#xff0c;来获得一个更好的帧&#xff0c;比如去掉伪影和污点 这里的分割为m个24帧的块&#xff0c;块与块之间已经有8帧重叠…

js之遍历方法

先创建一个数组&#xff0c;然后使用for.in进行遍历&#xff0c;如下图所示sub代表下标并且遍历几次&#xff0c;arr代表数组 <script>let arr [1, 2, 3, 4, 5, 6];for (let sub in arr) {console.log(arr);}</script> 第二种方法则是for循环遍历&#xff0c;根据…

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…

【哈希表】Leetcode 14. 最长公共前缀

题目讲解 14. 最长公共前缀 算法讲解 我们使用当前第一个字符串中的与后面的字符串作比较&#xff0c;如果第一个字符串中的字符没有出现在后面的字符串中&#xff0c;我们就直接返回&#xff1b;反之当容器中的所有字符串都遍历完成&#xff0c;说明所有的字符串都在该位置…

Java二维码、条码生成及解码工具类

功能描述 生成二维码、条码解码使用谷歌的zxing依赖 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version> </dependency><dependency><groupId>…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;…