Skip to main content
VEFプロトコル3は、v0.0.4で安定しています。プロトコル4は開発中で、オプトインされた開発ABIヘッダー(-DVSQL_USE_DEV_ABI=ON)でのみ利用可能です。古いプロトコル2で構築された拡張機能は、サーバーによって拒否され、再構築する必要があります。

概要

VillageSQLの拡張フレームワークを使用すると、データベースサーバーにカスタム機能を追加できます。VEF SDKと拡張テンプレートを使用して、カスタム拡張機能を構築します。 このガイドでは、拡張機能を構築およびインストールするための完全な手順を説明します。VDFの実装(型付きラッパー、集約、システム変数、パラメータ化された型)の詳細については、開発ガイドを参照してください。
Rustを使用する場合は、Rustでの拡張機能の構築を参照してください。

VillageSQL拡張機能とは?

VillageSQL拡張機能は、VEBファイル(VillageSQL拡張バンドル)としてパッケージ化され、次のものが含まれます。
  • マニフェスト - 拡張機能に関するメタデータ(名前、バージョン、説明)
  • 共有ライブラリ - 機能の実装であるコンパイルされたC++コード
  • オプションのメタデータ - 追加のリソースまたは構成
拡張機能は、次のものを提供するVEF SDK(VillageSQL拡張フレームワーク)を使用して構築されます。
  • 型と関数を定義するためのC++ API
  • SQLスクリプトなしでの自動登録
  • 型セーフな関数ラッパー
  • 拡張機能の定義のためのビルダーパターン
VDFと従来のUDF: VEF SDKを通じて登録された関数は、VDF(VillageSQL定義関数)と呼ばれます。VillageSQLは、CREATE FUNCTION ... SONAMEを通じて登録された従来のMySQL UDFもサポートしていますが、新しい拡張機能にはVEF SDKアプローチを使用することをお勧めします。

SQLでのVDFの呼び出し

VDFは、拡張機能プレフィックスの有無にかかわらず呼び出すことができます。
関数解決順序: プレフィックスなしで関数を呼び出すと、VillageSQLは次の順序で解決します。
  1. システム関数(組み込みのMySQL関数(NOW()CONCAT()など))
  2. UDF(従来のMySQLユーザー定義関数)
  3. VDF(拡張機能の関数)- 同じ名前の関数が1つだけ存在する場合
  4. ストアド関数CREATE FUNCTIONで作成)
修飾名を使用する場合:
  • 複数の拡張機能が同じ名前の関数を提供する場合、extension.function_nameを使用します。
  • 曖昧さがない場合は、クリーンなコードのために修飾名を使用します。
  • その関数名を提供する拡張機能が1つだけの場合、修飾名は必要ありません。
拡張機能は、次のものを追加できます。
  • カスタム関数(VDF) - 自動型チェックと検証を備えたSQL関数
  • カスタムデータ型 - ORDER BYおよびインデックスで機能するCOMPLEXUUID、またはVECTORなどの新しい列タイプ
  • 型操作 - カスタム型のエンコード、デコード、比較、およびハッシュ関数

前提条件

開始する前に、VillageSQLをソースからビルドします。拡張機能は、サーバーのSDKヘッダーとビルドツリーに対してリンクされます。最初にソースからのビルドガイドに従ってください。 また、次のものも必要です。
  • Git - クローニングとバージョン管理用
  • CMake 3.18以降 - ビルドシステム
  • C++コンパイラ - GCC 8+、Clang 8+、またはC++17サポートを備えたMSVC 2019+
  • 基本的なC++の知識 - C++と関数ポインタの理解
AIエージェントでビルドしますか? vsql-extension-builderスキルは、Claude Code、Gemini、またはその他のサポートされているエージェントを使用して、スキャフォールディングからテストまで、このワークフロー全体を自動化します。次のようにインストールします。

ステップ1:拡張テンプレートを取得する

拡張テンプレートを次の2つの方法で開始できます。

オプションA:VillageSQLソースからテンプレートを使用する

VillageSQLソースコードがある場合は、テンプレートが含まれています。

オプションB:GitHubからフォークする

