开源项目CuteSqlite开发笔记(二):SQLite的架构

news2024/11/19 13:41:06

在开发CuteSqlite图形客户端的时候,需要用到SQL的语法解释,来对SQL语句进行优化。找了很多的SQL语法解释器,都不是十分满意,只有翻开Sqlite的源码,看看SQLite对SQL语句的解释过程,本文是翻译的官方文档。

 官方介绍架构的文章:https://www.sqlite.org/arch.html

CuteSqlite源码:https://github.com/shinehanx/CuteSqlite.git

SQLite使用的Lemon解释器翻译文章:开源项目CuteSqlite开发笔记(三):SQLite使用的Lemon解释器

SQLite的架构

SQLite的架构图

Introduction 介绍

本文档描述了SQLite库的架构。这里的信息对于那些想要理解或修改SQLite内部工作原理的人很有用。

Overview 概述

SQLite的工作原理是将SQL文本编译成字节码,然后使用虚拟机运行该字节码。

sqlite3_tagre_v2()和相关接口充当将SQL文本转换为字节码的编译器。sqlite3_stmt对象是实现单个SQL语句的单个字节码程序的容器。sqlite3_step()接口将字节码程序传递到虚拟机中,并运行该程序,直到它完成,或形成一行要返回的结果,或遇到致命错误,或被中断。

Interface  接口

C语言接口的大部分内容都可以在源文件main.c、legacy.c和vdbeapi.c中找到,尽管有些例程分散在其他文件中,它们可以访问具有文件范围的数据结构。sqlite3_get_table()例程在table.c中实现。sqlite3_mprintf()例程位于printf.c中。sqlite3_complete()接口位于complete.c中。TCL接口由tclsqlite.c实现。

为了避免名称冲突,SQLite库中的所有外部符号开始都以前缀sqlite3开头。那些供外部使用的符号(换句话说,那些构成SQLite的API的符号)添加下划线,因此开始以sqlite3_开头。扩展API有时会在下划线之前添加扩展名;例如:sqlite3_rbu_或sqlite3_session_。

Tokenizer 分词器

当一个包含SQL语句的字符串要被求值时,它首先被发送到标记器(tokenizer)。tokenizer将SQL文本分解为标记(Token),并将这些标记(Token)一个接一个地交给解析器。tokenizer在文件tokenize.c中手工编码。

注意,在这个设计中,标记器调用解析器。熟悉YACC和BISON的人可能习惯于用相反的方式来做事情--让解析器调用标记器。不过,让标记器调用解析器会更好,因为它可以是线程安全的,而且运行得更快。

Parser 解析器

解析器根据上下文为标记分配语义。SQLite的解析器使用Lemon解析生成器生成(包含解释SQL语法,并生成C语言代码)。Lemon的工作与YACC/BISON相同,但它使用了不同的输入语法,这更不容易出错。Lemon还生成了一个可重入和线程安全的解析器。Lemon定义了非终结符析构函数(non-terminal destructor)的概念,这样当遇到语法错误时它就不会泄漏内存。驱动Lemon并定义SQLite理解的SQL语言的语法文件位于src/parse.y中。

因为Lemon是一个通常在开发机器上找不到的程序,所以Lemon的完整源代码(只有一个C文件)包含在SQLite发行版的"tool"目录中。(稍后在WINDOWS上使用GCC编译出lemon.exe,并解释src/parse.y成C语言代码)

Code Generator 代码生成器

在解析器将标记组装到解析树中之后,代码生成器运行以分析解析树并生成执行SQL语句的工作的字节码。准备好的语句对象是这个字节码的容器。代码生成器中有许多文件,包括:attach.c、auth.c、build.c、delete.c、expr.c、insert.c、pragma.c、select.c、deliver.c、update.c、vacuum.c、where.c、wherecode.c和whereexpr.c。在这些文件中,大多数严重的魔术发生。expr.c处理表达式的代码生成。where*.c处理SELECT、UPDATE和NULL语句上的WHERE子句的代码生成。文件attach.c、delete.c、insert.c、select.c、update.c和vacuum.c处理具有相同名称的SQL语句的代码生成。(这些文件的每一部分会调用expr.c和where.c中的例程。)所有其他SQL语句都是从build.c中编写的。auth.c文件实现了sqlite3_set_authorizer()的功能。

Bytecode Engine  字节码引擎

由代码生成器创建的字节码程序由虚拟机运行。

虚拟机本身完全包含在单个源文件vdbe.c中。vdbe.h头文件定义了虚拟机与SQLite库的其余部分之间的接口,vdbeInt.h定义了虚拟机本身私有的结构和接口。其他各种vdbe*.c文件是虚拟机的助手。vdbeaux.c文件包含虚拟机使用的实用程序和库的其余部分用来构建VM程序的接口模块。vdbeapi.c文件包含虚拟机的外部接口,例如sqlite3_bind_int()和sqlite3_step()。单个值(字符串、整数、浮点数和BLOB)存储在名为“Mem”的内部对象中,该对象由vdbem.c实现。

SQLite使用C语言例程的回调来实现SQL函数。即使是内置的SQL函数也是这样实现的。大多数内置的SQL函数(例如:abs()、count()、substr()等)都可以在func.c源文件中找到。日期和时间转换函数可以在date.c中找到。有些函数,如coalesce()和typeof(),直接由代码生成器实现为字节码。

B-Tree b树

SQLite数据库使用btree.c源文件中的B树,实现在磁盘上维护。单独的B树用于数据库中的每个表和每个索引。所有的B树都存储在同一个磁盘文件中。文件格式细节是稳定和明确定义的,并保证向前兼容。

B树子系统和SQLite库的其余部分的接口由头文件btree.h定义。

Page Cache 页面高速缓存

B树模块以固定大小的页面从磁盘请求信息。默认的page_size是4096字节,但可以是512到65536字节之间的2的任意幂。页面缓存负责阅读、写入和缓存这些页面。页面缓存还提供回滚和原子提交抽象,并负责数据库文件的锁定。B树驱动程序从页面缓存中请求特定的页面,并在想要修改页面或提交或回滚更改时通知页面缓存。页面缓存处理所有混乱的细节,以确保请求得到快速、安全和有效的处理。

主页面缓存实现在pager.c文件中。WAL模式逻辑在单独的wal.c中。内存缓存是由pcache.c和pcache1.c文件实现的。页面缓存子系统和SQLite其余部分之间的接口由头文件pager.h定义。

主页面缓存实现在pager.c文件中。WAL模式逻辑在单独的wal.c中。内存缓存是由pcache.c和pcache1.c文件实现的。页面缓存子系统和SQLite其余部分之间的接口由头文件pager.h定义。

OS Interface OS接口

为了提供跨操作系统的可移植性,SQLite使用了一个称为VFS的抽象对象。每个VFS都提供了打开、阅读、写入和关闭磁盘上文件的方法,以及其他特定于操作系统的任务,如查找当前时间或获取随机性以初始化内置的伪随机数生成器。SQLite目前为unix(在os_unix.c文件中)和Windows(在os_win.c文件中)提供了VFS。

Utilities 公共的工具函数

内存分配、无大小写字符串比较例程、可移植文本到数字转换例程和其他实用程序位于util.c中。解析器使用的符号表由hash. c中的哈希表维护。utf. c源文件包含Unicode转换子例程。SQLite在printf.c中有自己的printf()私有实现(带有一些扩展),在random.c中有自己的伪随机数生成器(PRNG)。

Test Code 测试代码

源代码树的“src/”文件夹中名称以test开始的文件仅用于测试,不包含在库的标准构建中。

上一篇:开源项目CuteSqlite开发笔记(一) 

下一篇:开源项目CuteSqlite开发笔记(三):SQLite使用的Lemon解释器 

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

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

相关文章

模块电源(六):前馈电容

