이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 57.2. 와이즈 롤 토토 데이터 래퍼 콜백 루틴버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

53.2. 롤 토토 데이터 래퍼 콜백 루틴

FDW 핸들러 함수는 palloc'd를 반환합니다fdwroutine아래에 설명 된 콜백 함수에 포인터를 포함하는 구조. 스캔 관련 기능이 필요하고 나머지는 선택 사항입니다.

thefdwroutinestruct 유형은에 선언되었습니다.SRC/포함/롤 토토/fdwapi.h, 추가 세부 사항을 참조하십시오.

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

무효
getforeignrelsize (plannerinfo *root,
                   reploptinfo *baserel,
                   oid forexableid);

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

이 기능이 업데이트되어야합니다Baserel- 행제한 quals에 의해 수행 된 필터링을 설명 한 후 테이블 스캔에 의해 반환 된 예상 행의 수가 되려면. 의 초기 값Baserel- 행는 일정한 기본 추정치 일 뿐이며 가능한 경우 교체해야합니다. 함수는 또한 업데이트를 선택할 수 있습니다Baserel- 너비평균 결과 행 너비의 더 나은 추정치를 계산할 수있는 경우

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보는

무효
getforeignpaths (plannerinfo *루트,
                 reploptinfo *baserel,
                 oid forexableid);

롤 토토 테이블에서 스캔 할 수있는 액세스 경로를 만듭니다. 이것은 쿼리 계획 중에 호출됩니다. 매개 변수는와 동일합니다.getforeignRelsize, 이미 호출되었습니다.

