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에서):테스트 전략
테스트 파일 (test/t/complex_create.test):핵심 구현 패턴
매니페스트
파일:manifest.json
사용자 정의 유형을 포함한 데이터 내보내기 및 가져오기
VillageSQL은 사용자 정의 유형에 대해SELECT INTO OUTFILE 및 LOAD DATA INFILE을 지원하여 사용자 정의 유형 값을 유지한 채 데이터를 내보내고 가져올 수 있습니다. 두 문 모두 secure_file_priv가 쓰기 가능한 디렉터리를 지정하거나 비어 있어야 합니다. 기본값인 secure_file_priv=NULL 상태로 둔 서버는 이러한 문을 ERROR 1290과 함께 즉시 거부합니다.
SELECT INTO OUTFILE
사용자 정의 유형은 내보낼 때 문자열 표현으로 직렬화됩니다:/tmp/signals_export.txt):
LOAD DATA INFILE
내보낸 데이터를 테이블로 다시 로드합니다:사용자 정의 구분자로 내보내기
사용자 정의 필드 및 줄 종결자 사용 가능:VDF 함수로 내보내기
확장 함수를 사용하여 계산된 값을 내보냅니다:사용자 정의 유형은
SELECT ... INTO OUTFILE에 의해 문자열 표현으로 내보내지고 LOAD DATA INFILE에 의해 다시 읽힙니다. SELECT ... INTO DUMPFILE은 문자열 표현을 쓰지 않습니다: 그 방식으로 쓴 COMPLEX 값은 (3,4)가 아니라 16개의 이진 바이트로 기록됩니다.다음 단계
확장 생성
자체 확장 구축
확장 아키텍처
내부 구조 이해
vsql_complex 소스
완전한 소스 코드 보기
사용 가능한 확장
확장 카탈로그 탐색

