自訂掃描使用以下結構在完成的計畫樹中表示
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
複製,因此儲存在 “自訂” 欄位中的所有資料必須由該函數可以處理的節點組成。 此外,自訂掃描提供者不能替換嵌入 CustomScan
的較大結構來代替結構本身,就像 CustomPath
或 CustomScanState
一樣。
Node *(*CreateCustomScanState) (CustomScan *cscan);
為此 CustomScan
分配一個 CustomScanState
。 實際分配通常會大於普通 CustomScanState
所需的大小,因為許多提供者希望將其嵌入為較大結構的第一個欄位。 傳回的值必須適當地設定節點標籤和 methods
,但其他欄位在此階段應保留為零; 在 ExecInitCustomScan
執行基本初始化後,將調用 BeginCustomScan
回呼,使自訂掃描提供者有機會執行其他任何需要執行的操作。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。