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

55.2. 외국 토토 사이트 래퍼 콜백 루틴

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

theFdw루틴struct 유형은src/include/foreign/fdwapi.h, 자세한 내용은 참조하세요.

55.2.1. 외부 테이블 스캔을 위한 FDW 루틴

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

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

이 기능은 업데이트되어야 합니다.baserel-행제한 조건에 의해 수행된 필터링을 고려한 후 테이블 스캔에서 반환된 예상 행 수입니다. 초기값은바셀-행은 단지 일정한 기본 추정치일 뿐이며 가능하다면 대체되어야 합니다. 이 기능은 업데이트를 선택할 수도 있습니다.바셀-너비평균 결과 행 너비의 더 나은 추정치를 계산할 수있는 경우. (초기 값은 열 토토 사이트 유형과 마지막으로 측정 한 열 평균 폭 값을 기준으로합니다분석.) 또한 이 기능은 업데이트될 수 있습니다.baserel-튜플외부 테이블의 총 행 수를 더 잘 추정할 수 있는 경우. (초기값은 다음과 같습니다.pg_class.reltuples마지막으로 보이는 총 행 수를 나타냅니다분석.)

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 래퍼 쿼리 토토 결과추가 정보는

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

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

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

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 래퍼 쿼리 토토 결과추가 정보는

Foreignscan *
getforeignplan (plannerinfo *root,
                reploptinfo *baserel,
                Oid ForeigntableId,
                토토 사이트 경로 *best_path,
                목록 *tlist,
                목록 *scan_clauses,
                계획 *outer_plan);

만들기ForeignScan선택한 외래 액세스 경로에서 노드를 계획하십시오. 쿼리 계획이 끝날 때 호출됩니다. 매개 변수는입니다.getforeignRelsize및 선택된 것ForeignPath(이전에 생산GetForeignPaths, GetForeignJoinPaths또는GetForeignUpperPaths), 계획 노드에서 내보낼 대상 목록, 계획 노드에서 시행할 제한 조항 및의 외부 하위 계획Foreignscan, 다음이 수행하는 재검사에 사용됩니다.RecheckForeignScan. (경로가 기본 관계가 아닌 조인용인 경우,토토 사이트테이블IDisInvalidOid.)

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

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 래퍼 쿼리 토토 결과추가 정보는

무효
excernforeignscan (토토 사이트 scanstate *노드,
                  int eflags);

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

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

tupletableslot *
반복적

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

반환된 행은 다음과 일치해야 합니다.FDW_SCAN_TLIST대상 목록이 제공된 경우, 그렇지 않으면 스캔되는 외래 테이블의 행 유형과 일치해야합니다. 필요하지 않은 열을 최적화하기로 선택한 경우, 해당 열 위치에 널을 삽입하거나 A를 생성해야합니다.fdw_scan_tlist해당 열이 생략된 목록입니다.

참고PostgreSQL의 실행자는 반환된 행이 외부 테이블에 정의된 제약 조건을 위반하는지 여부에 신경 쓰지 않습니다. 그러나 플래너는 주의를 기울이고 선언된 제약 조건을 충족하지 않는 외부 테이블에 표시되는 행이 있는 경우 쿼리를 잘못 최적화할 수 있습니다. 사용자가 제약 조건이 true여야 한다고 선언했을 때 제약 조건을 위반하면 오류를 발생시키는 것이 적절할 수 있습니다(데이터 유형이 일치하지 않는 경우에 수행해야 하는 것과 마찬가지로).

무효
rescanforeignscan (foreignscanstate *노드);

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

무효
endforeignscan (foreignscanstate *노드);

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

55.2.2. 토토 사이트 조인을 스캔하기위한 FDW 루틴

FDW가 토토 사이트인 결합을 원격으로 수행하는 것을 지원하는 경우 (두 테이블의 데이터를 가져오고 로컬로 가입하는 대신)이 콜백 기능을 제공해야합니다.

공허
GetForeignJoinPaths(PlannerInfo *루트,
                     RelOptInfo *joinrel,
                     RelOptInfo *외부,
                     RelOptInfo *innerrel,
                     JoinType 조인 유형,
                     JoinPathExtraData *추가);

