KaiwuDB 解析器之语义解析

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.rhkb.cn/news/323428.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据刷盘测试

达梦数据库为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。 下面我们通过测试来验证是不是这样 执行我们事先准备的SHELL脚本 可以看到第一次strings文件没有输出,说明刚写的数据在数据库的BUFFER缓冲区内,还没有刷…

什么样的人能上百度词条

百度百科是一个向所有互联网用户开放的平台,任何人都可以创建或编辑词条。然而,并不是所有的人物或事物都能被收录到百度百科中,它有一定的收录标准和审结的关于哪些人或事物能上百度百科的条件和流程。 百度百科的收录标准 知名度和影响力&…

太牛了!360大佬编写的《应急响应指导手册》火了!(PDF限时3天领取)

免责声明: 请使用者遵守《中华人民共和国网络安全法》,由于传播、利用本账号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。 简介 这份《应急响应指导手册》&#xf…

OpenNJet评测,探寻云原生之美

在信息时代的大海上,云原生应用引擎如一艘航行于波涛之间的帆船,承载着创新的梦想和数字化的未来。本文将带领您登上这艘船,聚焦其中之一的OpenNJet,一同探寻其中的奥秘和精妙,领略其独特之美。 OpenNJet 内容浅析 O…

每日Attention学习3——Cross-level Feature Fusion

模块出处 [link] [code] [PR 23] Cross-level Feature Aggregation Network for Polyp Segmentation 模块名称 Cross-level Feature Fusion (CFF) 模块作用 双级特征融合 模块结构 模块代码 import torch import torch.nn as nnclass BasicConv2d(nn.Module):def __init__(…

Python批量备份华为设备配置到FTP服务器

Excel表格存放交换机信息: 备份文件夹效果图: Windows系统配置计划任务定时执行python脚本: Program/script:C:\Python\python.exe Add arguments (optional): D:\Python_PycharmProjects\JunLan_pythonProje…

AWS Cli Windows安装配置

1. 安装 下载地址:AWS 命令行界面(CLI)_管理AWS服务的统一工具-AWS云服务 检验安装: > aws --version aws-cli/2.15.44 Python/3.11.8 Windows/10 exe/AMD64 prompt/off 2. 创建IAM用户 1) 创建组 选择IAM 点击创建组 填写用户组名,…

c++——类和对象(中)

1.类的六个默认成员函数 在一个空类中真的什么都没有吗,错!在创建类的时候,编译器自动生成六个函数,这六个函数叫默认成员函数。但是,如果我们自己实现六个同名函数(依旧有默认成员函数的特性,…

Django项目之电商购物商城 -- 创建收货地址

Django项目之电商购物商城 – 创建收货地址 一. 在users中创建新的视图与路由用于创建收货地址 # 设置收货地址 class AddressView(View):def get(self , request):return render(request , "user_center_site.html")# 设置收货地址path(user_center_site/, views.…

金和OAC6 FileDownLoad 任意文件读取漏洞

文章目录 免责声明漏洞描述漏洞原理影响版本漏洞复现修复建议 免责声明 没有网络安全就没有国家安全,该文章只为学习和交流,利用做违法乱纪的事,与本人无关 漏洞描述 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,…

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts

这门课程专注于提示工程的掌握,教你以精确的方式引导GPT,利用它们的生成能力产生卓越的AI驱动结果。一步一步地,你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI,到以惊…

IDEA切换分支

方法一 1、选择要切换分支的module 2、右键,选择git 3、再点击branches 4、可以看到当前module的本地分支(local Branches)及远程分支(Remote Branches)列表。点击你要切换到的分支,Checkout即可。 方法二 1、点击…

MATLAB模拟退火算法、遗传算法、蚁群算法、粒子群算法

概况 模拟退火算法、遗传算法、蚁群算法、粒子群算法等算法,都是属于概率算法,不绝对,不迅速,能用其它方式解决的问题,不要用这些相对复杂的算法,比如有明确的线性关系或者非线性对应关系。这里的概率算法…

大模型背后的秘密公式: Q*?

这麽说好像我是James Bond后面那个厉害的Q先生,Q是英文Quartermaster(軍需官)第1個英文字大寫,是007系列英國祕勤局虛構部門Q部門的領導。 Stanford大学的研究者最近发表了一篇名为"From r to Q*: Your Language Model is S…

回答篇:测试开发高频面试题目

引用之前文章:《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇(持续更新中) 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

基于 stable diffusion 制作上世纪90年代的游戏美术风格

1. 项目背景 目前游戏项目中出现美术产能不足的瓶颈&#xff0c;如果使用 midjourney 之类的第三方生成式人工智能产品生成美术素材的话&#xff0c;一方面需要将我们的美术资产投喂给第三方企业进行风格训练&#xff0c;有安全性上的风险&#xff0c;另一方面&#xff0c;第三…

华为ensp中BFD和OSPF联动(原理及配置命令)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月6日20点26分 BFD通常指的是双向转发检测。BFD是一个旨在快速检测通信链路故障的网络协议&#xff0c;提供了低开销、短延迟的链路故障检测机制。它主要用于监测两个…

VisualGDB:Linux静态库项目创建、编译及库的使用

接上篇《VisualGDB&#xff1a;Linux动态库项目创建、编译及库的使用》&#xff0c;静态库的创建和使用与动态库基本无差别&#xff0c;唯一需要做的就是指定项目生成静态库。 一、指定项目生成静态库 二、重新构建和编译项目 这里注意&#xff0c;同样要copy一个libxxx.so格式…

【Spring】GoF 之代理模式

一、代理模式 在 Java 程序中的代理模式的作用&#xff1a; 当一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象去完成某个行为 需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 A 对象无法和 B 对象直接交互时&#xff0c;也可以…