Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Специфичные для SQL запросы и ответы

Ниже рассматриваются запросы IPROTO_EXECUTE и IPROTO_PREPARE, а также приводится описание ответов.

Базовое описание запросов

Имя

Код

Описание

IPROTO_EXECUTE

0x0b

Выполнение SQL-выражения (box.execute())

IPROTO_PREPARE

0x0d

Подготовка SQL-выражения (box.prepare())

IPROTO_EXECUTE

Код: 0x0b.

Тело представляет собой map из 3 элементов:

SVG diagram

  • Используйте IPROTO_STMT_ID (0x43) и идентификатор выражения (MP_INT) при выполнении подготовленного выражения. Используйте IPROTO_SQL_TEXT (0x40) и текст выражения (MP_STR) при выполнении SQL-строки.

  • IPROTO_SQL_BIND (0x41) соответствует массиву значений параметров для подстановки вместо плейсхолдеров ? или :name.

  • IPROTO_OPTIONS (0x2b) соответствует массиву параметров. Обычно он пуст.

Пример 1

Предположим, что подготовлено выражение с двумя плейсхолдерами ? и выполняется с двумя параметрами:

n = conn:prepare([[VALUES (?, ?);]])conn:execute(n.stmt_id, {1,'a'})

Тогда тело будет выглядеть так:

SVG diagram

В руководстве Understanding binary protocol показаны фактические байтовые коды сообщения IPROTO_EXECUTE.

Чтобы вызвать подготовленное выражение с именованными параметрами из коннектора, передавайте параметры в массиве map. Клиент должен обернуть каждый элемент в map, где ключ содержит имя параметра (с двоеточием), а значение – фактическое значение. Таким образом, чтобы привязать foo и bar к 42 и 43, клиент должен отправить IPROTO_SQL_TEXT: <...>, IPROTO_SQL_BIND: [{"foo": 42}, {"bar": 43}].

Если выражение содержит как именованные, так и неименованные параметры, в map оборачиваются только именованные. Остальные параметры являются позиционными и подставляются по порядку.

Пример 2

Запросим полные метаданные и затем выберем две строки из таблицы с именем t1, содержащей колонки с именами DD и Д:

conn.space._session_settings:update('sql_full_metadata', {{'=', 'value', true}})conn:prepare([[SELECT dd, дд AS д FROM t1;]])

В iproto-запросе не будет IPROTO_DATA, но будут два дополнительных элемента:

  • 34 00 = IPROTO_BIND_COUNT and MP_UINT = 0 (параметров для привязки нет).
  • 33 90 = IPROTO_BIND_METADATA and MP_ARRAY, size 0 (параметров для привязки нет).

Тело запроса выглядит так:

SVG diagram

IPROTO_PREPARE

Код: 0x0d.

Тело представляет собой map из 1 элемента:

SVG diagram

Элемент map IPROTO_PREPARE совпадает с первым элементом тела IPROTO_EXECUTE для SQL-строки.

Ответы для SQL

После заголовка в ответе на SQL-выражение следует тело, которое несколько отличается от тела для запросов и ответов, не связанных с SQL.

Ответы на SELECT, VALUES или PRAGMA

Если SQL-выражение – SELECT, VALUES или PRAGMA, ответ содержит:

SVG diagram

Пример

Запросим полные метаданные и затем выберем две строки из таблицы с именем t1, содержащей колонки с именами DD и Д:

conn.space._session_settings:update('sql_full_metadata', {{'=', 'value', true}})conn:execute([[SELECT dd, дд AS д FROM t1;]])

Тело ответа может выглядеть так:

SVG diagram

В руководстве Understanding the binary protocol показаны фактические байтовые коды ответов на приведённые выше SQL-сообщения.

Ответы на остальные запросы

Если SQL-запрос не является SELECT, VALUES или PRAGMA, тело ответа содержит только IPROTO_SQL_INFO (0x42). Обычно IPROTO_SQL_INFO – это map с единственным элементом – SQL_INFO_ROW_COUNT (0x00) – количеством изменённых строк.

SVG diagram

Например, если запрос – INSERT INTO {table-name} VALUES (1), (2), (3), то тело ответа содержит map IPROTO_SQL_INFO с SQL_INFO_ROW_COUNT = 3.

Map IPROTO_SQL_INFO может содержать второй элемент – SQL_INFO_AUTO_INCREMENT_IDS (0x01) – новое значение (или значения) первичного ключа для INSERT в таблицу, определённую с PRIMARY KEY AUTOINCREMENT. В этом случае MP_MAP будет содержать два ключа, один из которых – 0x01: SQL_INFO_AUTO_INCREMENT_IDS, представляющий собой массив беззнаковых целых чисел.