모두 동일한 토토 사이트 서버에 속하는 두 개 이상의 토토 사이트 테이블에 가입 할 수있는 액세스 경로를 만듭니다. 이 선택적 기능은 쿼리 계획 중에 호출됩니다. 와 마찬가지로GetForeignPaths,이 함수는 생성해야합니다ForeignPath제공된 사람의 경로조인렐그리고 전화하세요add_path조인을 위해 고려되는 경로 세트에 이러한 경로를 추가합니다. 그러나 달리GetforeignPaths, 로컬 조인과 관련된 경로는 항상 가능하므로 이 함수가 하나 이상의 경로 생성에 성공할 필요는 없습니다.

이 함수는 내부 및 외부 관계의 다양한 조합으로 동일한 조인 관계에 대해 반복적으로 호출됩니다. 중복된 작업을 최소화하는 것은 FDW의 책임입니다.

if aForeignPath경로가 조인을 위해 선택되면 전체 조인 프로세스를 나타냅니다. 구성 요소 테이블 및 보조 조인에 대해 생성된 경로는 사용되지 않습니다. 조인 경로의 후속 처리는 단일 외부 테이블을 검색하는 경로에서와 마찬가지로 진행됩니다. 한 가지 차이점은 다음과 같습니다.ScanRelid결과 중Outissscan계획 노드는 단일 관계가 나타내지 않기 때문에 0으로 설정해야합니다. 대신,fs_relids필드ForeignScan노드는 결합된 관계 집합을 나타냅니다. (후자의 필드는 코어 플래너 코드에 의해 자동으로 설정되며 FDW에 의해 채워질 필요가 없습니다.) 또 다른 차이점은 원격 조인에 대한 열 목록을 시스템 카탈로그에서 찾을 수 없기 때문에 FDW가 채워야 한다는 것입니다.fdw_scan_tlist적절한 목록 포함대상 항목노드, 반환하는 튜플에서 런타임에 제공할 열 집합을 나타냅니다.

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

55.2.3. 사후 스캔/결합 처리 계획을 위한 FDW 루틴

FDW가 원격 집계와 같은 원격 사후 스캔/조인 프로세싱 수행을 지원하는 경우이 콜백 기능을 제공해야합니다.

공허
GetForeignUpperPaths(PlannerInfo *루트,
                      UpperRelationKind 단계,
                      RelOptInfo *input_rel,
                      RelOptInfo *output_rel);

가능한 액세스 경로 생성상류 관계프로세싱, 이는 집계, 창 함수, 정렬 및 테이블 업데이트와 같은 모든 스캔 후/조인 쿼리 처리에 대한 플래너의 용어입니다. 이 선택적 기능은 쿼리 계획 중에 호출됩니다. 현재 쿼리에 관련된 모든 기본 관계가 동일한 FDW에 속하는 경우에만 호출됩니다. 이 기능은 생성해야합니다ForeignPathFDW가 원격으로 수행하고 호출하는 방법을 알고 있는 사후 스캔/조인 처리에 대한 경로add_path이 경로를 표시된 상위 관계에 추가합니다. 와 마찬가지로getforeignjoinpaths, 로컬 처리와 관련된 경로는 항상 가능하므로 이 함수가 경로 생성에 성공할 필요는 없습니다.

단계매개변수는 현재 고려 중인 스캔 후/조인 단계를 식별합니다.output_rel은 이 단계의 계산을 나타내는 경로를 수신해야 하는 상위 관계이며input_rel은 이 단계에 대한 입력을 나타내는 관계입니다. (참고하세요토토 사이트 경로경로 추가output_rel일반적으로 경로에 직접적으로 종속되지 않습니다.input_rel, 처리가 외부에서 수행될 것으로 예상되기 때문입니다. 그러나 이전 처리 단계에서 이전에 생성된 경로를 검사하는 것은 중복 계획 작업을 피하는 데 유용할 수 있습니다.)

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 래퍼 쿼리 토토 결과추가 정보는

55.2.4. 외부 테이블 업데이트를 위한 FDW 루틴

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

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

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

그렇게 하려면 다음을 추가하세요.TargetEntry항목을Parsetree- TargetList, 가져올 추가 값에 대한 표현식이 포함되어 있습니다. 이러한 각 항목은 표시되어야 합니다.resjunk = true, 고유한이 있어야 합니다.RESNAME실행 시 이를 식별합니다. 일치하는 이름을 사용하지 마십시오.ctidN, 전체또는전체N24288_24438eval_const_expressions대상 목록에 추가하기 전에.

