手写SQL编译器 - Chapter 1

数据库是怎么工作的?

当你打开这篇文章的时候你一定也好奇:

  • SQL语句为什么能对数据库操作
  • 事务回滚是怎么滚的?
  • 数据是怎么被保存到硬盘里的?

接下来我们将一步步搭建一个框架并逐渐完善,并尝试着把这些问题讲明白。

我选择基于 SQLite ,因为 SQLite 体积小又功能齐全,整个数据库就存储在一个文件中。
我认为可以以此为起点以小见大,启发大家对数据库有更多的思考。

一个 SQL 语句需要经过一连串的过程才能检索或修改数据。

  1. 前端包括:
    • tokenizer 词法解析器
    • parser 语法解析器
    • code generator 代码生成器

前端输入一个 SQL 查询,输出为 SQLite 虚拟机字节码。字节码本质上就是可以在数据库上运行的程序。

  1. 后端包括:
    • Virtual Machine 虚拟机
    • B-Tree B 树
    • Pager 页缓存管理器
    • OS Interface 操作系统接口
      虚拟机将前端生成的字节码作为指令,可以对一个或多个索引执行操作,每个表或索引都存储在 B 树上(B 树:一种树状数据结构)。其实虚拟机本质上就是一堆判断字节码指令的 switch 语句。

B 树由许多结点组成。每个结点的长度为一页。B 树可以通过向 pager 发出指令来执行 从磁盘检索页面或保存回磁盘的操作。

pager通过接收指令读取或写入页,它负责以适当的偏移量在数据库文件中进行读取或写入。它还在内存中保留了最近访问页面的缓存,并决定何时将这些页面写回磁盘。

操作系统接口与上面提到的不在同一层。具体什么样的接口取决于为哪个操作系统的 SQLite 编译。在这个系列中,暂不支持跨平台。


本系列环境:
【操作系统】:Ubuntu 20.04 LTS
【语言】:C 语言
【编译器】: GCC 9.3.0

前置知识要求:
1. 会C语言,不要求精通,懂基本的 顺序结构、分支结构、循环结构 和 指针即可。
2. 对数据结构略有耳闻
3. 会 SQL 或 了解 SQLite

先整点好玩的~~

REPL

REPL,全称 Read Eval Print Loop交互式解释器

例如 Python 安装以后就自带 REPL ,在命令行下输入 Python 就可以启动

$ python
Python 3.8.5 (default, Aug 19 2020, 17:31:43) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> print("Hello World!")
Hello World!
>>> 

动手实现

现在我们也自己实现一个

// MyREPL.c 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int main() {
   
    char command[100];
    
    while (true) {
   
    	printf("BoiiDB > ");    // 打印提示符
        scanf("%s", command);   // 接收输入
        
        if(strcmp(command, ".q") == 0) 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
  屏蔽数据库间的差异,以统一的界面和操作方式来对数据进行处理,将程序员或数据管理员从繁琐的操作模式中解脱出来,使其更加专注的进行Sql语句的编写。   将查询分析器和企业管理器功能合二为一,并融入众多实用功能,并完美支持 sqlserver、oracle、mysql、access。是您编写sql语句和数据分析的绝佳帮手。   功能列表:   1、代码高亮:根据操作数据库的不同区分相应关键字,并高亮显示   2、自动完成:输入不同的表名等信息,将自动提示相关的字段信息等。   3、智能提示:输入相应关键字将出现类似VS中一样的说明提示。   4、跨库操作:可同时跨多个数据库间操作,互不影响。随时切换,随时运行。   5、随意运行:运行选择的代码、运行多个Sql操作代码。如果运行多个Select语句则显示多个结果集,用来对比查看。(快捷键F5)   6、数据库树中查找对象。   7、在Sql语句编辑器中快速查找功能。   8、查看数据库属*   9、查看表结构   10、自动生成Sql语句模板   11、删除表、视图等   12、查看数据库属*,并快速定到至物理文件。   13、生成脚本信息功能   14、结果集导出功能。   15、在结构集中查找   16、删除指定的行(快捷键 ‘delete’)   17、修改制定的数据   18、添加新数据   19、复制选择内容(快捷键‘ctrl+C’)   20、将外部数据导入到结果集中(支持txt:以 '|'或tab符号为分割符 和execl: 指定Sheet页名称 和 默认Sheet页 )   21、支持将导入的数据更新至数据库。   22、编辑操作时自动错提示功能(如:自动递增字段自动屏蔽编辑功能。必填字段没有填写内   容则提示,数据类型不正确自动提示等。。。)   23、自动标识主键(主键字段标识为-*-字段名-*-)   24、冻结指定行、列功能。使查看操作更加方便   25、数据集更改后,在提交前可选查看所有更改的部分数据。并用颜**分。   26、自定义我的收藏功能。   27、详细数据单窗体查看功能(支持图片字段)   28、*在没有安装SqlServer 客户端及任何组件的情况下仍然可以连接至SqlServer*   29、*判断Oracle的常见错误,并尝试更改或给出提示*   30、增加历史记录功能。   31、增加自动保存用户状态功能。再次打开软件将会保留上次已连接的数据库信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TCP404

老板大方~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值