Bytecode 和 tables_used 是内置于 SQLite 中的 虚拟表,用于访问有关 预备语句 的信息。Bytecode 和 tables_used 都作为 表值函数 操作。它们接受一个必需的参数,该参数可以是 SQL 语句的文本,也可以是指向现有预备语句的指针。bytecode 函数为预备语句中的每个 字节码 操作返回一行结果。tables_used 函数为预备语句访问的每个持久 btree(表或索引)返回一行。
只有在 SQLite 使用 -DSQLITE_ENABLE_BYTECODE_VTAB 编译时选项编译时,才能使用 bytecode 和 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”类型的指针。
bytecode 表的模式是
CREATE TABLE bytecode( addr INT, opcode TEXT, p1 INT, p2 INT, p3 INT, p4 TEXT, p5 INT, comment TEXT, subprog TEXT, stmt HIDDEN );
前八列是虚拟机中单个 字节码 的地址、操作码和操作数,该虚拟机实现了该语句。这些列与使用 EXPLAIN 时输出的列相同。bytecode 虚拟表显示预备语句中的所有操作,包括预备语句的主体以及用于实现触发器或外键操作的子程序。对于预备语句的主体,"subprog" 字段为 NULL,或者对于触发器和外键操作,该字段是触发器名称或字符串 "(FK)"。
tables_used 表的模式是
CREATE TABLE tables_used( type TEXT, schema TEXT, name TEXT, wr INT, subprog TEXT, stmt HIDDEN );
tables_used 表旨在显示数据库文件中的哪些 btree 被预备语句读写,包括主语句本身以及相关触发器和外键操作。列如下
type → "table" 或 "index",具体取决于 btree 扮演的角色。
schema → btree 所在的数据库文件。对于主数据库(通常情况)将为“main”,对于临时表和索引将为“temp”,或者对于由 ATTACH 语句分配的 附加 数据库,将为分配的名称。
name → 表或索引的名称
wr → 0 表示对象被读取,1 表示对象被写入
subprog → 访问对象的子程序。NULL 表示预备语句的主体。否则,该字段是触发器的名称或外键操作的 "(FK)"。
此页面最后修改于 2022-01-08 05:02:57 UTC