一、前馈电容: 前馈电容是与电阻分压的顶部电阻 并联的"可选电容器" 二、计算及仿真: 1、计算 无前馈电容时,输出电压:;有前馈电容时,输出电压:,(其中,&am…

如何解决5G基站高能耗问题?

安科瑞 须静燕 截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5…

JavaSE基础50题:17. (递归)求1+2+3+……+10

概述 递归求123……10 代码 public class P17 {public static int sum(int n) {if (n 1) {return 1;}return n sum(n-1);}public static void main(String[] args) {System.out.println(sum(10)); //55} }运行过程 如:1234,最后的结果为10

Nacos源码解读07——集群数据同步

Distro协议背景 Distro 协议是 Nacos 社区自研的⼀种 AP 分布式协议,是面向临时实例设计的⼀种分布式协议, 其保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。作为⼀种有状态 的中间件应用的内嵌协议,Dis…

柏林噪声C++

柏林噪声 随机噪声 如上图所示随机噪声没有任何规律可言,我们希望生成有一些意义的局部连续的随机图案 一维柏林噪声 假设希望生成一段局部连续的随机曲线,可以采用插值的方式:在固定点随机分配y值(一般是整数点)&a…

docker安装elasticsearch8.5.0和kibana

服务器环境,centos7 一、安装elasticsearch 1. 创建一个es和kibana通用的网络 docker network create es-net 2. 拉取es镜像,这里选择8.5.0版本 docker pull elasticsearch:8.5.03. 创建挂载目录,并授权 mkdir /usr/local/install/ela…

WebStorm:Mac/Win上强大的JavaScript开发工具

WebStorm是JetBrains公司开发的针对Mac和Windows系统的JavaScript开发工具。它为开发者提供了一站式的代码编辑、调试、测试和版本控制等功能,帮助你更高效地进行Web开发。新版本的WebStorm 2023在性能和用户体验方面都做出了重大改进,让你的JavaScript开…

机器学习实战:预测波士顿房价

前言: Hello大家好,我是Dream。 今天来学习一下机器学习中一个非常经典的案例:预测波士顿房价,在此过程中也会补充很多重要的知识点,欢迎大家一起前来探讨学习~ 一、导入数据 在这个项目中,我们利用马萨诸…

富时中国A50指数查询方法详解

富时中国A50指数,是指衡量中国A股市场50家具有代表性的上市公司股票表现的指数。对于投资者来说,了解和查询A50指数的走势对于制定投资策略至关重要。那么,如何轻松地查询富时中国A50指数呢? 1. 百度搜索 百度搜索引擎是最简便的…

【Node.js后端架构:MVC模式】基于expres讲解

Node.js后端架构:MVC模式 什么是MVC MVC (Model-View-Controller) 是一种软件设计模式,用于将应用程序的逻辑分离成三个不同的组件:模型、视图和控制器。 模型(Model)负责处理应用程序的数据逻辑。它负责从数据库或其…

使用Netty实现文件传输的HTTP服务器和客户端

现在我们来用netty实现文件传输的HTTP服务器和客户端 pom依赖文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

国内好用的CRM系统你知道哪些?看看这篇吧

选择CRM系统需要考虑许多因素&#xff0c;其中一个重要的标准是用户数量。使用广泛、受到用户认可的CRM系统&#xff0c;无论是在功能、易用性、灵活性还是价格上&#xff0c;都会给企业带来更多的益处。有什么国内用得比较多的CRM系统吗&#xff1f; 以Zoho CRM为例&#xff…

Linux学习教程(第十四章 Linux系统服务管理)一

第十四章 Linux系统服务管理&#xff08;一&#xff09; 什么是系统服务&#xff1f;服务是在后台运行的应用程序&#xff0c;并且可以提供一些本地系统或网络的功能。 那么&#xff0c;Linux 中常见的服务有那些&#xff0c;这些服务怎么分类&#xff0c;服务如何启动&#x…

视频处理关键知识

1 引言 视频技术发展到现在已经有100多年的历史&#xff0c;虽然比照相技术历史时间短&#xff0c;但在过去很长一段时间之内都是最重要的媒体。由于互联网在新世纪的崛起&#xff0c;使得传统的媒体技术有了更好的发展平台&#xff0c;应运而生了新的多媒体技术。而多媒体技术…

为什么感染HPV的人越来越多?劲松中西医结合医院专家发表看法

近年来&#xff0c;HPV感染率在我国呈现上升趋势&#xff0c;引起了社会的广泛关注。HPV是一种人乳头瘤病毒&#xff0c;主要通过性接触传播&#xff0c;也是引起宫颈癌的主要原因之一。那么&#xff0c;为什么我国的HPV感染率如此高呢&#xff1f; 首先&#xff0c;我们需要了…

手把手教你写 Compose 动画 -- 讲的不能再细的 AnimationSpec 动画规范

前面我们聊过 animateDpAsState 和 Animatable 两种动画 API 的用法&#xff0c;但只是简单了解了&#xff0c;这两个函数内部都有一个共同的核心参数&#xff1a;AnimationSpec。 Composable fun animateDpAsState(targetValue: Dp,animationSpec: AnimationSpec<Dp> …

友思特 Neuro-R:快速部署实时推理API

科技赋能&#xff0c;视觉技术在缺陷检测方面的应用为生产制造自动化程度带来了重大影响&#xff0c;有效缩短了检测时间&#xff0c;提升了生产效率&#xff0c;创造出更多的经济效益。通过视觉技术的精准分析和快速判断&#xff0c;缺陷检测变得更加准确、高效&#xff0c;无…

Java二十一章 网络通信

1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序&#xff0c;客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机&#xff0c;实现两者间的相互通信。 网络协议 网络协议规定了计算机…

echarts绘制一个柱状折线图

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个饼图 echarts绘制一个环形图2 效果&#xff1a; 代码&#xff1a; <template><div class"wrapper"><!-- 柱状图 --><div v-if"type new_bar" ref"barChar…

2023最新八股文前端面试题

第一章 Css 1.说一下CSS的盒模型。 在HTML页面中的所有元素都可以看成是一个盒子盒子的组成:内容content、内边距padding、边框border、外边距margin盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(border padding) 控制盒模型的模式…