VillageSQL 고유 기능
VEF가 제공하는 기능 중 일부는 아래 표에서 비교할 대상이 없습니다. MySQL의 구조가 다르기 때문이거나, VillageSQL 확장 작성자가 PostgreSQL이 자체 확장에 제공하지 않는 기능을 필요로 했기 때문입니다.- 키링 접근 —
vsql::preview::keyring을 사용하면 확장이 서버의 키링에서 비밀 값을 읽을 수 있습니다. - InnoDB 페이지 저장소 —
vsql::preview::storage를 사용하면 확장이 InnoDB 세그먼트를 생성하고, 리두 로깅과 함께 버퍼 풀을 통해 그 페이지를 읽고 쓸 수 있습니다. - 대체 프로토콜 핸들러 — #299는 확장이 MySQL 와이어 프로토콜이 아닌 다른 방식으로 클라이언트에 서비스를 제공할 수 있게 합니다.
표를 읽는 방법
사용 가능으로 표시되지 않은 모든 행은 해당 행이나 표 아래의 설명에서, 해당 작업이 추적되고 논의되는 GitHub 이슈로 연결됩니다.
미리보기 기능을 통해 사용 가능으로 표시된 항목은
vsql_allow_preview_extensions = ON이 필요합니다 — 미리보기 기능을 참조하세요. vsql::preview::auth와 vsql::preview::statement_event는 또한 개발용 ABI(-DVSQL_USE_DEV_ABI=ON)로 빌드된 확장에서만 사용할 수 있습니다.
C++와 Rust
VillageSQL 확장은 C++ 또는 Rust로 작성할 수 있습니다. VEF는 서버 측 기능이고 각 SDK는 그 위의 바인딩입니다. Rust 바인딩은 더 최근에 나왔기 때문에, 현재로서는 일부 기능을 C++에서만 사용할 수 있습니다.플러그형 인터페이스
가장 널리 알려진 PostgreSQL 확장들은 아래쪽의 훅이 아니라 이 인터페이스들 위에 구축되어 있습니다. 또한 VEF가 가장 완전하게 다루는 프레임워크 영역이므로 여기에서 시작하세요.on_init()과 on_deinit()은 확장이 선언한 기능이 활성화된 상태에서 실행됩니다. on_init()은 서버가 기능을 채운 후에, on_deinit()은 서버가 기능을 해제하기 전에 실행되므로, 훅에서 등록된 시스템 변수를 읽을 수 있습니다. CPU별 함수 포인터 선택과 같은 로컬 설정에도 적합합니다.
vsql::preview::sql_query에는 SPI를 중심으로 구축된 확장에 영향을 주는 세 가지 제한이 있습니다. 문장은 바인드 인자를 받지 않으므로 값을 직접 이스케이프해야 합니다(#627). 확장은 동시 세션이 아니라 단일 세션을 사용합니다(#626). 또한 VDF 내부에서는 호출할 수 없습니다(#597).
훅 변수
훅은 서버가 문장 처리 도중 확장에 제어권을 넘겨, 서버가 수행하려는 작업을 읽거나 변경할 수 있게 하는 지점입니다. PostgreSQL은 고정된 훅 집합을 전역 함수 포인터로 선언합니다. 아래 표는 그 전부를 다루며, 각 훅이 실행되는 쿼리 처리 단계별로 묶었습니다.파싱 및 DDL
플래너
실행기
연산자별 세부 정보가 필요한 PostgreSQL 확장은 노드 수준에서
ExecutorRun_hook을 감싸서 이를 얻습니다. VEF에서 이는 별도 작업이며 #340에서 추적됩니다.
EXPLAIN
인증 및 보안
PostgreSQL 확장은
ClientAuthentication_hook을 두 가지 다른 용도로 사용하며, VEF는 그중 하나를 다룹니다. 확장은 vsql::preview::auth 기능을 통해 자체 인증 방식을 구현할 수 있으며, vsql-oauth2가 이 위에 구축되어 있습니다. 아직 직접 처리하지 않은 인증의 결과는 관찰할 수 없는데, 이는 PostgreSQL의 auth_delay와 로그인 실패 추적기가 작동하는 방식입니다. 그 부분은 #464입니다.
PostgreSQL은 훅이 아니라 pg_ident.conf를 통해 외부 ID를 데이터베이스 계정에 매핑합니다. VEF는 동일한 vsql::preview::auth 기능으로 이를 다룹니다. set_active_roles()는 인증 플러그인이 외부 ID를 확인한 후 세션에 역할을 준비(stage)할 수 있게 하고, roles_mode()는 로그인할 때마다 다시 조회되는 콜백을 등록하여, 서버가 준비된 역할을 활성화만 할지, 부여까지 할지, 아니면 계정의 권한을 그에 맞게 동기화할지(운영자가 고정한 DEFAULT ROLE은 동기화 후에도 유지됩니다)를 결정합니다. 둘 다 villagesql/sdk/include/villagesql/preview/auth.h에 선언되어 있습니다.