您的位置:首页 > 数据库

PostgreSQL在何处处理 sql查询之十五

2013-05-23 15:06 387 查看
如此:

接前面,看 add_base_rels_to_query函数:

/*
* add_base_rels_to_query
*
*      Scan the query's jointree and create baserel RelOptInfos for all
*      the base relations (ie, table, subquery, and function RTEs)
*      appearing in the jointree.
*
* The initial invocation must pass root->parse->jointree as the value of
* jtnode.    Internally, the function recurses through the jointree.
*
* At the end of this process, there should be one baserel RelOptInfo for
* every non-join RTE that is used in the query.  Therefore, this routine
* is the only place that should call build_simple_rel with reloptkind
* RELOPT_BASEREL.    (Note: build_simple_rel recurses internally to build
* "other rel" RelOptInfos for the members of any appendrels we find here.)
*/
void
add_base_rels_to_query(PlannerInfo *root, Node *jtnode)
{
if (jtnode == NULL)
return;
if (IsA(jtnode, RangeTblRef))
{
int            varno = ((RangeTblRef *) jtnode)->rtindex;

(void) build_simple_rel(root, varno, RELOPT_BASEREL);
}
else if (IsA(jtnode, FromExpr))
{
FromExpr   *f = (FromExpr *) jtnode;
ListCell   *l;

foreach(l, f->fromlist)
add_base_rels_to_query(root, lfirst(l));
}
else if (IsA(jtnode, JoinExpr))
{
JoinExpr   *j = (JoinExpr *) jtnode;

add_base_rels_to_query(root, j->larg);
add_base_rels_to_query(root, j->rarg);
}
else
elog(ERROR, "unrecognized node type: %d",
(int) nodeTag(jtnode));
}


如果表所对应的文件出现问题,会在 build_simple_rel处报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: