メインコンテンツへスキップ
VillageSQL 拡張フレームワーク(VEF)は、定義された方法でデータベースの内部動作へのアクセスを拡張機能に提供します。PostgreSQL はオープンソースデータベースの中で最も成熟した拡張フレームワークを持っているため、このページでは PostgreSQL を参照点として使用し、VEF の現在および計画中の機能の全体像を示します。 このページは完成した状態ではなく、スナップショットとしてお読みください。VEF はリリースごとに変化します。PostgreSQL のフック機能に正確に一致させることが目標ではありません。MySQL と PostgreSQL は異なるデータベースであり、それぞれのユーザーのニーズも多くの場合異なります。

VillageSQL 固有の機能

VEF が提供するもののうちいくつかは、以下の表に比較対象がありません。MySQL の構造が異なるため、あるいは VillageSQL の拡張機能作成者が PostgreSQL では自身の拡張機能に提供されていないものを必要としたためです。
  • Keyring アクセス — vsql::preview::keyring により、拡張機能はサーバーの keyring からシークレットを読み取ることができます。
  • InnoDB ページストレージ — vsql::preview::storage により、拡張機能は InnoDB セグメントを作成し、バッファプールを通じてそのページを読み書きできます。redo ログにも記録されます。
  • 代替プロトコルハンドラ — #299 により、拡張機能は MySQL ワイヤプロトコル以外の方法でクライアントに応答できるようになります。
さらに 2 つの機能が、MySQL の構造に由来して計画されています。バイナリログの書き込みおよびフラッシュの監視(#297)とレプリケーションチャネルの監視(#341)は、どちらも MySQL のバイナリログとマルチソースレプリケーションチャネルを読み取ります。PostgreSQL は WAL の論理デコードとサブスクリプション機構によって同等の領域をカバーしており、これは同様の目的に対する異なる設計です。

表の読み方

利用可能 と記されていないすべての行は、その行または表の下の注記で、その作業が追跡および議論されている GitHub Issue にリンクしています。 プレビュー機能を通じて 利用可能 と記されているものには、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 を中心に構築されるすべての拡張機能に影響する 3 つの制限があります。文はバインドパラメータを取らないため、値は手動でエスケープする必要があります(#627)。拡張機能は同時実行のセッションではなく、単一のセッションを取得します(#626)。そして、VDF の内部からは呼び出せません(#597)。

フック変数

フックとは、サーバーが文の実行中に拡張機能へ制御を渡し、サーバーがこれから行おうとしていることを拡張機能が読み取ったり変更したりできるようにする地点です。PostgreSQL はグローバルな関数ポインタとして固定のフックセットを宣言しています。以下の表はそのすべてを、各フックが発火するクエリ処理の段階ごとに分類して示しています。

解析と DDL

プランナ

エグゼキュータ

オペレータ単位の詳細を必要とする PostgreSQL の拡張機能は、ノードレベルで ExecutorRun_hook をラップすることでこれを取得します。VEF ではこれは別の作業であり、#340 で追跡されています。

EXPLAIN

認証とセキュリティ

PostgreSQL の拡張機能は ClientAuthentication_hook を 2 つの異なる目的で使用しており、VEF はそのうちの 1 つをカバーしています。拡張機能は vsql::preview::auth 機能を通じて独自の認証方式を実装できます。vsql-oauth2 はこれを基盤としています。一方、自身が処理していない認証の結果を監視することはまだできません。これは PostgreSQL の auth_delay やログイン失敗のトラッカーが動作する方法です。その部分は #464 です。 PostgreSQL は、フックではなく pg_ident.conf を通じて外部 ID をデータベースアカウントにマッピングします。VEF は同じ vsql::preview::auth 機能でこれをカバーしています。set_active_roles() により、認証プラグインは外部 ID を解決した後にセッション用のロールをステージングでき、roles_mode() は、ログインのたびに再問い合わせされるコールバックを登録します。このコールバックは、サーバーがステージングされたロールを有効化するだけか、付与も行うか、アカウントの付与をそれに合わせて同期するか(運用者が固定した DEFAULT ROLE は同期後も保持されます)を決定します。どちらも villagesql/sdk/include/villagesql/preview/auth.h で宣言されています。

ロギング

起動と共有メモリ

ファンクションマネージャ

必要なものをお知らせください

私たちは、拡張機能の作成者からの要望に基づいてこの作業の優先順位を決定しています。上記のいずれかが、あなたが構築したい拡張機能の妨げになっている場合は、その Issue に 👍 を付け、ユースケースをコメントで説明してください。