Spec-Zone.ru › SQLite

Табличные функции Bytecode() и Tables_Used()

Содержание
1. Обзор
2. Использование
2.1. Схема bytecode
2.2. Схема 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API