小巧。快速。可靠。
三选其二。
Bytecode() 和 Tables_Used() 表值函数

1. 概述

Bytecode 和 tables_used 是内置于 SQLite 中的 虚拟表,用于访问有关 预备语句 的信息。Bytecode 和 tables_used 都作为 表值函数 操作。它们接受一个必需的参数,该参数可以是 SQL 语句的文本,也可以是指向现有预备语句的指针。bytecode 函数为预备语句中的每个 字节码 操作返回一行结果。tables_used 函数为预备语句访问的每个持久 btree(表或索引)返回一行。

2. 用法

只有在 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”类型的指针。

2.1. 模式

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

此页面最后修改于 2022-01-08 05:02:57 UTC