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

VillageSQL 고유 기능

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

표를 읽는 방법

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

로깅

시작 및 공유 메모리

함수 관리자

필요한 기능을 알려주세요

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