这篇文档主要描述了SQLite类库的结构。这篇文档的内容对于那些想了解和修改SQLite内部结构的人将会非常有用。
右侧是一个结构图,它显示了SQLite的主要成分及各成分之间是如何相互关联的。接下来的文本将简要的介绍每个单一的成分。
这篇文档描述SQLite第三版,它和 2.8版以及早期的版本基本相似,但在一些细节上是有区别的。
接口程序
SQLite类库大部分的公共接口程序是由main.c, legacy.c,
和 vdbeapi.c源文件中的功能执行的。
但有些程序是分散在其他文件夹的,因为在其他文件夹里他们可以访问有文件作用域的数据结构。 sqlite3_get_table() 这个程序是在table.c中执行的。sqlite3_mprintf()在printf.c中执行。 sqlite3_complete()在tokenize.c中执行。
Tcl 接口程序用tclsqlite.c来执行。
为了避免和其它软件在名字上有冲突,SQLite类库中所有的外部符号都是以sqlite3为前缀来命名的。这些被用来做外部使用的符号(换句话说,这些符号用来形成SQLite的API)是以sqlite3_.
来命名的。
Tokenizer
当执行一个包含SQL语句的字符串时,接口程序要把这个字符串传递给tokenizer。Tokenizer的任务是把原有字符串分成一个个标示符,并把这些标示符传递给剖析器。Tokenizer是在C文件夹tokenize.c中用手编译的。
在这个设计中需要注意的一点是,tokenizer调用parser。熟悉YACC和BISON的人们也许会习惯于用parser调用tokenizer。
The author of
SQLite的作者已经尝试了这两种方法,并发现用tokenizer调用parser会使程序运行的更顺利。YACC使程序更滞后一些。
Parser
The parser是一个部分,它基于文件场景赋予tokens意思。SQLite的parser是由 L