# 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;

扫描必须像任何其他扫描一样初始化,包括估计成本、目标列表、资格等。旗帜是一个与中的含义相同的位掩码自定义路径.定制计划可以用来存放孩子计划节点。定制快递应用于存储需要由setrefs。C再选择。C虽然私人定制应用于存储仅由自定义扫描提供程序本身使用的其他专用数据。自定义扫描列表扫描基关系时可以为零,表示自定义扫描返回与基关系的行类型匹配的扫描元组。否则,它是一个描述实际扫描元组的目标列表。自定义扫描列表必须为联接提供,如果自定义扫描提供程序可以计算一些非Var表达式,则可以为扫描提供。定制救济品由核心代码设置为该扫描节点处理的一组关系(范围表索引);除非此扫描正在替换联接,否则它将只有一个成员。方法必须指向(通常是静态分配的)实现所需自定义扫描方法的对象,下面将进一步详细介绍。

客户扫描扫描单一关系,扫描斯坎雷利德必须是要扫描的表的范围表索引。当它替换连接时,扫描斯坎雷利德应该是零。

平面树必须能够使用copyObject,因此存储在“自定义”字段中的所有数据必须由该函数可以处理的节点组成。此外,自定义扫描提供程序不能替代嵌入客户扫描对于建筑本身,就像一个自定义路径自定义扫描状态.

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

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

分配自定义扫描状态为了这个客户扫描.实际分配的金额通常会高于普通项目所需的金额自定义扫描状态,因为许多提供商希望将其作为更大结构的第一个字段嵌入。返回的值必须具有节点标记和方法适当设置,但其他字段在此阶段应保留为零;之后ExeinitCustomScan执行基本初始化时Begingstomscan回调将被调用,以使自定义扫描提供程序有机会执行任何其他需要的操作。