概述
一:sql准备过程
在前面的分析中我们知道,sqlite3_open()为我们打开了数据库并准备了所要的内存空间,锁,vfs等。
接下来就分析sql是如何被解析器一步一步解析的。
上图是准备sql语句的过程分析图。
1.1:sqlite3_prepare_v2函数:
该函数是准备的入口函数。
传入了5个参数:
sqlite3 *db : sqlite3_open()返回的数据库句柄
const char *zSql: 要准备的sql语句
int nBytes : sql语句的 长度(strlen(sql))
sqlite3_stmt **ppStmt: 准备的语句存储该结构体对象中,可以认为是预编译语句的句柄,执行时需要传入这个句柄
const char **pzTail: 指向被解析的字符串的末尾
SQLite 现在提供两个版本的编译 API 函数:遗留的和现在使用的。
在遗留版本中,原始 SQL 文本没有保存在编译后的语句(sqlite3_stmt 结构)中,因此,如
果 schema 发生改变,sqlite3_step()会返回 SQLITE_SCHEMA。在新版本中,编译后的语句
中保存原始 SQL 文本,当遇到schema 改变时自动重新编译。sqlite3_prepare()函数中其实只包含一条对 sqlite3LockAndPrepare()的调用语句:
SQLITE_APIint sqlite3_prepare_v2( sqlite3 *db, /* Database handle. 成功打开的数据库句柄*/ constchar *zSql, /* UTF-8 encoded SQL statement. UTF8编码的 SQL 语句 */ intnBytes, /* Length of zSql in bytes. 参数 sql 的字节数, 包含 ' |