自定義掃描提供程式通常會透過設定以下鉤子來為基表新增路徑,該鉤子會在核心程式碼生成完所有可能的訪問路徑後呼叫(Gather 和 Gather Merge 路徑除外,它們會在該鉤子之後呼叫,以便可以使用由鉤子新增的部分路徑)。
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte); extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;
雖然此鉤子函式可用於檢查、修改或刪除核心系統生成的路徑,但自定義掃描提供程式通常會將其限制在生成 CustomPath
物件並使用 add_path
或 add_partial_path
(如果是部分路徑)將其新增到 rel
中。自定義掃描提供程式負責初始化 CustomPath
物件,其宣告如下:
typedef struct CustomPath { Path path; uint32 flags; List *custom_paths; List *custom_restrictinfo; List *custom_private; const CustomPathMethods *methods; } CustomPath;
path
必須像任何其他路徑一樣進行初始化,包括行數估計、起始成本和總成本,以及該路徑提供的排序順序。 flags
是一個位掩碼,用於指定掃描提供程式是否支援某些可選功能。如果自定義路徑支援反向掃描,則 flags
應包含 CUSTOMPATH_SUPPORT_BACKWARD_SCAN
;如果支援標記和恢復,則應包含 CUSTOMPATH_SUPPORT_MARK_RESTORE
;如果能夠執行投影,則應包含 CUSTOMPATH_SUPPORT_PROJECTION
。(如果未設定 CUSTOMPATH_SUPPORT_PROJECTION
,則掃描節點只會生成被掃描關係的 Var;如果設定了該標誌,則掃描節點必須能夠評估這些 Var 上的標量表達式。)可選的 custom_paths
是此自定義路徑節點使用的 Path
節點的列表;這些節點將由規劃器轉換為 Plan
節點。如下所述,還可以為連線關係建立自定義路徑。在這種情況下,custom_restrictinfo
應用於儲存應用於自定義路徑所替換的連線的連線子句集。否則應為 NIL。custom_private
可用於儲存自定義路徑的私有資料。私有資料應以 nodeToString
可以處理的形式儲存,以便嘗試列印自定義路徑的除錯例程能夠按預期工作。methods
必須指向實現所需自定義路徑方法的(通常是靜態分配的)物件,這些方法將在下文進一步詳細介紹。
自定義掃描提供程式還可以提供連線路徑。與基表一樣,此類路徑必須產生與它所替換的連線通常產生的輸出相同的輸出。為此,連線提供程式應設定以下鉤子,然後在鉤子函式中,為連線關係建立 CustomPath
路徑。
typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra); extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;
此鉤子會被反覆呼叫,針對相同的連線關係,使用不同的內部和外部關係組合;鉤子有責任最小化重複工作。
另請注意,應用於連線的連線子句集(作為 extra->restrictlist
傳遞)取決於內部和外部關係的組合。為 joinrel
生成的 CustomPath
路徑必須包含它使用的連線子句集,如果該路徑被規劃器選為 joinrel
的最佳路徑,則規劃器將使用該子句集將其轉換為計劃。
Plan *(*PlanCustomPath) (PlannerInfo *root, RelOptInfo *rel, CustomPath *best_path, List *tlist, List *clauses, List *custom_plans);
將自定義路徑轉換為最終計劃。返回值通常是一個 CustomScan
物件,回撥必須分配並初始化該物件。有關更多詳細資訊,請參閱 第 60.2 節。
List *(*ReparameterizeCustomPathByChild) (PlannerInfo *root, List *custom_private, RelOptInfo *child_rel);
在將由給定子關係 child_rel
的最頂層父項引數化的路徑轉換為由該子關係引數化時,會呼叫此回撥。該回調用於重新引數化任何路徑或轉換儲存在 CustomPath
的給定 custom_private
成員中的任何表示式節點。回撥可以根據需要使用 reparameterize_path_by_child
、adjust_appendrel_attrs
或 adjust_appendrel_attrs_multilevel
。
如果您在文件中看到任何不正確、與您對特定功能的實際使用不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。