이 함수는 하나 이상의 액세스 경로를 생성해야합니다 (롤 토토 경로노드) 외부 테이블의 스캔을 위해서는 전화해야합니다add_path그러한 각 경로를 추가하려면Baserel- PathList. 사용하는 것이 좋습니다create_foreignscan_path빌드하려면롤 토토 경로노드. 함수는 여러 액세스 경로를 생성 할 수 있습니다 (예 : 유효한 경로Pathkeys사전 분류 된 결과를 나타냅니다. 각 액세스 경로에는 비용 추정치가 포함되어야하며 의도 된 특정 스캔 방법을 식별하는 데 필요한 FDW- 민간 정보가 포함될 수 있습니다.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보는

Outissscan *
getforeignplan (plannerinfo *root,
                reploptinfo *baserel,
                Oid ForeigntableId,
                롤 토토 경로 *best_path,
                목록 *tlist,
                목록 *scan_clauses);

a 생성Foreignscan선택한 외래 액세스 경로에서 노드를 계획하십시오. 쿼리 계획이 끝날 때 호출됩니다. 매개 변수는입니다.getforeignRelsize, 선택된롤 토토 경로(이전에 생산GetforeignPaths), 계획 노드에 의해 방출되는 대상 목록과 계획 노드에 의해 시행되는 제한 조항..

이 함수는 a를 생성하고 반환해야합니다.Foreignscan계획 노드; 사용하는 것이 좋습니다make_foreignscan구축하려면Outissscan노드.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보는

무효
excernforeignscan (롤 토토 scanstate *노드,
                  int eflags);

롤 토토 스캔 실행을 시작하십시오. 이것은 집행자 스타트 업 동안 호출됩니다. 스캔이 시작되기 전에 필요한 초기화를 수행해야하지만 실제 스캔을 실행하지는 않습니다 (첫 번째 호출시 수행해야합니다ITREARTEFOREIGNSCAN). 그만큼Outissscanstate노드가 이미 생성되었지만 그FDW_STATE필드는 여전히 무효입니다. 스캔 할 테이블에 대한 정보는를 통해 액세스 할 수 있습니다.Outissscanstate노드 (특히 기본에서OutissscanPlan Node.getforeignplan).eflags이 계획 노드에 대한 집행자의 작동 모드를 설명하는 플래그 비트가 포함되어 있습니다.

(eflags & exec_flag_explain_only)사실,이 기능은 외부가 가시적으로 행동하지 않아야합니다. 노드 상태를 유효하게하는 데 필요한 최소 값 만설명 foreignscanandendforeignscan.

tupletableslot *
반복적

롤 토토 소스에서 한 줄을 가져와 튜플 테이블 슬롯으로 반환합니다 (노드Scantupleslot이 목적으로 사용해야합니다). 더 이상 행을 사용할 수없는 경우 리턴 NULL. 튜플 테이블 슬롯 인프라를 통해 물리적 또는 가상 튜플을 반환 할 수 있습니다. 대부분의 경우 후자의 선택은 성능 관점에서 바람직합니다. 이는 수명이 짧은 메모리 컨텍스트에서 호출 될 수 있습니다. 에서 메모리 컨텍스트 생성tecineforeignscan더 많은 수명 스토리지가 필요한 경우es_query_cxt노드의Estate.

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

참고PostgreSQL의 집행 인은 반환 된 행이 어떤 것을 위반하는지 상관하지 않습니다NOT NULL롤 토토 테이블 열에 정의 된 제약 조건 - 그러나 플래너가 관리하고 쿼리를 잘못 최적화 할 수 있습니다.NULL값은 포함하지 말라고 선언 한 열에 있습니다. aNULL값은 사용자가 존재하지 않아야한다고 선언했을 때 값이 발생합니다. 오류를 제기하는 것이 적절할 수 있습니다 (데이터 유형 불일치의 경우 필요한대로).

무효
rescanforeignscan (foreignscanstate *노드);

처음부터 스캔을 다시 시작하십시오. 스캔이 의존하는 매개 변수는 값이 변경되었을 수 있으므로 새 스캔이 반드시 같은 행을 반드시 반환 할 필요는 없습니다.

무효
endforeignscan (foreignscanstate *노드);

스캔 및 릴리스 리소스를 종료하십시오. 일반적으로 Palloc'd 메모리를 해제하는 것은 중요하지 않지만 예를 들어 원격 서버에 대한 열린 파일 및 연결을 정리해야합니다.

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

FDW가 쓰기 가능한 롤 토토 테이블을 지원하는 경우 FDW의 요구와 기능에 따라 다음 콜백 기능을 제공해야합니다.

무효
addforeignupdateTargets (query *parsetree,
                         rangetblentry *target_rte,
                         관계 target_relation);

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

그렇게하려면 추가TargetEntry항목 toParsetree- TargetList, 추가 값을 가져 오는 표현식을 포함합니다. 그러한 각 항목은 표시되어야합니다resjunk=true, 뚜렷한Resname실행 시간에이를 식별합니다. 일치하는 이름 사용을 피하십시오CTIDn, Wholerow또는Wholerown, 핵심 시스템 이이 이름의 정크 열을 생성 할 수 있습니다.

이 기능은 플래너가 아닌 다시 작성자에서 호출되므로 사용 가능한 정보는 계획 루틴에서 사용할 수있는 정보와 약간 다릅니다.Parsetree|업데이트또는삭제명령, whiletarget_rteandtarget_relation대상 롤 토토 표를 설명합니다.

addforeignupdateTargets포인터가 설정되었습니다NULL, 추가 대상 표현식이 추가되지 않습니다. (이것은 구현할 수 없게 될 것입니다삭제운영업데이트FDW가 변하지 않는 기본 키에 의존하여 행을 식별하는 경우에도 여전히 실현 가능할 수 있습니다.)

목록 *
planforeignmodify (plannerinfo *root,
                   ModififyTable *계획,
                   색인 결과,
                   int subplan_index);

외국 테이블에서 삽입, 업데이트 또는 삭제에 필요한 추가 계획 조치를 수행하십시오. 이 함수는에 첨부 될 FDW- 민간 정보를 생성합니다.modifyTable업데이트 작업을 수행하는 계획 노드. 이 개인 정보는 a의 형태가 있어야합니다.Listtecineforeignmodify실행 단계 중.

루트쿼리에 대한 플래너의 글로벌 정보입니다.planmodifyTable계획 노드.FDWPRIVLISTSField.ressultrelation범위 테이블 지수로 대상 이물질 테이블을 식별합니다.subplan_index의 어떤 대상을 식별합니다modifyTable계획 노드 이것은 0에서 계산됩니다. 색인을 원한다면를 사용하십시오.plan- 계획또는 기타 하위 구조plan노드.

참조PostgreSQL : 문서 : 9.4 : 외국 데이터 래퍼 쿼리 와이즈 토토추가 정보는

if theplanforeignModify포인터가 설정되었습니다NULL, 추가 계획 시간 조치가 취하지 않으며FDW_PRIVATE전달 된 목록tearnforeignmodify

무효
tertoctoreignmodify (modifyTableState *mtstate,
                    rinfo *rinfo,
                    목록 *fdw_private,
                    int subplan_index,
                    int eflags);

롤 토토 테이블 수정 작업을 시작하십시오. 이 루틴은 집행자 스타트 업 동안 호출됩니다. 실제 테이블 수정 전에 필요한 초기화를 수행해야합니다. 그후,execforeigninsert, execforeignupdate또는execforeigndelete삽입, 업데이트 또는 삭제되도록 각 튜플이 요구됩니다.

mtstate|modifyTable실행중인 계획 노드; 계획 및 실행 상태에 대한 글로벌 데이터는이 구조를 통해 사용할 수 있습니다.rinforesultrelinfo대상 외래 테이블을 설명하는 구조. (그만큼RI_FDWSTATE필드resultrelinfoFDW 가이 작업에 필요한 개인 상태를 저장할 수 있습니다.)fdw_private|planforeignModify, 경우.subplan_indexmodifyTable계획 노드입니다.eflags이 계획 노드에 대한 집행자의 작동 모드를 설명하는 플래그 비트가 포함되어 있습니다.

(eflags & exec_flag_explain_only)사실,이 함수는 외부가 가시적으로 행동하지 않아야합니다. 노드 상태를 유효하게하는 데 필요한 최소 값 만ForeignModify 설명andendforeignModify.

tearnforeignmodify포인터가 설정되었습니다NULL, 집행자 스타트 업 동안 조치를 취하지 않습니다.

tupletableslot *
execforeigninsert (Estate *Estate,
                   rinfo *rinfo,
                   tupletableslot *슬롯,
                   tupletableslot *planlot);

하나의 튜플을 롤 토토 테이블에 삽입하십시오.Estate쿼리의 글로벌 실행 상태입니다.rinforesultrelinfo대상 롤 토토 표를 설명하는 구조.슬롯삽입 할 튜플을 포함합니다. 롤 토토 테이블의 행 유형 정의와 일치합니다.plantlotmodifyTable계획 노드의 하위 비행; 에서 다릅니다.슬롯가능성이 추가"정크"열. (그만큼plantlot일반적으로에 대한 관심은 거의 없습니다.삽입사례이지만 완전성을 위해 제공됩니다.)

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

반환 된 슬롯의 데이터는에만 사용됩니다.삽입Query는반환절 또는 외국 테이블에가 있습니다.After Row트리거. 트리거는 모든 열이 필요하지만 FDW는의 내용에 따라 일부 또는 모든 열을 반환하는 것을 최적화하도록 선택할 수 있습니다.반환절. 그럼에도 불구하고 일부 슬롯은 성공을 나타내려면 반환되어야합니다. 그렇지 않으면 쿼리의보고 된 행 카운트가 잘못 될 것입니다.

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

tupletableslot *
execforeignupdate (Estate *Estate,
                   rinfo *rinfo,
                   tupletableslot *슬롯,
                   tupletableslot *planlot);

외국 테이블에서 하나의 튜플 업데이트.Estate쿼리의 글로벌 실행 상태입니다.rinforesultrelinfo대상 롤 토토 표를 설명하는 구조.슬롯튜플에 대한 새로운 데이터를 포함합니다. 롤 토토 테이블의 행 유형 정의와 일치합니다.plantlotModifyTable계획 노드의 하위 비행; 에서 다릅니다.슬롯가능성이 추가로"정크"열. 특히, 요청한 모든 정크 열은addforeignupdateTargets이 슬롯에서 사용할 수 있습니다.

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

반환 된 슬롯의 데이터는에만 사용됩니다.업데이트Query는반환절 또는 외국 테이블에가 있습니다.After Row트리거. 트리거는 모든 열이 필요하지만 FDW는의 내용에 따라 일부 또는 모든 열을 반환하는 것을 최적화하도록 선택할 수 있습니다.반환절. 그럼에도 불구하고 일부 슬롯은 성공을 나타내려면 반환되어야합니다. 그렇지 않으면 쿼리의보고 된 행 카운트가 잘못 될 것입니다.

execforeignupdate포인터가 설정되었습니다NULL, 오류 메시지로 외국 테이블을 업데이트하려는 시도가 실패합니다.

tupletableslot *
execforeigndelete (Estate *Estate,
                   rinfo *rinfo,
                   tupletableslot *슬롯,
                   tupletableslot *planlot);

외래 테이블에서 하나의 튜플을 삭제합니다.Estate쿼리의 글로벌 실행 상태입니다.rinforesultrelinfo대상 롤 토토 표를 설명하는 구조.슬롯전화시 유용한 것은 포함되지만 반환 된 튜플을 잡는 데 사용될 수 있습니다.plantlotmodifyTable계획 노드의 하위 비행; 특히에 의해 요청 된 모든 정크 열이 운반됩니다.addforeignupdateTargets. 정크 열을 사용하여 삭제할 튜플을 식별해야합니다.

반환 값은 삭제 된 행을 포함하는 슬롯이거나 행이 삭제되지 않은 경우 (일반적으로 트리거의 결과)입니다. 통과슬롯튜플을 반환 할 수 있도록 사용할 수 있습니다.

반환 된 슬롯의 데이터는에만 사용됩니다.삭제Query는반환절 또는 외국 테이블에가 있습니다.행 후트리거. 트리거는 모든 열이 필요하지만 FDW는의 내용에 따라 일부 또는 모든 열을 반환하는 것을 최적화하도록 선택할 수 있습니다.반환절. 그럼에도 불구하고 일부 슬롯은 성공을 나타내려면 반환되어야합니다. 그렇지 않으면 쿼리의보고 된 행 카운트가 잘못 될 것입니다.

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

무효
endforeignmodify (Estate *Estate,
                  resultrelinfo *rinfo);

테이블 업데이트 및 릴리스 리소스를 종료하십시오. 일반적으로 Palloc'd 메모리를 해제하는 것은 중요하지 않지만 예를 들어 원격 서버에 대한 열린 파일 및 연결을 정리해야합니다.

endforeignModify포인터가 설정되었습니다NULL, 집행자 종료 중에 조치를 취하지 않습니다.

int
isforeignrelupdatable (관계 rel);

지정된 외국 테이블이 지원하는 업데이트 업데이트 보고서. 반환 값은를 사용하여 외국 테이블에서 어떤 작업을 지원하는지를 나타내는 규칙 이벤트 번호의 약간 마스크 여야합니다.cmdtype열거; 즉,(1 << cmd_update) = 4for업데이트, (1 << cmd_insert) = 8for삽입(1 << cmd_delete) = 16for삭제.

인 경우isforeignrelupdatable포인터가 설정되었습니다NULL, FDW가 제공하는 경우 외국 테이블은 삽입 가능, 업데이트 가능 또는 삭제 가능한 것으로 가정합니다execforeigninsert, execforeignupdate또는execforeigndelete각각. 이 기능은 FDW가 업데이트 가능한 일부 테이블과 그렇지 않은 테이블을 지원하는 경우에만 필요합니다. (그럼에도 불구 하고이 함수를 확인하는 대신 실행 루틴에서 오류를 던지는 것이 허용됩니다. 그러나이 기능은에 표시 될 업데이트 가능성을 결정하는 데 사용됩니다.Information_Schema보기)

53.2.3. fdw 루틴을위한설명

무효
foreignscan을 설명
                    설명 *es);

