當執行 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 (*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
中的常見資料,例如目標清單和掃描關係,但該回呼允許顯示其他私有狀態。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。