Skip to main content
vsql_complex 拡張は、VEF SDK を使用したカスタム型の VillageSQL の参照実装であり、実運用可能な拡張パターンを示しています。 ソース: VillageSQL リポジトリvillagesql/examples/vsql-complex/

vsql_complex が提供するもの

複素数 (a + bi) 用の COMPLEX 型。算術演算、ユーティリティ、集計機能を備えています。 使用例:

ディレクトリ構造


VEF 登録パターン

ファイル: src/complex.cc vsql_complex は、VEF_GENERATE_ENTRY_POINTS() を使用して VEF SDK を使用します。
主なパターン:
  • 単一のマクロ呼び出しですべてを登録 — 手動による SQL は不要
  • 型オブジェクトは、kName を非型テンプレートパラメータとして使用した vsql::make_type<kName>() で構築された constexpr 変数です。ここで、kNamestatic 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 を割り当てた場合に書き込まれるデフォルト値を設定します。
  • 関数登録には、.build() を使用して make_func<&impl>("name") を使用します。
  • 集計登録には、.clear<&fn>() および .accumulate<&fn>() を使用して make_aggregate_func<State, &result_fn>("name") を使用します。結果関数は、void(const State&, ResultWrapper) というシグネチャを持ちます。

バイナリストレージ形式

COMPLEX は 16 バイト (リトルエンディアン) を格納されます。
  • バイト 0-7: 実数部 (double)
  • バイト 8-15: 虚数部 (double)
エンコード/デコード (complex.cc):
プラットフォームに依存しないバイトオーダー関数を使用して、クロスプラットフォームの互換性を実現します。

ラッパー関数

VEF SDK は、型付きの引数と結果ラッパーを提供するため、実装は生のプロトコル構造ではなく、C++ 型で動作します。 算術演算の例 (complex.cc から):
ユーティリティ関数ラッパー (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ソースコード

完全なソースコードを表示します。

利用可能な拡張機能

拡張機能カタログを参照します。