Skip to main content
カスタムタイプは、v0.0.4で安定しているVEFプロトコル3を使用します。プロトコル4は開発中で、オプトインされた開発ABIヘッダー(-DVSQL_USE_DEV_ABI=ON)でのみ利用可能です。古いプロトコル2で構築された拡張機能は、サーバーによって拒否され、再構築する必要があります。
カスタムタイプを使用すると、ORDER BY、インデックス、および集計関数で機能するCOMPLEXUUID、またはVECTORのような新しいカラムタイプを定義できます。このページは、C++での拡張機能の作成チュートリアルのステップ4です。ここで続行する前に、ステップ1〜3を完了してください。

タイプ操作の定義

すべてのカスタムタイプには、エンコード、デコード、および比較操作が必要であり、オプションでハッシュ操作も必要です。これらのシグネチャに対して実装し、vsql::make_type<>()にビルダーオブジェクトを渡します。
カスタムタイプを返すVDF(from_string)の場合、サーバーはVDFを呼び出す前に、出力バッファーのサイズをタイプのpersisted_length値以上に設定するため、呼び出し時にbuf.size() >= persisted_lengthが保証されます。これは、固定幅タイプとパラメータ化されたタイプの両方に適用されます(persisted_lengthは、呼び出し時にタイプコンテキストから解決されます)。個別のバッファーサイズ要求は必要ありません。
生のバイナリアクセスは、連続したTのシーケンスに対する非所有ビューであるvsql::Span<T>を介して行われます。in.value()vsql::Span<const unsigned char>を返し、out.buffer()vsql::Span<unsigned char>を返します。C++20以降を使用する場合、vsql::Span<T>std::span<T>のエイリアスです。C++17の場合、C++ SDKは、同じdata()size()empty()、インデックス、およびイテレータインターフェースを持つ、最小限のソース互換のフォールバックを提供します。これは、#include <villagesql/vsql.h>を介して利用できます。

タイプの登録

vsql::make_type<kName>()テンプレートは、エンコード、デコード、比較、およびハッシュ操作をタイプオブジェクトに直接埋め込みます。VDF名は、コンパイル時にTYPE::from_stringTYPE::to_stringTYPE::compare、およびTYPE::hashとして自動的に生成されます。個別の.func(make_type_encode<>(...))呼び出しは必要ありません。
build()は、from_stringto_string、またはcompareが欠落している場合、コンパイルに失敗します。各テンプレートメソッドは、static_assertを使用して関数ポインタのシグネチャを検証します。 タイプ名は、非型テンプレートパラメータ(NTTP)として渡されます。static constexpr const char[]配列として宣言します。ポインタの同一性は、独立したVDF名バッファーのキーとして使用されるため、同じ関数ポインタを共有する2つのタイプでも、個別の自動生成された名前が付けられます。

タイプ操作のリファレンス

テンプレートベースのAPIは、これらのSQL呼び出し可能なVDFを自動的に生成します。 完全なC++シグネチャについては、タイプ操作を参照してください。

ALTER TABLEとカスタムタイプ

ALTER TABLE ... MODIFY COLUMNおよびCHANGE COLUMNは、カスタムタイプが関与する場合、これらのルールを適用します。

タイプ変換関数

テンプレートベースのAPIを使用すると、エンコードおよびデコードVDFはタイプオブジェクトに埋め込まれ、自動的に登録されます。個別の.func()呼び出しは必要ありません。自動生成されたVDFはSQL呼び出し可能です。
明示的な変換が必要な場合 VillageSQLは、直接カラムへの代入時に文字列リテラルをカスタムタイプに暗黙的に変換するため、INSERT INTO t (val) VALUES ('(1.0,2.0)')は、明示的な呼び出しなしで機能します。ただし、STRINGタイプに解決される式(CASE式、CONCATなど)は、暗黙的に強制変換されません。TYPE::from_stringでラップします。

例:COMPLEXタイプ

COMPLEX数を実装する完全な例を以下に示します。
これらの操作を定義した後、ユーザーはカスタムタイプを持つテーブルを作成できます。

生成されたカラム内のVDF

VDFは、生成されたカラム式で使用できます。VDFは、拡張ビルダーで.deterministic()として宣言されている必要があります。サーバーは、このコンテキストで非決定的な関数をブロックします。
complex_abs.deterministic()で登録する必要があります。従来のMySQL UDFは、生成されたカラムでは許可されていません。
完全な実装については、vsql_complexの例を参照してください。

関数インデックス内のVDF

VDFは、関数インデックス式で使用できます。生成されたカラムからの同じ.deterministic()要件がここにも適用されます。これは、MySQLが関数インデックスを隠し生成カラムとして実装するためです。
オプティマイザは、同じVDF式がWHEREORDER BY、またはGROUP BYに含まれる場合に、インデックスを使用します。比較値をVDFの戻り値のタイプにキャストして、オプティマイザが式を一致させます。

次のステップ

タイプを定義したら、チュートリアルのステップ5に進み、拡張機能をビルドしてインストールします。

次のステップ:拡張機能のビルド

チュートリアルに戻って、拡張機能をビルドしてインストールします。

パラメータ化された型

VECTOR(1536)のようにパラメータを受け取るタイプ — 次元を認識するエンコード、デコード、およびストレージサイジング。

拡張機能APIリファレンス

VDF APIコントラクト、null処理、バッファーサイズ、および高度なパターン。

レプリケーション

ROW形式の要件、拡張機能のインストール順序、およびレプリケートされたセットアップのバージョンマッチング。