allpath.c文件分析

allpath.c文件位于backend/optimizer/path文件夹下。

该文件包含的函数如下所示:

static void set_base_rel_pathlists(PlannerInfo *root);
这个函数的作用是找出基本关系中每个实体可能的扫描路径,它会考虑顺序查找和基于索引的查找,然后把每个可用的查询路径插入pathlist。这个函数内部会调用set_rel_pathlist。
static void set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
这个函数的作用是为每个基本关系构造执行路径。set_base_rel_pathlists会调用这个函数。另外这个函数会根据rte的不同调用不同的函数。
static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_RELATION的情况,这个函数会被set_rel_pathlist调用。
static void set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
处理rte->inh=true的情况,这个函数会被set_rel_pathlist调用。
static void set_dummy_rel_pathlist(RelOptInfo *rel);
这个函数会被set_plain_rel_pathlist调用,它的作用是为一个关系生成虚拟的执行路径,并找到一个最优的路径。
static void set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
处理rel->rtekind=RTE_SUBQUERY的情况,这个函数会被set_rel_pathlist调用。
static void set_function_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_FUNCTION的情况,这个函数会被set_rel_pathlist调用。
static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_VALUES的情况,这个函数会被set_rel_pathlist调用。
static void set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_CTE同时rte->self_reference=false的情况,这个函数会被set_rel_pathlist调用。
static void set_worktable_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte);
处理rel->rtekind=RTE_CTE同时rte->self_reference=true的情况,这个函数会被set_rel_pathlist调用。
static RelOptInfo *make_rel_from_joinlist(PlannerInfo *root, List *joinlist);
这个函数的作用是利用joinlist生成操作路径以指导连接查询。该函数会被make_one_rel函数调用。
static bool subquery_is_pushdown_safe(Query *subquery, Query *topquery,bool *differentTypes);
这个函数对查询语句中涉及的子查询语句进行检查,以确定子查询的类型。该函数会被set_subquery_pathlist,recurse_pushdown_safe这两个函数调用。
static bool recurse_pushdown_safe(Node *setOp, Query *topquery,bool *differentTypes);
处理有递归的情况。
static void compare_tlist_datatypes(List *tlist, List *colTypes,bool *differentTypes);
对比tlist和colTypes中的数据,如果有不同就作标记。
static bool qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,bool *differentTypes);
static void subquery_push_qual(Query *subquery,RangeTblEntry *rte, Index rti, Node *qual);
将一个安全的自查询进栈。
static void recurse_push_qual(Node *setOp, Query *topquery,RangeTblEntry *rte, Index rti, Node *qual);
处理有递归的情况。
RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist)//对于一个PlannerInfo找出所有的执行路径。

在这个文件中最主要的函数应该是make_one_rel(PlannerInfo *root, List *joinlist),用于构建一条语句所有的执行路径。
posted @ 2010-01-20 20:45  电信415实验室  阅读(577)  评论(0编辑  收藏  举报