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

如此:

接前面,看 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处报错。

你可能感兴趣的:(PostgreSQL)