小巧、快速、可靠
任選三項
Bytecode() 和 Tables_Used() 表值函數

1. 概觀

Bytecode 和 tables_used 是內建於 SQLite 的虛擬表格,用於存取已準備陳述式的資訊。Bytecode 和 tables_used 都作為表值函數運作。它們會接收一個單一必要參數,可能是 SQL 陳述式的文字,或是現有已準備陳述式的指標。Bytecode 函數會為已準備陳述式中的每個位元組碼運算,傳回一列結果。Tables_used 函數會為已準備陳述式存取的每個持久性 B-tree(表格或索引)傳回一列。

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. 架構

位元組碼表的架構為

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 表用於顯示資料庫檔案的哪些 b-tree 由已準備陳述讀取或寫入,包括主陳述本身以及相關觸發器和外來鍵動作。欄位如下

此頁面最後修改於 2022-01-08 05:02:57 UTC