ORDER BY、インデックス、および集計関数で機能するRATIONAL、VECTOR、またはINETのような新しいカラム型を定義できます。Rust SDKは、custom_type!マクロを通じてこれをサポートしています。
このページでは、まずRustでの拡張機能の作成を完了していることを前提としています。セットアップ(Cargo.toml、manifest.json、cargo-vsql)は同じです。
カスタム型を使用するタイミング
次のいずれかの条件に該当する場合に、カスタム型を使用します。- 標準のSQL型では表現できないバイナリのオンディスクレイアウトが必要な場合(パックされた浮動小数点数、固定幅の整数、バイナリ識別子)
- 型に、辞書順の文字列の順序とは異なる独自の順序セマンティクスがある場合
ORDER BY、COUNT(DISTINCT)、およびセット操作のために、サーバーに値を正しくインデックス化・ハッシュさせたい場合
STRING、INT、またはREALカラムに問題なく収まる場合は、カスタム型は必要ありません。
custom_type!マクロ
すべてのカスタム型には、4つのコールバック(エンコード、デコード、比較、ハッシュ)とデフォルト値が必要です。完全なマクロのシグネチャは次のとおりです。
type_name、persisted_length、max_decode_buffer_length、encode、decode、およびcompareは必須です。hashとdefaultはオプションですが、推奨されます。hashは、正しいCOUNT(DISTINCT)およびセット操作に必要であり、defaultは、型初期化の検証に必要です。
バイナリ値の受信と返却
カスタム型を受け取るか返す関数は、生のバイトで動作します。 入力 —InValue::Custom(b)は、保存されたバイナリを&[u8]として渡します。
VdfReturn::Binary(bytes)は、バイナリバイトをサーバーに返します。
func!宣言でカスタム型を参照するには、villagesql::custom!("type_name")を使用します。
例:有理数型
SDKリポジトリのexamples/vsql_rationalは、RATIONAL型を実装する動作する拡張機能です。有理数を、リトルエンディアンのバイト順で2つのi64値のペア(分子、分母)、合計16バイトとして格納し、算術関数を提供します。
エンコード、デコード、比較、およびハッシュの実装のコアは次のとおりです。
custom_type!登録と算術VDF(rational_add、rational_subなど)は、examples/vsql_rational/src/lib.rsの完全なソースにあります。
拡張機能がインストールされている場合:
rational_to_real(r RATIONAL) -> REALは、分子を分母で割ることによって、RATIONAL値を64ビット浮動小数点近似に変換します。表示または比較のために近似的な10進数が必要で、その値をカラムに精度が落ちる表現として保存したくない場合に便利です。
型を含むextension!ブロック
関数と型を両方登録する場合、extension!ブロックには2つのセクションがあります。
funcs:を省略します。関数のみの拡張機能はtypes:を省略します。
次のステップ
Rust APIリファレンス
InValue、VdfReturn、およびすべてのマクロの完全なリファレンス。Rust で拡張機能を作成する
はじめに — Cargoのセットアップ、最初の関数、パッケージング、およびテスト。
C++カスタム型
C++のカスタム型 —
make_type<>、エンコード/デコード/比較/ハッシュ、ALTER TABLEルール。拡張機能のアーキテクチャ
カスタム型が解決、キャッシュ、および保存される方法。