추가 인쇄설명롤 토토 테이블 스캔의 출력. 이 기능은 호출 할 수 있습니다설명 프 로퍼 타입 텍스트및 필드를 추가하는 관련 함수설명출력. 깃발 필드es인쇄 할 내용과 상태를 결정하는 데 사용될 수 있습니다.Outissscanstate노드를 검사하여 런타임 통계를 제공 할 수 있습니다분석 설명CASE.

ForeignScan을 설명포인터가 설정되었습니다NULL, 추가 정보가 인쇄되지 않습니다설명.

무효
foreignModify 설명 (modifyTableState *mtstate,
                      rinfo *rinfo,
                      목록 *fdw_private,
                      int subplan_index,
                      structstate *es);

추가 인쇄설명외국 테이블 업데이트의 출력. 이 기능은 호출 할 수 있습니다설명 프 로퍼 타입 텍스트및 필드를 추가하는 관련 기능설명출력. 깃발 필드es인쇄 할 내용과 상태를 결정하는 데 사용될 수 있으며ModifyTableState노드를 검사하여 런타임 통계를 제공 할 수 있습니다분석케이스. 처음 네 가지 인수는와 동일합니다.teeralforeignmodify.

ForeignModify 설명포인터가 설정되었습니다NULL, 추가 정보가 인쇄되지 않습니다설명.