이 함수는 계획 중에 호출되지만 제공되는 정보는 다른 계획 루틴에서 사용할 수 있는 정보와 약간 다릅니다.파싱 트리는 다음의 구문 분석 트리입니다.업데이트또는삭제명령, 동안target_rteand대상_관계대상 외부 테이블을 설명합니다.

만약에AddForeignUpdateTargets포인터가 다음으로 설정되었습니다.NULL, 추가 대상 표현식이 추가되지 않습니다. (이렇게 하면 구현이 불가능해집니다.삭제운영업데이트FDW가 변하지 않는 기본 키에 의존하여 행을 식별하는 경우에도 여전히 실현 가능할 수 있습니다.)

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

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

루트쿼리에 대한 플래너의 글로벌 정보입니다.plan이것은modifyTable계획 노드.FDWPRIVLISTS필드.ressultrelation범위 테이블 인덱스로 대상 외부 테이블을 식별합니다.하위 계획_index어떤 대상을 식별테이블 수정계획 노드는 0부터 계산됩니다. 색인을 생성하려면 이것을 사용하세요.계획-계획또는 다른 하위 구조plan노드.

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

만약에PlanForeign수정포인터가 설정되었습니다NULL, 추가 계획 시간 조치를 취하지 않고fdw_private목록이 다음으로 전달됨BeginForeignModify는 nil이 될 것입니다.

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

외국 테이블 수정 작업을 시작하십시오. 이 루틴은 집행자 스타트 업 동안 호출됩니다. 실제 테이블 수정 전에 필요한 초기화를 수행해야합니다. 그후,execforeigninsert, ExecForeignUpdate또는ExecForeignDelete각 튜플이 삽입, 업데이트 또는 삭제될 때마다 호출됩니다.

mtstate전체적인 상태입니다테이블 수정계획 노드가 실행 중입니다. 계획 및 실행 상태에 대한 전역 토토 사이트는 이 구조를 통해 사용할 수 있습니다.린포이것은결과RelInfo대상 외부 테이블을 설명하는 구조체입니다. (그만큼ri_FdwState필드ResultRelInfoFDW가 이 작업에 필요한 비공개 상태를 저장하는 데 사용할 수 있습니다.)fdw_private다음에 의해 생성된 개인 데이터를 포함합니다PlanForeign수정(있는 경우).하위 계획_index의 어떤 대상을 식별합니다테이블 수정이것은 계획 노드입니다.플래그이 계획 노드에 대한 실행기의 작동 모드를 설명하는 플래그 비트를 포함합니다.

(eflags & exec_flag_explain_only)이 사실입니다. 이 함수는 외부에 표시되는 작업을 수행해서는 안 됩니다. 노드 상태를 유효하게 만드는 데 필요한 최소한의 작업만 수행해야 합니다.설명 foreignModify그리고EndForeignModify.

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

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

외부 테이블에 하나의 튜플을 삽입하십시오.Estate쿼리의 글로벌 실행 상태입니다.rinforesultrelinfo대상 외부 테이블을 설명하는 구조체.슬롯삽입 할 튜플을 포함합니다. 토토 사이트 테이블의 행 유형 정의와 일치합니다.planSlot에 의해 생성된 튜플을 포함합니다.테이블 수정계획 노드의 하위 계획; 와는 다르다슬롯추가 포함"정크"열. (그만큼planSlot일반적으로 별 관심이 없습니다.삽입사례이지만 완전성을 위해 제공됩니다.)

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

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

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

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

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

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

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

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

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

외부 테이블에서 하나의 튜플을 삭제하세요.부동산쿼리의 전역 실행 상태입니다.rinfo이것은결과RelInfo대상 외부 테이블을 설명하는 구조체.슬롯호출 시 유용한 내용은 없지만 반환된 튜플을 보관하는 데 사용할 수 있습니다.plantlot테이블 수정계획 노드의 하위 비행; 특히에 의해 요청 된 모든 정크 열이 운반됩니다.AddForeignUpdateTargets. 삭제할 튜플을 식별하려면 정크 열을 사용해야 합니다.

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

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

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

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

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

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

정수
IsForeignRelUpdatable(관계 상대);

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

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

