SQLite的架构(十一)

返回:SQLite—系列文章目录   

上一篇:SQLite下一代查询规划器(十)

下一篇:SQLite—系列文章目录   

介绍

本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。

接口SQL 命令处理器虚拟机B-树呼叫器操作系统接口分词器解析 器法典发电机公用事业测试代码核心后端SQL 编译器辅料

附近的图表显示了SQLite的主要组件 以及它们如何互操作。下面的文字 解释了各个组件的角色。

概述

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

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

接口

大部分 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 开头。 那些供外部使用的符号(换句话说, 那些构成 API for SQLite 的符号)添加下划线,以及 因此,从sqlite3_开始。扩展 API 有时会添加 下划线前的扩展名;例如:sqlite3rbu_ 或 sqlite3session_

分词器

当要计算包含 SQL 语句的字符串时,它是 首先发送到分词器。 分词器中断 将 SQL 文本转换为令牌并传递这些令牌 一个接一个地到解析器。分词器是手动编码的 文件 tokenize.c.

请注意,在此设计中,分词器调用分析器。人 熟悉YACC和BISON的人可能习惯于做事 另一种方式 - 让解析器调用分词器。拥有 不过,分词器调用解析器更好,因为它可以制作 线程安全,它运行得更快。

解析 器

解析器根据 他们的背景。SQLite 的解析器是使用 Lemon 解析器生成器生成的。 Lemon 的工作与 YACC/BISON 相同,但它使用 一种不同的输入语法,不易出错。 Lemon 还生成了一个可重入且线程安全的解析器。 Lemon 定义了非终端析构函数的概念,所以 当遇到语法错误时,它不会泄漏内存。 驱动 Lemon 并定义 SQL 语言的语法文件 SQLite 理解的内容可以在 parse.y 中找到。

因为 Lemon 是一个在开发机器上通常找不到的程序, Lemon 的完整源代码(只有一个 C 文件)包含在 “tool”子目录中的 SQLite 分发。

代码生成器

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

代码生成器,尤其是 where*.c 和 select.c 中的逻辑,有时称为查询规划器。对于任何特定的 SQL 语句,可能有 成百上千或数百万种不同的算法进行计算 答案是。查询计划器是一个 AI,它努力选择 这数百万种选择中的最佳算法。

字节码引擎

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

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

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

B-树

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

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

页面缓存

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

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

操作系统接口

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

公用事业

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

测试代码

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…

CCIE-08-BGP-Listen

目录 实验条件网络拓朴实验目的 开始配置配置动态路由协议配置BGP检查邻居配置 实验条件 网络拓朴 实验目的 将R1配置成Listen状态,自动接收来自其它路由器的建邻居请求、建立邻居 开始配置 配置动态路由协议 这里用EIGRP来配置,保证网络的可达性&a…

Linux云计算之Linux基础2——Linux发行版本的安装

目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前,要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置:open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码,不符合本人编程习惯所以一直也没有研究这东西,近期打…

Gitee上传私有仓库

个人记录 Gitee创建账号 以KS进销存系统为例,下载到本地电脑解压。 新建私有仓库 仓库名称:ks-vue3,选择‘私有’ 本地配置 下载安装git配置git 第一次配置可以在本地目录右键【Open Git Bash here】输入【Git 全局设置】再输入【创…

IDEA配置本地Maven(解决依赖下载缓慢)

1.下载Maven Maven下载页 根据需要选择下载其中一个,我选了zip格式的 将下载好的apache-maven-3.9.5解压到你想要的目录下 2.配置系统环境 设置系统环境变量 MAVEN_HOME 为安装路径的bin目录 变量名:MAVEN_HOME 变量值:写你的 apache-m…

网络安全 | 什么是负载均衡器?

关注WX: CodingTechWork 介绍 负载均衡是在多个服务器之间有效分配网络流量的过程。负载均衡的目的是优化应用程序的可用性,并确保良好的终端用户体验。负载均衡可协助高流量网站和云计算应用程序应对数百万个用户请求,从而保证客户请求不会…

C#/WPF Inno Setup打包程序

Inno Setup介绍 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,现在已经更新到Inno Setup 6了。Inno Setup是一个十分简单实用的打包小工具,可以按照我们自己的意愿设置功能,稳定性也很好。 官方网址&#xff1…

腾讯云4核8G12M服务器和标准型S5服务器配置价格表

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

746.Leetcode 使用最小花费爬楼梯

746.Leetcode 使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯…

【Qt】:常用控件(四:显示类控件)

常用控件 一.Lable二.LCD Number 一.Lable QLabel 可以⽤来显⽰⽂本和图⽚. 代码⽰例:显⽰不同格式的⽂本 代码⽰例:显⽰图⽚ 此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化 为了解决这个问题,可以在Widget中重写resizeEvent函数。当用户把窗口从A拖…

大商创多用户商城系统 多处SQL注入漏洞复现

0x01 产品简介 大商创多用户商城系统是一个功能强大、灵活多变的新零售电商系统服务商。该系统支持平台自营和商家入驻,实现多元化经营模式,能够全面整合供应商、生产商、经销商和消费者等产业链资源,提高产品多样性,加快资金流动速度,并有助于减少不必要的成本输出。 0…

代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

文章目录 前言1、Bluecms-CNVD-1Day-常规注入审计分析2、emlog-CNVD-1Day-常规注入审计分析3、emlog-CNVD-1Day-2次注入审计分析 前言 挖掘技巧: -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update…

【MATLAB源码-第178期】基于matlab的8PSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境: MATLAB 2022a 1、算法描述 在通信系统中,频率偏移是一种常见的问题,它会导致接收到的信号频率与发送信号的频率不完全匹配,进而影响通信质量。在调制技术中,QPSK(Quadrature Phase Shift Keyi…

C语言进阶课程学习记录-第22课 - 条件编译使用分析

C语言进阶课程学习记录-第22课 - 条件编译使用分析 条件编译基本概念条件编译实验条件编译本质实验-ifdefinclude本质实验-间接包含同一个头文件解决重复包含的方法-ifndef实验-条件编译的应用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源…

深入理解指针2:数组名理解、一维数组传参本质、二级指针、指针数组和数组指针

1、数组名理解 首先来看一段代码: int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0; } 输出的结果是:40,如果arr是数组首元素的地址,那输出应该是4/8才对。 其实数组名就…

WordPress主题–Applay v3.7.1 开心版下载

Applay是一款功能强大的多用途WordPress主题,专为应用展示、应用商店、商业和购物等Woocommerce网站而设计。它配备了拖曳式页面编辑功能,类似于Elementor,让您能够轻松构建和定制您的网站。无论您有什么需求,都可以尝试下这个主题…

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测 目录 时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于CFBP级联前向BP神经网络时序预测(完整源码和数据); 2.数据集为excel…

多线程学习

目录 1.多线程介绍 2.并发和并行 3.多线程的实现方式 3.1通过继承Thread类实现 3.2通过实现Runable接口使用Thread类实现 3.3通过实现Callable<>接口使用Futuretask<>类使用Thread类实现 3.4总结 4.在线程中常见的一些成员方法&#xff08;导航&#xff09; 5.…

SQL注入---报错注入

文章目录 目录 文章目录 一.报错注入概述 二.报错注入分类 extractValue()函数概述 利用extractValue()函数报错注入 利用updatexml()函数报错注入 总结 一.报错注入概述 在SQL注入报错攻击中&#xff0c;攻击者通过在用户输入的位置注入恶意的SQL代码&#xff0c;使应用程序…