이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 57.2. 와이즈 토토 데이터 래퍼 콜백 루틴버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

53.2. 외부 롤 토토 래퍼 콜백 루틴

FDW 핸들러 함수는 palloc'd를 반환합니다.Fdw루틴9319_9455

Fdw루틴구조체 유형이 다음에서 선언되었습니다.src/include/foreign/fdwapi.h, 자세한 내용은 참조하세요.

53.2.1. 롤 토토 테이블 스캔을 위한 FDW 루틴

공허
GetForeignRelSize(PlannerInfo *루트,
                   RelOptInfo *baserel,
                   Oid foreigntableid);

롤 토토 테이블에 대한 관계 크기 추정치를 얻습니다. 이는 롤 토토 테이블을 스캔하는 쿼리 계획 초기에 호출됩니다.루트는 쿼리에 대한 플래너의 전역 정보입니다.바셀이 테이블에 대한 플래너의 정보입니다. 그리고롤 토토테이블ID이것은pg_class롤 토토 테이블의 OID입니다. (롤 토토테이블ID플래너 롤 토토 구조에서 얻을 수 있지만 노력을 절약하기 위해 명시적으로 전달되었습니다.)

이 기능은 업데이트되어야 합니다.baserel-행제한 조건에 의해 수행된 필터링을 고려한 후 테이블 스캔에서 반환된 예상 행 수입니다. 초기값은바셀-행은 단지 일정한 기본 추정치일 뿐이며 가능하다면 대체되어야 합니다. 이 기능은 업데이트를 선택할 수도 있습니다.바셀-너비평균 결과 행 너비에 대한 더 나은 추정치를 계산할 수 있는 경우.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보를 확인하세요.

공허
GetForeignPaths(PlannerInfo *루트,
                 RelOptInfo *baserel,
                 Oid foreigntableid);

롤 토토 테이블에 대한 스캔을 위한 가능한 액세스 경로를 생성하십시오. 이는 쿼리 계획 중에 호출됩니다. 매개변수는 와 동일합니다.GetForeignRelSize이미 호출되었습니다.

이 함수는 최소한 하나의 액세스 경로를 생성해야 합니다(ForeignPath노드)를 사용하여 롤 토토 테이블을 스캔하고 호출해야 합니다.add_path각 경로를 추가하려면baserel-경로 목록. 사용하는 것이 좋습니다.create_foreignscan_path빌드하기 위해ForeignPath노드. 이 함수는 여러 액세스 경로(예: 유효한 경로)를 생성할 수 있습니다.경로키미리 정렬된 결과를 나타냅니다. 각 액세스 경로에는 예상 비용이 포함되어야 하며, 의도한 특정 검색 방법을 식별하는 데 필요한 FDW 개인 정보가 포함될 수 있습니다.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보를 확인하세요.

ForeignScan *
GetForeignPlan(PlannerInfo *루트,
                RelOptInfo *baserel,
                Oid foreigntableid,
                ForeignPath *best_path,
                목록 *tlist,
                *scan_clauses 나열);

만들기ForeignScan선택한 외부 액세스 경로의 노드를 계획합니다. 이는 쿼리 계획이 끝날 때 호출됩니다. 매개변수는 다음과 같습니다.GetForeignRelSize및 선택된 것ForeignPath(이전에 제작됨GetForeignPaths), 계획 노드에서 내보낼 대상 목록 및 계획 노드에서 시행할 제한 조항입니다.

이 함수는 다음을 생성하고 반환해야 합니다.ForeignScan계획 노드; 사용하는 것이 좋습니다.make_foreignscan빌드하기 위해ForeignScan노드.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보를 확인하세요.

공허
BeginForeignScan(ForeignScanState *노드,
                  int 플래그);

롤 토토 스캔 실행을 시작합니다. 이는 실행기 시작 중에 호출됩니다. 스캔을 시작하기 전에 필요한 초기화를 수행해야 하지만 실제 스캔 실행을 시작해서는 안 됩니다(첫 번째 호출 시 수행되어야 함).IterateForeignScan).ForeignScanState노드가 이미 생성되었지만, 그fdw_state필드가 아직 NULL입니다. 스캔할 테이블에 대한 정보는를 통해 액세스할 수 있습니다.ForeignScanState노드(특히, 기본에서ForeignScan에서 제공한 FDW 개인 정보가 포함된 계획 노드GetForeignPlan). 플래그이 계획 노드에 대한 실행기의 작동 모드를 설명하는 플래그 비트를 포함합니다.

