Redrock Postgres 搜索 英文
版本: 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

56.3. 执行自定义扫描

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

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

ss初始化为任何其他扫描状态, 但如果扫描是针对联接而不是基本关系,则ss.ss_currentRelation 将保留为NULL。flags是具有与CustomPathCustomScan中相同含义的位掩码。methods 必须指向实现所需的自定义扫描状态方法的(通常是静态分配的)对象, 这将在下面进一步详细描述。通常,不需要支持copyObjectCustomScanState将实际上是嵌入上面作为其第一成员的更大的结构。

56.3.1. 自定义扫描执行回调

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

完成提供的CustomScanState的初始化。 已经通过ExecInitCustomScan初始化了标准字段, 但是应该在这里初始化任何私有字段。

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

获取下一个扫描元组。如果剩余任何元组, 它应该在当前扫描方向上用下一个元组填充ps_ResultTupleSlot, 然后返回元组槽。如果没有,应返回NULL或空槽。

void (*EndCustomScan) (CustomScanState *node);

Clean up any private data associated with the CustomScanState. This method is required, but it does not need to do anything if there is no associated data or it will be cleaned up automatically. 清除与CustomScanState相关联的任何私有数据。 此方法是必需的,但如果没有相关数据或者它将自动清理,则不需要执行任何操作。

void (*ReScanCustomScan) (CustomScanState *node);

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

void (*MarkPosCustomScan) (CustomScanState *node);

保存当前扫描位置,以便随后可以通过RestrPosCustomScan回调恢复。 此回调是可选的,只需要在设置CUSTOMPATH_SUPPORT_MARK_RESTORE 标志时提供此回调。

void (*RestrPosCustomScan) (CustomScanState *node);

恢复由MarkPosCustomScan回调保存的上一个扫描位置。 此回调是可选的,只需要在设置CUSTOMPATH_SUPPORT_MARK_RESTORE 标志时提供此回调。

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

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