VillageSQL 고유 기능
VEF가 제공하는 기능 중 일부는 아래 표에서 비교할 대상이 없습니다. MySQL의 구조가 다르기 때문이거나, VillageSQL 확장 작성자가 PostgreSQL이 자체 확장에 제공하지 않는 기능을 필요로 했기 때문입니다.- 키링 접근 —
vsql::preview::keyring을 사용하면 확장이 서버의 키링에서 비밀 값을 읽을 수 있습니다. - 확장 전용 파일 저장소 —
vsql::preview::storage는 확장에 서버가 관리하는 디스크 공간을 제공합니다. PostgreSQL 확장은 서버 측 API 없이 자체적으로 파일을 관리합니다. - 대체 프로토콜 핸들러 — #299는 확장이 MySQL 와이어 프로토콜이 아닌 다른 방식으로 클라이언트에 서비스를 제공할 수 있게 합니다.
표를 읽는 방법
사용 가능으로 표시되지 않은 모든 행은 해당 작업이 추적되고 논의되는 GitHub 이슈로 연결됩니다.
미리보기 기능을 통해 사용 가능으로 표시된 항목은
vsql_allow_preview_extensions = ON이 필요합니다 — 미리보기 기능을 참조하세요.
C++와 Rust
VillageSQL 확장은 C++ 또는 Rust로 작성할 수 있습니다. VEF는 서버 측 기능이고 각 SDK는 그 위의 바인딩입니다. Rust 바인딩은 더 최근에 나왔기 때문에, 현재로서는 일부 기능을 C++에서만 사용할 수 있습니다.플러그형 인터페이스
가장 널리 알려진 PostgreSQL 확장들은 아래쪽의 훅이 아니라 이 인터페이스들 위에 구축되어 있습니다. 또한 VEF가 가장 완전하게 다루는 프레임워크 영역이므로 여기에서 시작하세요.on_init()과 on_deinit()은 _PG_init과 달리 서버에 접근하지 않고 확장 내부에서 실행됩니다. CPU별 함수 포인터 선택과 같은 로컬 설정에 적합합니다. 서버와 통신해야 하는 설정은 기능의 populate 단계에 두어야 합니다.
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를 확인한 후 세션에 역할을 할당할 수 있게 하고, auto_grant_roles()는 토큰의 클레임을 기준으로 역할을 자동으로 부여하는 콜백을 등록합니다. 둘 다 villagesql/sdk/include/villagesql/preview/auth.h에 선언되어 있습니다.

