当前位置: 首页 > news >正文

SQLite架构

介绍

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

上图显示了 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 开头。 那些供外部使用的符号(换句话说, 构成 SQLite API 的那些符号)添加下划线,以及 因此,从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 文件)包含在 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 树模块从固定大小的磁盘请求信息 页面。 默认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() 私有实现( 一些扩展)和它自己的 random.c 中的伪随机数生成器 (PRNG)

测试代码

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

http://www.dtcms.com/a/465307.html

相关文章:

  • 初识Linux和Linux基础指令详细解析及shell的运行原理
  • Python容器内存三要素
  • NumPy 矩阵库(numpy.matlib)用法与作用详解
  • Web 开发 26
  • 正规app软件开发费用漯河网站优化
  • 人工智能学习:线性模型,损失函数,过拟合与欠拟合
  • 开篇词:为何要懂攻防?—— 实战化安全思维的建立
  • 怎么在qq上自己做网站wordpress是一款强大的
  • 网站建设公司 成本结转ppt之家模板免费下载
  • Android Vibrator学习记录
  • pop、push、unshift、shift的作用?
  • 大模型激活值相关公式说明(114)
  • unity升级对ab变更的影响
  • 谁是远程控制软件的“最优选”?UU远程、ToDesk、向日葵深度横测
  • 天机学堂升级版,海量新功能加入
  • vuedraggable拖拽任意组件并改变数据排序
  • {MySQL查询性能优化索引失效的八大场景与深度解决方案}
  • 网站整体建设方案360网站免费推广怎么做
  • 方舟优品:生产型撮合模式如何推动电商行业创新发展
  • 无人机芯片模块技术要点分析
  • 使用手机检测的智能视觉分析技术与应用 加油站使用手机 玩手机检测
  • 门户网站建设的重要性如何优化网页
  • 怎么在工商网站做实名认证海淀商城网站建设
  • 加餐 结束语
  • 做网站都需要用到什么3d建模一般学费多少
  • 深入解析 Conda、Anaconda 与 Miniconda:Python 环境管理的完整指南
  • 用elasticlient封装Elasticsearch C++ 客户端封装库
  • 使用go搭建本地mcp实现AI选股小记
  • Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
  • 网站代码怎么放长春百度快速优化