외부 테이블에 대한 일부 삽입, 업데이트 및 삭제는 대체 인터페이스 세트를 구현하여 최적화할 수 있습니다. 삽입, 업데이트 및 삭제를 위한 일반 인터페이스는 원격 서버에서 행을 가져온 다음 해당 행을 한 번에 하나씩 수정합니다. 경우에 따라 이 행별 접근 방식이 필요하지만 비효율적일 수 있습니다. 외부 서버가 실제로 검색하지 않고도 어떤 행을 수정해야 하는지 결정할 수 있고 작업에 영향을 줄 수 있는 로컬 구조가 없는 경우(행 수준 로컬 트리거 또는체크 옵션 있음부모보기의 제약 조건), 전체 작업이 원격 서버에서 수행되도록 물건을 정리할 수 있습니다. 아래에 설명 된 인터페이스는 이것을 가능하게합니다.

부울
PlanDirectModify(PlannerInfo *루트,
                  ModifyTable *계획,
                  색인 결과관계,
                  int subplan_index);

원격 서버에서 직접 수정을 실행하는 것이 안전한지 결정하십시오. 그렇다면 돌아가세요.이를 위해 계획 조치를 수행 한 후. 그렇지 않으면 return거짓. 이 선택적 기능은 쿼리 계획 중에 호출됩니다. 이 기능이 성공하면BeginDirectModify, IterateDirectModifyandEndDirectModify38093_38282PlanForeign수정.

원격 서버에서 직접 수정을 실행하려면 이 함수는 대상 하위 계획을 다음으로 다시 작성해야 합니다.Outissscan원격 서버에서 직접 수정을 실행하는 계획 노드. 그만큼작동필드ForeignScancmdtype적절하게 열거; 즉,CMD_UPDATEfor업데이트, CMD_INSERT삽입CMD_DELETEfor삭제.

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 래퍼 쿼리 토토 결과추가 정보는

만약에PlanDirectModify포인터가 다음으로 설정되었습니다.NULL, 원격 서버에서 직접 수정을 실행하려는 시도는 수행되지 않습니다.

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

원격 서버에서 직접 수정을 실행할 준비. 이것은 집행자 스타트 업 동안 호출됩니다. 직접 수정 전에 필요한 초기화를 수행해야합니다 (첫 번째 호출시 수행해야합니다IterateDirectModify). 그만큼ForeignScanState노드가 이미 생성되었지만 그FDW_STATE필드가 여전히 NULL입니다. 수정할 테이블에 대한 정보는를 통해 액세스할 수 있습니다.ForeignScanState노드(특히, 기본에서ForeignScanPlan Node.PlandirectModify). 플래그이 계획 노드에 대한 실행기의 작동 모드를 설명하는 플래그 비트를 포함합니다.

언제든지 주의하세요(eflags & exec_flag_explain_only)사실,이 함수는 외부로 가시적 인 동작을 수행해서는 안됩니다. 노드 상태를 유효하게하는 데 필요한 최소 값 만ExplainDirectModifyandEndDirectModify.

만약BEGINDIRECTMODIFY포인터가 설정되었습니다NULL, 원격 서버에서 직접 수정을 실행하려는 시도는 수행되지 않습니다.

TupleTableSlot *
IterateDirectModify(ForeignScanState *노드);

삽입, 업데이트또는삭제쿼리에 a가 없습니다돌아오는 중절, 원격 서버에서 직접 수정한 후 NULL을 반환하면 됩니다. 쿼리에 절이 있는 경우,에 필요한 데이터가 포함된 결과 하나를 가져옵니다.돌아오는 중계산, 튜플 테이블 슬롯(노드의ScanTupleSlot이 목적으로 사용해야합니다). 실제로 삽입, 업데이트 또는 삭제 된 데이터는에 저장해야합니다.es_result_relation_info-ri_projectReturning-pi_exprContext-ecxt_scantuple노드의Estate. 더 이상 사용할 수 있는 행이 없으면 NULL을 반환합니다. 이는 호출 간에 재설정되는 단기 메모리 컨텍스트에서 호출됩니다. 에서 메모리 컨텍스트를 생성합니다.BeginDirectModify더 오래 지속되는 저장 공간이 필요하거나 다음을 사용하는 경우es_query_cxt노드의EState.

