Skip to main content
このページは、拡張機能の作成者向けのドキュメントです。ステップバイステップのチュートリアルについては、拡張機能の作成 を参照してください。カスタム列タイプについては、カスタムタイプの作成 を参照してください。

VDF 関数コントラクト

これらのコントラクトは、VDF 実装関数が VEF ランタイムとどのように連携するかを規定します。make_func<> を使用して登録されたすべての関数は、これらに従う必要があります。以下に参照されている型は、#include <villagesql/vsql.h> を介して利用できます。

パート A: VDF 関数コントラクト

1. VDF 実装関数は void 型であり、値を返しません。
成功、NULL、警告、またはエラーは、結果ラッパーのいずれかの終端メソッドを呼び出すことによって伝達されます: out.set(...) / out.set_length(n)out.set_null()out.warning(msg)、または out.error(msg) 2. result->type を、4 つの結果定数のいずれかに正確に設定します。 vef_return_value_type_t には、次の 4 つの定数があります。 型固有のバリアントはありません。VEF_RESULT_VALUE は、文字列、整数、実数、およびカスタム型に対して、成功を示す単一の定数です。出力型は、関数が受け取る結果ラッパー (StringResultIntResultRealResultCustomResult) によって決定されます。 3. input.value() を呼び出す前に、input.is_null() を確認します。 is_null() が true を返す場合、value() を呼び出すと未定義の動作になります。
4. 文字列結果の場合、out.buffer() に書き込み、out.set_length(n) を呼び出します。書き込む前に、out.buffer().size() を確認します。
  • out.buffer() は、サーバーが管理するバッファーに対する Span<char> を返します。
  • out.set_length(n) は、書き込まれたバイト数を記録します。
  • out.buffer().size() は、最大容量です。書き込む前に必ず確認してください。
5. エラーメッセージを out.error(msg) に渡します。メッセージは、必要に応じて VEF_MAX_ERROR_LEN (512 バイト) に切り捨てられます。 out.error(msg)std::string_view を受け入れます。メッセージをサーバーが管理するバッファーにコピーし、結果の状態をエラーに設定します。

ラッパー関数の実装

実装関数は、型付きの引数と結果ラッパーを使用します。

NULL 値の処理

is_null() を使用して NULL をチェックし、set_null() を呼び出して NULL を返します。
NULL 値の処理オプション:
  • 入力 NULL チェック: input.is_null()
  • NULL 値を返す: out.set_null()
  • 戻り値: out.set(v) (数値/カスタム) または、文字列の場合、out.buffer() に書き込んだ後に out.set_length(n)
  • 警告を返す: out.warning(msg) - この行に対して NULL を返し、SQL 警告を追加し、実行を継続します。厳密モードでは、MySQL は INSERT/UPDATE でこれをエラーに昇格させます。out.set() の代わりに呼び出し、追加としてではなく呼び出します。
  • エラーを返す: out.error(msg) - ステートメントの実行を中止します。

エラー処理

検証の失敗または無効な入力に対して、カスタムメッセージを使用してエラーを返します。
結果タイプ:
  • VEF_RESULT_VALUE - 成功 (out.set(v) / out.set_length(n))
  • VEF_RESULT_NULL - NULL 値 (out.set_null())
  • VEF_RESULT_WARNING - 行レベルの警告 (NULL を返し、SQL 警告を追加し、実行を継続します。厳密モードでは、INSERT/UPDATE でエラーに昇格します) (out.warning(msg))
  • VEF_RESULT_ERROR - 致命的なエラー、ステートメントの実行を中止します (out.error(msg))

プリラン/ポストランによるステートメントごとの状態

プリランおよびポストラン フックは、型付きラッパーを使用します。必要なシグネチャは次のとおりです。
生の ABI シグネチャ (vef_prerun_args_t* / vef_postrun_args_t*) は、.prerun<&Hook>() および .postrun<&Hook>()static_assert によってコンパイル時に拒否されます。
PrerunArgs および PostrunArgs メソッドの詳細については、ステートメントごとの状態 (プリランおよびポストラン) を参照してください。

集計関数

組み込みの集計関数 COUNT(DISTINCT)、MIN、MAX、および GROUP_CONCAT は、カスタム型でもすぐに使用できます。MIN および MAX には、型に登録された比較関数が必要です。 カスタム集計 VDF もサポートされています。make_aggregate_func<State, &result_fn>("name") を使用して登録し、.returns().param().clear<>()、および .accumulate<>() をチェーンしてから、.build() を呼び出します。.clear<>().accumulate<>() の両方が必要です。詳細については、集計 VDF を参照してください。 カスタム型を使用した組み込みの集計操作:
拡張機能は、1 行ごとの実行モデルで呼び出されます。
  • 各関数呼び出しは、独自の結果バッファー (スレッドセーフ) を持つ 1 行を処理します。
  • prerun/postrun は、ステートメントごとのセットアップ/ティアダウンを提供します。
  • グローバル状態を避けてください - 関数パラメーターと戻り値を使用します。
  • グローバル状態を使用する必要がある場合は、ミューテックス/ロックで保護します。
ベストプラクティス: シンプルさと安全性のために、ステートレスな関数を設計します。

ウィンドウ関数

次のウィンドウ関数は、カスタム型で動作します。

一時テーブル

カスタム型は、一時テーブルで動作します。CREATE TEMPORARY TABLEINSERT、および ALTER TABLE は、永続テーブルと同じように動作します。

プレビュー API

一部の VEF 機能は、SDK インクルードツリーの villagesql/preview/ の下にあるオプトインヘッダーとして利用できます。ABI と API はまだ積極的に開発されており、予告なしに変更される可能性があります。 オプトインするには、拡張機能のソースにインクルードを追加します。たとえば、次のとおりです。
これらのヘッダーは、<villagesql/vsql.h> によって取り込まれません。オプトインする場合は、これを直接インクルードする必要があります。 vsql::preview の下の名前空間レイアウトは、機能ごとです。単一の普遍的なパターンはありません。キーリング API は vsql::preview_keyring::KeyringCapability を使用します。スレッドワーカー API は vsql::preview_thread_worker::ThreadWorkerCapability を使用します。SQL クエリ API は vsql::preview_sql_query::SqlQueryCapability を使用し、バックグラウンドワーカー スレッドハンドル (vef_thread_handle_t *) から取得する必要があります。各ヘッダーを確認して、定義されている正確な名前空間とクラス名を確認してください。 完全なプレビュー API ドキュメントについては、プレビュー機能 を参照してください。

トリガー

トリガーは、カスタム型の列を持つテーブルで発動します。トリガー本体は、NEW および OLD からのカスタム型以外の列を参照できます。トリガー本体内でカスタム型の列の値にアクセスすることは、まだサポートされていません。