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

VillageSQL 固有の機能

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

表の読み方

利用可能 と記されていないすべての行は、その作業が追跡および議論されている GitHub Issue にリンクしています。 プレビュー機能を通じて 利用可能 と記されているものには、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 を中心に構築されるすべての拡張機能に影響する 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 を解決した後にセッションへロールを割り当てることができ、auto_grant_roles() はトークンのクレームに基づいてロールを自動的に付与するコールバックを登録します。どちらも villagesql/sdk/include/villagesql/preview/auth.h で宣言されています。

ロギング

起動と共有メモリ

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

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

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