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

news/2024/7/10 22:05:05 标签: 数据库, sql, c语言, 开源

toadb updated by 2023/11/15

专栏内容

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

开源贡献

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

文章目录

  • 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.niftyadmin.cn/n/5187319.html

相关文章

医疗软件制造商如何实施静态分析,满足 FDA 医疗器械网络安全验证

随着 FDA 对网络安全验证和标准提出更多要求,医疗软件制造商需要采用静态分析来确保其软件满足这些新的安全标准。继续阅读以了解如何实施静态分析来满足这些安全要求。 随着 FDA 在其软件验证指南中添加更多网络安全要求,医疗设备制造商可以转向静态分…

使用VC++实现分段线性变换,直方图均衡化、锐化处理(使用拉普拉斯算子)

图像锐化1 实验要求 5.1实验目的、要求 实验目的: (1)掌握图像增强的原理与相关方法。 (2)能使用VC实现图像增强的一些相关功能。 实验要求: A部分: (1)对一幅256级灰度…

shell脚本学习06(小滴课堂)

fi是结束循环的意思。 这里脚本1:代表着脚本和1.txt文件处于同一目录下。 脚本2为绝对路径的写法。 在使用./进行启动时,我们需要给文件赋予执行权限。 把文件名改为2.txt: 什么都没有返回,说明文件已经不存在。 可以使用脚本2 if else的方式…

个人背景介绍

看到这篇文章的网友,你好! 我的网名叫火柴棍,出生于1991年,籍贯四川乐山,现居住在成都,本科学历。目前是在一家专注生物识别技术的科技公司担任硬件研发技术主管,主要的工作有硬件方案设…

【JAVA-排列组合】一个套路速解排列组合题

说明 在初遇排列组合题目时,总让人摸不着头脑,但是做多了题目后,发现几乎能用同一个模板做完所有这种类型的题目,大大提高了解题效率。本文简要介绍这种方法。 题目列表 所有题目均从leetcode查找,便于在线验证 46.…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers(通常简称为protobuf)是Google公司开发的一种数据描述语言,它能够将结构化数据序列化,可用于数据存储、通信协议…

按键精灵中的日志、分辨率、找色逻辑、线程

1. 开启输出日志 // 开启日志 Log.Open TracePrint "你好"TracePrint "世界"// 关闭日志 Log.Close // 输出日志 TracePrint GetTempDir()// 当前脚本第4行:你好 // 当前脚本第6行:世界2. 设置分辨率 在写脚本的时候&#xff0c…

ES Kibana windows 安装

ES & Kibana windows 安装 声明: 本文没有实际操作过,只记录。具体操作请参考 ES & Kibana 安装 该文章 JDK1.8,最低要求!ElasticSearch客户端,界面工具! Java开发,ElasticSearch的版…