VillageSQL 固有の機能
VEF が提供するもののうちいくつかは、以下の表に比較対象がありません。MySQL の構造が異なるため、あるいは VillageSQL の拡張機能作成者が PostgreSQL では自身の拡張機能に提供されていないものを必要としたためです。- Keyring アクセス —
vsql::preview::keyringにより、拡張機能はサーバーの keyring からシークレットを読み取ることができます。 - 拡張機能専用のファイルストレージ —
vsql::preview::storageは、拡張機能にサーバー管理下のディスク領域を提供します。PostgreSQL の拡張機能は、サーバー側 API なしで自身のファイルを管理します。 - 代替プロトコルハンドラ — #299 により、拡張機能は MySQL ワイヤプロトコル以外の方法でクライアントに応答できるようになります。
表の読み方
利用可能 と記されていないすべての行は、その作業が追跡および議論されている 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 で宣言されています。

