Bytecode和table_used是SQLite内置的虚拟表,用于访问有关准备好的语句的信息。字节码和table_used都可以用作表值函数。它们采用一个必需的参数,该参数可以是SQL语句的文本,也可以是指向现有的准备好的语句的指针。字节码函数为 准备好的语句中的每个字节码操作返回一行结果。table_used函数为由prepared语句访问的每个持久性btree(表或索引)返回一行。
仅当使用-DSQLITE_ENABLE_BYTECODE_VTAB编译时选项编译SQLite时,字节码表和tables_used表才可用。该CLI已编制这种方式,所以你可以使用标准的 CLI作为测试平台,以实验性功能。
这两个虚拟表都是只读的同义虚拟表。您可以通过在SELECT语句的FROM子句中直接提及它们来使用它们。它们都需要一个参数,即要分析的SQL语句。例如:
SELECT * FROM bytecode('SELECT * FROM bytecode(?1)');
参数可以是SQL语句的文本,在这种情况下,将返回该语句的字节码(或tables_used),或者参数可以是诸如?1或$ stmt之类的参数,该参数随后绑定到已准备好的语句对象使用 sqlite3_bind_pointer()接口。在sqlite3_bind_pointer()接口中使用“ stmt-pointer”指针类型。
字节码表的架构为:
创建表字节码( 地址INT, 操作码TEXT, p1 INT, p2 INT, p3 INT, p4 TEXT, p5 INT, 评论TEXT, subprog TEXT, 隐藏 );
前八列是实现该语句的虚拟机中单个字节码的地址,操作码和操作数。这些列与使用EXPLAIN时输出的列相同。字节码虚拟表显示了预处理语句中的所有操作,包括预处理语句的主体和用于实现触发器或外键动作的子程序。对于准备好的语句的主体,“ subprog”字段为NULL,对于触发器和外键操作,该字段为触发器名称或字符串“(FK)”。
table_used表的架构为:
创建表table_used( 输入TEXT, 模式TEXT, 名称TEXT, wr INT, subprog TEXT, 隐藏 );
table_used表旨在显示准备好的语句读取或写入数据库文件的哪些btree,既可以通过主语句本身,也可以通过相关的触发器和外键动作来读取或写入。列如下: