RowBinaryWithNamesAndTypesAndDefaults

RowBinaryWithNamesAndTypesAndDefaults

RowBinaryWithNamesAndTypesAndDefaults 포맷은 RowBinaryWithNamesAndTypes 포맷과 비슷하지만, 각 셀 앞에 열의 DEFAULT 값을 사용할지 여부를 나타내는 추가 바이트가 붙는 입력 전용 포맷이에요. 이 조합 덕분에 스키마가 진화하는 INSERT를 지원할 수 있습니다.

출처: 문서

본문

Input Output Alias

Description

RowBinaryWithNamesAndTypes 포맷과 비슷하지만, 각 셀 앞에 그 열의 DEFAULT 값을 사용해야 하는지 여부를 나타내는 추가 바이트가 있어요 — RowBinaryWithDefaults 포맷에서와 정확히 같아요. 이 조합은 스키마가 진화하는 INSERT를 지원해요. 기록하는 쪽은 헤더에서 열을 생략할 수 있는데(그 열에는 대상 열의 DEFAULT가 적용돼요), 보내는 열에 대해서는 NULL과 혼동하지 않고 각 셀을 "열의 DEFAULT 사용"으로 표시할 수 있어요. 이 포맷은 입력 전용입니다.

Wire format

헤더는 RowBinaryWithNamesAndTypes와 동일해요:

  1. 열 개수 N을 나타내는 VarUInt.
  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)의 경우 값 바이트는 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

더 알아보기 (Learn more)