小。速度很快。可靠。
选择任意三个选项。
SQLite建筑

介绍

本文档描述了SQLite库的体系结构。这里的信息对那些想了解或修改SQLite的内部工作。

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

概述

SQLite通过将SQL文本编译到字节码,然后运行使用虚拟机的字节码。

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

接口

大部分C语言界面在源中找到文件夹主要。c(c),遗产。c(c)、和vdbeapi公司。c(c)尽管有些例行程序是分散在其他可以访问数据的文件中具有文件范围的结构。这个sqlite3_get_table()例程在中实现表。c(c).这个sqlite3_mprintf()例程位于打印。c(c).这个sqlite3_complete()接口在中完成。c(c).这个TCL接口由实施tclsqlite公司。c(c).

为了避免名称冲突,所有外部SQLite库中的符号以前缀开头方形3.用于外部使用的符号(换句话说,构成SQLite API的符号)添加下划线,以及因此,首先方形3_扩展API有时会添加下划线前的扩展名;例如:平方米3rbu_sqlite3会话_.

分词器

当要计算包含SQL语句的字符串时首先发送到标记器。标记器损坏将SQL文本转换为标记并传递这些标记一个接一个地发送给解析器。标记器是手工编码的文件标记化。c(c).

注意,在这个设计中,标记器调用解析器。熟悉YACC和BISON的人可能习惯于另一种方法是让解析器调用标记化器。不过,标记器调用解析器更好,因为它可以被创建线程安全,运行速度更快。

分析器

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

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

代码生成器

解析器将标记组装成解析树后,代码生成器运行以分析解析树并生成字节码执行SQL语句的工作。这个准备好的报表对象是此字节码的容器。代码生成器中有许多文件,包括:连接。c(c),授权。c(c),生成。c(c),删除。c(c),经验。c(c),插入。c(c),杂注。c(c),选择。c(c),触发。c(c),更新。c(c),真空。c(c),哪里。c(c),其中代码。c(c)、和其中:。c(c).在这些文件中,发生了大部分严重的魔法。表达。c(c)处理表达式的代码生成。其中*。c(c)处理上WHERE子句的代码生成SELECT、UPDATE和DELETE语句。文件连接。c(c),删除。c(c),插入。c(c),选择。c(c),触发。c(c) 更新。c(c)、和真空。c(c)处理代码生成用于具有相同名称的SQL语句。(每个文件都调用例程在里面表达。c(c)哪里。c(c)如有必要。)所有其他SQL语句由生成。c(c).这个授权。c(c)file实现的功能sqlite3_set_authorizer().

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

字节码引擎

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

虚拟机本身完全包含在单个源文件维德比。c(c). The维德比。小时头文件定义接口在虚拟机和SQLite库的其余部分之间,以及vdbeInt公司。小时它定义了结构和接口对虚拟机本身是私有的。各种其他vdbe公司。c(c)文件是虚拟机的助手。这个维德布。c(c)文件包含虚拟机使用的实用程序库的其余部分使用的机器和接口模块构建VM程序。这个vdbeapi公司。c(c)文件包含外部虚拟机的接口,如sqlite3_bind_int()sqlite3_step().单个值(字符串、整数、浮点数和BLOB)被存储在由实现的名为“Mem”的内部对象中vdbemem公司。c(c).

SQLite使用C语言例程的回调实现SQL函数。甚至内置的SQL函数也是这样实现的。大多数内置SQL函数(例如:abs(),count(),substr()等等)可以在中找到功能。c(c)来源文件。日期和时间转换函数位于日期。c(c).一些功能,如合并()typeof()已实现由代码生成器直接作为字节码。

B-树

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

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

页面缓存

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

主页面缓存实现位于寻呼机。c(c)文件。WAL模式逻辑是独立的沃尔。c(c)内存内缓存由pcache。c(c)pcache1.c文件夹。页面缓存子系统之间的接口SQLite的其余部分由头文件定义寻呼机。小时.

操作系统接口

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

公用设施

内存分配,无大小写字符串比较例程,便携式文本到数字转换例程和其他实用程序位于实用程序。c(c).解析器使用的符号表由找到的哈希表维护在里面搞砸。c(c). Theutf(联合特遣部队)。c(c)源文件包含Unicode转换子程序。SQLite有自己的私有实现打印()(带有一些扩展)打印。c(c)和它自己的中的伪随机数生成器(PRNG)随机。c(c).

测试代码

源树“src/”文件夹中名称以开头的文件测试仅用于测试,不包含在标准中图书馆的建设。