| 入力 | 出力 | エイリアス |
|---|---|---|
| ✔ | ✗ |
説明
RowBinaryWithNamesAndTypes フォーマットに似ていますが、各セルの前に 1 バイト追加されており、そのカラムの DEFAULT 値を使用するかどうかを示します。これは RowBinaryWithDefaults フォーマットとまったく同じです。この組み合わせにより、スキーマの進化に対応した INSERT をサポートします。書き込み側はヘッダーからカラムを省略でき、その場合は対象カラムの DEFAULT が使用されます。さらに、送信するカラムについては、個々のセルごとに「そのカラムの DEFAULT を使う」と指定でき、これを NULL と混同せずに扱えます。
このフォーマットは入力専用です。
ワイヤ形式
ヘッダーは RowBinaryWithNamesAndTypes と同一です。
- カラム数
Nを表すVarUInt。 - カラム名を格納した、長さプレフィックス付きの
StringがN個。 N個のカラム型 — テキスト名、またはコンパクトなバイナリエンコーディングのいずれかで、output_format_binary_encode_types_in_binary_format/input_format_binary_decode_types_in_binary_format設定で制御されます。
ヘッダーの後には、各行は N 個のセルで構成されます。各セルについて:
- 1 バイトの
UInt8マーカーバイト。0x01— 対象カラムのDEFAULT式を使用します。後続する値バイトはありません。0x00— 値が続き、カラム型のRowBinaryシリアライザーでシリアライズされます。Nullable(T)の場合、値バイトはNullableの ヌルバイト (非NULLは0、NULL は1) で始まり、非NULLであればその後に内部値が続きます。
デフォルト値と NULL
セルごとのデフォルトマーカーと、Nullable に組み込まれているヌルバイトは独立しています。Nullable(UInt32) DEFAULT 42 カラムは、各行ごとに次の 3 通りで送信できます。
| Bytes | Meaning |
|---|---|
01 |
DEFAULT 42 を使用します。 |
00 01 |
値パスに入り、その後 Nullable 型によって NULL を表します。 |
00 00 … |
値パスに入り、その後に NULL ではない内部値が続きます。 |
スキーマの進化
| ケース | 動作 |
|---|---|
| ファイルのヘッダーにカラムがまったく存在しない | 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 │
└────┘- ヘッダーには、
Nullable(UInt32)型のxという名前のカラムが 1 つあります。 - その 1 つのセルではマーカー
0x01が使われ、"DEFAULT 42を使用する" ことを意味します。
フォーマット設定
以下の設定は、すべての RowBinary 系フォーマットに共通です。
| 設定 | 説明 | デフォルト |
|---|---|---|
format_binary_max_string_size |
RowBinary フォーマットで許可される String の最大サイズです。 | 1GiB |
output_format_binary_encode_types_in_binary_format |
RowBinaryWithNamesAndTypes 出力フォーマットで、ヘッダー内の型を、型名の文字列ではなく binary encoding を使って書き込めるようにします。 |
false |
input_format_binary_decode_types_in_binary_format |
RowBinaryWithNamesAndTypes 入力フォーマットで、ヘッダー内の型を、型名の文字列ではなく binary encoding を使って読み取れるようにします。 |
false |
output_format_binary_write_json_as_string |
RowBinary 出力フォーマットで、JSON データ型の値を JSON String 値として書き込めるようにします。 |
false |
input_format_binary_read_json_as_string |
RowBinary 入力フォーマットで、JSON データ型の値を JSON String 値として読み取れるようにします。 |
false |