前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
## 59.2.创建自定义扫描计划 [59.2.1. 自定义扫描计划回调](custom-scan-plan.html#CUSTOM-SCAN-PLAN-CALLBACKS) 自定义扫描使用以下结构在完成的计划树中表示: ``` 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`回调将被调用,以使自定义扫描提供程序有机会执行任何其他需要的操作。