언제든지 주의하세요(플래그 및 EXEC_FLAG_EXPLAIN_ONLY)이 사실입니다. 이 함수는 롤 토토에 표시되는 작업을 수행해서는 안 됩니다. 노드 상태를 유효하게 만드는 데 필요한 최소한의 작업만 수행해야 합니다.ExplainForeignScan그리고EndForeignScan.

TupleTableSlot *
IterateForeignScan(ForeignScanState *노드);

롤 토토 소스에서 한 행을 가져와 튜플 테이블 슬롯(노드의ScanTupleSlot이 목적으로 사용되어야 합니다). 더 이상 사용할 수 있는 행이 없으면 NULL을 반환합니다. 튜플 테이블 슬롯 인프라를 사용하면 물리적 또는 가상 튜플을 반환할 수 있습니다. 대부분의 경우 성능 측면에서 후자를 선택하는 것이 더 좋습니다. 이는 호출 간에 재설정되는 단기 메모리 컨텍스트에서 호출됩니다. 에서 메모리 컨텍스트를 생성합니다.BeginForeignScan장기적인 저장 공간이 필요하거나 다음을 사용하는 경우es_query_cxt노드의EState.

반환된 행은 스캔 중인 롤 토토 테이블의 열 서명과 일치해야 합니다. 필요하지 않은 가져오기 열을 최적화하기로 선택한 경우 해당 열 위치에 null을 삽입해야 합니다.

참고포스트그레SQL의 실행자는 반환된 행이 위반하는지 여부에 상관하지 않습니다.NULL이 아님외부 테이블 열에 정의된 제약 조건 — 그러나 플래너는 이를 고려하고 다음과 같은 경우 쿼리를 잘못 최적화할 수 있습니다.NULL값을 포함하지 않도록 선언된 열에 값이 있습니다. 만약에NULL사용자가 아무것도 존재하지 않아야 한다고 선언한 경우 값이 발견되면 오류를 발생시키는 것이 적절할 수 있습니다(데이터 유형이 일치하지 않는 경우에 수행해야 하는 것과 마찬가지로).

공허
ReScanForeignScan(ForeignScanState *노드);

스캔을 처음부터 다시 시작하세요. 스캔이 의존하는 매개변수의 값이 변경되었을 수 있으므로 새 스캔이 반드시 정확히 동일한 행을 반환하는 것은 아닙니다.

공허
EndForeignScan(ForeignScanState *노드);

스캔을 종료하고 자원을 해제합니다. 일반적으로 palloc 메모리를 해제하는 것은 중요하지 않지만, 예를 들어 열려 있는 파일과 원격 서버에 대한 연결을 정리해야 합니다.

53.2.2. 롤 토토 테이블 업데이트를 위한 FDW 루틴

FDW가 쓰기 가능한 외부 테이블을 지원하는 경우 FDW의 필요와 기능에 따라 다음 콜백 함수 중 일부 또는 전부를 제공해야 합니다.

공허
AddForeignUpdateTargets(쿼리 *parsetree,
                         RangeTblEntry *target_rte,
                         관계 target_relation);

업데이트그리고삭제작업은 테이블 검색 기능으로 이전에 가져온 행에 대해 수행됩니다. FDW에는 업데이트하거나 삭제할 정확한 행을 식별할 수 있도록 행 ID 또는 기본 키 열 값과 같은 추가 정보가 필요할 수 있습니다. 이를 지원하기 위해 이 함수는 숨겨진 항목을 추가할 수 있습니다. 또는"정크", 대상 열을 롤 토토 테이블에서 검색할 열 목록으로 지정합니다.업데이트또는삭제.

그렇게 하려면 다음을 추가하세요.대상 항목항목을parsetree-targetList, 가져올 추가 값에 대한 표현식이 포함되어 있습니다. 이러한 각 항목은 표시되어야 합니다.재정크 = 사실, 고유한이 있어야 합니다.이름 변경실행 시 이를 식별합니다. 일치하는 이름을 사용하지 마십시오.ctidN, 전체또는전체N, 핵심 시스템이 이러한 이름의 정크 열을 생성할 수 있기 때문입니다.

이 함수는 플래너가 아닌 리라이터에서 호출되므로 사용 가능한 정보는 계획 루틴에서 사용 가능한 정보와 약간 다릅니다.파싱 트리다음에 대한 구문 분석 트리입니다.업데이트또는삭제명령, 동안target_rte그리고대상_관계대상 롤 토토 테이블을 설명합니다.

만약AddForeignUpdateTargets포인터가 다음으로 설정되었습니다.NULL, 추가 대상 표현식이 추가되지 않습니다. (이렇게 하면 구현이 불가능해집니다.삭제그러나 작업은업데이트FDW가 행을 식별하기 위해 변경되지 않는 기본 키를 사용하는 경우 여전히 가능할 수 있습니다.)