반환 된 행은와 일치해야합니다.fdw_scan_tlist대상 목록이 제공된 경우, 그렇지 않으면 업데이트되는 외래 테이블의 행 유형과 일치해야합니다. 에 필요하지 않은 페치 열을 최적화하기로 선택한 경우반환계산, 해당 열 위치에 널을 삽입하거나 a를 생성해야합니다.fdw_scan_tlist해당 열이 생략된 목록입니다.

쿼리에 절이 있든 없든, 쿼리의 보고된 행 수는 FDW 자체에 의해 증가되어야 합니다. 쿼리에 절이 없으면 FDW는 또한에 대한 행 수를 늘려야 합니다.Outissscanstate노드분석 설명CASE.

만약에IterateDirectModify포인터가 다음으로 설정되었습니다.NULL, 원격 서버에서 직접 수정을 실행하려는 시도는 수행되지 않습니다.

공허
EndDirectModify(ForeignScanState *노드);

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

만약에EndDirectModify포인터가 설정되었습니다NULL, 원격 서버에서 직접 수정을 실행하려는 시도는 수행되지 않습니다.

55.2.5. 행 잠금을 위한 FDW 루틴

FDW가 지원을 원하는 경우늦은 행 잠금(설명에 따름)PostgreSQL : 문서 : 9.6 : 외국 데이터 포장지에서 행 스포츠 토토), 다음 콜백 함수를 제공해야 합니다.

RowMarkType
GetForeignRowMarkType(RangeTblEntry *rte,
                       LockClauseStrength 강도);

토토 사이트 테이블에 사용할로드 마킹 옵션을보고합니다.rte범위Tbl항목테이블의 노드 및강도해당 항목에서 요청한 잠금 강도를 설명합니다.업데이트/공유절(있는 경우). 결과는 다음의 멤버여야 합니다.RowmarkTypeEnum Type.

이 함수는 AN에 나타나는 각 토토 사이트 테이블에 대한 쿼리 계획 중에 호출됩니다.업데이트, 삭제, 또는업데이트/공유 선택쿼리이며 대상이 아닙니다업데이트또는삭제.

GetForeignRowMarkType포인터가 설정되었습니다NULL, 그row_mark_copy옵션이 항상 사용됩니다. (이것은 다음을 의미합니다.RefetchForeignRow절대 호출되지 않으므로 제공 될 필요는 없습니다.)

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 포장지에서 행 스포츠 토토더 많은 정보를 원하시면.

힙튜플
RefetchForeignRow(EState *부동산,
                   ExecRowMark *erm,
                   데이텀 로우이드,
                   bool *업데이트됨);

필요한 경우 잠긴 후 외부 테이블에서 하나의 튜플을 다시 가져오십시오.Estate쿼리의 전역 실행 상태입니다.erm이것은ExecRowMark대상 이물 테이블과 획득 할 행 잠금 유형 (있는 경우)을 설명하는 구조.Rowid가져올 튜플을 식별합니다.업데이트은 출력 매개변수입니다.

이 함수는 가져온 튜플의 palloc 복사본을 반환해야 합니다. 또는NULL행 잠금을 얻을 수없는 경우. 획득 할 행 잠금 유형은에 의해 정의됩니다.erm-markType, 이전에 반환 한 값GetForeignRowMarkType. (ROW_MARK_REFERENCE잠금 장치를 얻지 않고 튜플을 다시 가져 오는 것을 의미합니다.ROW_MARK_COPY이 루틴에서는 절대 볼 수 없습니다.)

또한*업데이트됨로 설정해야합니다true가져온 것이 이전에 얻은 것과 동일한 버전이 아니라 업데이트된 버전의 튜플인 경우. (FDW가 이에 대해 확신할 수 없는 경우 항상 반환true권장됩니다.)

기본적으로 행 잠금 획득에 실패하면 오류가 발생한다는 점에 유의하세요. 에이NULL반환은 다음 경우에만 적합합니다.스킵 잠긴옵션은에 의해 지정됩니다erm- waitpolicy.

Rowid이것은CTID행을 다시 가져 오기 위해 이전에 읽은 값. 비록Rowid값은 다음과 같이 전달됩니다.데이텀, 현재는 a만 가능합니다.tid. 함수 API는 향후 행 ID에 대해 다른 토토 사이트 유형을 허용할 수 있기를 바라면서 선택되었습니다.

