Bytecode 和 tables_used 是內建於 SQLite 的虛擬表格,用於存取已準備陳述式的資訊。Bytecode 和 tables_used 都作為表值函數運作。它們會接收一個單一必要參數,可能是 SQL 陳述式的文字,或是現有已準備陳述式的指標。Bytecode 函數會為已準備陳述式中的每個位元組碼運算,傳回一列結果。Tables_used 函數會為已準備陳述式存取的每個持久性 B-tree(表格或索引)傳回一列。
只有在 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」指標類型。
位元組碼表的架構為
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 由已準備陳述讀取或寫入,包括主陳述本身以及相關觸發器和外來鍵動作。欄位如下
type → 「table」或「index」,視 b-tree 扮演的角色而定。
schema → b-tree 所在的資料庫檔案。對主資料庫而言會是「main」(通常情況),對 TEMP 表和索引而言會是「temp」,或對 附加 資料庫而言會是 ATTACH 陳述所指定的資料庫名稱。
name → 表或索引的名稱
wr → 如果物件已讀取,則為 0,如果物件已寫入,則為 1
subprog → 存取物件的子程式。NULL 表示已準備陳述式的主體。否則,此欄位是觸發器的名稱或外來鍵動作的「(FK)」。
此頁面最後修改於 2022-01-08 05:02:57 UTC