본문으로 바로가기
본문으로 바로가기

RowBinaryWithNamesAndTypesAndDefaults

입력출력별칭

설명

RowBinaryWithNamesAndTypes 포맷과 유사하지만, 각 셀 앞에 해당 컬럼의 DEFAULT 값을 사용해야 하는지를 나타내는 추가 바이트가 있습니다. 이는 RowBinaryWithDefaults 포맷과 정확히 동일합니다. 이 조합은 스키마가 변경되는 상황의 INSERT를 지원합니다. 즉, 작성기는 헤더에서 컬럼을 생략할 수 있으며(이 경우 대상 컬럼의 DEFAULT가 적용됨), 전송하는 컬럼에 대해서도 각 셀을 NULL과 혼동하지 않고 "컬럼의 DEFAULT 사용"으로 표시할 수 있습니다.

이 포맷은 입력 전용입니다.

wire 형식

헤더는 RowBinaryWithNamesAndTypes와 동일합니다:

  1. 컬럼 수 N을 나타내는 VarUInt 1개.
  2. 컬럼 이름이 담긴 길이 접두사가 붙은 String N개.
  3. N개의 컬럼 타입 — 텍스트 이름 또는 간결한 바이너리 인코딩 중 하나이며, output_format_binary_encode_types_in_binary_format / input_format_binary_decode_types_in_binary_format 설정으로 제어됩니다.

헤더 다음에는 각 행이 N개의 셀로 구성됩니다. 각 셀에는 다음이 포함됩니다:

  • UInt8 마커 바이트 1개.
    • 0x01 — 대상 컬럼의 DEFAULT 표현식을 사용합니다. 뒤따르는 값 바이트는 없습니다.
    • 0x00 — 값이 뒤따르며, 컬럼 타입의 RowBinary 직렬화기를 통해 직렬화됩니다. Nullable(T)의 경우 값 바이트는 Nullable null 바이트(널이 아니면 0, NULL이면 1)로 시작하고, 널이 아닌 경우 그 뒤에 내부 값이 이어집니다.

기본값과 NULL

셀 단위 기본값 마커와 Nullable의 내장 NULL 바이트는 서로 독립적입니다. Nullable(UInt32) DEFAULT 42 컬럼은 각 행에서 세 가지 방식으로 전송될 수 있습니다:

바이트의미
01DEFAULT 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개가 있습니다.
  • 단일 셀은 0x01 마커를 사용하며, 이는 "DEFAULT 42 사용"을 의미합니다.

포맷 설정

다음 설정은 모든 RowBinary 유형 포맷에 공통적으로 적용됩니다.

설정설명기본값
format_binary_max_string_sizeRowBinary 포맷에서 String 값에 허용되는 최대 크기입니다.1GiB
output_format_binary_encode_types_in_binary_formatRowBinaryWithNamesAndTypes 출력 포맷에서 타입 이름이 포함된 문자열 대신, 헤더에 있는 타입을 binary encoding으로 기록하도록 합니다.false
input_format_binary_decode_types_in_binary_formatRowBinaryWithNamesAndTypes 입력 포맷에서 타입 이름이 포함된 문자열 대신, 헤더에 있는 타입을 binary encoding으로 읽도록 합니다.false
output_format_binary_write_json_as_stringRowBinary 출력 포맷에서 JSON 데이터 타입의 값을 JSON String 값으로 기록하도록 합니다.false
input_format_binary_read_json_as_stringRowBinary 입력 포맷에서 JSON 데이터 타입의 값을 JSON String 값으로 읽도록 합니다.false