53.2.4. fdw 루틴을위한분석

bool
Analyzeforeigntable (관계 관계,
                     arceSamplerowsFunc *func,
                     BlockNumber *TotalPages);

이 함수는 다음에 호출됩니다스포츠 토토 사이트 PostgreSQL : 문서 : 9.4 : Analyze외국 테이블에서 실행됩니다. FDW 가이 외국 테이블에 대한 통계를 수집 할 수 있다면 반환해야합니다truefunc, 그리고 페이지의 테이블의 추정 크기와TotalPages. 그렇지 않으면 returnfalse.

FDW가 테이블에 대한 통계 수집을 지원하지 않으면analyzeforeigntable포인터를 설정할 수 있습니다NULL.

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

int
AcquireSamplerowsFunc (관계 관계, int elevel,
                       무거운 *행, int targrows,
                       이중 *Totalrows,
                       Double *Totaldeadrows);

최대의 임의의 샘플Targrows행은 테이블에서 수집되어 발신자 제공에 저장해야합니다배열. 수집 된 실제 행 수를 반환해야합니다. 또한 테이블의 총 라이브 및 데드 행의 총 수에 대한 추정치를 출력 매개 변수로 저장하십시오.TotalrowsTotalDeadrows. (세트TotalDeadrowsFDW에 데드 행의 개념이없는 경우 0까지.)