Skip to main content
VillageSQL 확장 프레임워크(VEF)는 확장이 정해진 방식으로 데이터베이스 내부 동작에 접근할 수 있게 합니다. PostgreSQL은 오픈소스 데이터베이스 중 가장 성숙한 확장 프레임워크를 갖추고 있으므로, 이 페이지는 PostgreSQL을 기준점으로 삼아 VEF의 현재 기능과 계획된 기능을 파악할 수 있게 합니다. 이 페이지는 완성된 상태가 아니라 특정 시점의 스냅샷으로 읽어야 합니다. VEF는 릴리스마다 변경됩니다. PostgreSQL의 훅 기능을 정확히 일치시키는 것이 목표는 아닙니다. MySQL과 PostgreSQL은 서로 다른 데이터베이스이며, 사용자의 요구 사항도 종종 다릅니다.

VillageSQL 고유 기능

VEF가 제공하는 기능 중 일부는 아래 표에서 비교할 대상이 없습니다. MySQL의 구조가 다르기 때문이거나, VillageSQL 확장 작성자가 PostgreSQL이 자체 확장에 제공하지 않는 기능을 필요로 했기 때문입니다.
  • 키링 접근vsql::preview::keyring을 사용하면 확장이 서버의 키링에서 비밀 값을 읽을 수 있습니다.
  • 확장 전용 파일 저장소vsql::preview::storage는 확장에 서버가 관리하는 디스크 공간을 제공합니다. PostgreSQL 확장은 서버 측 API 없이 자체적으로 파일을 관리합니다.
  • 대체 프로토콜 핸들러#299는 확장이 MySQL 와이어 프로토콜이 아닌 다른 방식으로 클라이언트에 서비스를 제공할 수 있게 합니다.
MySQL의 구조 때문에 존재하는 기능이 두 가지 더 있습니다. 바이너리 로그 쓰기 및 플러시 관찰(#297)과 복제 채널 관찰(#341)은 모두 MySQL의 바이너리 로그와 다중 소스 복제 채널을 읽습니다. PostgreSQL은 WAL의 논리적 디코딩과 구독 메커니즘으로 비슷한 영역을 다루는데, 이는 유사한 목적을 위한 다른 설계입니다.

표를 읽는 방법

사용 가능으로 표시되지 않은 모든 행은 해당 작업이 추적되고 논의되는 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에 선언되어 있습니다.

로깅

시작 및 공유 메모리

함수 관리자

필요한 기능을 알려주세요

우리는 확장 작성자의 요청을 기준으로 이 작업의 우선순위를 정합니다. 위 항목 중 하나가 구축하려는 확장을 가로막고 있다면, 해당 이슈에 👍를 추가하고 댓글로 사용 사례를 설명해 주세요.