만약Refetchforeignrow포인터가 설정되었습니다NULL, 행을 다시 가져오려는 시도는 오류 메시지와 함께 실패합니다.

참조PostgreSQL : 문서 : 9.6 : 외국 데이터 포장지에서 행 스포츠 토토자세한 내용은

부울
RecheckForeignScan(ForeignScanState *노드, TupleTableSlot *슬롯);

이전에 회복 된 튜플이 여전히 관련 스캔과 일치하고 예선에 가입하고 튜플의 수정 된 버전을 제공 할 수 있음을 다시 확인하십시오. Join Pushdown을 수행하지 않는 외국 데이터 포장지의 경우 일반적으로이를 설정하는 것이 더 편리합니다.NULL대신 설정fdw_recheck_quals적절하게. 그러나 외부 조인이 푸시다운되면 필요한 속성이 모두 존재하더라도 모든 기본 테이블과 관련된 검사를 결과 튜플에 다시 적용하는 것만으로는 충분하지 않습니다. 왜냐하면 일부 한정자와 일치하지 않으면 튜플이 반환되지 않고 일부 속성이 NULL이 될 수 있기 때문입니다.Recheckforeignscan한정자를 다시 확인하고 여전히 만족하면 true를 반환하고 그렇지 않으면 false를 반환할 수 있지만 제공된 슬롯에 대체 튜플을 저장할 수도 있습니다.

조인 푸시다운을 구현하기 위해 외부 토토 사이트 래퍼는 일반적으로 재확인에만 사용되는 대체 로컬 조인 계획을 구성합니다. 이는의 외부 하위 계획이 됩니다.ForeignScan. 재확인이 필요한 경우,이 하위 플랜을 실행할 수 있고 결과 튜플은 슬롯에 저장 될 수 있습니다. 기본 테이블이 둘 이상의 행을 반환하지 않기 때문에이 계획은 효율적 일 필요는 없습니다. 예를 들어, 모든 결합을 중첩 루프로 구현할 수 있습니다. 함수GetExistingLocalJoinPath대체 로컬 조인 계획으로 사용될 수있는 기존 경로를 검색하는 데 사용될 수 있습니다..GetExistingLocalJoinPath지정된 조인 관계의 경로 목록에서 모색되지 않은 경로를 검색합니다. (이러한 경로를 찾지 못하면 NULL을 반환합니다.이 경우 외국 데이터 래퍼가 로컬 경로를 자체적으로 구축하거나 해당 조인에 대한 액세스 경로를 만들지 않도록 선택할 수 있습니다.).

55.2.6. FDW 루틴:설명

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

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

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

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

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

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

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

추가 인쇄설명원격 서버에서 직접 수정에 대한 출력입니다. 이 함수는 호출할 수 있습니다.설명 프로페티 텍스트및 관련 함수에 필드를 추가하는 관련 함수설명출력. 깃발 필드es인쇄 할 내용과 상태를 결정하는 데 사용될 수 있습니다.ForeignScanState노드를 검사하여 런타임 통계를 제공 할 수 있습니다분석 설명케이스.

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

55.2.7. FDW 루틴:분석

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

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

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

53153_53222

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

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

55.2.8. FDW 루틴:토토 사이트 스키마 가져 오기

목록 *
ImportForeignSchema(ImportForeignSchemaStmt *stmt, Oid serverOid);

외국 테이블 생성 명령 목록을 얻습니다. 이 기능은 실행할 때 호출됩니다PostgreSQL : 문서 :, 그리고 해당 진술의 구문 분석 트리와 사용할 외국 서버의 OID가 전달됩니다. 그것은 c 문자열 목록을 반환해야하며, 각각은 A를 포함해야합니다.PostgreSQL : 문서 : 9.6 : 외국 메이저 토토 사이트 만들기명령. 이 문자열은 코어 서버에 의해 구문 분석되고 실행됩니다.

