一个自定义扫描提供者将通过设置下面的钩子函数来为基本关系增加路径, 在核心代码已经为该关系产生了所有访问路径集后(除了在此调用之后生成的Gather路径,以便它们可以使用被钩子添加的部分路径),这个钩子函数将被调用。
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *rel,
Index rti,
RangeTblEntry *rte);
extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;
尽管这个钩子函数可被用来检查、修改或者移除核心系统产生的路径,自定义扫描提供程序通常还是局限于产生CustomPath
对象并且使用add_path
把它们加入到rel
中。自定义扫描提供者负责初始化CustomPath
对象,它被声明为这样:
typedef struct CustomPath { Path path; uint32 flags; List *custom_paths; List *custom_private; const CustomPathMethods *methods; } CustomPath;
path
必须像任何其他路径一样被初始化,包括行计数估计、启动和总代价以及这条路径提供的排序顺序。flags
是一个位掩码,如果该自定义路径能够支持反向扫描则它应该包括CUSTOMPATH_SUPPORT_BACKWARD_SCAN
,如果支持标记和恢复则应该包括CUSTOMPATH_SUPPORT_MARK_RESTORE
。这两种能力都是可选的。可选的
custom_paths
域是由这个自定义路径节点使用的Path
节点的列表,这些将被规划器转换成Plan
节点。custom_private
可被用来存储该自定义路径的私有数据。私有数据应该被存储为能被nodeToString
处理的形式,这样尝试打印该自定义路径的调试例程才能正常地工作。
methods
必须指向一个实现了所需自定义路径方法的对象(通常是静态分配的),当前只有一种方法。
一个自定义扫描提供者还能提供连接路径。就和基本关系一样,这样一条路径也应该产生和它将要替换的连接所产生的相同的输出。要做到这一点,连接提供程序应该设置下面的钩子函数,并且在该钩子函数里为连接关系创建CustomPath
路径。
typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *outerrel,
RelOptInfo *innerrel,
JoinType jointype,
JoinPathExtraData *extra);
extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;
对于同一个连接关系,这个钩子将被反复调用,因为要对不同的内外关系组合生成路径,所以如何最小化可能的重复工作是钩子函数的责任。
Plan *(*PlanCustomPath) (PlannerInfo *root,
RelOptInfo *rel,
CustomPath *best_path,
List *tlist,
List *clauses,
List *custom_plans);
将一条自定义路径转换为一个完成的计划。返回值通常将是一个CustomScan
对象,回调函数必须负责分配并且初始化这个对象。详见第 58.2 节。
inner/aroundinner/aroundVim 8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。 开始运动图▼/▶ Cursor ▽/▷ T...
gcfg组件采用了接口化设计,以实现高扩展性。通过接口化设计的方式,使用者可以自定义对接的配置获取方式,例如etcd,z...
使用方式gf-vgfversion用以查看当前gf命令行工具编译时的版本信息。使用示例$ gf versionGoFrame CLI Tool v2.0.0, ...
一、数据模型数据模型又叫做实体模型,主要是来自于底层持久化数据库的数据结构,例如:MySQL、Redis、MongoDB、K...
glog对日志分析工具非常友好,支持输出JSON格式的日志内容,以便于后期对日志内容进行解析分析。想要支持JSON数据格...
以下为Golang标准库的一些基础语法和基础函数,GoFrame框架对部分基础函数做了必要的改进。变量可以使用符号|在函数间传递...
模型创建ModelModel方法用于创建基于数据表的Model对象。常见的,也可以使用g对象管理模块中的Model方法在默认...
可观测性是很重要的,目前已经有比较不错的OpenTelemetry标准,各个第三方组件以及厂商都按照这套标准库来暴露和对接观测数...
方法操作方法操作用于原生SQL执行,相对链式操作更偏底层操作一些,在ORM链式操作执行不了太过于复杂的SQL操作时,...