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

59.2. 建立自訂掃描計畫 #

自訂掃描使用以下結構在完成的計畫樹中表示

typedef struct CustomScan
{
    Scan      scan;
    uint32    flags;
    List     *custom_plans;
    List     *custom_exprs;
    List     *custom_private;
    List     *custom_scan_tlist;
    Bitmapset *custom_relids;
    const CustomScanMethods *methods;
} CustomScan;

scan 必須像任何其他掃描一樣進行初始化,包括估計成本、目標列表、限定條件等等。flags 是一個位元遮罩,其含義與 CustomPath 中相同。custom_plans 可用於儲存子 Plan 節點。custom_exprs 應該用於儲存表達式樹,這些樹需要由 setrefs.csubselect.c 進行修復,而 custom_private 應該用於儲存僅由自訂掃描提供者使用的其他私有資料。custom_scan_tlist 在掃描基本關係時可以為 NIL,表示自訂掃描傳回與基本關係的列類型匹配的掃描元組。 否則,它是一個描述實際掃描元組的目標列表。custom_scan_tlist 必須為聯結提供,如果自訂掃描提供者可以計算一些非 Var 表達式,則可以為掃描提供。custom_relids 由核心程式碼設定為此掃描節點處理的關係(範圍表索引)集; 除非此掃描正在替換聯結,否則它只有一個成員。methods 必須指向一個(通常是靜態分配的)物件,該物件實現所需的自訂掃描方法,這些方法將在下面進一步詳細介紹。

CustomScan 掃描單個關係時,scan.scanrelid 必須是要掃描的表的範圍表索引。 當它替換聯結時,scan.scanrelid 應該為零。

計劃樹必須能夠使用 copyObject 複製,因此儲存在 自訂 欄位中的所有資料必須由該函數可以處理的節點組成。 此外,自訂掃描提供者不能替換嵌入 CustomScan 的較大結構來代替結構本身,就像 CustomPathCustomScanState 一樣。

59.2.1. 自訂掃描計畫回呼 #

Node *(*CreateCustomScanState) (CustomScan *cscan);

為此 CustomScan 分配一個 CustomScanState。 實際分配通常會大於普通 CustomScanState 所需的大小,因為許多提供者希望將其嵌入為較大結構的第一個欄位。 傳回的值必須適當地設定節點標籤和 methods,但其他欄位在此階段應保留為零; 在 ExecInitCustomScan 執行基本初始化後,將調用 BeginCustomScan 回呼,使自訂掃描提供者有機會執行其他任何需要執行的操作。

提交更正

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