支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5

59.3. 執行自訂掃描 #

當執行 CustomScan 時,其執行狀態由 CustomScanState 表示,其宣告如下:

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

ss 的初始化方式與任何其他掃描狀態相同,不同之處在於,如果掃描是針對聯結而不是基底關係,則 ss.ss_currentRelation 會保留為 NULL。flags 是一個位元遮罩,其含義與 CustomPathCustomScan 中相同。methods 必須指向一個(通常是靜態分配的)物件,該物件實作所需之自訂掃描狀態方法,這些方法將在下面詳細說明。通常,CustomScanState (不需要支援 copyObject) 實際上會是一個更大的結構,將上述內容嵌入為其第一個成員。

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 中的常見資料,例如目標清單和掃描關係,但該回呼允許顯示其他私有狀態。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。