목록 *
PlanForeignModify(PlannerInfo *루트,
                   ModifyTable *계획,
                   색인 결과관계,
                   int subplan_index);

외부 테이블의 삽입, 업데이트 또는 삭제에 필요한 추가 계획 작업을 수행합니다. 이 함수는 다음에 첨부될 FDW 개인 정보를 생성합니다.테이블 수정업데이트 작업을 수행하는 계획 노드입니다. 이 개인 정보는 다음과 같은 형식이어야 합니다.목록, 다음 주소로 전달됩니다.BeginForeignModify실행 단계 중.

루트은 쿼리에 대한 플래너의 전역 정보입니다.계획이것은테이블 수정다음을 제외하고 완전한 계획 노드fdwPrivLists필드.결과관계범위 테이블 색인으로 대상 롤 토토 테이블을 식별합니다.하위 계획_index어떤 대상을 식별테이블 수정계획 노드는 0부터 계산됩니다. 색인을 생성하려면 이것을 사용하세요.계획-계획또는 기타의 하위 구조계획노드.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보를 확인하세요.

만약PlanForeign수정포인터가 다음으로 설정되었습니다.NULL, 계획 시 추가 작업이 수행되지 않으며fdw_private목록 전달 대상BeginForeignModifyNIL이 됩니다.

공허
BeginForeignModify(ModifyTableState *mtstate,
                    ResultRelInfo *rinfo,
                    *fdw_private 목록,
                    int 하위 계획_색인,
                    int 플래그);

외부 테이블 수정 작업 실행을 시작합니다. 이 루틴은 실행기 시작 중에 호출됩니다. 실제 테이블 수정 전에 필요한 초기화를 수행해야 합니다. 이어서,ExecForeignInsert, ExecForeignUpdate또는ExecForeignDelete각 튜플이 삽입, 업데이트 또는 삭제될 때마다 호출됩니다.

mtstate전체적인 상태입니다테이블 수정계획 노드가 실행 중입니다. global data about the plan and execution state is available via this structure.린포이것은결과RelInfo대상 롤 토토 테이블을 설명하는 구조체입니다. (그ri_FdwState필드결과RelInfoFDW는 이 작업에 필요한 비공개 상태를 저장할 수 있습니다.)fdw_private다음에 의해 생성된 개인 데이터를 포함합니다.PlanForeign수정있는 경우.하위 계획_index어떤 대상을 식별테이블 수정이것은 계획 노드입니다.플래그이 계획 노드에 대한 실행기의 작동 모드를 설명하는 플래그 비트를 포함합니다.

언제 참고하세요(플래그 및 EXEC_FLAG_EXPLAIN_ONLY)이 true입니다. 이 함수는 롤 토토에 표시되는 작업을 수행해서는 안 됩니다. 노드 상태를 유효하게 만드는 데 필요한 최소한의 작업만 수행해야 합니다.ExplainForeignModify그리고EndForeignModify.

만약에BeginForeignModify포인터가 다음으로 설정되었습니다.NULL, 실행기 시작 중에는 아무런 조치도 취하지 않습니다.

TupleTableSlot *
ExecForeignInsert(EState *부동산,
                   ResultRelInfo *rinfo,
                   TupleTableSlot *슬롯,
                   TupleTableSlot *planSlot);

롤 토토 테이블에 하나의 튜플을 삽입하십시오.부동산쿼리의 전역 실행 상태입니다.rinfo이것은결과RelInfo대상 롤 토토 테이블을 설명하는 구조체.슬롯삽입할 튜플을 포함합니다. 이는 롤 토토 테이블의 행 유형 정의와 일치합니다.planSlot에 의해 생성된 튜플을 포함합니다.테이블 수정계획 노드의 하위 계획; 와는 다르다슬롯추가 내용이 포함될 수 있음"정크"열. (그planSlot일반적으로 다음 사용자에게는 별 관심이 없습니다.삽입사례이지만 완전성을 위해 제공됩니다.)

반환 값은 실제로 삽입된 데이터가 포함된 슬롯이거나(트리거 작업의 결과로 제공된 데이터와 다를 수 있음) 실제로 행이 삽입되지 않은 경우(일반적으로 트리거의 결과로) NULL입니다. 전달된슬롯이 목적으로 재사용할 수 있습니다.

