# 59.2.创建自定义扫描计划
自定义扫描使用以下结构在完成的计划树中表示:
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
回调将被调用,以使自定义扫描提供程序有机会执行任何其他需要的操作。