| Вход | Выход | Псевдоним |
|---|---|---|
| ✔ | ✗ |
Описание
Похож на формат RowBinaryWithNamesAndTypes, но перед каждой ячейкой добавляется дополнительный байт, который указывает, нужно ли использовать значение DEFAULT для столбца, — точно так же, как в формате RowBinaryWithDefaults. Такая комбинация поддерживает INSERT при изменении схемы: отправитель может опускать столбцы в заголовке (тогда для них используется DEFAULT целевого столбца), а для любого передаваемого столбца может помечать отдельные ячейки как «использовать DEFAULT столбца», не смешивая это с NULL.
Этот формат предназначен только для ввода.
Формат передачи данных
Заголовок идентичен RowBinaryWithNamesAndTypes:
VarUIntс числом столбцовN.NзначенийStringс префиксом длины, содержащих имена столбцов.Nтипов столбцов — либо в виде текстовых имен, либо в компактном двоичном кодировании, в зависимости от настроекoutput_format_binary_encode_types_in_binary_format/input_format_binary_decode_types_in_binary_format.
После заголовка каждая строка состоит из N ячеек. Для каждой ячейки:
- Один байт-маркер
UInt8.0x01— использовать выражениеDEFAULTцелевого столбца. Байты значения после этого не следуют.0x00— далее идет значение, сериализованное с помощью сериализатораRowBinaryдля типа столбца. ДляNullable(T)байты значения начинаются сNullablenull-байта (0для не-NULL,1для NULL), затем идет внутреннее значение, если оно не равно NULL.
Значения по умолчанию и NULL
Маркер значения по умолчанию для каждой ячейки и встроенный null-байт в Nullable независимы друг от друга. Столбец Nullable(UInt32) DEFAULT 42 можно передавать тремя разными способами для каждой строки:
| Байты | Значение |
|---|---|
01 |
Использовать DEFAULT 42. |
00 01 |
Сначала путь значения, затем NULL через тип Nullable. |
00 00 … |
Сначала путь значения, затем ненулевое внутреннее значение. |
Изменение схемы
| Случай | Поведение |
|---|---|
| Столбец полностью отсутствует в заголовке файла | Заполняется в целевой таблице с помощью insertDefaultsForNotSeenColumns; управляется параметром defaults_for_omitted_fields. |
Столбец присутствует в заголовке, маркер ячейки 0x01 |
Для каждой строки вызывается insertDefault. |
Столбец присутствует в заголовке, маркер ячейки 0x00 |
Значение разбирается как обычно. |
| Лишний столбец в заголовке, отсутствующий в целевой таблице | Игнорируется, если input_format_skip_unknown_fields = 1 (сначала считывается маркер; если 0x01, больше ничего не происходит; если 0x00, типизированное значение разбирается и отбрасывается). |
Пример использования
SELECT * FROM format(
'RowBinaryWithNamesAndTypesAndDefaults',
'x Nullable(UInt32) DEFAULT 42',
unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);┌──x─┐
│ 42 │
└────┘- В заголовке указан один столбец с именем
xтипаNullable(UInt32). - Единственная ячейка использует маркер
0x01, что означает "использоватьDEFAULT 42".
Настройки формата
Следующие настройки общие для всех форматов типа RowBinary.
| Настройка | Описание | По умолчанию |
|---|---|---|
format_binary_max_string_size |
Максимально допустимый размер значения String в формате RowBinary. | 1GiB |
output_format_binary_encode_types_in_binary_format |
Позволяет записывать типы в заголовке с использованием двоичного кодирования вместо строк с именами типов в выходном формате RowBinaryWithNamesAndTypes. |
false |
input_format_binary_decode_types_in_binary_format |
Позволяет читать типы в заголовке с использованием двоичного кодирования вместо строк с именами типов во входном формате RowBinaryWithNamesAndTypes. |
false |
output_format_binary_write_json_as_string |
Позволяет записывать значения типа данных JSON как значения JSON типа String в выходном формате RowBinary. |
false |
input_format_binary_read_json_as_string |
Позволяет читать значения типа данных JSON как значения JSON типа String во входном формате RowBinary. |
false |