选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

57.3. 执行自定义扫描 #

在执行 CustomScan 时,其执行状态由 CustomScanState 表示,其声明如下:

typedef struct CustomScanState
{
    ScanState ss;
    uint32    flags;
    const CustomExecMethods *methods;
} CustomScanState;

ss 的初始化方式与其他任何扫描状态相同,不过如果该扫描针对的是连接而不是基本关系,那么 ss.ss_currentRelation 会保留为 NULL。flags 是一个位掩码,其含义与 CustomPathCustomScan 中相同。methods 必须指向一个实现了所需自定义扫描状态方法的对象(通常是静态分配的),下文会进一步说明。通常,CustomScanState 实际上会是一个更大的结构体,并把上述结构体嵌为其第一个成员;它不需要支持 copyObject

57.3.1. 自定义扫描执行回调 #

void (*BeginCustomScan) (CustomScanState *node,
                         EState *estate,
                         int eflags);

完成所提供 CustomScanState 的初始化。标准字段已经由 ExecInitCustomScan 初始化,但任何私有字段都应在这里初始化。

TupleTableSlot *(*ExecCustomScan) (CustomScanState *node);

取出下一个扫描元组。如果仍有元组剩余,它应当使用当前扫描方向中的下一个元组填充 ps_ResultTupleSlot,然后返回该元组槽。否则,应返回 NULL 或一个空槽。

void (*EndCustomScan) (CustomScanState *node);

清理与 CustomScanState 关联的任何私有数据。这个方法是必需的,但如果没有相关数据,或者相关数据会被自动清理,则它不需要做任何事情。

void (*ReScanCustomScan) (CustomScanState *node);

将当前扫描倒回到开始处,并准备重新扫描该关系。

void (*MarkPosCustomScan) (CustomScanState *node);

保存当前扫描位置,以便之后可由 RestrPosCustomScan 回调恢复。这个回调是可选的,只需在设置了 CUSTOMPATH_SUPPORT_MARK_RESTORE 标志时提供。

void (*RestrPosCustomScan) (CustomScanState *node);

恢复由 MarkPosCustomScan 回调保存的先前扫描位置。这个回调是可选的,只需在设置了 CUSTOMPATH_SUPPORT_MARK_RESTORE 标志时提供。

Size (*EstimateDSMCustomScan) (CustomScanState *node,
                               ParallelContext *pcxt);

估算并行操作所需的动态共享内存数量。这可能会高于实际使用量,但绝不能低于实际使用量。返回值的单位是字节。这个回调是可选的,只需在该自定义扫描提供者支持并行执行时提供。

void (*InitializeDSMCustomScan) (CustomScanState *node,
                                 ParallelContext *pcxt,
                                 void *coordinate);

初始化并行操作所需的动态共享内存;coordinate 指向一块已分配的空间,其大小等于 EstimateDSMCustomScan 的返回值。这个回调是可选的,只需在该自定义扫描提供者支持并行执行时提供。

void (*InitializeWorkerCustomScan) (CustomScanState *node,
                                    shm_toc *toc,
                                    void *coordinate);

基于领导者通过 InitializeDSMCustomScan 建立的共享状态,初始化并行工作者的自定义状态。这个回调是可选的,只需在该自定义扫描提供者支持并行执行时提供。

void (*ExplainCustomScan) (CustomScanState *node,
                           List *ancestors,
                           ExplainState *es);

为自定义扫描计划节点的 EXPLAIN 输出附加信息。这个回调是可选的。即使没有这个回调,存储在 ScanState 中的公共数据,例如目标列表和扫描关系,也会被显示;但该回调允许显示额外的私有状态。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。