在下面的代码片段中,我试图手动迭代sqlite3虚拟机来调查操作码。
我虽然vdbe->nOp
应该返回我的查询的操作数,但是它会返回一些操作,这些操作在每次运行代码时都会发生变化,而且看起来非常不正确。根据sqlite3.exe中的.explain
,此特定查询应该只有20个操作码。当我运行下面的代码时,我会看到数百万的nOp
值,远远超过vdbe->aOp
的大小。代码段错误。
void debug_query(){
sqlite3_stmt *stmt;
sqlite3 *db;
sqlite3_open("./data/dummy_data.db", &db);
int rc = sqlite3_prepare_v2(db, "SELECT * FROM track", 256, &stmt, NULL);
if( rc!=SQLITE_OK ) {
printf("query failed\n");
return;
}
Vdbe *vdbe = (Vdbe*) stmt;
VdbeOp *o = vdbe->aOp;
std::cout << vdbe->nOp << std::endl;
int i;
for(i = 0; i < vdbe->nOp && o[i].opcode != OP_Next; i++);
}