当执行 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
中存储的常用数据,如目标列表和扫描关系,即使没有此回调也会显示,但该回调允许显示额外的私有状态。
如果您在文档中看到任何不正确、与您在使用特定功能时的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。