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フラグがセットされている場合にのみ、提供する必要があります。
void (*ExplainCustomScan) (CustomScanState *node,
List *ancestors,
ExplainState *es);
カスタムスキャンの計画ノードのEXPLAINについて追加情報を出力します。
このコールバックは必須ではありません。
対象のリストやスキャンのリレーションなどScanStateに格納される共通データは、このコールバックがなくても表示されますが、このコールバックにより、追加のプライベートな状態が表示できるようになります。