VillageSQL拡張テンプレートリポジトリをフォークすることから始めます。
  1. GitHubのテンプレートリポジトリにアクセスします。
  2. **「フォーク」**ボタンをクリックして、独自のコピーを作成します。
  3. ローカルにフォークをクローンします。
GitHubの「このテンプレートを使用」ボタンを使用して、履歴なしでテンプレートに基づいて新しいリポジトリを作成することもできます。

ステップ2:マニフェストを更新する

manifest.jsonを編集して、拡張機能のメタデータを定義します。
$schemaフィールドはオプションですが、すべてのマニフェストフィールドのIDEのオートコンプリートとインライン検証を有効にします。

manifest.jsonスキーマ

検証ルール:
  • name: 文字で始まり、文字または数字で終わる必要があります。小文字、数字、アンダースコア、ハイフンを含めることができます。最大64文字。アンダースコアを使用します - ハイフンはSQLでバッククォートで囲む必要があります。
  • version: セマンティックバージョンに従う必要があります(例:1.0.0、0.2.1)
  • 無効なマニフェストは、INSTALL EXTENSIONの失敗を引き起こします。
例:
SQL、ファイル名、リポジトリ名全体での完全な命名規則については、拡張機能の命名規則を参照してください。

ステップ3:VEF SDKを使用して拡張機能を実装する

VEF SDKは、次のものを提供するC++ APIを提供します。
  • 拡張機能を定義するための流暢なビルダーパターン
  • 型セーフな関数定義とコンパイル時のチェック
  • 自動引数の検証と型変換
  • ORDER BYおよびインデックスを有効にするカスタム型と比較/ハッシュ関数のサポート

VillageSQLヘッダーを含める

メインの拡張ファイル(例:src/extension.cc)を作成し、VEF SDKを含めます。
<villagesql/vsql.h>ヘッダーは、型ビルダー、関数ビルダー、および拡張ビルダーをプルインし、一般的に使用されるシンボルをvsql名前空間に再エクスポートします。

拡張機能を定義する

VEF_GENERATE_ENTRY_POINTS()マクロを使用して、拡張機能を定義します。
関数ビルダーメソッド:
  • make_func<&impl>("name") - 実装ポインタを持つ関数を作成します。
  • .returns(type) - 戻り値の型を設定します(STRINGINTREAL、またはカスタム型名)。
  • .param(type) - パラメータを追加します(最大8つのパラメータ)。
  • .buffer_size(size_t) - STRING/CUSTOM戻りの特定の出力バッファサイズを要求します。
  • .deterministic(bool = true) - この関数は常に同じ入力に対して同じ出力を返し、副作用がないことを宣言します。デフォルトは非決定性です。
  • .prerun<func>() - ステートメントごとのセットアップ関数を設定します(オプション)。
  • .postrun<func>() - ステートメントごとのクリーンアップ関数を設定します(オプション)。
  • .build() - 関数の登録を完了します。
パラメータ制限: 関数は最大8つのパラメータ(kMaxParamsで定義)をサポートします。それ以上のパラメータが必要な場合は、構造化型または複数の関数を検討してください。

カスタム型引数と戻り値を持つVDF

VDFは、.param(TYPE_NAME)および.returns(TYPE_NAME)をビルダーで使用して、カスタム型の値を受け取り、返すことができます。実装では、入力にCustomArg、出力にCustomResultを使用します。これは、型操作で使用されるのと同じラッパーです。
.param(COMPLEX)および.returns(COMPLEX)で登録します。
完全なCustomArg/CustomResultAPIについては、開発ガイドを参照してください。これには、パラメータ化された型用のCustomArgWith<P>およびCustomResultWith<P>が含まれます。

決定性関数

デフォルトでは、VDFは非決定性として登録されます。非決定性関数は、次の3つのSQLコンテキストでブロックされます。生成された列、CHECK制約、および式デフォルト値(列のDEFAULT (expr))。これらの機能のいずれかを使用すると、非決定性VDFがエラーを返します。関数が常に同じ入力に対して同じ出力を生成し、副作用がない場合は、ビルダーチェーンに.deterministic()を追加して、決定性として宣言できます。 オプティマイザは、この情報を使用して、関数を1つのステートメントに対して1回評価し、行間で値を再利用する場合があります。非決定性関数を誤って決定性としてマークすると、サーバーが異なる出力を生成する必要がある入力に対して同じ結果を返す可能性があります。関数が外部状態、ランダム性、または時間に依存しない場合にのみ、.deterministic()を追加してください。 ビルダーのシグネチャ: .deterministic(bool d = true) - 引数なしの形式は、デフォルトでtrueになります。 例:
complex_addは決定性として宣言されているため、生成された列の定義で使用できます。

