| PostgreSQL 9.6.5文書 | |||
|---|---|---|---|
| 前のページ | 上に戻る | 第 57章カスタムスキャンプロバイダの作成 | 次のページ |
CustomScanが実行されるとき、その実行状態はCustomScanStateで表現されます。 これは次のように宣言されています。
typedef struct CustomScanState
{
ScanState ss;
uint32 flags;
const CustomExecMethods *methods;
} CustomScanState;
ssは他のすべてのスキャン状態と同じく初期化されますが、スキャンがベースリレーションではなく結合を対象にしているときは例外で、ss.ss_currentRelationはNULLのままになります。
flagsはCustomPathおよびCustomScanと同じ意味のビットマスクです。
methodsは必要なカスタムスキャン状態のメソッドを実装するオブジェクト(通常は静的に割り当てられる)を指していなければなりません。
これについては以下で詳しく説明します。
CustomScanStateはcopyObjectをサポートしなくてもよく、典型的には上記を先頭のメンバーとして組み込んだより大きな構造体になっています。
void (*BeginCustomScan) (CustomScanState *node,
EState *estate,
int eflags);
提供されたCustomScanStateの初期化を完了します。
標準的なフィールドはExecInitCustomScanで初期化が済んでいますが、プライベートフィールドはここで初期化されます。
TupleTableSlot *(*ExecCustomScan) (CustomScanState *node);
次のスキャンタプルをフェッチします。 タプルが残っている場合は、現在のスキャン方向で次にあるタプルをps_ResultTupleSlotに入れます。 タプルが残っていないときは、NULLまたは空のスロットが戻されます。
void (*EndCustomScan) (CustomScanState *node);
CustomScanStateに関連付けられたプライベートデータを整理します。 このメソッドは必須ですが、関連付けられたデータがない場合、あるいはそれが自動的に整理される場合は、このメソッドは何もする必要はありません。
void (*ReScanCustomScan) (CustomScanState *node);
現在のスキャンを先頭まで巻き戻し、リレーションの再スキャンの準備をします。
void (*MarkPosCustomScan) (CustomScanState *node);
現在のスキャン位置を保存し、後でRestrPosCustomScanコールバックでリストアできるようにします。
このコールバックは必須ではなく、CUSTOMPATH_SUPPORT_MARK_RESTOREフラグがセットされている場合にのみ、提供する必要があります。
void (*RestrPosCustomScan) (CustomScanState *node);
MarkPosCustomScanコールバックで保存された以前のスキャン位置をリストアします。
このコールバックは必須ではなく、CUSTOMPATH_SUPPORT_MARK_RESTOREフラグがセットされている場合にのみ、提供する必要があります。
Size (*EstimateDSMCustomScan) (CustomScanState *node,
ParallelContext *pcxt);並列操作に要求される動的共有メモリの使用量を予測します。 使用を予測される量よりも多い量の結果が返しても良いですが、少なく返してはいけません。 返り値の単位はバイトとなります。 このコールバックは必須ではなく、カスタムスキャンプロバイダが並列実行をサポートする場合にのみ提供される必要があります。
void (*InitializeDSMCustomScan) (CustomScanState *node,
ParallelContext *pcxt,
void *coordinate);
並列操作に要求される動的共有メモリを初期化します。
coordinateは、EstimateDSMCustomScanの返り値と一致する、割り当て済み領域の量を示しています。
このコールバックは必須ではなく、カスタムスキャンプロバイダが並列実行をサポートする場合にのみ提供される必要があります。
void (*InitializeWorkerCustomScan) (CustomScanState *node,
shm_toc *toc,
void *coordinate);InitializeDSMCustomScanによりリーダーにて設定された共有状態を元に、並列ワーカーのカスタム状態を初期化します。 このコールバックは必須ではなく、カスタムスキャンプロバイダが並列実行をサポートする場合にのみ提供される必要があります。
void (*ExplainCustomScan) (CustomScanState *node,
List *ancestors,
ExplainState *es);カスタムスキャンの計画ノードのEXPLAINについて追加情報を出力します。 このコールバックは必須ではありません。 対象のリストやスキャンのリレーションなどScanStateに格納される共通データは、このコールバックがなくても表示されますが、このコールバックにより、追加のプライベートな状態が表示できるようになります。