where.c中使用SqliteWhereBegin()函数是查询处理部分最核心的函数,它主要完成where部分的优化及相关的opcode的生成。
在SqliteWhereBegin()函数中,它接受从select,update,delete中传入的where子句,然后进行分析、优化,生成操作码,最后把操作码传递给VDBE后,使用SqliteWhereEnd()函数来生成WHERE循环的结束代码。
下面是where.c中的主要函数的调用关系:

其中:
sqliteWhereBegin()函数是开始where子句的分析处理;
WhereClauseInit()函数是初始化whereClause结构体;
whereSplit()函数是把whereClause根据op分隔开来;
codeOneLoopStart()函数是为WHERE子句中实现的的第i级循环的代码的生成;
bestVirtualIndex()函数是用于计算虚拟表的最佳索引;
bestBtreeIndex()函数是用于选择最佳的Btree索引;
constructAutomatic()函数是用于创建自动索引;
exprAnalyzeAll()函数是循环调用exprAnalyze()分析where子句;
exprAnalyze()函数是分析分隔后的where子句;
allowedOp()函数是判断相应的运算符是否可以使用索引;
isLikeOrGlob()函数是判断like或glob语句是否能够进行优化;
isMatchOfColumn()函数是检查表达式是否是column MATCH expr形式;
exprAnalyzeOrTerm()函数是分析一个包含两个或更多OR子句连接的子句;
disableTerm()函数是在WHERE子句中禁用一个被分割的子句;
findTerm()函数是WHERE子句中查找一个被分割的子句;
其中:
whereInfoFree()函数是释放whereInfo结构体;
whereClauseClear()函数是解除一个WhereClause数据结构的分配;
whereOrInfoDelete()函数是解除WhereOrInfo对象的所有内存分配;
whereAndInfoDelete()函数是解除WhereAndInfo对象的所有内存分配