Специфичные для SQL запросы и ответы
Ниже рассматриваются запросы IPROTO_EXECUTE и IPROTO_PREPARE, а также приводится описание ответов.
Имя | Код | Описание |
|---|---|---|
0x0b | Выполнение SQL-выражения (box.execute()) | |
0x0d | Подготовка SQL-выражения (box.prepare()) |
Код: 0x0b.
Тело представляет собой map из 3 элементов:
-
Используйте IPROTO_STMT_ID (0x43) и идентификатор выражения (MP_INT) при выполнении подготовленного выражения. Используйте IPROTO_SQL_TEXT (0x40) и текст выражения (MP_STR) при выполнении SQL-строки.
-
IPROTO_SQL_BIND (0x41) соответствует массиву значений параметров для подстановки вместо плейсхолдеров ? или :name.
-
IPROTO_OPTIONS (0x2b) соответствует массиву параметров. Обычно он пуст.
Предположим, что подготовлено выражение с двумя плейсхолдерами ? и выполняется с двумя параметрами:
n = conn:prepare([[VALUES (?, ?);]])conn:execute(n.stmt_id, {1,'a'})
Тогда тело будет выглядеть так:
В руководстве Understanding binary protocol показаны фактические байтовые коды сообщения IPROTO_EXECUTE.
Чтобы вызвать подготовленное выражение с именованными параметрами из
коннектора, передавайте параметры в массиве map. Клиент должен обернуть
каждый элемент в map, где ключ содержит имя параметра (с двоеточием), а
значение – фактическое значение. Таким образом, чтобы привязать foo и
bar к 42 и 43, клиент должен отправить
IPROTO_SQL_TEXT: <...>, IPROTO_SQL_BIND: [{"foo": 42}, {"bar": 43}].
Если выражение содержит как именованные, так и неименованные параметры, в map оборачиваются только именованные. Остальные параметры являются позиционными и подставляются по порядку.
Запросим полные метаданные и затем выберем две строки из таблицы с именем 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(параметров для привязки нет).
Тело запроса выглядит так:
Код: 0x0d.
Тело представляет собой map из 1 элемента:
Элемент map IPROTO_PREPARE совпадает с первым элементом тела IPROTO_EXECUTE для SQL-строки.
После заголовка в ответе на SQL-выражение следует тело, которое несколько отличается от тела для запросов и ответов, не связанных с SQL.
Если SQL-выражение – SELECT, VALUES или PRAGMA, ответ содержит:
Запросим полные метаданные и затем выберем две строки из таблицы с именем t1, содержащей колонки с именами DD и Д:
conn.space._session_settings:update('sql_full_metadata', {{'=', 'value', true}})conn:execute([[SELECT dd, дд AS д FROM t1;]])
Тело ответа может выглядеть так:
В руководстве Understanding the binary protocol показаны фактические байтовые коды ответов на приведённые выше SQL-сообщения.
Если SQL-запрос не является SELECT, VALUES или PRAGMA, тело ответа содержит только IPROTO_SQL_INFO (0x42). Обычно IPROTO_SQL_INFO – это map с единственным элементом – SQL_INFO_ROW_COUNT (0x00) – количеством изменённых строк.
Например, если запрос –
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, представляющий собой массив беззнаковых
целых чисел.