Skip to main content
vsql_complex 확장은 VillageSQL의 C++ SDK를 사용한 사용자 정의 유형에 대한 참조 구현체로, 실제 운영 환경에서 사용할 수 있는 확장 패턴을 보여줍니다. 소스: VillageSQL 저장소villagesql/examples/vsql-complex/

vsql_complex가 제공하는 기능

복소수(a + bi)를 위한 COMPLEX 유형으로 산술, 유틸리티 및 집계 기능을 제공합니다. 사용 예시:

디렉토리 구조


VEF 등록 패턴

파일: src/complex.cc vsql_complex는 C++ SDK의 VEF_GENERATE_ENTRY_POINTS() 매크로를 사용합니다:
핵심 패턴:
  • 단일 매크로 호출로 모든 것을 등록 — 수동 SQL 필요 없음
  • 유형 객체는 vsql::make_type<kName>()로 빌드된 constexpr 변수이며, kName은 비유형 템플릿 매개변수로 사용되는 static constexpr const char[]
  • 유형 연산(.from_string<>(), .to_string<>(), .compare<>(), .hash<>())은 유형 객체 내에 내장되어 있으며 별도의 .func() 호출이 필요하지 않음
  • .compare()는 ORDER BY 및 인덱싱을 가능하게 함; .hash()는 선택적임
  • .intrinsic_default_str("(0,0)")은 INSERT IGNORE 또는 UPDATE IGNORE가 이 유형의 NOT NULL 열에 NULL을 할당할 때 기록되는 기본값을 설정함
  • 함수 등록은 make_func<&impl>("name").build()를 사용함
  • 집계 등록은 make_aggregate_func<State, &result_fn>("name").clear<&fn>().accumulate<&fn>()을 사용하며, 결과 함수는 void(const State&, ResultType) 서명을 가짐

이진 저장 형식

COMPLEX는 16바이트(리틀엔디안)로 저장됩니다:
  • 바이트 0-7: 실수 부분(double)
  • 바이트 8-15: 허수 부분(double)
인코딩/디코딩 (complex.cc):
플랫폼 독립적인 바이트 순서 함수를 사용하여 크로스 플랫폼 호환성을 보장합니다.

인수 및 결과 유형

구현 코드에서는 원시 프로토콜 구조체 대신 타입화된 인수 및 결과 유형을 사용합니다: 산술 예시 (complex.cc에서):
유틸리티 함수 (complex.cc에서):

테스트 전략

테스트 파일 (test/t/complex_create.test):
결과 생성:
테스트 실행:

핵심 구현 패턴


매니페스트

파일: manifest.json

사용자 정의 유형을 포함한 데이터 내보내기 및 가져오기

VillageSQL은 사용자 정의 유형에 대해 SELECT INTO OUTFILELOAD DATA INFILE을 지원하여 사용자 정의 유형 값을 유지한 채 데이터를 내보내고 가져올 수 있습니다.

SELECT INTO OUTFILE

사용자 정의 유형은 내보낼 때 문자열 표현으로 직렬화됩니다:
파일 내용 (/tmp/signals_export.txt):

LOAD DATA INFILE

내보낸 데이터를 테이블로 다시 로드합니다:

사용자 정의 구분자로 내보내기

사용자 정의 필드 및 줄 종결자 사용 가능:
출력:

VDF 함수로 내보내기

확장 함수를 사용하여 계산된 값을 내보냅니다:
사용자 정의 유형은 문자열 표현 형식으로 내보내집니다. SELECT INTO DUMPFILE을 통한 이진 내보내기는 현재 사용자 정의 유형에 지원되지 않습니다.

다음 단계

확장 생성

자체 확장 구축

확장 아키텍처

내부 구조 이해

vsql_complex 소스

완전한 소스 코드 보기

사용 가능한 확장

확장 카탈로그 탐색