SQLite源码分析1 整体架构¶
简介¶
https://www.sqlite.org SQLite是一个轻量数据库,应用广泛。一个数据库一个文件。
- self contained 依赖少。可整合成一个c文件(https://www.sqlite.org/amalgamation.html)。 只依赖十个左右的标准C库函数。 
- Serverless 无服务。没有C/S结构、进程间网络间通讯,只在一个进程里跑。 
- Zero-Configuration 不需要配置,直接可使用。 
- Transactional 符合ACID原则。各种崩溃都不会影响操作的原子性或损毁文件。 
整体架构¶
见https://www.sqlite.org/arch.html
- Tokenizer分词器 把sql语句解成一个个token,传给paser进行语法解析。类似编译器那一套东西。 
- Parser语法分析器 https://www.sqlite.org/lemon.html 根据定义好的sql语法,解析token串。 规则在parse.y 
- Code Generator https://www.sqlite.org/opcode.html 处理语法树,生成bytecode。 包含一批类似delete.c,insert.c的代码,处理各种sql语句,转换成合适的bytecode。 
- Bytecode Engine bytecode用一个虚拟机来执行。代码为vdbe.c。 
- B树 数据库的核心数据结构。每个表、每个index都有一棵B树。 
- Page Cache页缓存 除了页缓存的基础功能。还实现原子操作、回滚等功能。 
- OS Interface os接口层,实现跨平台。 https://www.sqlite.org/vfs.html 
- Utilities 其他辅助功能。比如内存分配、字符串-数字转换、unicode处理等等。 
- Test Code 测试流程 
命令行功能结构¶
linux下输入sqlite3 test_db,进入sqlite命令行,自动打开test_db这个数据库文件。
并接受用户输入的sql语句。
看源代码shell.c的main函数如何实现这一流程。
   main()
       做各种初始化和配置,包括main_init。
       处理参数。
       sqlite3_initialize()
       sqlite3_appendvfs_init()
       open_db() // 打开数据库
           SHELL_OPEN_NORMAL
           sqlite3_open_v2()(main.c)
               openDatabase()
                   sqliteInt.h包含各种内部接口的定义。
                   比如全局配置,Sqlite3Config。
                   createCollation()
       打印欢迎信息 “SQLite version ...”
       process_input() // 死循环处理命令行的输入
           one_input_line() // 解出一行sql语句
           runOneSqlLine() // 运行一条sql语句
               shell_exec()
                   sqlite3_prepare_v2
                       sqlite3LockAndPrepare
                           sqlite3Prepare() // Compile the UTF-8 encoded SQL statement zSql into a statement handle
                               sqlite3RunParser()(tokenize.c)
                               sqlite3Parser() // 这里开始语法解析。sqlite3Parser在parse.y里定义。
       各种free
       结束
总结¶
了解了SQLite的整体架构和命令行流程
参考¶
https://www.sqlite.org/arch.html https://www.zhihu.com/question/22819578