SQlite源码分析

sqlite3DeleteFrom

程序段是为DELETE FROM语句生成代码

void sqlite3DeleteFrom(
Parse *pParse,         /* 解析指针 */
SrcList *pTabList,     /* 表中指向要删去内容的指针 */
Expr *pWhere           /* WHERE 语句指针.  可以为空 */
)
此函数有如下几部分组成:
1)找到我们想要删除的表。该表必须被放在一个SrcList结构,因为一些为多个表服务的子程序将被调用并且用Srclist参数来代替Table参数。
2)弄清楚是否有触发器,是否删除的这个表是一个视图。
3)如果pTab所指的是一个视图,确保它已经初始化。
4)为表分配游标号和所有的索引。
5)开始解析上下文。
6)开始生成代码。
7)如果我们尝试去删除一个视图,该视图必须在一个临时表中。
8)在WHERE子句中解决列名。
9)如果要统计行数,初始化要删除行的编号的计数器。
10)特殊情况:DELETE语句中没有WHERE子句将删除所有的行,这样很容易删除整个表,在之前的3.6.5版本,这个优化导致行被改变的计数器(由函数sqlite3_count_changes返回的值)。
11)通常情况下有一个WHERE子句使得我们通过扫描表并挑选其中的记录去删除。
12)收集要删除行的rowid。
13)在数据库扫描的过程中删除主键写入到列表中的每一个项目,在扫描完成后删除这些项目,因为删除的项目可以更改扫描的顺序。
14)除非这是一个视图,打开要删除表的游标和它的所有索引。如果是一个视图,唯一的影响就是要解除INSTEAD OF触发器。
15)删除行。
16)结束DELETE循环。
17)关闭表上打开的游标和它所有的索引。
18)通过存储在插入到自动增量的表记录到的最大的rowid计数器值的内容更新sqlite_sequence表。
19)返回被删除行的编号,如果这个过程正在生成代码是因为调用了函数sqlite3NestedParse(),没有调用回滚函数。