他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

59.3. カスタムスキャンの実行

CustomScanが実行されるとき、その実行状態はCustomScanStateで表現されます。 これは次のように宣言されています。

typedef struct CustomScanState
{
    ScanState ss;
    uint32    flags;
    const CustomExecMethods *methods;
} CustomScanState;

ssは他のすべてのスキャン状態と同じく初期化されますが、スキャンがベースリレーションではなく結合を対象にしているときは例外で、ss.ss_currentRelationはNULLのままになります。 flagsCustomPathおよびCustomScanと同じ意味のビットマスクです。 methodsは必要なカスタムスキャン状態のメソッドを実装するオブジェクト(通常は静的に割り当てられる)を指していなければなりません。 これについては以下で詳しく説明します。 CustomScanStatecopyObjectをサポートしなくてもよく、典型的には上記を先頭のメンバーとして組み込んだより大きな構造体になっています。

59.3.1. カスタムスキャン実行のコールバック

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 (*ReInitializeDSMCustomScan) (CustomScanState *node,
                                   ParallelContext *pcxt,
                                   void *coordinate);

カスタムスキャンプランノードが再スキャンしようとするときに、並列操作に必要な動的共有メモリを再初期化します。 このコールバックは必須ではなく、カスタムスキャンプロバイダが並列実行をサポートする場合にのみ提供される必要があります。 推奨する使い方としては、ReScanCustomScanコールバックはローカル状態だけをリセットし、このコールバックは共有状態だけをリセットするようにします。 今のところ、このコールバックはReScanCustomScanの前に呼ばれますが、この順序関係には依存しない方が良いです。

void (*InitializeWorkerCustomScan) (CustomScanState *node,
                                    shm_toc *toc,
                                    void *coordinate);

InitializeDSMCustomScanによりリーダーにて設定された共有状態を元に、並列ワーカーのローカル状態を初期化します。 このコールバックは必須ではなく、カスタムスキャンプロバイダが並列実行をサポートする場合にのみ提供される必要があります。

void (*ShutdownCustomScan) (CustomScanState *node);

ノードが実行を完了しないと思われるときに、リソースを解放します。 これはすべての場合に呼ばれるわけではありません。 ときには、この関数がまず呼ばれることなしに、EndCustomScanが呼ばれるかもしれません。 パラレルクエリで使用されるDSMセグメントは、このコールバックが呼ばれた直後に削除されるので、DSMセグメントが削除される前に何らかのアクションを起こしたいカスタムスキャンプロバイダは、このメソッドを実装すべきです。

void (*ExplainCustomScan) (CustomScanState *node,
                           List *ancestors,
                           ExplainState *es);

カスタムスキャンの計画ノードのEXPLAINについて追加情報を出力します。 このコールバックは必須ではありません。 対象のリストやスキャンのリレーションなどScanStateに格納される共通データは、このコールバックがなくても表示されますが、このコールバックにより、追加のプライベートな状態が表示できるようになります。