2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5

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;

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 复制,因此存储在“自定义”字段中的所有数据都必须由该函数可以处理的节点组成。此外,自定义扫描提供程序不能用包含 CustomScan 的更大结构替换该结构本身,就像对 CustomPathCustomScanState 可能的那样。

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

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

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

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。