| Entrada | Saída | Alias |
|---|---|---|
| ✔ | ✗ |
Descrição
Semelhante ao formato RowBinaryWithNamesAndTypes, mas com um byte extra antes de cada célula que indica se o valor DEFAULT da coluna deve ser usado — exatamente como no formato RowBinaryWithDefaults. Essa combinação oferece suporte a INSERTs com evolução de esquema: quem grava pode omitir colunas do cabeçalho (elas recebem o DEFAULT da coluna de destino) e, para qualquer coluna que enviar, pode marcar células individuais como "usar o DEFAULT da coluna" sem confundir isso com NULL.
Este formato é apenas de entrada.
Formato de transmissão
O cabeçalho é idêntico ao de RowBinaryWithNamesAndTypes:
- Um
VarUIntcom o número de colunasN. NStrings prefixadas pelo comprimento com os nomes das colunas.Ntipos de coluna — nomes textuais ou codificação binária compacta, controlados pelas configuraçõesoutput_format_binary_encode_types_in_binary_format/input_format_binary_decode_types_in_binary_format.
Após o cabeçalho, cada linha é composta por N células. Para cada célula:
- Um único byte marcador
UInt8.0x01— usa a expressãoDEFAULTda coluna de destino. Nenhum byte de valor vem em seguida.0x00— um valor vem em seguida, serializado pelo serializadorRowBinarydo tipo da coluna. ParaNullable(T), os bytes do valor começam com o byte nulo deNullable(0para não nulo,1para NULL) e, em seguida, vêm o valor interno, se não for nulo.
Valores padrão vs NULL
O marcador de valor padrão por célula e o byte nulo interno de Nullable são independentes. Uma coluna Nullable(UInt32) DEFAULT 42 pode ser enviada de três formas diferentes por linha:
| Bytes | Significado |
|---|---|
01 |
Use DEFAULT 42. |
00 01 |
Caminho do valor, depois NULL via o tipo Nullable. |
00 00 … |
Caminho do valor, depois um valor interno não nulo. |
Evolução do esquema
| Caso | Comportamento |
|---|---|
| Coluna totalmente ausente do cabeçalho do arquivo | Preenchida no destino via insertDefaultsForNotSeenColumns; condicionada por defaults_for_omitted_fields. |
Coluna presente no cabeçalho, marcador de célula 0x01 |
insertDefault por linha. |
Coluna presente no cabeçalho, marcador de célula 0x00 |
O valor é processado normalmente. |
| Coluna extra no cabeçalho, ausente na tabela de destino | Descartada silenciosamente quando input_format_skip_unknown_fields = 1 (o marcador é consumido primeiro; se 0x01, nada mais; se 0x00, o valor tipado é processado e descartado). |
Exemplo de uso
SELECT * FROM format(
'RowBinaryWithNamesAndTypesAndDefaults',
'x Nullable(UInt32) DEFAULT 42',
unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);┌──x─┐
│ 42 │
└────┘- O cabeçalho contém uma coluna chamada
xdo tipoNullable(UInt32). - A única célula usa o marcador
0x01, que significa "usarDEFAULT 42".
Configurações de formato
As configurações a seguir são comuns a todos os formatos do tipo RowBinary.
| Configuração | Descrição | Padrão |
|---|---|---|
format_binary_max_string_size |
O tamanho máximo permitido para String no formato RowBinary. | 1GiB |
output_format_binary_encode_types_in_binary_format |
Permite escrever tipos no cabeçalho usando codificação binária, em vez de strings com nomes de tipos, no formato de saída RowBinaryWithNamesAndTypes. |
false |
input_format_binary_decode_types_in_binary_format |
Permite ler tipos no cabeçalho usando codificação binária, em vez de strings com nomes de tipos, no formato de entrada RowBinaryWithNamesAndTypes. |
false |
output_format_binary_write_json_as_string |
Permite escrever valores do tipo de dado JSON como valores JSON String no formato de saída RowBinary. |
false |
input_format_binary_read_json_as_string |
Permite ler valores do tipo de dado JSON como valores JSON String no formato de entrada RowBinary. |
false |