반환된 슬롯의 데이터는 다음과 같은 경우에만 사용됩니다.삽입쿼리에 가 있습니다돌아오는 중절 또는 외부 테이블에행 이후트리거. 트리거에는 모든 열이 필요하지만 FDW는 내용에 따라 일부 또는 전체 열을 반환하지 않도록 최적화하도록 선택할 수 있습니다.돌아오는 중절. 그럼에도 불구하고 성공을 나타내려면 일부 슬롯을 반환해야 합니다. 그렇지 않으면 쿼리의 보고된 행 수가 잘못됩니다.

만약에ExecForeignInsert포인터가 다음으로 설정되었습니다.NULL, 외부 테이블에 삽입하려는 시도는 오류 메시지와 함께 실패합니다.

TupleTableSlot *
ExecForeignUpdate(EState *부동산,
                   ResultRelInfo *rinfo,
                   TupleTableSlot *슬롯,
                   TupleTableSlot *planSlot);

외부 테이블에서 하나의 튜플을 업데이트합니다.부동산쿼리의 전역 실행 상태입니다.rinfo이것이결과RelInfo대상 롤 토토 테이블을 설명하는 구조체.슬롯튜플에 대한 새 롤 토토를 포함합니다. 이는 외부 테이블의 행 유형 정의와 일치합니다.planSlot에 의해 생성된 튜플을 포함합니다.테이블 수정계획 노드의 하위 계획; 와는 다르다슬롯추가 내용이 포함될 수 있음"정크"열. 특히 다음에서 요청한 모든 정크 열은AddForeignUpdateTargets이 슬롯에서 사용할 수 있습니다.

반환 값은 실제로 업데이트된 행을 포함하는 슬롯이거나(트리거 작업의 결과로 제공된 데이터와 다를 수 있음) 실제로 업데이트된 행이 없는 경우(일반적으로 트리거의 결과로) NULL입니다. 전달된슬롯이 목적으로 재사용할 수 있습니다.

반환된 슬롯의 데이터는 다음 경우에만 사용됩니다.업데이트쿼리에 다음이 있습니다.돌아오는 중절 또는 외부 테이블에행 이후트리거. 트리거에는 모든 열이 필요하지만 FDW는 내용에 따라 일부 또는 전체 열을 반환하지 않도록 최적화하도록 선택할 수 있습니다.돌아오는 중절. 그럼에도 불구하고 성공을 나타내려면 일부 슬롯을 반환해야 합니다. 그렇지 않으면 쿼리의 보고된 행 수가 잘못됩니다.

만약에ExecForeignUpdate포인터가 다음으로 설정되었습니다.NULL, 외부 테이블을 업데이트하려는 시도는 오류 메시지와 함께 실패합니다.

TupleTableSlot *
ExecForeignDelete(EState *부동산,
                   ResultRelInfo *rinfo,
                   TupleTableSlot *슬롯,
                   TupleTableSlot *planSlot);

외부 테이블에서 하나의 튜플을 삭제합니다.부동산은 쿼리에 대한 전역 실행 상태입니다.린포이것은ResultRelInfo대상 롤 토토 테이블을 설명하는 구조체.슬롯호출 시 유용한 내용은 없지만 반환된 튜플을 보관하는 데 사용할 수 있습니다.planSlot에 의해 생성된 튜플을 포함합니다.테이블 수정계획 노드의 하위 계획; 특히, 다음에서 요청한 정크 열을 전달합니다.AddForeignUpdateTargets. 삭제할 튜플을 식별하려면 정크 열을 사용해야 합니다.

반환 값은 삭제된 행을 포함하는 슬롯이거나 삭제된 행이 없는 경우(일반적으로 트리거의 결과) NULL입니다. 전달된슬롯반환될 튜플을 보관하는 데 사용할 수 있습니다.

반환된 슬롯의 데이터는 다음과 같은 경우에만 사용됩니다.삭제쿼리에 다음이 있습니다.돌아오는 중절 또는 외부 테이블에행 이후트리거. 트리거에는 모든 열이 필요하지만 FDW는 내용에 따라 일부 또는 전체 열을 반환하지 않도록 최적화하도록 선택할 수 있습니다.돌아오는 중절. 그럼에도 불구하고 성공을 나타내려면 일부 슬롯을 반환해야 합니다. 그렇지 않으면 쿼리의 보고된 행 수가 잘못됩니다.

만약에ExecForeignDelete포인터가 다음으로 설정되었습니다.NULL, 외부 테이블에서 삭제하려는 시도는 오류 메시지와 함께 실패합니다.

공허
EndForeignModify(EState *부동산,
                  ResultRelInfo *rinfo);

테이블 업데이트를 종료하고 자원을 해제합니다. 일반적으로 palloc 메모리를 해제하는 것은 중요하지 않지만, 예를 들어 열려 있는 파일과 원격 서버에 대한 연결을 정리해야 합니다.

만약에EndForeignModify포인터가 다음으로 설정되었습니다.NULL, 실행기 종료 중에는 아무런 조치도 취하지 않습니다.

정수
IsForeignRelUpdatable(관계 상대);

지정된 외부 테이블이 지원하는 업데이트 작업을 보고합니다. 반환 값은를 사용하여 외부 테이블에서 지원되는 작업을 나타내는 규칙 이벤트 번호의 비트 마스크여야 합니다.명령 유형열거; 즉,(1 << CMD_UPDATE) = 4for업데이트, (1 << CMD_INSERT) = 8삽입그리고(1 << CMD_DELETE) = 16for삭제.

만약에IsForeignRelUpdatable포인터가 다음으로 설정되었습니다.NULL, FDW가 제공하는 경우 외부 테이블은 삽입 가능, 업데이트 가능 또는 삭제 가능하다고 가정됩니다.ExecForeignInsert, ExecForeignUpdate, 또는ExecForeignDelete각각. 이 기능은 FDW가 업데이트 가능한 테이블과 그렇지 않은 테이블을 지원하는 경우에만 필요합니다. (그럼에도 이 함수를 체크인하는 대신 실행 루틴에서 오류를 발생시키는 것이 허용됩니다. 그러나 이 함수는 표시할 업데이트 가능성을 결정하는 데 사용됩니다.information_schema조회.)

53.2.3. FDW 루틴:설명

공허
explainForeignScan(ForeignScanState *노드,
                    explainState *es);

추가 인쇄설명롤 토토 테이블 스캔에 대한 출력입니다. 이 함수는 호출할 수 있습니다.ExplainPropertyText및 필드를 추가하는 관련 함수설명출력. 플래그 필드는es인쇄할 내용과 상태를 결정하는 데 사용할 수 있습니다.ForeignScanState노드를 검사하여 다음에서 런타임 통계를 제공할 수 있습니다.분석 설명케이스.

만약에ExplainForeignScan포인터가 다음으로 설정되었습니다.NULL, 동안에는 추가 정보가 인쇄되지 않습니다.설명.

공허
explainForeignModify(ModifyTableState *mtstate,
                      ResultRelInfo *rinfo,
                      *fdw_private 목록,
                      int 하위 계획_색인,
                      구조체 explainState *es);

추가 인쇄설명외부 테이블 업데이트에 대한 출력입니다. 이 함수는 호출할 수 있습니다.ExplainPropertyText및 필드를 추가하는 관련 함수설명출력. 플래그 필드는es인쇄할 항목과 상태를 결정하는 데 사용할 수 있습니다.수정테이블상태노드를 검사하여 다음에서 런타임 통계를 제공할 수 있습니다.분석 설명케이스. 처음 4개의 인수는 for와 동일합니다.BeginForeignModify.

만약에ExplainForeignModify포인터가 다음으로 설정되었습니다.NULL, 동안에는 추가 정보가 인쇄되지 않습니다.설명.

53.2.4. FDW 루틴:분석

부울
AnalyzeForeignTable(관계 관계,
                     AcquireSampleRowsFunc *func,
                     BlockNumber *총 페이지 수);

이 함수는 다음과 같은 경우에 호출됩니다.스포츠 토토 사이트 PostgreSQL : 문서 : 9.4 : Analyze외부 테이블에서 실행됩니다. FDW가 이 외부 테이블에 대한 통계를 수집할 수 있으면 다음을 반환해야 합니다., 그리고 테이블에서 샘플 행을 수집할 함수에 대한 포인터를 제공합니다.func및 페이지의 예상 테이블 크기총페이지수. 그렇지 않으면 반환거짓.

FDW가 테이블에 대한 통계 수집을 지원하지 않는 경우,외부 테이블 분석포인터는 다음으로 설정될 수 있습니다.NULL.

제공된 경우 샘플 수집 기능에는 서명이 있어야 합니다

정수
AcquireSampleRowsFunc(관계 관계, int elevel,
                       HeapTuple *행, int targrows,
                       이중 *합계,
                       double *totaldeadrows);

최대의 무작위 샘플대상 성장행은 테이블에서 수집되어 호출자 제공에 저장되어야 합니다.배열. 수집된 실제 행 수를 반환해야 합니다. 또한 테이블의 활성 행과 데드 행의 총 개수 추정치를 출력 매개변수에 저장합니다.총계그리고총 교착 상태. (설정총 교착 상태FDW에 데드 행 개념이 없으면 0으로 설정됩니다.)