RowBinaryWithNamesAndTypesAndDefaults
RowBinaryWithNamesAndTypesAndDefaults
RowBinaryWithNamesAndTypesAndDefaults 포맷은 RowBinaryWithNamesAndTypes 포맷과 비슷하지만, 각 셀 앞에 열의 DEFAULT 값을 사용할지 여부를 나타내는 추가 바이트가 붙는 입력 전용 포맷이에요. 이 조합 덕분에 스키마가 진화하는 INSERT를 지원할 수 있습니다.
출처: 문서
본문
| Input | Output | Alias |
|---|---|---|
| ✔ | ✗ |
Description
RowBinaryWithNamesAndTypes 포맷과 비슷하지만, 각 셀 앞에 그 열의 DEFAULT 값을 사용해야 하는지 여부를 나타내는 추가 바이트가 있어요 — RowBinaryWithDefaults 포맷에서와 정확히 같아요. 이 조합은 스키마가 진화하는 INSERT를 지원해요. 기록하는 쪽은 헤더에서 열을 생략할 수 있는데(그 열에는 대상 열의 DEFAULT가 적용돼요), 보내는 열에 대해서는 NULL과 혼동하지 않고 각 셀을 "열의 DEFAULT 사용"으로 표시할 수 있어요. 이 포맷은 입력 전용입니다.
Wire format
헤더는 RowBinaryWithNamesAndTypes와 동일해요:
- 열 개수 N을 나타내는 VarUInt.
- 열 이름을 담은 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)의 경우 값 바이트는 Nullable의 null 바이트(0은 null 아님, 1은 NULL)로 시작하고, null이 아닌 경우 내부 값이 뒤따라요.
Defaults vs NULL
셀 단위 기본값 마커와 Nullable의 내장 null 바이트는 서로 독립적이에요. Nullable(UInt32) DEFAULT 42 열은 행마다 세 가지 방식으로 보낼 수 있습니다:
| Bytes | Meaning |
|---|---|
| 01 | DEFAULT 42를 사용해요. |
| 00 01 | 값 경로를 거친 뒤 Nullable 타입으로 NULL 처리. |
| 00 00 … | 값 경로를 거친 뒤 null이 아닌 내부 값. |
Schema evolution
| Case | Behavior |
|---|---|
| 파일의 헤더에 열이 아예 없는 경우 | insertDefaultsForNotSeenColumns로 대상에 채워지며, defaults_for_omitted_fields에 의해 제어돼요. |
| 헤더에 열이 있고 셀 마커가 0x01인 경우 | 행마다 insertDefault가 적용돼요. |
| 헤더에 열이 있고 셀 마커가 0x00인 경우 | 값이 정상적으로 파싱돼요. |
| 헤더에 있고 대상 테이블에는 없는 추가 열인 경우 | input_format_skip_unknown_fields = 1일 때 조용히 버려져요(마커가 먼저 소비되고, 0x01이면 더 진행하지 않으며, 0x00이면 타입이 지정된 값을 파싱해 버려요). |
Example usage
Query
SELECT * FROM format(
'RowBinaryWithNamesAndTypesAndDefaults',
'x Nullable(UInt32) DEFAULT 42',
unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);
Response
┌──x─┐
│ 42 │
└────┘
- 헤더에는 x라는 이름의 열 하나가 Nullable(UInt32) 타입으로 실려 있어요.
- 단일 셀은 마커 0x01 을 사용하므로 "DEFAULT 42 사용"을 의미해요.
Format settings
다음 설정들은 모든 RowBinary 계열 포맷에 공통으로 적용돼요.
| Setting | Description | Default |
|---|---|---|
| format_binary_max_string_size | RowBinary 포맷에서 String에 허용되는 최대 크기예요. | 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 | RowBinary 출력 포맷에서 JSON 데이터 타입의 값을 JSON String 값으로 기록할지 여부예요. | false |
| input_format_binary_read_json_as_string | RowBinary 입력 포맷에서 JSON 데이터 타입의 값을 JSON String 값으로 읽을지 여부예요. | false |