FDW 接口介绍
1. 获取一个外部表的关系尺寸估计。在对一个扫描外部表的查询进行规划的开头将调用该函数。
routine->GetForeignRelSize = postgresGetForeignRelSize;
2. 为一个外部表上的扫描创建可能的访问路径。这个函数在查询规划过程中被调用。
routine->GetForeignPaths = postgresGetForeignPaths;
3. 从选择的外部访问路径创建一个ForeignScan计划节点。这个函数在查询规划的末尾被调用。
routine->GetForeignPlan = postgresGetForeignPlan;
4. 开始执行一个外部扫描。这个函数在执行器启动阶段被调用。它应该执行任何在扫描能够开始之前需要完成的初始化工作,但是并不开始执行真正的扫描(会在第一次调用 IterateForeignScan时完成)。
routine->BeginForeignScan = postgresBeginForeignScan;
5. 从外部源获得一行,将它放在一个元组表槽中返回(节点的**ScanTupleSlot**
应当被用于此目的)。如果没有更多的行可用则返回 NULL。
routine->IterateForeignScan = postgresIterateForeignScan;
6. 从头开始重启一个扫描。注意扫描所依赖的任何参数可能已经改变了值,因此新扫描不一定会返回完全相同的行。
routine->ReScanForeignScan = postgresReScanForeignScan;
7. 结束扫描并释放资源。通常释放palloc过的内存,但是打开的文件和到远程服务器的连接等应该被清理。
routine->EndForeignScan = postgresEndForeignScan;
8. UPDATE和DELETE操作是在之前由表扫描函数取出的行上被执行的。FDW需要额外的信息(例如一个行ID或主键列的值)来保证它能够找到要更新或删除的准确行。要支持这些要求,这个函数可以项列列表中增加额外的隐藏或“junk”的目标列,它们在一个UPDATE或DELETE期间会被从外部表中获取。
routine->AddForeignUpdateTargets = postgresAddForeignUpdateTargets;
9. 执行外部表上插入、更新或删除所需的任何附加规划动作。这个函数生成FDW私有信息,该信息将被附加到执行该更新动作的**ModifyTable**
计划节点。
routine->PlanForeignModify = postgresPlanForeignModify;
10. 开始执行一个外部表修改操作。这个例程在执行器启动期间被调用。它应该执行任何先于实际表修改的初始化工作。
routine->BeginForeignModify = postgresBeginForeignModify;
11. 插入一个元组到外部表。
routine->ExecForeignInsert = postgresExecForeignInsert;
12. 插入多个元组到外部表
routine->ExecForeignBatchInsert = postgresExecForeignBatchInsert;
13. 决定一次批量插入最大元组数
routine->GetForeignModifyBatchSize = postgresGetForeignModifyBatchSize;
14. 更新外部表中的一个元组。
routine->ExecForeignUpdate = postgresExecForeignUpdate;
15. 从外部表删除一个元组。
routine->ExecForeignDelete = postgresExecForeignDelete;
16. 结束表更新并释放资源。通常释放palloc的内存,但是打开的文件和到远程服务器的连接等应当被清除。
routine->EndForeignModify = postgresEndForeignModify;
被INSERT或者COPY FROM插入到分区表中的元组会被路由到分区。如果一个FDW支持可路由的外部表分区,它还应该提供下面的回调函数。当在外部表上执行COPY FROM时,也会调用这些函数。
17. 开始在外部表上执行插入操作。当外部表被选中作为元组路由的分区以及**COPY FROM**
命令中指定的目标时,在第一个元组被插入到该外部表之前会调用这个例程。
routine->BeginForeignInsert = postgresBeginForeignInsert;
18. 结束表插入操作并释放资源。通常释放palloc的内存,但是打开的文件和到远程服务器的连接等应当被清除。
routine->EndForeignInsert = postgresEndForeignInsert;
19. 报告指定的外部表支持哪些更新操作。
routine->IsForeignRelUpdatable = postgresIsForeignRelUpdatable;
一些对于外部表的插入、更新和删除可以通过实现另一组接口来优化。普通的插入、更新和删除接口会从远程服务器取得行,然后一次修改其中一行。在某些情况下,这种逐行 的方式是必要的,但是可能效率不高。如果有可能让外部服务器判断哪些行可以直接修改而无需先检索它们并且没有本地触发器会影响该操作,那么可以让整个操作在远程服务 器上执行。
20. 决定在远程服务器上执行直接修改是否安全。
routine->PlanDirectModify = postgresPlanDirectModify;
21. 准备在远程服务器上执行一次直接修改。这个函数会在执行器启动时被调用。它应该执行直接修改所需的任何初始化工作(应该在第一次IterateDirectModify调用之前完 成)。
routine->BeginDirectModify = postgresBeginDirectModify;
22. 当INSERT、UPDATE或者DELETE查询没有RETURNING子句时,完成远程服务器上的直接修改后返回 NULL。当查询有该子句时,取出一个包含RETURNING计算所需数据的结果,用一个元组表槽返回它(节点的ScanTupleSlot应被用于这一目的)。
routine->IterateDirectModify = postgresIterateDirectModify;
23. 在远程服务器上的直接修改后进行清理。通常释放用 palloc 分配的内存,但是诸如打开的文件和到远程服务器的连接应该被清除。
routine->EndDirectModify = postgresEndDirectModify;
如果一个 FDW 希望支持后期行锁定, 它必须提供下列回调函数:
24. 报告要对一个外部表使用哪个行标记选项。
routine->GetForeignRowMarkType = NULL;
25. 从外部表中重新取得一个元组,如有必要先锁定它。
routine->RefetchForeignRow = NULL;
26. 重新检查之前返回的元组是否仍然匹配相关的扫描和连接条件,并且可能提供该元组的一个修改版本。
routine->RecheckForeignScan = postgresRecheckForeignScan;
/* Support functions for EXPLAIN */
27. 为一个外部表扫描打印额外的EXPLAIN输出。
routine->ExplainForeignScan = postgresExplainForeignScan;
28. 为一个外部表更新打印额外的EXPLAIN输出。
routine->ExplainForeignModify = postgresExplainForeignModify;
29. 为远程服务器上的直接修改打印额外的EXPLAIN输出。
routine->ExplainDirectModify = postgresExplainDirectModify;
30. truncate 一个或多个 外表
routine->ExecForeignTruncate = postgresExecForeignTruncate;
/* Support functions for ANALYZE */
31. 当ANALYZE被执行在一个外部表上时会调用这个函数。
routine->AnalyzeForeignTable = postgresAnalyzeForeignTable;
32. 应该从该表上收集最多targrows行的一个随机采样并将它存放到调用者提供的rows数组中。实际被收集的行的数量必须被返回。另外,将表中有效行和死亡行的总数存储到输出参数totalrows和totaldeadrows中(如果FDW没有死亡行的概念,将totaldeadrows设置为 0 )。
AcquireSampleRowsFunc =postgresAcquireSampleRowsFunc
/* Support functions for IMPORT FOREIGN SCHEMA */
33. 取得一个外部表创建命令的列表。
routine->ImportForeignSchema = postgresImportForeignSchema;
/* Support functions for join push-down */
34. 它为两个(或更多)同属于一台外部服务器的外部表的连接创建可能的访问路径。这个可选的函数会在查询规划过程中被调用。
routine->GetForeignJoinPaths = postgresGetForeignJoinPaths;
/* Support functions for upper relation push-down */
35. 为上层关系处理创建可能的访问路径,这是规划器针对所有扫描/连接后查询处理的术语,例如聚集、窗口函数、排序和表更新。在查询规划期间会调用这个可选的函数。
routine->GetForeignUpperPaths = postgresGetForeignUpperPaths;
/* Support functions for parallelism under Gather node */
ForeignScan节点可以选择支持并行执行。一个并行的ForeignScan将在多个进程中被执行并且在相互合作的进程中每一个元组必须只被返回一次
36. 测试一个扫描是否可以在一个并行工作者中被执行。
IsForeignScanParallelSafe_function IsForeignScanParallelSafe;
37. 估算并行操作所需的动态共享内存的数量。
EstimateDSMForeignScan_function EstimateDSMForeignScan;
38. 初始化并行操作所需的动态共享内存。
InitializeDSMForeignScan_function InitializeDSMForeignScan;
39. 当外部扫描计划将要被重新扫描时,重新初始化并行操作所要求的动态共享内存。
ReInitializeDSMForeignScan_function ReInitializeDSMForeignScan;
40. 基于领导者在InitializeDSMForeignScan期间建立的共享状态初始化并行工作者的本地状态。
InitializeWorkerForeignScan_function InitializeWorkerForeignScan;
41. 在预见到节点将不会被执行完时释放资源。
ShutdownForeignScan_function ShutdownForeignScan;
/* Support functions for path reparameterization. */
该函数被用于重新参数化任意路径或者转化一个ForeignPath的给定fdw_private成员中保存的任意表达式节点
42. 在把一个由给定子关系child_rel的最顶层父关系参数化的路径转换成由该子关系参数化的路径时会调用这个函数。
ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild;
异步执行支持
43. 检测输入的外表查询路径是否支持异步执行
routine->IsForeignPathAsyncCapable = postgresIsForeignPathAsyncCapable;
44. 从一个外部表中异步请求下一个元组
routine->ForeignAsyncRequest = postgresForeignAsyncRequest;
45. 给我们要等待的配置一个文件描述符事件
routine->ForeignAsyncConfigureWait = postgresForeignAsyncConfigureWait;
46. 从一个准备好的文件描述符中 请求更多的元组
routine->ForeignAsyncNotify = postgresForeignAsyncNotify;




