淘宝数据库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语法的执行顺序等。


欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏。
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!