ORDER BY、インデックス、および集計関数で機能するCOMPLEX、UUID、または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_string、TYPE::to_string、TYPE::compare、およびTYPE::hashとして自動的に生成されます。個別の.func(make_type_encode<>(...))呼び出しは必要ありません。
build()は、from_string、to_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呼び出し可能です。
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は、生成されたカラムでは許可されていません。関数インデックス内のVDF
VDFは、関数インデックス式で使用できます。生成されたカラムからの同じ.deterministic()要件がここにも適用されます。これは、MySQLが関数インデックスを隠し生成カラムとして実装するためです。
WHERE、ORDER BY、またはGROUP BYに含まれる場合に、インデックスを使用します。比較値をVDFの戻り値のタイプにキャストして、オプティマイザが式を一致させます。
次のステップ
タイプを定義したら、チュートリアルのステップ5に進み、拡張機能をビルドしてインストールします。次のステップ:拡張機能のビルド
チュートリアルに戻って、拡張機能をビルドしてインストールします。
パラメータ化された型
VECTOR(1536)のようにパラメータを受け取るタイプ — 次元を認識するエンコード、デコード、およびストレージサイジング。拡張機能APIリファレンス
VDF APIコントラクト、null処理、バッファーサイズ、および高度なパターン。
レプリケーション
ROW形式の要件、拡張機能のインストール順序、およびレプリケートされたセットアップのバージョンマッチング。

