Skip to main content
Rust SDK はアルファ版です。リリース間で破壊的な API 変更が発生する可能性があります。関数のみの拡張機能、集約関数、可変長引数関数、およびカスタム型(encode、decode、compare、hash)がサポートされており、sys_varstatus_varthread_workerkeyring の各プレビュー機能もサポートされています。列ストレージ ABI は現在 C++ のみです。必要な場合は C++ SDK を使用してください。
カスタム型を使用すると、ORDER BY、インデックス、および集計関数で機能するRATIONALVECTOR、またはINETのような新しいカラム型を定義できます。Rust SDKは、custom_type!マクロを通じて、またストレージサイズがカラムのパラメータに依存する型についてはparameterized_type!を通じて、これをサポートしています(パラメータ化された型を参照)。 このページでは、まずRustでの拡張機能の作成を完了していることを前提としています。セットアップ(Cargo.toml、manifest.json、cargo-vsql)は同じです。

カスタム型を使用するタイミング

次のいずれかの条件に該当する場合に、カスタム型を使用します。
  • 標準のSQL型では表現できないバイナリのオンディスクレイアウトが必要な場合(パックされた浮動小数点数、固定幅の整数、バイナリ識別子)
  • 型に、辞書順の文字列の順序とは異なる独自の順序セマンティクスがある場合
  • ORDER BYCOUNT(DISTINCT)、およびセット操作のために、サーバーに値を正しくインデックス化・ハッシュさせたい場合
SQLで呼び出すことができる関数のみが必要で、データがSTRINGINT、またはREALカラムに問題なく収まる場合は、カスタム型は必要ありません。

custom_type!マクロ

すべてのカスタム型には、4つのコールバック(エンコード、デコード、比較、ハッシュ)とデフォルト値が必要です。完全なマクロのシグネチャは次のとおりです。
type_namepersisted_lengthmax_decode_buffer_lengthencodedecode、およびcompareは必須です。hashdefaultはオプションですが、推奨されます。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_addrational_subなど)は、examples/vsql_rational/src/lib.rsの完全なソースにあります。 拡張機能がインストールされている場合:
rational_to_real(r RATIONAL) -> REALは、分子を分母で割ることによって、RATIONAL値を64ビット浮動小数点近似に変換します。表示または比較のために近似的な10進数が必要で、その値をカラムに精度が落ちる表現として保存したくない場合に便利です。

パラメータ化された型

パラメータ化された型は、ストレージサイズを知るために、CREATE TABLE時に 読み取られる値(VECTOR(3)3など)を必要とします。custom_type!では これを表現できません。そのpersisted_lengthは、すべてのカラムに対して 単一の固定された定数です。parameterized_type!は、そのパラメータ化された 対応物です。永続化される長さは、固定されるのではなく、int_to_paramsresolve_paramsを通じて、宣言されたパラメータからカラムごとに計算されます。
type_namemax_persisted_lengthmax_decode_buffer_lengthencodedecodecompareint_to_paramsresolve_paramsparams_typeparams_parse、およびparams_to_stringsは必須です。hashdefaultはオプションです。intrinsic_default_fn(デフォルトがパラメータに依存する場合に、&Pからデフォルトを計算する関数)もオプションであり、defaultとは相互に排他的です。 次はpadintです。固定の8バイトで格納されるi64で、ゼロ埋めされた表示幅を制御するwidthパラメータを持ちます。
パラメータ化されたカスタム型の引数を受け取る関数は、単なる InValue::Custom(bytes)ではなくInValue::CustomWithParams { bytes, params }を 受け取ります。paramsは[TypeParams]であり、カラムに宣言されたkey=valueの ペアに対する読み取り専用でゼロコピーのビューです。

型を含むextension!ブロック

関数と型を両方登録する場合、extension!ブロックには2つのセクションがあります。
関数のみの拡張機能はtypes:を省略します。型のみの拡張機能はfuncs: []を保持し、それ以外は何も省略しません。

次のステップ

Rust APIリファレンス

InValueVdfReturn、およびすべてのマクロの完全なリファレンス。

Rust で拡張機能を作成する

はじめに — Cargoのセットアップ、最初の関数、パッケージング、およびテスト。

C++カスタム型

C++のカスタム型 — make_type<>、エンコード/デコード/比較/ハッシュ、ALTER TABLEルール。

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

カスタム型が解決、キャッシュ、および保存される方法。