vsql_complex 拡張は、C++ SDK を使用したカスタム型の VillageSQL の参照実装であり、実運用可能な拡張パターンを示しています。
ソース: VillageSQL リポジトリ の villagesql/examples/vsql-complex/
vsql_complex が提供するもの
複素数 (a + bi) 用の COMPLEX 型。算術演算、ユーティリティ、集計機能を備えています。 使用例:ディレクトリ構造
VEF 登録パターン
ファイル:src/complex.cc
vsql_complex は、VEF_GENERATE_ENTRY_POINTS() を用いて C++ SDK を使用します。
- 単一のマクロ呼び出しですべてを登録 — 手動による SQL は不要
- 型オブジェクトは、
kNameを非型テンプレートパラメータとして使用したvsql::make_type<kName>()で構築されたconstexpr変数です。ここで、kNameはstatic constexpr const char[]です。 - 型操作 (
.from_string<>()、.to_string<>()、.compare<>()、.hash<>()) は、型オブジェクトに埋め込まれており、それらのために個別の.func()呼び出しは必要ありません。 .compare()は ORDER BY とインデックスを有効にします。.hash()はオプションです。.intrinsic_default_str("(0,0)")は、INSERT IGNORE または UPDATE IGNORE がこの型の NOT NULL 列に NULL を割り当てた場合に書き込まれるデフォルト値を設定します。- 関数登録では、
make_func<&impl>("name")を.build()とともに使用します。 - 集計関数の登録では、
make_aggregate_func<State, &result_fn>("name")を.clear<&fn>()および.accumulate<&fn>()とともに使用します。結果関数は、void(const State&, ResultType)というシグネチャを持ちます。
バイナリストレージ形式
COMPLEX は 16 バイト (リトルエンディアン) を格納します。- バイト 0-7: 実数部 (double)
- バイト 8-15: 虚数部 (double)
引数と結果の型
実装は、生のプロトコル構造体ではなく、型付きの引数と結果の型で動作します。 算術演算の例 (complex.cc から):テスト戦略
テストファイル (test/t/complex_create.test):主要な実装パターン
マニフェスト
ファイル:manifest.json
カスタム型を使用したデータのエクスポートとインポート
VillageSQL は、カスタム型に対してSELECT INTO OUTFILE および LOAD DATA INFILE をサポートしており、カスタム型の値を保持したままデータをエクスポートおよびインポートできます。
SELECT INTO OUTFILE
カスタム型は、エクスポート時に文字列表現にシリアライズされます。/tmp/signals_export.txt):
LOAD DATA INFILE
エクスポートされたデータをテーブルにロードします。カスタム区切り文字を使用したエクスポート
カスタムフィールド区切り文字と行末文字を使用できます。VDF 関数を使用したエクスポート
拡張関数を使用して、計算された値をエクスポートします。カスタム型は、文字列表現形式でエクスポートされます。カスタム型に対するバイナリエクスポート (
SELECT INTO DUMPFILE) は、現在サポートされていません。次のステップ
拡張機能の作成
独自の拡張機能を作成します。
拡張機能のアーキテクチャ
内部構造を理解します。
vsql_complexソースコード
完全なソースコードを表示します。
利用可能な拡張機能
拡張機能カタログを参照します。

