自定義掃描在最終的計劃樹中表示為以下結構
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.c
和 subselect.c
進行修復的表示式樹,而 custom_private
應用於儲存僅由自定義掃描提供程式自身使用的其他私有資料。custom_scan_tlist
在掃描基表時可以為 NIL,表示自定義掃描返回的掃描元組與基表的行型別匹配。否則,它是一個描述實際掃描元組的目標列表。custom_scan_tlist
必須為連線提供,如果自定義掃描提供程式可以計算一些非 Var 表示式,也可以為掃描提供。custom_relids
由核心程式碼設定為該掃描節點處理的關聯(範圍表索引)集合;除非該掃描替換了連線,否則它將只有一個成員。methods
必須指向一個(通常是靜態分配的)實現所需自定義掃描方法的物件,這些方法將在下面進一步詳細說明。
當 CustomScan
掃描單個關係時,scan.scanrelid
必須是要掃描的表的範圍表索引。當它替換連線時,scan.scanrelid
應為零。
計劃樹必須能夠使用 copyObject
進行復制,因此儲存在“custom”欄位中的所有資料必須由該函式可以處理的節點組成。此外,自定義掃描提供程式不能用嵌入 CustomScan
的較大結構替換該結構本身,就像 CustomPath
或 CustomScanState
那樣。
Node *(*CreateCustomScanState) (CustomScan *cscan);
為這個 CustomScan
分配一個 CustomScanState
。實際的分配通常會比普通的 CustomScanState
大,因為許多提供程式希望將其作為更大的結構的第一欄位嵌入。返回值必須設定節點標籤和 methods
,但在此時其他欄位應保留為零;在 ExecInitCustomScan
執行基本初始化後,將呼叫 BeginCustomScan
回撥,為自定義掃描提供程式提供執行其他所需操作的機會。
如果您在文件中看到任何不正確、與您在使用特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。