Перейти к основному содержимому
Перейти к основному содержимому

RowBinaryWithNamesAndTypesAndDefaults

ВводВыводПсевдоним

Описание

Аналогично формату RowBinaryWithNamesAndTypes, но с дополнительным байтом перед каждой ячейкой, который указывает, нужно ли использовать значение DEFAULT для столбца, — точно так же, как в формате RowBinaryWithDefaults. Эта комбинация поддерживает INSERT с изменением схемы: отправляющая сторона может опускать столбцы в заголовке (в этом случае для них будет использоваться DEFAULT целевого столбца), а для любого столбца, который она всё же передаёт, может пометить отдельные ячейки как «использовать DEFAULT столбца», не смешивая это с NULL.

Этот формат предназначен только для ввода.

Формат передачи данных

Заголовок совпадает с RowBinaryWithNamesAndTypes:

  1. VarUInt с количеством столбцов N.
  2. N значений String с префиксом длины, содержащих имена столбцов.
  3. 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) байты значения начинаются с null-байта Nullable (0 для не-NULL, 1 для NULL), затем, если значение не NULL, идет внутреннее значение.

Значения по умолчанию и NULL

Маркер значения по умолчанию на уровне ячейки и встроенный в Nullable null-байт не зависят друг от друга. Столбец Nullable(UInt32) DEFAULT 42 можно передавать для каждой строки тремя разными способами:

БайтыЗначение
01Использовать DEFAULT 42.
00 01Вариант со значением, затем NULL через тип Nullable.
00 00 …Вариант со значением, затем внутреннее значение, отличное от NULL.

Эволюция схемы

СлучайПоведение
Столбец полностью отсутствует в заголовке файлаЗаполняется в целевой таблице через insertDefaultsForNotSeenColumns; управляется параметром defaults_for_omitted_fields.
Столбец присутствует в заголовке, маркер ячейки 0x01insertDefault для каждой строки.
Столбец присутствует в заголовке, маркер ячейки 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.

SettingDescriptionDefault
format_binary_max_string_sizeМаксимально допустимый размер значения типа String в формате RowBinary.1GiB
output_format_binary_encode_types_in_binary_formatПозволяет записывать типы в заголовке с использованием binary encoding вместо строк с именами типов в формате вывода RowBinaryWithNamesAndTypes.false
input_format_binary_decode_types_in_binary_formatПозволяет читать типы в заголовке с использованием binary encoding вместо строк с именами типов в формате ввода 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