在执行 CustomScan 时,其执行状态由 CustomScanState 表示,其声明如下:
typedef struct CustomScanState
{
ScanState ss;
uint32 flags;
const CustomExecMethods *methods;
} CustomScanState;
ss 的初始化方式与其他任何扫描状态相同,不过如果该扫描针对的是连接而不是基本关系,那么 ss.ss_currentRelation 会保留为 NULL。flags 是一个位掩码,其含义与 CustomPath 和 CustomScan 中相同。methods 必须指向一个实现了所需自定义扫描状态方法的对象(通常是静态分配的),下文会进一步说明。通常,CustomScanState 实际上会是一个更大的结构,并把上述结构嵌为其第一个成员;它不需要支持 copyObject。
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 (*ReInitializeDSMCustomScan) (CustomScanState *node,
ParallelContext *pcxt,
void *coordinate);
当自定义扫描计划节点即将被重新扫描时,重新初始化并行操作所需的动态共享内存。这个回调是可选的,只需在该自定义扫描提供者支持并行执行时提供。推荐的做法是,此回调只重置共享状态,而 ReScanCustomScan 回调只重置本地状态。目前,这个回调会在 ReScanCustomScan 之前调用,但最好不要依赖这种顺序。
void (*InitializeWorkerCustomScan) (CustomScanState *node,
shm_toc *toc,
void *coordinate);
基于领导者在 InitializeDSMCustomScan 期间建立的共享状态,初始化并行工作者的本地状态。这个回调是可选的,只需在该自定义扫描提供者支持并行执行时提供。
void (*ShutdownCustomScan) (CustomScanState *node);
在预期该节点不会执行到完成时释放资源。这个回调不会在所有情况下都被调用;有时,可能会在没有先调用它的情况下直接调用 EndCustomScan。由于并行查询使用的 DSM 段会在调用该回调后立即销毁,因此希望在 DSM 段消失前执行某些动作的自定义扫描提供者应实现此方法。
void (*ExplainCustomScan) (CustomScanState *node,
List *ancestors,
ExplainState *es);
为自定义扫描计划节点的 EXPLAIN 输出附加信息。这个回调是可选的。即使没有这个回调,存储在 ScanState 中的公共数据,例如目标列表和扫描关系,也会被显示;但该回调允许显示额外的私有状态。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。