カスタムバッファサイズ

可変長のデータを返す関数の場合は、特定のバッファサイズを要求します。
書き込む前に、利用可能なバッファスペースを確認します。
.buffer_size()を使用して、関数の最大出力サイズに基づいて十分なバッファサイズを要求します。
関数を実装する前に、拡張APIリファレンスを確認して、完全なVDF契約を確認してください。これには、nullチェック、結果の型、バッファのサイズ設定、およびエラー処理が含まれます。

ステップ4:カスタム型を作成する

カスタム型を使用すると、ORDER BY、インデックス、および集約関数で機能するCOMPLEXUUID、またはVECTORなどの新しい列タイプを定義できます。拡張機能にのみ関数を登録する場合は、ステップ5に進みます。 完全な実装については、カスタム型の作成を参照してください。型にパラメータがある場合(例:VECTOR(1536))、パラメータ化された型を参照してください。

ステップ5:ビルド構成を更新する

CMakeLists.txtを編集して、拡張機能をVEBファイルとしてビルドします。
構成に関する注意:
  • VillageSQLExtensionFrameworkは、拡張機能をビルドするためのCMakeヘルパーを提供します。
  • VEF_CREATE_VEB()は、ライブラリ、マニフェスト、およびメタデータを.vebアーカイブにパッケージ化します。
  • フレームワークは、MySQL/VillageSQLビルドフラグを自動的に検出します。
  • ライブラリターゲット名は通常extensionです(任意の名前を使用できます)。
  • VEB名は、manifest.jsonの名前と一致する必要があります。
  • デフォルトでは、拡張機能は安定したABIヘッダーに対してビルドされます。不安定な開発ヘッダーに対してビルドするには、-DVSQL_USE_DEV_ABI=ONを設定します。

ステップ6:ビルドディレクトリを作成する

別のビルドディレクトリを作成します。

ステップ7:CMakeとMakeでビルドする

拡張機能を構成してビルドします。
これにより、次のものが作成されます。
  • コンパイルされた共有ライブラリ(.soファイル)
  • VEBパッケージ(.vebファイル)- マニフェストとライブラリを含むtarアーカイブ

ビルドを確認する

VEBファイルの内容を確認します。
次のものが表示されるはずです。

ステップ8:インストールしてテストする

オプションA:VillageSQL拡張ディレクトリにインストールする

インストールターゲットを使用して、VEBをVillageSQLインストールにコピーします。
これにより、.vebファイルが、VillageSQL_VEB_INSTALL_DIRで構成されたディレクトリにコピーされます。

オプションB:手動インストール

VEBファイルを手動でコピーします。

拡張機能をテストする

  1. VillageSQLに接続します。
  2. 拡張機能をインストールします。
  3. インストールを確認します。
  4. 関数をテストします。

テストの作成

拡張機能が正しく機能することを確認するために、テストファイルを追加します。
  1. mysql-test/t/にテストファイルを作成します。
  2. 期待される結果を生成します。
  3. テストを実行します。

トラブルシューティング

拡張機能がロードされない

エラーログを確認し、VEBの内容を確認します。

関数が見つからない

インストールと登録を確認します。

ビルドエラー

拡張機能の例

既存のVillageSQL拡張機能から学習します。

vsql_complex

複素数データ型の実装

vsql_extension_template

拡張機能を作成するための最小限のテンプレート

次のステップ

拡張機能の使用

拡張機能をインストールおよび管理する方法を学びます。

開発ガイド

型付きラッパー、集約、システム変数、およびテスト

拡張機能のアーキテクチャ

ライフサイクル、キャッシュ、パフォーマンス、およびセキュリティモデル

ソースからのビルド

VillageSQLをソースコードからビルドします。

リソース