Bytecode() 和 Tables_Used() 表值函数

、概述

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,包括主语句本身以及相关触发器和外键操作。列如下:

  • 类型→ “表”或“索引”,具体取决于 btree 所服务的角色。

  • schema → btree 位于哪个数据库文件中。对于主数据库(通常情况),这将是“main”,对于 TEMP 表和索引,这将是“temp”,或者是ATTACH语句 分配给附加数据库的名称。

  • 名称→ 表或索引的名称

  • wr → 0 如果对象被读取,1 如果对象被写入

  • subprog → 访问对象的子程序。NULL 表示准备语句的主体。否则,此字段是触发器的名称或外键操作的“(FK)”。