【手写数据库toadb】代码又更新了,增加了解析树,查询树,执行计划,向更多复杂SQL迈进了一步

toadb updated by 2023/11/15

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • toadb updated by 2023/11/15
  • 概述
  • 更新内容
  • 举例说明
  • 支持情况
  • 结尾

概述

主要更新了解析树,增加了查询树和执行计划树的生成,这有利于带条件SQL和复杂SQL处理,同时节点化各个关系代数运算后,有利于执行计划优化的实现。与此同时,更新了执行器,可以通过输入的计划树来执行,不再像以前通过SQL解析结果。

更新内容

下面将分别描述更新的内容:

  • 解析树

在词法分析、语法分析的过程中,会生成解析树,将用不同节点来表示各子句及存储它们传递的信息,这样有助于后续步骤的开展。在开发解析树时,尽可能与存储模型,数据库类型无关,希望做成一个通用的SQL解析器,它的输入就是SQL字符,输出就是解析树,不像现在每种类型的数据都有一个解析器。真正与数据库,存储模型相关的,是在下一步骤,也就是查询树。

  • 查询树

查询树,也叫做逻辑执行计划,它的主要是把SQL用关系代数进行表达,不同关系代数用不同节点表示,树的层次来表示节点之间的关系。当然在转换的过程中,会对SQL中的数据进行检查,比如表是否存在,表的元数据是否一致等;同时还会对一些SQL子句进行展开和替换,比如对sellect *, 将它的结果目标列替换为所有的属性列,这就是常说的重写的过程。当然,在真实数据库中,重写阶段还会对视图,规则等进行处理。

  • 计划树

计划树,也叫执行计划,或者叫做物理执行计划树,它是一个树状结构,每个节点的类型对应着真正要执行的动作。当然未来会在生成计划树之前,可以再增加一个优化器,对各种可能的SQL子句进行重新整理,提升子句,逻辑检查等,这将大大提升执行的效率。

  • 执行器

之前只对简单的SQL执行全表查询,更新后通过输入的物理执行计划,只需要递归的遍历执行计划的节点,按对应节点的类型执行相应动作即可,然后返回target对应的元组,更新后执行器更加通用,更加灵活。
未来增加索引,优化节点执行动作,增加节点执行接口,这些将变成局部修改。

  • 内存管理

之前对于动态内存申请并没有进行释放管理,本次增加了一个简单的内存管理,实现一种内存上下文的机制,在上下文使用完成后,会统一释放之前上下文中申请的内存。在程序退出时,会释放所有申请的内存。同时,为了方便调式,对于动态申请的内存,标定了内存的起始和结尾,这样可以方便探测到内存越界的情况。
这是一个公共组件,目前只是简单实现,后期与数据库的缓存管理一起进行模块级实现。

举例说明

下面举几个例子说明一下变化情况。

  • insert 语句

比如insert into tablename(...) values(...),(...); ,这条插入语句。

之前是通过遍历values子句,循环执行执行表的动作。

更新之后,values子句转换为一个虚似的表,在执行计划中,会有一个表扫描的节点,将返回的元组,再执行一个ModifyTable动作。这样就是一个通用的操作,未来很方便的支持insert into ... select ...这种形式,或者更复杂的形式。

  • select 语句
    如上所述,之前只有一个表的全表扫描。现在对于表扫描,实现一种迭代器的扫描方式,每次可以返回下一个扫描到的元组。对于多表和带条件表达式时,增加控制节点,比如两个表的连接,会增加嵌套循环节点,先从外表中拿到一个元组,再从内表中依次扫描元组,如果两表都有元组,则输出结果,当内表遍历完时,从外表再扫描下一个元组,再从头遍历内表。

目前只有顺序扫描和嵌套循环两种实现路径。

支持情况

目前toadb支持的SQL语法有:

  • DDL

create table tableName(columnName type,...);
drop table tableName;
创建表和删除表的SQL支持;

  • DML

insert into tablename(...) values(...),(...);
向表中插入数据,可以是一个values,也可以带多组值;

  • DQL

select columName,.. from tableName,.. where qual and qual or qual;
可以查询单个或多个表,带有条件(目前需要带一个条件),目前对条件并没有处理,只是简单的返回全表。当查询为多表时,会以积的形式返回结果,也就是两边非空的所有列。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

003.文件描述符、重定向

1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入(stdin)、标准输出(stdout&am…

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

nvidia-docker部署pytorch服务【GPU工作站】

文章目录 一、安装 Docker二、安装 NVIDIA Container Toolkit三、宿主机安装 cuda 和 nvidia-driver四、测试一、安装 Docker 可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/124237932 二、安装 NVIDIA Container Toolkit 参考nvidia官方 https:/…

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 &#x1f4a6;什么是字符串 &#x1f4a6;字符串如何存储&#xff1f; 二、字符串常量和字符数组 &#x1f4a6;字符串常量 ✨什么是字符串常量&#xff1f; ✨字符串常量与指针 &#x1f4a6;字符数组 ✨字符数组的应用 &#x1f4a6;字符串常量与字符数组的…

Flink和Kafka连接时的精确一次保证

Flink写入Kafka两阶段提交 端到端的 exactly-once&#xff08;精准一次&#xff09; kafka -> Flink -> kafka 1&#xff09;输入端 输入数据源端的 Kafka 可以对数据进行持久化保存&#xff0c;并可以重置偏移量&#xff08;offset&#xff09; 2&#xff09;Flink内…

k8s-集群升级 2

在每个集群节点都安装部署cir-docker 配置cri-docker 升级master节点 导入镜像到本地并将其上传到仓库 修改节点套接字 升级kubelet 注&#xff1a;先腾空后进行升级&#xff0c;顺序不能搞反&#xff0c;否则会导致严重问题 配置kubelet使用cri-docker 解除节点保护 升级wor…

水库大坝安全监测预警系统的重要作用

水库大坝建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;在各种荷载的作用和自然因素的影响下&#xff0c;其工作性态和安全状况随时都在变化。如果出现异常&#xff0c;又不被及时发现&#xff0c;其后果不堪设想。全天候实时监测&#xff0c;实时掌握水库水位、雨情…

postman连接数据库

参考&#xff1a;https://blog.csdn.net/qq_45572452/article/details/126620210 1、安装node.js 2、配置环境变量 3、安装xmysql连接数据库cmd窗口输入"npm install -g xmysql"后回车cmd窗口输入"xmysql"后回车,验证xmysql是否安装成功(下图代表安装成功)…

【ATTCK】ATTCK视角下的水坑钓鱼攻防战法

在网络安全领域&#xff0c;ATT&CK已经成为了研究和理解恶意攻击者行为的重要工具。站在攻击者的视角&#xff0c;ATT&CK为我们描绘了他们在攻击过程中所使用的各种战术、技术和常见知识。本文将结合ATT&CK框架&#xff0c;对水坑钓鱼攻击进行深入分析&#xff0c;…

【C++面向对象】13. 接口 / 抽象类*

文章目录 【 1. 抽象类 】1.1 抽象类的定义1.2 抽象类的应用条件1.3 实例 【 2. 设计策略 】 接口描述了类的行为和功能&#xff0c;而不需要完成类的特定实现。C 接口是使用 抽象类&#xff08;abstract base class&#xff0c;也称为ABC&#xff09; 来实现的。 【 1. 抽象类…

phalcon 访问IndexController 中只能访问indexAction方法,访问不了testAction等其它问题的解决办法

phalcon 访问IndexController 中只能访问indexAction方法&#xff0c;访问不了testAction&#xff0c;也访问不了indexAction方法&#xff0c;但是可以访问ArticleController里面的任意方法。访问其它方法出现这个错误“php - phalcon IndexController handler class cannot be…

配置开启Docker2375远程连接与解决Docker未授权访问漏洞

一、配置开启Docker远程连接 首先需要安装docker,参考我这篇文章&#xff1a;基于CentOS7安装配置docker与docker-compose 配置开启Docker远程连接的步骤&#xff1a; //1-编辑/usr/lib/systemd/system/docker.service 文件 vim /usr/lib/systemd/system/docker.service //2…

2023鸿蒙预定未来,环境搭建学习

鸿蒙开发基础知识 鸿蒙的基本概念和特点 鸿蒙&#xff08;HarmonyOS&#xff09;是华为公司开发的一款全场景分布式操作系统。它的设计目标是为各种设备提供统一的、无缝的用户体验。鸿蒙的核心特点包括以下几个方面&#xff1a; 分布式架构&#xff1a;鸿蒙采用分布式架构&…

LCD1602指定位置显示字符串-详细版

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

Django模板层

模板之变量 所有的数据类型都可以在模板中使用 render(request, index.html, context{}) render(request, index.html, contextlocals()) """在模板中使用变量的时候&#xff0c;用的是字典的key值&#xff0c;key值value值一般保持一致"""详细…

DigitalVirt 洛杉矶 CMIN2 VPS 测评

发布于 2023-07-16 在 https://chenhaotian.top/vps/digitalvirt-us-cmin2/ 官网链接&#xff08;含AFF&#xff09;&#xff1a;https://digitalvirt.com/aff.php?aff459 美国西海岸 四网回程 CMIN2 移动新线路。 晚高峰延迟 165ms 左右&#xff0c;不丢包&#xff0c;非常…

Linux安装RabbitMQ详细教程

一、下载安装包 下载erlang-21.3-1.el7.x86_64.rpm、rabbitmq-server-3.8.8-1.el7.noarch.rpm 二、安装过程 1、解压erlang-21.3-1.el7.x86_64.rpm rpm -ivh erlang-21.3-1.el7.x86_64.rpm2、安装erlang yum install -y erlang3、查看erlang版本号 erl -v4、安装socat …

【1567.乘积为正数的最长子数组长度】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getMaxLen(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]nums[0]>0?1:0;g[0]nums[0]<0?1:0…

vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例

背景&#xff1a;vue项目 使用this.$router.push进行路由跳转时&#xff0c;可以通过query或params参数传递和接收参数。 通过query参数传递参数&#xff1a; // 传递参数 this.$router.push({path: /target,query: {id: 1,name: John} }); // 接收参数 this.$route.query.id …