타입
타입 (Types)
Trino에서 Type 인터페이스는 SQL 언어의 타입을 구현하는 데 사용돼요. Trino에는 VarcharType, BigintType 같은 내장 타입이 기본으로 들어 있어요. ParametricType 인터페이스는 타입에 파라미터를 제공해서 VARCHAR(10)이나 DECIMAL(22, 5) 같은 타입을 만들 수 있게 해줘요. Plugin은 getTypes()에서 새로운 Type 객체를, getParametricTypes()에서 새로운 ParametricType 객체를 반환해 제공할 수 있어요.
아래는 Type 인터페이스에 대한 높은 수준의 개요예요. 더 자세한 내용은 Type의 JavaDoc을 참고하세요.
출처: 문서
본문
네이티브 컨테이너 타입 (Native container type)
모든 타입은 getJavaType() 메서드를 정의하는데, 이를 흔히 "네이티브 컨테이너 타입"이라고 해요. 이는 실행 중에 값을 담고 Block에 저장하는 데 사용하는 Java 타입이에요. 예를 들어, 이 Type을 만들거나 소비하는 함수를 구현하는 Java 코드에서 사용하는 타입이에요.
네이티브 인코딩 (Native encoding)
값이 네이티브 컨테이너 타입 형태로 어떻게 해석되는지는 그 Type이 정의해요. BigintType 같은 일부 타입은 네이티브 컨테이너 타입의 Java 해석(64비트 2의 보수)과 일치해요. 하지만 TimestampWithTimeZoneType처럼 네이티브 컨테이너 타입으로 long을 쓰는 다른 타입은, long에 저장된 값이 타임존과 유닉스 에포크 이후의 밀리초를 합친 8바이트 이진 값이에요. 특히 이는 네이티브 인코딩을 모르고서는 두 네이티브 값을 비교해 의미 있는 결과를 기대할 수 없다는 뜻이에요.
타입 디스크립터 (Type descriptor)
타입의 디스크립터(TypeDescriptor)는 그 타입의 정체성을 정의하고, 타입 파라미터(파라메트릭 타입이라면)와 리터럴 파라미터 같은 일반 정보도 인코딩해요. 리터럴 파라미터는 VARCHAR(10) 같은 타입에서 쓰여요. 디스크립터는 항상 ground(구체화된) 상태예요. 즉 varchar(10)이나 array(bigint)처럼 하나의 구체 타입을 나타내요.
타입 템플릿 (Type template)
TypeDescriptor가 하나의 구체 타입을 나타내는 반면, TypeTemplate은 변수로 파라미터화된 타입 패밀리를 나타내요. ground 디스크립터의 열린(open) 대응물이라고 할 수 있어요. 함수 시그니처(Signature)는 인자와 반환 타입을 템플릿으로 담아요. array(E)는 타입 변수 E를, decimal(p, s)는 숫자 변수 p와 s를 가져요.
템플릿의 변수를 호출 지점에 바인딩하면(SignatureBinder 참조) 바인딩된 타입을 치환하고 계산된 숫자 표현식(예: char(x + y)의 x + y)을 평가해서 ground TypeDescriptor를 만들어요. 반대로, 변수 없는 TypeDescriptor를 TypeTemplate으로 끌어올리는 것도 지원돼요. 따라서 Signature는 타입 변수와 숫자 변수를 한 번 선언하고, 모든 인자·반환 위치를 그 변수들 위의 템플릿으로 표현해요.
타입 ID (Type id)
TypeId는 타입이 (예: 구체화된 뷰의 카탈로그 속성에) 영속화되는 불투명한 식별자예요. 타입 디스크립터의 렌더링된 형태를 감싸지만, 그 구조에 대해서는 아무것도 보장하지 않아요. TypeDescriptor가 조각별로 검사·비교할 수 있는 구조적 정체성이라면, TypeId는 오직 동등성 비교만 되고 TypeManager를 통해 다시 타입으로 해석돼요.
더 알아보기 (Learn more)
타입 시스템을 실제로 확장하는 방법은 커넥터 개발 문서와 함수 개발 문서에서 더 자세히 볼 수 있어요.