내부ImportForeignSchemaStmt구조체,remote_schema테이블을 가져올 원격 스키마의 이름입니다.목록_유형테이블 이름을 필터링하는 방법을 식별합니다 :fdw_import_schema_all원격 스키마의 모든 테이블을 가져와야 함을 의미합니다 (이 경우테이블_목록비어 있음),fdw_import_schema_limit_to에 나열된 테이블 만 포함한다는 의미테이블_목록FDW_IMPORT_SCHEMA_EXCEPT다음에 나열된 테이블을 제외한다는 의미테이블_목록. 옵션은 가져오기 프로세스에 사용되는 옵션 목록입니다. 옵션의 의미는 FDW에 따라 다릅니다. 예를 들어, FDW는 옵션을 사용하여 다음을 정의할 수 있습니다.NOT NULL열의 속성을 가져와야 합니다. 이러한 옵션은 FDW에서 데이터베이스 개체 옵션으로 지원하는 옵션과 관련이 있을 필요가 없습니다.

FDW는 무시할 수 있습니다local_schema필드importforeignschemastmt, 코어 서버가 해당 이름을 구문 분석에 자동으로 삽입하므로외국 테이블 만들기명령.

FDW는 다음에 의해 지정된 필터링 구현에 관심을 가질 필요가 없습니다.목록_유형그리고table_list중 하나입니다. 코어 서버는 해당 옵션에 따라 제외된 테이블에 대해 반환된 명령을 자동으로 건너뛰기 때문입니다. 그러나 처음부터 제외된 테이블에 대한 명령을 생성하는 작업을 피하는 것이 유용한 경우가 많습니다. 함수IsImportableForeignTable()주어진 외부 테이블 이름이 필터를 통과하는지 테스트하는 데 유용할 수 있습니다.

FDW가 테이블 정의 가져오기를 지원하지 않는 경우,토토 사이트 스키마 가져오기포인터를 설정할 수 있습니다NULL.

55.2.9. 병렬 실행을위한 FDW 루틴

A ForeignScan노드는 선택적으로 병렬 실행을 지원할 수 있습니다. 평행ForeignScan여러 프로세스에서 실행되며 모든 협력 프로세스에서 각 행을 한 번만 반환해야합니다. 이를 위해 프로세스는 동적 공유 메모리의 고정 크기 덩어리를 통해 조정할 수 있습니다. 이 공유 메모리는 모든 프로세스에서 동일한 주소로 매핑되는 것을 보장하지 않으므로 포인터를 사용할 수 없습니다. 다음 콜백은 일반적으로 선택 사항이지만 병렬 실행을 지원하는 경우 필요합니다.

부울
IsForeignScanParallelSafe(PlannerInfo *root, RelOptInfo *rel,
                          RangeTblEntry *rte);

병렬 작업자 내에서 스캔을 수행 할 수 있는지 테스트합니다. 이 기능은 플래너가 병렬 계획이 가능할 수 있다고 생각할 때만 호출되며 해당 스캔이 병렬 작업자 내에서 실행되기에 안전한 경우 TRUE를 반환해야합니다. 근로자의 데이터와의 연결이 어떻게 든 리더와 동일한 트랜잭션 컨텍스트를 공유하도록 이루어질 수 없다면 원격 데이터 소스에 트랜잭션 의미론이있는 경우 일반적으로 그렇지 않습니다.

이 콜백이 정의되지 않은 경우 스캔은 병렬 리더 내에서 이루어져야 한다고 가정됩니다. true를 반환한다고 해서 스캔 자체가 병렬로 수행될 수 있다는 의미는 아니며, 병렬 작업자 내에서 스캔이 수행될 수 있다는 의미일 뿐입니다. 따라서 병렬 실행이 지원되지 않는 경우에도 이 메서드를 정의하는 것이 유용할 수 있습니다.

크기
EstimateDSMForeignScan(ForeignScanState *node, ParallelContext *pcxt);

병렬 작업에 필요한 동적 공유 메모리의 양을 추정하십시오. 이것은 실제로 사용될 금액보다 높을 수 있지만 더 낮아서는 안됩니다. 반환 값은 바이트입니다.

무효
초기화 된 SMFOREIGNSCAN (OutiseScanstate *노드, ParallelContext *PCXT,
                         무효 *좌표);

병렬 작업에 필요한 동적 공유 메모리 초기화;좌표반환 값과 동일한 할당 공간의 양을 가리킴EstimateDSMForeignScan.

무효
InitializeworkerForeignScan (OutiseScanstate *노드, SHM_TOC *TOC,
                            무효 *좌표);

|DSMForeignScan 초기화. 이 콜백은 선택사항이며 이 맞춤 경로가 병렬 실행을 지원하는 경우에만 제공되어야 합니다.