操作码VDBE的机器语言由围绕于数据库管理的128个操作码(opcode)组成.
操作码包括:
Add、And、Callback、Clear、Close、Column、Commit、CleatIndex、Delete、Destroy、Divide、DropIndex、DropTable、Dup、Eq、FifoRead、FifoWrite、Ge、Goto、Gt、Halt、IdxDelete、IdxGE、IdxGT、IdxRowid、If、IfNot、Insert、Integer、IsNull、Last、Le、Lt、MakeRecord、MemIncr、MemLoad、MemMax、MemMove、MemNull、MemStore、MoveGe、MoveGt、MoveLe、Movelt、Ne、Negative、NewRowid、Next、NotExists、NotFound、NotNull、Null、NullRow、OpenRead、OpenWrite、Or、ParseSchema、Pop、Prev、Pull、Push、PutIntKey、Rewind、RowData、Rowid、SetNumColumns、Subtract、Transaction
每一个操作码具体的含义详细描述如下:
Add 弹出栈顶两个元素,并把它们相加后的结果压入栈中
And 弹出栈顶两个元素,进行与操作,把与运算后的结果压入栈中
Callback 弹出栈顶的P1个元素并在屏幕上打印出来,栈顶的P1个元素就是查询出来的一行记录
Clear 清空数据库文件中根页面为P1的表或索引中的所有记录,但保留表或索引结构,相当于删除表中的所有记录
Close 关闭游标P1
Column 从游标P1所指向的行记录中取出第P2列的值压入栈中
Commit 提交事务,完成此次操作
CreateIndex 在数据库文件中申请分配一个索引结构,并把索引的根页面号压入栈中
CreateTable 在数据库文件中申请分配一个表结构,并把表的根页面号压入栈中
Delete 删除游标P1所指向的行记录
Destroy 在文件中完全删除游标P1所指向的表或索引的所有记录和结构,相当于删除表或索引
Divide 弹出栈顶的2个元素,用第一个数(栈顶元素)除以第二个数,并把运算结果压入栈中
DropIndex 清除内存中的表述数据库中索引名为P3的索引结构
DropTable 清除内存中的表述数据库中表名为P3的表结构
Dup 复制栈顶的第P1个元素,并把复制得到的数据压入栈中。栈顶元素计为0元素。例如“Dup 0 0”将把栈顶元素复制一份放入栈顶
Eq 从栈顶弹出两个元素进行比较,如果相等,则跳转到P2指令处执行,否则继续执行下一条指令
FifoRead 从队列中读出一个数据并把此数据压入栈中,如果队列为空,则直接跳转到P2指令处执行
FifoWrite 把栈顶的整数写入到队列中
Ge 从栈顶弹出两个元素,如果第一个(栈顶)大于或等于第二个,则跳转到P2指令处,否则继续执行下一条指令
Goto 无条件跳转指令,跳转到P2指令处执行
Gt从栈顶弹出两个元素,如果第一个(栈顶)大于第二个,则跳转到P2指令处,否则继续执行下一条指令
Halt 停止退出指令,自动关闭所有打开的游标。
IdxDelete 删除索引表中记录号为栈顶元素的记录
IdxGE 比较索引表中游标为P1的行记录与栈顶元素,如果是大于或等于,则跳转到P2指令处,否则继续下一条指令,无论哪种情况,栈顶元素都要弹出一次。
IdxGT 比较索引表中游标为P1的行记录与栈顶元素,如果是大于,则跳转到P2指令处,否则继续下一条指令,无论哪种情况,栈顶元素都要弹出一次。
IdxRowid 把索引表中的记录条数压入栈中作为下一条记录号。
If 从栈顶中弹出一个值,如果为真,则跳转到P2指令处,否则继续执行下一条指令
IfNot从栈顶中弹出一个值,如果为假,则跳转到P2指令处,否则继续执行下一条指令
Insert 插入一条记录到游标P1所指向的表中。从栈顶弹出两个元素,第一个作为记录数据,第二个作为记录号
Integer 把整数P1压入栈中
IsNull 检查栈顶元素是否为NULL,如果为空就跳转到P2指令处。如果P1 是正数,无论是否跳转都弹出栈顶的P1个元素。如果P1为负数,则只在跳转发生的情况下弹出栈顶的P1个元素。
Last 指向游标为P1的表或索引中的最后一条记录
Le 从栈顶弹出两个元素,如果第一个(栈顶)小于或等于第二个,则跳转到P2指令处,否则继续执行下一条指令
Lt 从栈顶弹出两个元素,如果第一个(栈顶)小于第二个,则跳转到P2指令处,否则继续执行下一条指令
MakeRecord 从栈顶中弹出P1个元素,把这P1个弹出值合并为一条记录压入栈中,这就是要插入表中的数据记录
MemIncr 把内存单元P2的整数值加P1
MemInt 把整数P1保存到内存单元P2中
MemLoad 把内存单元P1的值复制一份压入栈中,如果内存单元是字符串,那么把内存单元的地址指针压入到栈中
MemMax 把内存单元P1的值设为当前值与栈中值的最大值
MemMove 把内存单元P2中的值移到内存单元P1中,P2单元的值用NULL表示
MemNull 存储NULL到内存单元P1中
MemStore 把栈顶值写到内存单元P1中,如果P2是1,那么出栈一次,否则不出栈
MoveGe 弹出栈顶元素作为记录号,定位游标P1到大于或等于此记录号的行,如果没有记录大于或等于此记录号,则跳转到P2指令处
MoveGt 弹出栈顶元素作为记录号,定位游标P1到大于此记录号的行,如果没有记录大于此记录号,则跳转到P2指令处
MoveLe弹出栈顶元素作为记录号,定位游标P1到小于或等于此记录号的行,如果没有记录小于或等于此记录号,则跳转到P2指令处
MoveLt 弹出栈顶元素作为记录号,定位游标P1到小于此记录号的行,如果没有记录小于此记录号,则跳转到P2指令处
Multiply 从栈顶中弹出两个元素,把他们相乘,然后把结果压入到栈中
Ne从栈顶弹出两个元素进行比较,如果不相等,则跳转到P2指令处执行,否则继续执行下一条指令
Negative 把栈顶的整数用它的相反数替换
NewRowid产生一个整数作为新的记录数,此数因该比所有已有的记录号要大,把这个数压入到栈顶
Next 移动游标到下一条记录
NotExists 把栈顶值作为记录号,如果P1表中没有此记录号,那么跳转到P2,否则,把游标指向该行记录,然后把栈顶元素出栈
NotFound 如果P1表中没有记录与栈顶中的记录相符,那么跳转到P2,否则,把游标指向该行记录,然后把栈顶元素出栈
NotNull 如果栈顶的P1(绝对值)个数据不都是NULL,那么跳转到P2指令处,否则不跳转,如果P1大于0,那么弹出栈顶的P1个元素,否则,栈保持不变。
Null 压入NULL到栈中
NullRow 移动游标P1到一个空行
OpenRead 以只读方式打开数据库文件中根页面为P2的表
OpenWrite 以可写方式打开数据库文件中根页面为P2的表
Or 从栈顶弹出两个元素,把它们进行或运算,然后把运算结果压入到栈中
ParseSchema 从字典表中读入并分析所有符合where条件(P3)的记录
Pop 从栈顶中弹出P1个元素
Prev 移动游标到上一条记录
Pull 把第P1个元素从栈中移出并把它压到栈顶,如“Pull 1 0”相当于把栈顶的两个元素交换位置
Push 把第P1个元素的值用栈顶元素的值来替换,然后把栈顶元素出栈
PutIntKey 出栈两次,把表中记录号为栈中弹出的记录号的记录用栈顶记录替换
Rewind 把游标指向下一条记录,如果记录为空那么跳转到P2指令处,常用这来实现循环
RowData 把游标所指向的行记录压入到栈中
Rowid 把游标所指向的记录号压入到栈中
SetNumColumns 设置表P1的列数为P2
String 字符串P3被压入到栈中
Subtract 从栈中弹出两个元素,用第一个(栈顶)减去第二个,并把结果压入到栈中
Transaction 开始一个事务,P1是要打开的数据库的索引