Табличные функции Bytecode() и Tables_Used()
1. Обзор
bytecode и tables_used — это встроенные в SQLite виртуальные таблицы, предоставляющие доступ к информации о подготовленных инструкциях. Обе таблицы bytecode и tables_used работают как табличные функции. Они принимают один обязательный аргумент: текст SQL-инструкции или указатель на существующую подготовленную инструкцию. Функция bytecode возвращает одну строку результата для каждой операции байткода в подготовленной инструкции. Функция tables_used возвращает одну строку для каждого постоянного B-дерева (таблицы или индекса), к которому обращается подготовленная инструкция.
2. Использование
Таблицы bytecode и tables_used доступны только в том случае, если SQLite был собран с параметром компиляции -DSQLITE_ENABLE_BYTECODE_VTAB. CLI собран с этим параметром, поэтому стандартный CLI можно использовать как тестовую платформу для экспериментов.
Обе виртуальные таблицы доступны только для чтения и являются виртуальными таблицами, существующими только под собственным именем. Чтобы использовать их, укажите их непосредственно в предложении FROM оператора SELECT. Каждая из них требует один аргумент — SQL-инструкцию, которую необходимо проанализировать. Например:
SELECT * FROM bytecode('SELECT * FROM bytecode(?1)');
Аргументом может быть текст SQL-инструкции — в этом случае возвращается байткод (или tables_used) для этой инструкции — либо параметр, например ?1 или $stmt, которому позднее привязывается объект подготовленной инструкции с помощью интерфейса sqlite3_bind_pointer(). Для интерфейса sqlite3_bind_pointer() используйте тип указателя "stmt-pointer".
2.1. Схема bytecode
Схема виртуальной таблицы bytecode:
CREATE TABLE bytecode( addr INT, opcode TEXT, p1 INT, p2 INT, p3 INT, p4 TEXT, p5 INT, comment TEXT, subprog TEXT, nexec INT, ncycle INT, stmt HIDDEN );
Первые восемь столбцов содержат адрес, код операции и операнды для одной операции байткода виртуальной машины, выполняющей эту инструкцию. Это те же столбцы, которые выводятся при использовании EXPLAIN.
Виртуальные таблицы bytecode показывают все операции подготовленной инструкции: как в её основном теле, так и во вложенных программах, используемых для выполнения триггеров или действий внешних ключей. Поле "subprog" имеет значение NULL для основного тела подготовленной инструкции; в противном случае в нём указано имя триггера или строка "(FK)" для триггеров и действий внешних ключей соответственно.
Столбцы "nexec" и "ncycle" показывают соответственно количество выполнений каждого кода операции и общее количество тактов процессора, затраченных на этот код операции. Эти поля всегда имеют значение 0, если SQLite не был собран с параметрами компиляции SQLITE_ENABLE_STMT_SCANSTATUS и статистика scan-status не включена с помощью интерфейса sqlite3_db_config(db,SQLITE_DBCONFIG_STMT_SCANSTATUS,...). Значения nexec и ncycle являются накопительными, пока не будут сброшены с помощью sqlite3_stmt_scanstatus_reset().
В настоящее время столбец "ncycle" всегда возвращает 0, если SQLite не собран для процессоров X86_64 или AARCH64 с помощью GCC, Clang или MSVC либо для процессоров PPC с помощью GCC или Clang.
2.2. Схема tables_used
Схема таблицы tables_used:
CREATE TABLE tables_used( type TEXT, schema TEXT, name TEXT, wr INT, subprog TEXT, stmt HIDDEN );
Таблица tables_used предназначена для отображения B-деревьев файла базы данных, которые читаются или изменяются подготовленной инструкцией: как самой основной инструкцией, так и связанными с ней триггерами и действиями внешних ключей. Столбцы описаны ниже:
type → Значение "table" или "index" в зависимости от роли B-дерева.
schema → Файл базы данных, в котором находится B-дерево. Для основной базы данных (обычный случай) это значение "main", для временных таблиц и индексов — "temp", а для подключённых баз данных — имя, присвоенное им оператором ATTACH.
name → Имя таблицы или индекса
wr → 0, если объект читается; 1, если объект изменяется
subprog → Подпрограмма, в которой происходит обращение к объекту. Значение NULL означает основное тело подготовленной инструкции. В противном случае в этом поле указано имя триггера или "(FK)" для действия внешнего ключа.
Последнее обновление этой страницы: 2025-11-13 07:12:58Z
SQLite is in the Public Domain.
https://sqlite.org/bytecodevtab.html