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

59.2. 创建自定义扫描计划 #

59.2.1. 自定义扫描计划回调

自定义扫描在已完成的计划树中使用以下结构表示

typedef struct CustomScan
{
    Scan      scan;
    uint32    flags;
    List     *custom_plans;
    List     *custom_exprs;
    List     *custom_private;
    List     *custom_scan_tlist;
    Bitmapset *custom_relids;
    const CustomScanMethods *methods;
} CustomScan;

scan 必须初始化为其他任何扫描,包括估计成本、目标列表、限定条件等。 flags 是一个位掩码,与 CustomPath 中的含义相同。 可以使用 custom_plans 存储子 Plan 节点。 应该使用 custom_exprs 存储表达式树,这些表达式树将被 setrefs.csubselect.c 修复,而应该使用 custom_private 存储由自定义扫描提供程序本身使用的其他私有数据。 当扫描基关系时,custom_scan_tlist 可以为 NIL,表明自定义扫描返回与基关系行类型匹配的扫描元组。 否则,它是描述实际扫描元组的目标列表。 对于联接,必须提供 custom_scan_tlist,并且如果自定义扫描提供程序可以计算一些非 Var 表达式,则可以提供扫描。 custom_relids 由核心代码设置为此扫描节点处理的关系集(范围表索引);除了当此扫描替换联接时,它只有一个成员。 methods 必须指向实现所需自定义扫描方法的(通常是静态分配的)对象,这些方法在下面有更详细的说明。

CustomScan 扫描单个关系时,scan.scanrelid 必须是要扫描的表范围表索引。 当它替换联接时,scan.scanrelid 应为零。

计划树必须能够使用 copyObject 复制,因此存储在 custom 字段中的所有数据都必须包含该函数可以处理的节点。 此外,自定义扫描提供程序不能将嵌入 CustomScan 的较大结构替换为结构本身,因为 CustomPathCustomScanState 可以这样做。

59.2.1. 自定义扫描计划回调 #

Node *(*CreateCustomScanState) (CustomScan *cscan);

为这个 CustomScan 分配一个 CustomScanState。 实际分配通常会大于普通 CustomScanState 的要求,因为许多提供程序希望将其嵌入为更大结构的第一个字段。 返回的值必须设置节点标签和 methods,但在此时阶段应将其他字段保留为零;ExecInitCustomScan 执行基本初始化后,将调用 BeginCustomScan 回调,让自定义扫描提供程序有机会做其他需要的事情。