사용자 정의 스캔 제공자는 일반적으로 다음 후크를 설정하여 기본 관계에 대한 토토 캔를 추가합니다. 이 후크는 핵심 코드가 관계에 대해 가능한 모든 액세스 토토 캔를 생성한 후에 호출됩니다(후크에 의해 추가된 부분 토토 캔를 사용할 수 있도록 이 호출 후에 생성되는 수집 토토 캔는 제외):
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *rel,
인덱스 rti,
RangeTblEntry *rte);
extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;
이 후크 기능을 사용하여 핵심 시스템에서 생성된 토토 캔를 검사, 수정 또는 제거할 수 있지만 사용자 정의 스캔 공급자는 일반적으로 생성에만 국한됩니다.맞춤 토토 캔객체 및 추가rel사용 중추가_토토 캔. 사용자 정의 스캔 제공자는 초기화를 담당합니다.사용자 정의 토토 캔객체는 다음과 같이 선언됩니다:
typedef 구조체 CustomPath
토토 캔 토토 캔;
uint32 플래그;
*custom_paths를 나열하십시오.
*custom_private 나열;
const CustomPathMethods *메소드;
사용자 정의 토토 캔;
토토 캔행 개수 추정, 시작 및 총 비용, 이 토토 캔에서 제공하는 정렬 순서를 포함하여 다른 토토 캔와 마찬가지로 초기화되어야 합니다.플래그다음을 포함해야 하는 비트 마스크입니다.CUSTOMPATH_SUPPORT_BACKWARD_SCAN사용자 정의 토토 캔가 역방향 스캔을 지원할 수 있는 경우CUSTOMPATH_SUPPORT_MARK_RESTORE표시 및 복원을 지원할 수 있는 경우. 두 기능 모두 선택 사항입니다. 선택 사항custom_paths다음 목록입니다토토 캔이 사용자 정의 토토 캔 노드에서 사용되는 노드; 이것들은 다음과 같이 변환될 것입니다.계획플래너별 노드.custom_private사용자 정의 토토 캔의 개인 데이터를 저장하는 데 사용할 수 있습니다. 개인 데이터는 다음에서 처리할 수 있는 형식으로 저장되어야 합니다.nodeToString, 맞춤 토토 캔를 인쇄하려고 시도하는 디버깅 루틴이 설계된 대로 작동하도록 합니다.메소드필수 사용자 정의 토토 캔 메소드를 구현하는 (일반적으로 정적으로 할당된) 객체를 가리켜야 하며 현재는 하나만 있습니다.
사용자 정의 스캔 제공자는 조인 토토 캔도 제공할 수 있습니다. 기본 관계와 마찬가지로 이러한 토토 캔는 대체하는 조인에 의해 일반적으로 생성되는 것과 동일한 출력을 생성해야 합니다. 이렇게 하려면 조인 공급자가 다음 후크를 설정한 다음 후크 함수 내에서 create맞춤 토토 캔조인 관계에 대한 토토 캔.
typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *외부,
RelOptInfo *innerrel,
JoinType 조인 유형,
JoinPathExtraData *추가);
extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;
이 후크는 내부 및 외부 관계의 다양한 조합으로 동일한 조인 관계에 대해 반복적으로 호출됩니다. 중복된 작업을 최소화하는 것은 후크의 책임입니다.
계획 *(*PlanCustomPath) (PlannerInfo *루트,
RelOptInfo *rel,
사용자 정의 토토 캔 *best_path,
목록 *tlist,
*절 나열,
*custom_plans 나열);
사용자 정의 토토 캔를 완성된 계획으로 변환합니다. 반환 값은 일반적으로 다음과 같습니다.CustomScan12942_13006PostgreSQL : 문서 : 10 : 58.2. 맞춤형 사설 토토 계획 만들기자세한 내용은.