Ключи, используемые в запросах и ответах
В этом разделе описаны ключи iproto, содержащиеся в запросах и
ответах. Ключи – это константы Tarantool, которые определены или
упомянуты в файле
iproto_constants.h.
Хотя сами ключи являются 8-битными целыми числами без знака, их значения могут иметь разные типы.
Имя | Код и | Описание |
|---|---|---|
0x54 | Версия бинарного протокола, поддерживаемая клиентом | |
0x55 | Поддерживаемые функции бинарного протокола | |
0x01 | Уникальный идентификатор запроса | |
0x05 | Версия схемы базы данных | |
IPROTO_TIMESTAMP | 0x04 | Время в секундах с начала эпохи Unix |
0x00 | Тип запроса или тип ответа | |
0x52 | Ответ с ошибкой | |
0x31 | Ошибка в виде строки | |
IPROTO_DATA | 0x30 | Данные, переданные в транзакции. Могут быть пустыми. Используются во всех запросах и ответах |
IPROTO_SPACE_ID | 0x10 | Идентификатор спейса |
IPROTO_INDEX_ID | 0x11 | Идентификатор индекса |
0x21 | Кортеж, аргументы, операции или пара аутентификации. Подробнее | |
IPROTO_KEY | 0x20 | Массив ключей индекса в запросе. См. space_object:select() |
IPROTO_LIMIT | 0x12 | Максимальное количество кортежей в спейсе |
IPROTO_OFFSET | 0x13 | Количество кортежей, пропускаемых при выборке |
0x14 | Тип итератора | |
IPROTO_INDEX_BASE | 0x15 | Указывает, начинается ли нумерация полей с 1 или с 0 |
IPROTO_FUNCTION_NAME | 0x22 | Имя вызываемой функции. Используется в IPROTO_CALL |
IPROTO_USER_NAME | 0x23 | Имя пользователя. Используется в IPROTO_AUTH |
IPROTO_OPS | 0x28 | Массив операций. Используется в IPROTO_UPSERT |
IPROTO_EXPR | 0x27 | Аргумент команды. Используется в IPROTO_EVAL |
IPROTO_AUTH_TYPE | 0x5b | Протокол, используемый для генерации данных аутентификации пользователя |
IPROTO_AFTER_POSITION | 0x2e | Позиция кортежа, после которой space_object:select() начинает поиск |
IPROTO_AFTER_TUPLE | 0x2f | Кортеж, после которого space_object:select() начинает поиск |
IPROTO_FETCH_POSITION | 0x1f | Если true, space_object:select() возвращает позицию последнего выбранного кортежа |
IPROTO_POSITION | 0x35 | Если |
Имя | Код и | Описание |
|---|---|---|
0x0a | Уникальный идентификатор потока | |
IPROTO_TIMEOUT | 0x56 | Время ожидания в секундах, по истечении которого транзакции откатываются |
0x59 | Уровень изоляции транзакций |
Имя | Код и | Описание |
|---|---|---|
IPROTO_REPLICA_ID | 0x02 | Идентификатор реплики |
IPROTO_INSTANCE_UUID | 0x24 | UUID экземпляра |
0x26 | Векторные часы (vclock) экземпляра | |
0x5a | Идентификатор запроса синхронизации векторных часов. Начиная с версии 2.11 | |
IPROTO_REPLICASET_UUID | 0x25 | До версии Tarantool 2.11 IPROTO_REPLICASET_UUID назывался IPROTO_CLUSTER_UUID. |
IPROTO_LSN | 0x03 | Порядковый номер транзакции в журнале (LSN) |
IPROTO_TSN | 0x08 | Порядковый номер транзакции |
0x01 | True, если экземпляр настроен как read_only. Начиная с версии 2.6.1 | |
0x02 | Текущие векторные часы экземпляра | |
0x03 | Векторные часы самой старой записи WAL экземпляра | |
0x04 | True, если экземпляр недоступен для записи: настроен как read_only, имеет статус orphan или является ведомым узлом Raft. Начиная с версии 2.6.1 | |
0x05 | True, если реплика анонимная. Соответствует replication.anon. Начиная с версии 2.7.1 | |
0x06 | True, если экземпляр завершил процесс начальной загрузки или восстановления. Начиная с версий 2.7.3, 2.8.2, 2.10.0 | |
0x07 | True, если box.cfg.election_mode имеет значение | |
0x08 | UUID лидера начальной загрузки. UUID кодируется как строка из 36 байт. Начиная с версии 2.11 | |
0x09 | Массив элементов MP_STR, содержащий UUID участников, зарегистрированных в наборе реплик. Каждый UUID кодируется как строка из 36 байт. Начиная с версии 2.11 | |
0x0a | Имя экземпляра. Начиная с версии 3.0 | |
0x09 | Вспомогательные данные для указания состояния последнего сообщения транзакции. Включаются в заголовок любого DML-запроса, записываемого в WAL. | |
IPROTO_SERVER_VERSION | 0x06 | Версия Tarantool подписывающегося узла в компактном представлении |
IPROTO_REPLICA_ANON | 0x50 | Необязательный ключ, используемый в запросе SUBSCRIBE. True, если подписывающаяся реплика анонимная |
IPROTO_ID_FILTER | 0x51 | Необязательный ключ, используемый в запросе SUBSCRIBE, за которым следует массив идентификаторов экземпляров, строки которых не будут переданы реплике. Начиная с версии 2.10.0 |
IPROTO_REPLICASET_NAME | 0x5c | Необязательный ключ, используемый для передачи имени экземпляра-инициатора в запросах JOIN, SUBSCRIBE и REGISTER. |
IPROTO_INSTANCE_NAME | 0x5d | Необязательный ключ, используемый для передачи имени набора реплик экземпляра в запросах SUBSCRIBE. |
Имя | Код и | Описание |
|---|---|---|
0x53 | Терм RAFT на экземпляре | |
IPROTO_RAFT_TERM | 0x00 | Терм RAFT на экземпляре. Ключ используется только для запросов типа IPROTO_RAFT. |
IPROTO_RAFT_VOTE | 0x01 | Голос экземпляра в текущем терме (если есть) |
IPROTO_RAFT_STATE | 0x02 | Состояние RAFT. Возможные значения: |
0x03 | Текущие векторные часы экземпляра | |
IPROTO_RAFT_LEADER_ID | 0x04 | Идентификатор текущего лидера, каким его видит узел, отправляющий запрос. Начиная с версии 2.10.0 |
IPROTO_RAFT_IS_LEADER_SEEN | 0x05 | True, если узел имеет прямое соединение с узлом-лидером. Начиная с версии 2.10.0 |
Все ключи IPROTO_RAFT_* используются только в запросах IPROTO_RAFT*.
Подробнее о событиях и подписках в iproto см. box-protocol-watchers.
Эти ключи используются с SQL в специфичных для SQL запросах и ответах, таких как IPROTO_EXECUTE и IPROTO_PREPARE.
Имя | Код и | Описание |
|---|---|---|
IPROTO_SQL_TEXT | 0x40 | Текст SQL-запроса |
IPROTO_STMT_ID | 0x43 | Идентификатор подготовленного запроса |
IPROTO_OPTIONS | 0x2b | Параметры SQL-транзакции. Обычно пустые |
0x32 | Метаданные SQL-транзакции | |
IPROTO_FIELD_NAME | 0x00 | Имя поля. Вложено в IPROTO_METADATA |
IPROTO_FIELD_TYPE | 0x01 | Тип поля. Вложено в IPROTO_METADATA |
IPROTO_FIELD_COLL | 0x02 | Правила сортировки поля. Вложено в IPROTO_METADATA |
IPROTO_FIELD_IS_NULLABLE | 0x03 | True, если поле может содержать NULL. Вложено в IPROTO_METADATA. |
IPROTO_FIELD_IS_AUTOINCREMENT | 0x04 | True, если поле автоинкрементное. Вложено в IPROTO_METADATA. |
IPROTO_FIELD_SPAN | 0x05 | Исходное выражение в SELECT. Вложено в IPROTO_METADATA. См. box.execute() |
IPROTO_BIND_METADATA | 0x33 | Имена и типы связываемых переменных |
IPROTO_BIND_COUNT | 0x34 | Количество параметров для привязки |
0x41 | Значения параметров для подстановки вместо плейсхолдеров ? или :name | |
IPROTO_SQL_INFO | 0x42 | Дополнительные параметры, связанные с SQL |
SQL_INFO_ROW_COUNT | 0x00 | Количество изменённых строк. Равно |
SQL_INFO_AUTO_INCREMENT_IDS | 0x01 | Новое значение (или значения) первичного ключа для INSERT в таблицу, определённую с PRIMARY KEY AUTOINCREMENT. Вложено в IPROTO_SQL_INFO |
Код: 0x54.
IPROTO_VERSION – целое число, отражающее версию протокола, которую поддерживает клиент. Последняя версия IPROTO_VERSION – IPROTO_VERSION.
Код: 0x55.
Доступные IPROTO_FEATURES:
-
IPROTO_FEATURE_STREAMS = 0– поддержка потоков: IPROTO_STREAM_ID в заголовке запроса. -
IPROTO_FEATURE_TRANSACTIONS = 1– поддержка транзакций: команды IPROTO_BEGIN, IPROTO_COMMIT и IPROTO_ROLLBACK (с IPROTO_STREAM_ID в заголовке запроса). Подробнее см. отправку команд транзакций. -
IPROTO_FEATURE_ERROR_EXTENSION = 2– поддержка расширения MP_ERROR MsgPack. Клиенты, не поддерживающие эту возможность, получают ответы об ошибках на IPROTO_EVAL и IPROTO_CALL в виде строковых сообщений об ошибках. -
IPROTO_FEATURE_WATCHERS = 3– поддержка удаленных наблюдателей: команды IPROTO_WATCH, IPROTO_UNWATCH и IPROTO_EVENT. -
IPROTO_FEATURE_INSERT_ARROW = 12– поддержка вставки данных в формате Arrow. Подробнее об этой возможности. Доступно начиная с версии 3.3.0.
Код: 0x01.
Это беззнаковое целое число, которое должно увеличиваться так, чтобы быть уникальным для каждого запроса. Это число также возвращается функцией box.session.sync().
Значение IPROTO_SYNC в ответе должно совпадать со значением IPROTO_SYNC в запросе.
Код: 0x05.
Версия схемы базы данных – беззнаковое число, которое увеличивается при значительном изменении схемы.
В заголовке запроса IPROTO_SCHEMA_VERSION является необязательным, поэтому при его отсутствии версия проверяться не будет.
В заголовке ответа IPROTO_SCHEMA_VERSION присутствует всегда, и проверка того, изменилась ли версия, выполняется на стороне клиента.
Код: 0x14.
Возможные значения (см. iterator_type.h):
| |
|---|---|
| |
| ALL, все кортежи |
| LT, меньше чем |
| LE, меньше или равно |
| GE, больше или равно |
| GT, больше чем |
| BITS_ALL_SET, все биты значения установлены в ключе |
| BITS_ANY_SET, хотя бы один бит значения установлен |
| BITS_ALL_NOT_SET, биты не установлены |
| OVERLAPS, пересекается с прямоугольником или параллелепипедом |
| NEIGHBOR, соседствует с прямоугольником или параллелепипедом |
Код: 0x0a.
Используется только в потоках. Это беззнаковое число, которое должно быть уникальным для каждого потока.
В запросах IPROTO_STREAM_ID используется для двух целей: обеспечения выполнения запросов внутри транзакций отдельными группами и обеспечения строго консистентного выполнения запросов (вне зависимости от того, выполняются ли они внутри транзакций).
В ответах IPROTO_STREAM_ID не используется.
См. Бинарный протокол – потоки.
IPROTO_TXN_ISOLATION – уровень изоляции транзакций. Может принимать следующие значения:
TXN_ISOLATION_DEFAULT = 0– использовать уровень по умолчанию изbox.cfg(значение по умолчанию)TXN_ISOLATION_READ_COMMITTED = 1– чтение зафиксированных, но еще не подтвержденных измененийTXN_ISOLATION_READ_CONFIRMED = 2– чтение подтвержденных измененийTXN_ISOLATION_BEST_EFFORT = 3– определять уровень изоляции автоматически
См. Бинарный протокол – потоки, чтобы узнать больше о потоковых транзакциях в бинарном протоколе.
Код: 0x00.
Этот ключ используется как в запросах, так и в ответах. Он указывает тип запроса или ответа и в качестве значения содержит имя запроса или ответа (например: IPROTO_AUTH). Запросы и ответы см. в разделах взаимодействие клиента и сервера, репликация, события и подписки, потоки и интерактивные транзакции.
Код: 0x52.
В случае ошибки тело ответа содержит IPROTO_ERROR и IPROTO_ERROR_24 вместо IPROTO_DATA.
Подробнее об ответах с ошибками см. в разделе Формат запросов и ответов.
Код: 0x31.
IPROTO_ERROR_24 используется в версиях Tarantool до 2.4.1. Ключ содержит ошибку в строковом формате.
Начиная с Tarantool 2.4.1 Tarantool упаковывает ошибки как расширение MP_ERROR MessagePack, которое включает дополнительную информацию. В теле ответа с ошибкой передаются два ключа: IPROTO_ERROR и IPROTO_ERROR_24.
Подробнее об ответах с ошибками см. в разделе Формат запросов и ответов.
Код: 0x21.
Несколько операций используют этот ключ по-разному:
Кортеж для вставки | |
|---|---|
Операции для выполнения | |
IPROTO_AUTH
Массив из 2 полей: |
Код: 0x09.
При репликации синхронных транзакций ключ IPROTO_FLAGS включается в заголовок. Ключ содержит значение MP_UINT с одним или несколькими битами:
-
IPROTO_FLAG_COMMIT (0x01) устанавливается, если это последнее сообщение транзакции.
-
IPROTO_FLAG_WAIT_SYNC (0x02) устанавливается, если это последнее сообщение транзакции, которая не может быть завершена немедленно.
-
IPROTO_FLAG_WAIT_ACK (0x04) устанавливается, если это последнее сообщение синхронной транзакции.
Пример:
Код: 0x53.
- Ключ используется в запросах IPROTO_RAFT_PROMOTE и IPROTO_RAFT_DEMOTE.
- Начиная с версии 2.11 ключ включается в ответ на сообщение heartbeat. Терм соответствует значению box.info.synchro.queue.term на экземпляре-отправителе.
Vclock (векторные часы) – это карта порядковых номеров журнала, определяющая версию набора данных, хранящегося на узле. Фактически она представляет количество логических операций, выполненных на конкретном узле. Vclock выглядит так:
Существует пять ключей, соответствующих векторным часам в различных контекстах репликации. Все они имеют тип MP_MAP:
-
IPROTO_VCLOCK (0x26) передается новому экземпляру, присоединяющемуся к набору реплик.
-
IPROTO_VCLOCK_SYNC (0x5a) используется в heartbeat-сообщениях репликации. Мастер отправляет свои heartbeat-сообщения реплике, включая этот монотонно возрастающий ключ. Как только реплика получает heartbeat с ненулевым значением IPROTO_VCLOCK_SYNC, она начинает отвечать с тем же значением во всех подтверждениях. Этот ключ был добавлен в версии 2.11.
-
IPROTO_BALLOT_VCLOCK (0x02) включается в сообщение IPROTO_BALLOT. IPROTO_BALLOT отправляется в ответ на запрос IPROTO_VOTE. Этот ключ был добавлен в /release/2.6.1.
-
IPROTO_BALLOT_GC_VCLOCK (0x03) также включается в сообщение IPROTO_BALLOT. IPROTO_BALLOT отправляется в ответ на запрос IPROTO_VOTE. Это vclock самой старой записи WAL на экземпляре. Соответствует box.info.gc().vclock. Этот ключ был добавлен в /release/2.6.1.
-
IPROTO_RAFT_VCLOCK (0x03) включается в сообщение IPROTO_RAFT. Присутствует только на экземплярах в состоянии "candidate" (IPROTO_RAFT_STATE == 2).
Все ключи IPROTO_BALLOT* используются только в запросах IPROTO_BALLOT. Начиная с версий /release/2.7.3, /release/2.8.2 и /release/2.10.0 были произведены следующие переименования:
- IPROTO_BALLOT_IS_RO_CFG (0x01) ранее назывался IPROTO_BALLOT_IS_RO.
- IPROTO_BALLOT_IS_RO (0x04) ранее назывался IPROTO_BALLOT_IS_LOADING.
Код: 0x32.
Используется с SQL в рамках IPROTO_EXECUTE.
Ключ содержит массив карт колонок, при этом каждая карта колонки содержит как минимум IPROTO_FIELD_NAME (0x00) и MP_STR, а также IPROTO_FIELD_TYPE (0x01) и MP_STR.
Кроме того, если sql_full_metadata в системном пространстве
_session_settings имеет значение TRUE, то
массив содержит дополнительные карты колонок, соответствующие
компонентам, описанным в разделе
box.execute().
Код: 0x41.
Используется с SQL в рамках IPROTO_EXECUTE.
IPROTO_SQL_BIND – это массив значений параметров для подстановки вместо плейсхолдеров. Может содержать значения любого типа, включая MP_MAP.
-
Значения, не являющиеся MP_MAP, заменяют плейсхолдеры
?в запросе. -
Значения MP_MAP должны иметь формат
{[name] = value}, гдеname– именованный параметр в запросе. Пример такого запроса:tarantool> conn:execute('SELECT ?, ?, :name1, ?, :name2, :name1', {1, 2, {[':name1'] = 5}, 'str', {[':name2'] = true}})---- metadata:- name: COLUMN_1type: integer- name: COLUMN_2type: integer- name: COLUMN_3type: integer- name: COLUMN_4type: text- name: COLUMN_5type: boolean- name: COLUMN_6type: booleanrows:- [1, 2, 5, 'str', true, 5]