一、概述
Bytecode 和 tables_used 是内置于 SQLite 中的虚拟表,用于访问有关准备好的语句的信息。字节码和 tables_used 都作为表值函数运行。它们采用一个必需的参数,该参数可以是 SQL 语句的文本,也可以是指向现有预准备语句的指针。 字节码函数为准备好的语句中的每个字节码操作返回一行结果。tables_used 函数为准备好的语句访问的每个持久 btree(表或索引)返回一行。
2.用法
仅当使用-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”指针类型。
2.1. 图式
字节码表的架构是:
CREATE TABLE bytecode( addr INT, opcode TEXT, p1 INT, p2 INT, p3 INT, p4 TEXT, p5 INT, comment TEXT, subprog TEXT, stmt HIDDEN );
前八列是实现该语句的虚拟机中 单个字节码的地址、操作码和操作数。这些列与使用 EXPLAIN 时输出的列相同。字节码虚拟表显示了准备语句中的所有操作,包括准备语句的主体和用于实现触发器或外键操作的子程序。“subprog”字段对于准备语句的主体为 NULL,或者对于触发器和外键操作是触发器名称或字符串“(FK)”。
tables_used 表的架构是:
CREATE TABLE tables_used( type TEXT, schema TEXT, name TEXT, wr INT, subprog TEXT, stmt HIDDEN );
tables_used 表旨在显示准备好的语句读取或写入了数据库文件的哪些 btrees,包括主语句本身以及相关触发器和外键操作。列如下: