2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5

60.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 進行復制,因此儲存在“custom”欄位中的所有資料必須由該函式可以處理的節點組成。此外,自定義掃描提供程式不能用嵌入 CustomScan 的較大結構替換該結構本身,就像 CustomPathCustomScanState 那樣。

60.2.1. 自定義掃描計劃回撥 #

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

為這個 CustomScan 分配一個 CustomScanState。實際的分配通常會比普通的 CustomScanState 大,因為許多提供程式希望將其作為更大的結構的第一欄位嵌入。返回值必須設定節點標籤和 methods,但在此時其他欄位應保留為零;在 ExecInitCustomScan 執行基本初始化後,將呼叫 BeginCustomScan 回撥,為自定義掃描提供程式提供執行其他所需操作的機會。

提交更正

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