淘宝数据库OceanBaseSQL编译器部分源码阅读--生成物理查询计划(三)
2015-02-03 09:53:38
·
作者:
·
浏览: 72
p = filter_op;
}
// 4. generate physical plan for group by/aggregate
if (select_stmt->get_group_expr_size() > 0)
result_op = gen_phy_group_by(logical_plan, select_stmt, physical_plan, result_op);
else if (select_stmt->get_agg_fun_size() > 0)
result_op = gen_phy_scalar_aggregate(logical_plan, select_stmt, physical_plan, result_op);
// 5. generate physical plan for having
if (select_stmt->get_having_expr_size() > 0)
{
ObFilter *having_op = NULL;
CREATE_PHY_OPERRATOR(having_op, ObFilter, physical_plan);
ObSqlRawExpr *having_expr;
int32_t num = select_stmt->get_having_expr_size();
for (int32_t i = 0; i < num; i++)
{
having_expr = logical_plan->get_expr(select_stmt->get_having_expr_id(i));
ObSqlExpression having_filter;
having_expr->fill_sql_expression(having_filter, this, logical_plan, physical_plan);
having_op->add_filter(having_filter);
}
having_op->set_child(0, *result_op);
result_op = having_op;
}
// 6. generate physical plan for distinct
if (select_stmt->is_distinct())
result_op = gen_phy_distinct(logical_plan, select_stmt, physical_plan, result_op);
// 7. generate physical plan for order by
if (select_stmt->get_order_item_size() > 0)
result_op = gen_phy_order_by(logical_plan, select_stmt, physical_plan, result_op);
// 8. generate physical plan for limit
if (select_stmt->get_limit() != -1 || select_stmt->get_offset() != 0)
{
ObLimit *limit_op = NULL;
CREATE_PHY_OPERRATOR(limit_op, ObLimit, physical_plan);
limit_op->set_limit(select_stmt->get_limit(), select_stmt->
get_offset());
limit_op->set_child(0, *result_op);
result_op = limit_op;
}
// 8. generate physical plan for select clause
if (select_stmt->get_select_item_size() > 0)
{
ObProject *project_op = NULL;
CREATE_PHY_OPERRATOR(project_op, ObProject, physical_plan);
project_op->set_child(0, *result_op);
ObSqlRawExpr *select_expr;
int32_t num = select_stmt->get_select_item_size();
for (int32_t i = 0; i < num; i++)
{
const SelectItem& select_item = select_stmt->get_select_item(i);
select_expr = logical_plan->get_expr(select_item.expr_id_);
if (select_item.is_real_alias_)
{
ObBinaryRefRawExpr col_raw(OB_INVALID_ID, select_expr->get_column_id(), T_REF_COLUMN);
ObSqlRawExpr col_sql_raw(*select_expr);
col_sql_raw.set_expr(&col_raw);
ObSqlExpression col_expr;
col_sql_raw.fill_sql_expression(col_expr);
project_op ->add_output_column(col_expr);
}
else
{
ObSqlExpression col_expr;
select_expr->fill_sql_expression(col_expr, this, logical_plan, physical_plan);
project_op ->add_output_column(col_expr);
}
}
result_op = project_op;
}
physical_plan->add_phy_query(result_op, idx);
}
return idx;
}
四、 总结
物理查询计划的生成过程比逻辑计划和语法树解析部分更复杂。你需要了解相关的基础知识包括关系代数查询,流水线方式下的运算符构成,SQL语法的执行顺序等。
欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏。
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!