codeOffset函数:一般与limit结合使用。先确定offset的偏移量,得出返回结果集的起始位置,再根据limit返回限定大小的结 果集。
static void codeOffset(
Vdbe *v, /*生成代码给虚拟机*/
Select *p, /*声明Select结构体*/
int iContinue /*从这里跳过当前记录*/
){
if( p->iOffset && iContinue!=0 ){/*如果Select结构体中含有IOffset属性值并且设置了跳过当前记录*/
int addr;
sqlite3VdbeAddOp2(v, OP_AddImm, p->iOffset, -1);/*在VDBE中新添加一条指令,返回一个新指令的地址*/
addr = sqlite3VdbeAddOp1(v, OP_IfNeg, p->iOffset);/*实质上调用sqlite3VdbeAddOp3()修改指令的地址*/
sqlite3VdbeAddOp2(v, OP_Goto, 0, iContinue);/*设置跳往的地址*/
VdbeComment((v, "skip OFFSET records"));/*输入偏移量*/
sqlite3VdbeJumpHere(v, addr);/*输入偏移地址,改变下一条的执行地址*/
}
}