custom-scan-plan.md 2.5 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
## 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`回调将被调用,以使自定义扫描提供程序有机会执行任何其他需要的操作。