Fix shared exprs bugs when create inline view
This commit is contained in:
parent
50a6b3cda3
commit
0664c26d30
@ -787,21 +787,6 @@ int ObDMLStmt::replace_relation_exprs(const common::ObIArray<ObRawExpr *> &other
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDMLStmt::replace_inner_stmt_expr(const common::ObIArray<ObRawExpr *> &other_exprs,
|
||||
const common::ObIArray<ObRawExpr *> &new_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObStmtExprReplacer visitor;
|
||||
visitor.remove_scope(SCOPE_BASIC_TABLE);
|
||||
visitor.set_recursive(true);
|
||||
if (OB_FAIL(visitor.add_replace_exprs(other_exprs, new_exprs))) {
|
||||
LOG_WARN("failed to add replace exprs", K(ret));
|
||||
} else if (OB_FAIL(iterate_stmt_expr(visitor))) {
|
||||
LOG_WARN("failed to iterate stmt expr", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDMLStmt::copy_and_replace_stmt_expr(ObRawExprCopier &copier)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -3045,6 +3030,27 @@ int ObDMLStmt::get_from_tables(ObSqlBitSet<> &table_set) const
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDMLStmt::get_from_tables(common::ObIArray<TableItem *>& from_tables) const
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < from_items_.count(); ++i) {
|
||||
TableItem *table_item = NULL;
|
||||
const FromItem &from_item = from_items_.at(i);
|
||||
if (from_item.is_joined_ &&
|
||||
OB_ISNULL(table_item = get_joined_table(from_item.table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else if (!from_item.is_joined_ &&
|
||||
OB_ISNULL(table_item = get_table_item_by_id(from_item.table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else if (OB_FAIL(from_tables.push_back(table_item))) {
|
||||
LOG_WARN("failed to push back", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ColumnItem *ObDMLStmt::get_column_item(uint64_t table_id, const ObString &col_name)
|
||||
{
|
||||
ColumnItem *item = NULL;
|
||||
|
@ -667,24 +667,6 @@ public:
|
||||
int replace_relation_exprs(const common::ObIArray<ObRawExpr *> &other_exprs,
|
||||
const common::ObIArray<ObRawExpr *> &new_exprs);
|
||||
|
||||
/**
|
||||
* @brief replace_inner_stmt_expr
|
||||
* 对本层出现的 expr 进行替换。
|
||||
* stmt 中有一些 expr 可能出现在多处。对 stmt 进行深拷贝后,要调整新stmt中对应expr的指向。
|
||||
* other_exprs 与 new_exprs 一一映射。函数会将 a \in other_exprs 替换为对应的 b \in new_exprs
|
||||
* 构造 other_exprs 与 new_exprs 构成的映射关系需要包含以下几类表达式
|
||||
* 1. ObColumnRefRawExpr: 列表达式
|
||||
* 2. ObAggFunRawExpr: 聚合函数表达式
|
||||
* 3. ObQueryRefRawExpr: 子查询引用表达式
|
||||
* 4. ObWinFunRawExpr: 窗口函数表达式
|
||||
* 其中 2-4 仅出现在 ObSelectStmt 中。
|
||||
* @param other_exprs
|
||||
* @param new_exprs
|
||||
* @return
|
||||
*/
|
||||
int replace_inner_stmt_expr(const common::ObIArray<ObRawExpr*> &other_exprs,
|
||||
const common::ObIArray<ObRawExpr*> &new_exprs);
|
||||
|
||||
int copy_and_replace_stmt_expr(ObRawExprCopier &copier);
|
||||
|
||||
virtual int iterate_stmt_expr(ObStmtExprVisitor &vistor);
|
||||
@ -899,6 +881,7 @@ public:
|
||||
int get_table_rel_ids(const ObIArray<TableItem*> &tables, ObSqlBitSet<> &table_set) const;
|
||||
int get_from_tables(ObRelIds &table_set) const;
|
||||
int get_from_tables(ObSqlBitSet<> &table_set) const;
|
||||
int get_from_tables(common::ObIArray<TableItem*>& from_tables) const;
|
||||
|
||||
int add_table_item(const ObSQLSessionInfo *session_info, TableItem *table_item);
|
||||
int add_table_item(const ObSQLSessionInfo *session_info, TableItem *table_item, bool &have_same_table_name);
|
||||
|
@ -220,8 +220,6 @@ int ObTransformAggrSubquery::transform_with_aggregation_first(ObDMLStmt *&stmt,
|
||||
int ObTransformAggrSubquery::transform_with_aggr_first_for_having(ObDMLStmt *&stmt, bool &trans_happened)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr *, 4> exprs;
|
||||
ObSelectStmt *sel_stmt = NULL;
|
||||
ObSelectStmt *view_stmt = NULL;
|
||||
bool need_spj = false;
|
||||
if (OB_ISNULL(stmt)) {
|
||||
@ -233,9 +231,7 @@ int ObTransformAggrSubquery::transform_with_aggr_first_for_having(ObDMLStmt *&st
|
||||
LOG_WARN("check need spj failed", K(ret));
|
||||
} else if (!need_spj) {
|
||||
//do nothing
|
||||
} else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, stmt, view_stmt)) ||
|
||||
OB_FAIL(ObTransformUtils::push_down_groupby(ctx_, static_cast<ObSelectStmt *>(stmt),
|
||||
stmt->get_table_size() == 1 ? stmt->get_table_item(0) : NULL))) {
|
||||
} else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, stmt, view_stmt, true, true, true))) {
|
||||
LOG_WARN("create simple view failed", K(ret));
|
||||
} else if (OB_FAIL(transform_with_aggregation_first(stmt, trans_happened))) {
|
||||
LOG_WARN("transform with aggr first failed", K(ret));
|
||||
@ -1192,7 +1188,7 @@ int ObTransformAggrSubquery::transform_with_join_first(ObDMLStmt *&stmt,
|
||||
} else if (OB_UNLIKELY(!ObOptimizerUtil::find_item(view_stmt->get_subquery_exprs(),
|
||||
param.ja_query_ref_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("the subquery is not found in view stmt", K(ret));
|
||||
LOG_WARN("the subquery is not found in view stmt", K(ret), KPC(view_stmt), KPC(param.ja_query_ref_));
|
||||
} else if (OB_FAIL(do_join_first_transform(*view_stmt, param, root_expr, !join_first_happened_))) {
|
||||
LOG_WARN("failed to do join first transform", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::add_param_not_null_constraint(*ctx_, param.not_null_const_))) {
|
||||
@ -1373,42 +1369,20 @@ int ObTransformAggrSubquery::get_trans_view(ObDMLStmt &stmt,
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
TableItem *table = NULL;
|
||||
ObAliasRefRawExpr *alias = NULL;
|
||||
bool push_group_by = stmt.is_select_stmt() && post_group_by && has_groupby;
|
||||
bool push_vector_assign = stmt.is_update_stmt() && root_expr->has_flag(CNT_ALIAS);
|
||||
if (!has_rownum && !has_groupby && stmt.is_select_stmt()) {
|
||||
view_stmt = static_cast<ObSelectStmt *>(&stmt);
|
||||
} else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, &stmt, view_stmt))) {
|
||||
} else if (push_vector_assign &&
|
||||
OB_FAIL(ObRawExprUtils::find_alias_expr(root_expr, alias))) {
|
||||
LOG_WARN("failed to find alias expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, &stmt, view_stmt,
|
||||
true, true, push_group_by,
|
||||
alias))) {
|
||||
LOG_WARN("failed to create simple view", K(ret));
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_table_size(); ++i) {
|
||||
if (OB_ISNULL(stmt.get_table_item(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
} else if (stmt.get_table_item(i)->ref_query_ == view_stmt) {
|
||||
table = stmt.get_table_item(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret) && stmt.is_select_stmt()) {
|
||||
if (has_groupby && post_group_by) {
|
||||
if (OB_FAIL(ObTransformUtils::push_down_groupby(ctx_,
|
||||
static_cast<ObSelectStmt *>(&stmt),
|
||||
table))) {
|
||||
LOG_WARN("failed to push down group by", K(ret));
|
||||
} else {
|
||||
view_stmt = static_cast<ObSelectStmt *>(&stmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret) && stmt.is_update_stmt()) {
|
||||
if (root_expr->has_flag(CNT_ALIAS)) {
|
||||
ObAliasRefRawExpr *alias = NULL;
|
||||
if (OB_FAIL(ObRawExprUtils::find_alias_expr(root_expr, alias))) {
|
||||
LOG_WARN("failed to find alias expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::push_down_vector_assign(
|
||||
ctx_, static_cast<ObUpdateStmt *>(&stmt), alias, table))) {
|
||||
LOG_WARN("failed to push down vector query", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (push_group_by) {
|
||||
view_stmt = static_cast<ObSelectStmt *>(&stmt);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -1751,7 +1725,7 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt,
|
||||
LOG_WARN("failed to get select exprs", K(ret));
|
||||
} else if (OB_FAIL(modify_vector_comparison_expr_if_necessary(select_stmt, expr_factory, select_exprs, parent_expr_of_query_ref))) {
|
||||
LOG_WARN("failed to modify vector comparison expr", K(ret));
|
||||
} else if (OB_FAIL(select_stmt.replace_inner_stmt_expr(trans_param.query_refs_,
|
||||
} else if (OB_FAIL(select_stmt.replace_relation_exprs(trans_param.query_refs_,
|
||||
select_exprs))) {
|
||||
LOG_WARN("failed to update query ref value expr", K(ret));
|
||||
}
|
||||
@ -1822,6 +1796,9 @@ int ObTransformAggrSubquery::modify_vector_comparison_expr_if_necessary(
|
||||
LOG_WARN("unexpected root_expr type", K(ret), K(value_cmp_type));
|
||||
} else {
|
||||
ObOpRawExpr *new_parent_expr = NULL;
|
||||
ObSEArray<ObRawExpr*, 1> old_exprs;
|
||||
ObSEArray<ObRawExpr*, 1> new_exprs;
|
||||
|
||||
if (OB_FAIL(expr_factory->create_raw_expr(value_cmp_type, new_parent_expr))) {
|
||||
LOG_WARN("failed to build expr", K(ret), K(new_parent_expr));
|
||||
} else {
|
||||
@ -1830,12 +1807,12 @@ int ObTransformAggrSubquery::modify_vector_comparison_expr_if_necessary(
|
||||
LOG_WARN("failed to add param expr", K(ret));
|
||||
}
|
||||
}
|
||||
ObSEArray<ObRawExpr*, 1> old_exprs;
|
||||
ObSEArray<ObRawExpr*, 1> new_exprs;
|
||||
if (OB_FAIL(old_exprs.push_back(parent_expr_of_query_ref)) || OB_FAIL(new_exprs.push_back(new_parent_expr))) {
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(old_exprs.push_back(parent_expr_of_query_ref)) ||
|
||||
OB_FAIL(new_exprs.push_back(new_parent_expr))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("failed to push back expr", K(ret));
|
||||
} else if (OB_FAIL(select_stmt.replace_inner_stmt_expr(old_exprs, new_exprs))) {
|
||||
} else if (OB_FAIL(select_stmt.replace_relation_exprs(old_exprs, new_exprs))) {
|
||||
LOG_WARN("failed to replace expr in stmt", K(ret));
|
||||
}
|
||||
}
|
||||
|
@ -1152,9 +1152,6 @@ int ObTransformDBlink::inner_pack_link_table(ObDMLStmt *stmt, LinkTableHelper &h
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
TableItem *view_table = NULL;
|
||||
ObSelectStmt *ref_query = NULL;
|
||||
ObSEArray<SemiInfo*, 2> dummy_semi_infos;
|
||||
ObSEArray<TableItem *, 8> reverse_tables;
|
||||
if (OB_ISNULL(stmt)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null stmt", K(ret));
|
||||
@ -1164,50 +1161,24 @@ int ObTransformDBlink::inner_pack_link_table(ObDMLStmt *stmt, LinkTableHelper &h
|
||||
helper.is_reverse_link_ ? 0
|
||||
: helper.dblink_id_))) {
|
||||
LOG_WARN("failed to reverse link table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::construct_simple_view(stmt,
|
||||
helper.table_items_,
|
||||
helper.semi_infos_,
|
||||
ctx_,
|
||||
ref_query))) {
|
||||
LOG_WARN("failed to construct simple view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_,
|
||||
} else if (ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), helper.conditions_)) {
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
helper.table_items_,
|
||||
&helper.semi_infos_))) {
|
||||
LOG_WARN("failed to create empty view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
ref_query,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to add new table item", K(ret));
|
||||
} else if (OB_FAIL(stmt->rebuild_tables_hash())) {
|
||||
LOG_WARN("failed to rebuild table hash", K(ret));
|
||||
} else if (NULL == helper.parent_table_ &&
|
||||
NULL == helper.parent_semi_info_ &&
|
||||
OB_FAIL(stmt->add_from_item(view_table->table_id_, false))) {
|
||||
LOG_WARN("failed to add from item", K(ret));
|
||||
} else if (OB_FAIL(append(ref_query->get_condition_exprs(), helper.conditions_))) {
|
||||
LOG_WARN("failed to push back conditions", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(),
|
||||
helper.conditions_))) {
|
||||
LOG_WARN("failed to remove extracted conditions from stmt", K(ret));
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < helper.table_items_.count(); ++i) {
|
||||
TableItem *table = helper.table_items_.at(i);
|
||||
if (OB_ISNULL(table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is null", K(ret), K(table));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_table_in_semi_infos(
|
||||
stmt, view_table, table))) {
|
||||
LOG_WARN("failed to replace table in semi infos", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_table_in_joined_tables(
|
||||
stmt, view_table, table))) {
|
||||
LOG_WARN("failed to replace table in joined tables", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
view_table,
|
||||
helper.table_items_,
|
||||
&helper.conditions_,
|
||||
&helper.semi_infos_))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table) || OB_ISNULL(view_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, view_table))) {
|
||||
LOG_WARN("failed to generate select list", K(ret), K(view_table));
|
||||
} else if (OB_FAIL(formalize_link_table(view_table->ref_query_))) {
|
||||
LOG_WARN("failed to formalize link table", K(ret));
|
||||
} else {
|
||||
@ -1226,8 +1197,6 @@ int ObTransformDBlink::formalize_link_table(ObDMLStmt *stmt)
|
||||
LOG_WARN("failed to formalize select item", K(ret));
|
||||
} else if (OB_FAIL(formalize_column_item(stmt))) {
|
||||
LOG_WARN("failed to formalize column item", K(ret));
|
||||
} else if (OB_FAIL(stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -843,26 +843,23 @@ int ObTransformJoinLimitPushDown::do_transform(ObSelectStmt *select_stmt,
|
||||
LimitPushDownHelper &helper)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSelectStmt *ref_query = NULL;
|
||||
ObSEArray<ObRawExpr *, 16> new_conds;
|
||||
if (OB_ISNULL(select_stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret));
|
||||
} else if (!helper.lazy_join_tables_.empty() &&
|
||||
OB_FAIL(remove_lazy_left_join(select_stmt, helper))) {
|
||||
LOG_WARN("failed to remove lazy left join table", K(ret));
|
||||
//pushdown other join table item
|
||||
} else if (OB_FAIL(ObTransformUtils::construct_simple_view(select_stmt,
|
||||
helper.pushdown_tables_,
|
||||
helper.pushdown_semi_infos_,
|
||||
ctx_,
|
||||
ref_query))) {
|
||||
LOG_WARN("failed to construct simple view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_,
|
||||
select_stmt,
|
||||
ref_query,
|
||||
helper.view_table_))) {
|
||||
LOG_WARN("failed to add new table item", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_condition_exprs(),
|
||||
helper.pushdown_conds_))) {
|
||||
LOG_WARN("failed to remove conditions from stmt", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_semi_infos(),
|
||||
helper.pushdown_semi_infos_))) {
|
||||
LOG_WARN("failed to remove semi infos from stmt", K(ret));
|
||||
} else if (ObTransformUtils::add_new_table_item(ctx_,
|
||||
select_stmt,
|
||||
NULL,
|
||||
helper.view_table_)) {
|
||||
LOG_WARN("failed to create table item", K(ret));
|
||||
} else if (OB_FAIL(select_stmt->add_from_item(helper.view_table_->table_id_, false))) {
|
||||
LOG_WARN("failed to add from item", K(ret));
|
||||
}
|
||||
@ -881,29 +878,30 @@ int ObTransformJoinLimitPushDown::do_transform(ObSelectStmt *select_stmt,
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
if (!helper.lazy_join_tables_.empty() &&
|
||||
OB_FAIL(build_lazy_left_join(select_stmt, helper))) {
|
||||
if (OB_SUCC(ret) && !helper.lazy_join_tables_.empty()) {
|
||||
if (OB_FAIL(build_lazy_left_join(select_stmt, helper))) {
|
||||
LOG_WARN("failed to build lazy left join table", K(ret));
|
||||
} else if (OB_ISNULL(helper.view_table_) ||
|
||||
OB_ISNULL(ref_query = helper.view_table_->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("target table should not be null", K(ret));
|
||||
} else if (OB_FAIL(append(ref_query->get_condition_exprs(), helper.pushdown_conds_))) {
|
||||
LOG_WARN("failed to push back conditions", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_condition_exprs(),
|
||||
helper.pushdown_conds_))) {
|
||||
LOG_WARN("failed to remove extracted conditions from stmt", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, select_stmt, helper.view_table_))) {
|
||||
LOG_WARN("failed to generate select list", K(ret), K(helper.view_table_));
|
||||
} else if (OB_FAIL(add_order_by_limit_for_view(ref_query,
|
||||
*helper.view_table_,
|
||||
select_stmt,
|
||||
helper.pushdown_order_items_,
|
||||
helper.all_lazy_join_is_unique_join_))) {
|
||||
LOG_WARN("failed to add limit for generated view table", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
select_stmt,
|
||||
helper.view_table_,
|
||||
helper.pushdown_tables_,
|
||||
&helper.pushdown_conds_,
|
||||
&helper.pushdown_semi_infos_,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&helper.pushdown_order_items_))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_FAIL(add_limit_for_view(helper.view_table_->ref_query_,
|
||||
select_stmt,
|
||||
helper.all_lazy_join_is_unique_join_))) {
|
||||
LOG_WARN("failed to add order by limit for view", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1017,11 +1015,9 @@ int ObTransformJoinLimitPushDown::build_lazy_left_join(ObDMLStmt *stmt,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformJoinLimitPushDown::add_order_by_limit_for_view(ObSelectStmt *generated_view,
|
||||
TableItem &view,
|
||||
ObSelectStmt *upper_stmt,
|
||||
ObIArray<OrderItem> &order_items,
|
||||
bool pushdown_offset)
|
||||
int ObTransformJoinLimitPushDown::add_limit_for_view(ObSelectStmt *generated_view,
|
||||
ObSelectStmt *upper_stmt,
|
||||
bool pushdown_offset)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_ISNULL(generated_view) || OB_ISNULL(upper_stmt) ||
|
||||
@ -1029,36 +1025,11 @@ int ObTransformJoinLimitPushDown::add_order_by_limit_for_view(ObSelectStmt *gene
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("invalid parameter", K(ret), K(generated_view), K(upper_stmt), K(ctx_));
|
||||
} else {
|
||||
ObSEArray<ObRawExpr *, 16> old_order_exprs;
|
||||
ObSEArray<ObRawExpr *, 16> new_order_exprs;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < order_items.count(); i++) {
|
||||
if (OB_FAIL(old_order_exprs.push_back(order_items.at(i).expr_))) {
|
||||
LOG_WARN("failed to push back", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_,
|
||||
*upper_stmt,
|
||||
view,
|
||||
old_order_exprs,
|
||||
new_order_exprs))) {
|
||||
LOG_WARN("failed to move expr into view", K(ret));
|
||||
} else if (OB_UNLIKELY(new_order_exprs.count() != order_items.count())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected exprs count", K(ret), K(new_order_exprs), K(order_items));
|
||||
} else {
|
||||
for (int64_t i = 0; i < order_items.count(); i++) {
|
||||
order_items.at(i).expr_ = new_order_exprs.at(i);
|
||||
}
|
||||
}
|
||||
|
||||
ObRawExpr *offset_expr = upper_stmt->get_offset_expr();
|
||||
ObRawExpr *limit_expr = upper_stmt->get_limit_expr();
|
||||
if (OB_ISNULL(limit_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("illegal limit expr", K(ret));
|
||||
} else if (OB_FAIL(generated_view->get_order_items().assign(order_items))) {
|
||||
LOG_WARN("failed to copy order by items", K(ret));
|
||||
} else if (pushdown_offset) {
|
||||
generated_view->set_limit_offset(limit_expr, offset_expr);
|
||||
upper_stmt->set_limit_offset(NULL, NULL);
|
||||
|
@ -146,11 +146,9 @@ private:
|
||||
|
||||
int build_lazy_left_join(ObDMLStmt *stmt, LimitPushDownHelper &helper);
|
||||
|
||||
int add_order_by_limit_for_view(ObSelectStmt *generated_view,
|
||||
TableItem &view,
|
||||
ObSelectStmt *upper_stmt,
|
||||
ObIArray<OrderItem> &order_items,
|
||||
bool pushdown_offset);
|
||||
int add_limit_for_view(ObSelectStmt *generated_view,
|
||||
ObSelectStmt *upper_stmt,
|
||||
bool pushdown_offset);
|
||||
|
||||
int rename_pushdown_exprs(ObSelectStmt *select_stmt,
|
||||
ObIArray<LimitPushDownHelper*> &helpers);
|
||||
|
@ -40,18 +40,20 @@ int ObTransformLeftJoinToAnti::transform_one_stmt(common::ObIArray<ObParentDMLSt
|
||||
} else if (stmt->is_set_stmt()) {
|
||||
// do nothing
|
||||
} else {
|
||||
JoinedTable *joined_table = NULL;
|
||||
ObSEArray<ObSEArray<TableItem *, 4>, 4> trans_tables;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_from_item_size(); ++i) {
|
||||
FromItem &from_item = stmt->get_from_item(i);
|
||||
if (!from_item.is_joined_) {
|
||||
} else if (OB_ISNULL(joined_table = stmt->get_joined_table(from_item.table_id_))) {
|
||||
ObSEArray<JoinedTable*, 4> joined_tables;
|
||||
if (OB_FAIL(joined_tables.assign(stmt->get_joined_tables()))) {
|
||||
LOG_WARN("failed to assign joined table", K(ret));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < joined_tables.count(); ++i) {
|
||||
TableItem *table = NULL;
|
||||
if (OB_ISNULL(table = joined_tables.at(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null table", K(ret));
|
||||
} else if (OB_FAIL(SMART_CALL(transform_left_join_to_anti_join_rec(stmt,
|
||||
joined_table,
|
||||
table,
|
||||
trans_tables,
|
||||
joined_table->table_id_,
|
||||
true,
|
||||
trans_happened)))) {
|
||||
LOG_WARN("failed to transform left join to anti join", K(ret));
|
||||
}
|
||||
@ -103,35 +105,31 @@ int ObTransformLeftJoinToAnti::construct_transform_hint(ObDMLStmt &stmt, void *t
|
||||
}
|
||||
|
||||
int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join_rec(ObDMLStmt *stmt,
|
||||
JoinedTable *joined_table,
|
||||
TableItem *table,
|
||||
ObIArray<ObSEArray<TableItem *, 4>> &trans_tables,
|
||||
uint64_t root_table_id,
|
||||
bool is_root_table,
|
||||
bool &trans_happened)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
bool left_trans = false;
|
||||
bool cur_trans = false;
|
||||
bool is_root_table = false; ;
|
||||
TableItem *left_table = NULL;
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(joined_table) ||
|
||||
OB_ISNULL(left_table = joined_table->left_table_) ||
|
||||
OB_ISNULL(joined_table->right_table_)) {
|
||||
JoinedTable *joined_table = static_cast<JoinedTable *>(table);
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(table) || OB_UNLIKELY(!table->is_joined_table())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(joined_table));
|
||||
} else if (joined_table->joined_type_ == LEFT_OUTER_JOIN) {
|
||||
is_root_table = joined_table->table_id_ == root_table_id;
|
||||
if (left_table->is_joined_table()) {
|
||||
LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(table));
|
||||
} else if (joined_table->is_left_join()) {
|
||||
if (joined_table->left_table_->is_joined_table()) {
|
||||
if (OB_FAIL(SMART_CALL(transform_left_join_to_anti_join_rec(stmt,
|
||||
static_cast<JoinedTable *>(left_table),
|
||||
joined_table->left_table_,
|
||||
trans_tables,
|
||||
root_table_id,
|
||||
false,
|
||||
left_trans)))) {
|
||||
LOG_WARN("failed to transform joined table to anti join", K(ret));
|
||||
}
|
||||
}
|
||||
OPT_TRACE("try transform left join to anti join:", joined_table);
|
||||
if (OB_SUCC(ret) && OB_FAIL(transform_left_join_to_anti_join(stmt,
|
||||
joined_table,
|
||||
table,
|
||||
trans_tables,
|
||||
is_root_table,
|
||||
cur_trans))) {
|
||||
@ -143,8 +141,9 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join_rec(ObDMLStmt *s
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt,
|
||||
JoinedTable *joined_table,
|
||||
TableItem *table,
|
||||
ObIArray<ObSEArray<TableItem *, 4>> &trans_tables,
|
||||
bool is_root_table,
|
||||
bool &trans_happened)
|
||||
@ -152,16 +151,13 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt
|
||||
int ret = OB_SUCCESS;
|
||||
trans_happened = false;
|
||||
bool is_valid = false;
|
||||
TableItem *right_table = NULL;
|
||||
TableItem *view_table = NULL;
|
||||
JoinedTable *joined_table = static_cast<JoinedTable *>(table);
|
||||
ObSEArray<ObRawExpr *, 8> target_exprs;
|
||||
ObArray<ObRawExpr *> constraints;
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(joined_table) ||
|
||||
OB_ISNULL(joined_table->left_table_) ||
|
||||
OB_ISNULL(right_table = joined_table->right_table_)) {
|
||||
if (OB_ISNULL(stmt) || OB_UNLIKELY(!table->is_joined_table())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(joined_table));
|
||||
} else if (OB_FAIL(check_hint_valid(*stmt, *right_table, is_valid))) {
|
||||
LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(table));
|
||||
} else if (OB_FAIL(check_hint_valid(*stmt, *joined_table->right_table_, is_valid))) {
|
||||
LOG_WARN("failed to check hint valid", K(ret));
|
||||
} else if (!is_valid) {
|
||||
// do nothing
|
||||
@ -181,37 +177,27 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(),
|
||||
target_exprs))) {
|
||||
LOG_WARN("failed to remove condition exprs", K(ret));
|
||||
} else if (OB_FAIL(construct_trans_table_list(stmt, right_table, trans_tables))) {
|
||||
} else if (OB_FAIL(construct_trans_table_list(stmt, joined_table->right_table_, trans_tables))) {
|
||||
LOG_WARN("failed to construct transformed table list", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), target_exprs))) {
|
||||
LOG_WARN("failed to remove condition exprs", K(ret));
|
||||
} else if (is_root_table) {
|
||||
if ((right_table->is_joined_table() ||
|
||||
(lib::is_mysql_mode() && right_table->has_for_update())) &&
|
||||
OB_FAIL(ObTransformUtils::create_view_with_table(stmt,
|
||||
ctx_,
|
||||
right_table,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to create semi view", K(ret));
|
||||
} else if (OB_FAIL(trans_stmt_to_anti(stmt, joined_table))) {
|
||||
if (OB_FAIL(trans_stmt_to_anti(stmt, joined_table))) {
|
||||
LOG_WARN("failed to create semi stmt", K(ret));
|
||||
} else {
|
||||
trans_happened = true;
|
||||
}
|
||||
} else {
|
||||
TableItem *table = joined_table;
|
||||
TableItem *view_table = NULL;
|
||||
ObDMLStmt *ref_query = NULL;
|
||||
TableItem *view_table_for_update = NULL;
|
||||
if (lib::is_mysql_mode() && right_table->has_for_update() &&
|
||||
OB_FAIL(ObTransformUtils::create_view_with_table(stmt,
|
||||
ctx_,
|
||||
right_table,
|
||||
view_table_for_update))) {
|
||||
LOG_WARN("failed to create semi view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt,
|
||||
ctx_,
|
||||
table,
|
||||
view_table))) {
|
||||
TableItem *push_table = table;
|
||||
if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
push_table))) {
|
||||
LOG_WARN("failed to create empty view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
push_table))) {
|
||||
LOG_WARN("failed to create semi view", K(ret));
|
||||
} else if (OB_ISNULL(view_table) ||
|
||||
!view_table->is_generated_table() ||
|
||||
@ -233,21 +219,20 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedTable *joined_table)
|
||||
int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, JoinedTable *joined_table)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
// 1. create semi info, adjust from item
|
||||
SemiInfo *semi_info = NULL;
|
||||
int64_t idx = OB_INVALID_INDEX;
|
||||
TableItem *left_table = NULL;
|
||||
TableItem *right_table = NULL;
|
||||
TableItem *right_view_table = NULL;
|
||||
uint64_t right_table_id = OB_INVALID_ID;
|
||||
TableItem *view_table = NULL;
|
||||
if (OB_ISNULL(ctx_) || OB_ISNULL(ctx_->allocator_) ||
|
||||
OB_ISNULL(ctx_->session_info_) || OB_ISNULL(ctx_->expr_factory_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret), K(ctx_));
|
||||
} else if (OB_ISNULL(joined_table) || OB_ISNULL(left_table = joined_table->left_table_) ||
|
||||
} else if (OB_ISNULL(joined_table) ||
|
||||
OB_ISNULL(left_table = joined_table->left_table_) ||
|
||||
OB_ISNULL(right_table = joined_table->right_table_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null table", K(ret), K(joined_table));
|
||||
@ -260,18 +245,30 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT
|
||||
} else if (lib::is_oracle_mode() && OB_FAIL(clear_for_update(right_table))) {
|
||||
// avoid for update op in the right side of the anti/semi.
|
||||
LOG_WARN("failed to clear for update", K(ret));
|
||||
} else if (right_table->is_joined_table() &&
|
||||
OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, right_table, right_view_table))) {
|
||||
} else if (!right_table->has_for_update() && !right_table->is_joined_table()) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create empty view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create right view table", K(ret));
|
||||
} else {
|
||||
right_table_id = right_view_table == NULL ? right_table->table_id_ : right_view_table->table_id_;
|
||||
right_table = view_table;
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
semi_info->join_type_ = LEFT_ANTI_JOIN;
|
||||
semi_info->right_table_id_ = right_table_id;
|
||||
semi_info->right_table_id_ = right_table->table_id_;
|
||||
semi_info->semi_id_ = stmt->get_query_ctx()->available_tb_id_--;
|
||||
idx = stmt->get_from_item_idx(joined_table->table_id_);
|
||||
int64_t idx = stmt->get_from_item_idx(joined_table->table_id_);
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= stmt->get_from_item_size())) {
|
||||
ret = OB_INVALID_INDEX;
|
||||
LOG_WARN("invalid index", K(ret));
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("invalid index", K(ret), K(idx));
|
||||
} else {
|
||||
stmt->get_from_item(idx).table_id_ = left_table->table_id_;
|
||||
stmt->get_from_item(idx).is_joined_ = left_table->is_joined_table();
|
||||
@ -296,12 +293,8 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT
|
||||
}
|
||||
// 2. generate null exprs for exprs in right side of the joined table
|
||||
if (OB_SUCC(ret)) {
|
||||
ObSEArray<ObRawExprPointer, 16> relation_exprs;
|
||||
ObSEArray<ObRawExpr *, 4> from_exprs;
|
||||
ObSEArray<ObRawExpr *, 4> to_exprs;
|
||||
if (OB_FAIL(stmt->get_relation_exprs(relation_exprs))) {
|
||||
LOG_WARN("failed to get relation exprs", K(ret));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_column_size(); ++i) {
|
||||
const ColumnItem *col_item = NULL;
|
||||
ObRawExpr *from_expr = NULL;
|
||||
@ -310,7 +303,7 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT
|
||||
OB_ISNULL(from_expr = col_item->expr_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null column", K(ret));
|
||||
} else if (right_table_id != col_item->table_id_) {
|
||||
} else if (right_table->table_id_ != col_item->table_id_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_,
|
||||
to_expr))) {
|
||||
@ -329,23 +322,13 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT
|
||||
}
|
||||
}
|
||||
// do in-place modification
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < relation_exprs.count(); ++i) {
|
||||
ObRawExpr *expr = NULL;
|
||||
if (OB_FAIL(relation_exprs.at(i).get(expr))) {
|
||||
LOG_WARN("failed to get expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_expr(from_exprs,
|
||||
to_exprs,
|
||||
expr))) {
|
||||
LOG_WARN("failed to replace expr", K(ret));
|
||||
} else if (OB_FAIL(relation_exprs.at(i).set(expr))) {
|
||||
LOG_WARN("failed to set expr", K(ret));
|
||||
}
|
||||
}
|
||||
// a shared expr in semi_condition may be modified by the above replacemenet,
|
||||
// we revert the replacement in the following.
|
||||
if (OB_SUCC(ret)) {
|
||||
ObRawExprCopier copier(*ctx_->expr_factory_);
|
||||
if (OB_FAIL(copier.add_replaced_expr(to_exprs, from_exprs))) {
|
||||
if (OB_FAIL(stmt->replace_relation_exprs(from_exprs, to_exprs))) {
|
||||
LOG_WARN("failed to replace relation exprs", K(ret));
|
||||
} else if (OB_FAIL(copier.add_replaced_expr(to_exprs, from_exprs))) {
|
||||
LOG_WARN("failed to add replaced expr", K(ret));
|
||||
} else if (OB_FAIL(copier.copy_on_replace(semi_info->semi_conditions_,
|
||||
semi_info->semi_conditions_))) {
|
||||
@ -353,15 +336,16 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT
|
||||
}
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(stmt->get_semi_infos().push_back(semi_info))) {
|
||||
LOG_WARN("failed to assign semi infos", K(ret));
|
||||
} else if (OB_FAIL(stmt->rebuild_tables_hash())) {
|
||||
LOG_WARN("failed to rebuild table hash", K(ret));
|
||||
} else if (OB_FAIL(stmt->update_column_item_rel_id())) {
|
||||
LOG_WARN("failed to update column item rel id", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formlize stmt", K(ret));
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(stmt->get_semi_infos().push_back(semi_info))) {
|
||||
LOG_WARN("failed to assign semi infos", K(ret));
|
||||
} else if (OB_FAIL(stmt->rebuild_tables_hash())) {
|
||||
LOG_WARN("failed to rebuild table hash", K(ret));
|
||||
} else if (OB_FAIL(stmt->update_column_item_rel_id())) {
|
||||
LOG_WARN("failed to update column item rel id", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formlize stmt", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -40,17 +40,17 @@ private:
|
||||
const TableItem &table,
|
||||
bool &is_valid);
|
||||
int transform_left_join_to_anti_join_rec(ObDMLStmt *stmt,
|
||||
JoinedTable *joined_table,
|
||||
TableItem *table,
|
||||
ObIArray<ObSEArray<TableItem *, 4>> &trans_tables,
|
||||
uint64_t root_table_id,
|
||||
bool is_root_table,
|
||||
bool &trans_happened);
|
||||
int transform_left_join_to_anti_join(ObDMLStmt *&stmt,
|
||||
JoinedTable *joined_table,
|
||||
TableItem *table,
|
||||
ObIArray<ObSEArray<TableItem *, 4>> &trans_tables,
|
||||
bool is_root_table,
|
||||
bool &trans_happened);
|
||||
int trans_stmt_to_anti(ObDMLStmt *stmt,
|
||||
const JoinedTable *joined_table);
|
||||
JoinedTable *joined_table);
|
||||
int construct_trans_table_list(const ObDMLStmt *stmt,
|
||||
const TableItem *table,
|
||||
ObIArray<ObSEArray<TableItem *, 4>> &trans_tables);
|
||||
|
@ -35,8 +35,6 @@ int ObTransformOrExpansion::transform_one_stmt(ObIArray<ObParentDMLStmt> &parent
|
||||
bool &trans_happened)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObDMLStmt *upper_stmt = NULL;
|
||||
ObSelectStmt *spj_stmt = NULL;
|
||||
trans_happened = false;
|
||||
if (OB_FAIL(transform_in_joined_table(parent_stmts, stmt, trans_happened))) {
|
||||
LOG_WARN("failed to do or expansion in joined condition", K(ret));
|
||||
@ -589,12 +587,19 @@ int ObTransformOrExpansion::create_single_joined_table_stmt(ObDMLStmt *trans_stm
|
||||
} else if (OB_ISNULL(cur_table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret), K(cur_table));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(trans_stmt, ctx_, cur_table,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
trans_stmt,
|
||||
view_table,
|
||||
cur_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
trans_stmt,
|
||||
view_table,
|
||||
cur_table))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret), K(view_table));
|
||||
LOG_WARN("view table is null", K(ret), K(view_table));
|
||||
} else {
|
||||
ref_query = view_table->ref_query_;
|
||||
}
|
||||
@ -3033,10 +3038,10 @@ int ObTransformOrExpansion::get_condition_related_tables(ObSelectStmt &stmt,
|
||||
// (t1.c = 1 or t3.c = 1)) v
|
||||
// where v.d in (select d from t4 where t4.a > v.a limit 10)
|
||||
or_expr_tables.reuse();
|
||||
if (OB_FAIL(get_all_tables(stmt,
|
||||
or_expr_tables,
|
||||
or_semi_infos))) {
|
||||
LOG_WARN("failed to get all tables", K(ret));
|
||||
if (OB_FAIL(or_semi_infos.assign(stmt.get_semi_infos()))) {
|
||||
LOG_WARN("failed to assign semi infos", K(ret));
|
||||
} else if (OB_FAIL(stmt.get_from_tables(or_expr_tables))) {
|
||||
LOG_WARN("failed to get from tables", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3067,7 +3072,7 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt,
|
||||
bool create_view = false;
|
||||
ObSEArray<TableItem *, 4> or_expr_tables;
|
||||
ObSEArray<SemiInfo *, 4> or_semi_infos;
|
||||
ObSqlBitSet<> view_table_set;
|
||||
ObSqlBitSet<> table_set;
|
||||
int64_t new_expr_pos = OB_INVALID_ID;
|
||||
if (OB_ISNULL(ctx_) || OB_ISNULL(stmt) || OB_ISNULL(stmt_factory = ctx_->stmt_factory_)
|
||||
|| OB_ISNULL(expr_factory = ctx_->expr_factory_) || OB_ISNULL(conds_exprs)
|
||||
@ -3083,21 +3088,15 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt,
|
||||
LOG_WARN("failed to get condition related tables", K(ret));
|
||||
} else if (!create_view) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_tables(stmt, ctx_,
|
||||
or_expr_tables, or_semi_infos, view_table))) {
|
||||
LOG_WARN("failed to create simple view", K(ret));
|
||||
} else if (OB_ISNULL(view_stmt = view_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("failed to get view stmt", K(ret));
|
||||
} else if (OB_FAIL(stmt->get_table_rel_ids(*view_table, view_table_set))) {
|
||||
LOG_WARN("failed to get rel ids", K(ret));
|
||||
} else {
|
||||
// push down a predicate, if:
|
||||
// 1. it is the or expansion cond; or
|
||||
// 2. a. it does not contain not onetime subquery; and
|
||||
// b. it is only related to view tables
|
||||
ObSEArray<ObRawExpr *, 16> new_conds;
|
||||
ObSEArray<ObRawExpr *, 16> old_push_conds;
|
||||
ObSEArray<ObRawExpr *, 4> push_conditions;
|
||||
if (OB_FAIL(stmt->get_table_rel_ids(or_expr_tables, table_set))) {
|
||||
LOG_WARN("failed to get table rel ids", K(ret));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < conds_exprs->count(); i++) {
|
||||
ObRawExpr *cond = NULL;
|
||||
if (OB_ISNULL(cond = (conds_exprs->at(i)))) {
|
||||
@ -3105,27 +3104,36 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt,
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else if (i != expr_pos &&
|
||||
(conds_exprs->at(i)->has_flag(CNT_SUB_QUERY) ||
|
||||
!cond->get_relation_ids().is_subset(view_table_set))) {
|
||||
!cond->get_relation_ids().is_subset(table_set))) {
|
||||
// do not push
|
||||
} else if (OB_FAIL(old_push_conds.push_back(cond))) {
|
||||
} else if (OB_FAIL(push_conditions.push_back(cond))) {
|
||||
LOG_WARN("failed to push cond", K(ret));
|
||||
} else if (i == expr_pos){
|
||||
new_expr_pos = old_push_conds.count() - 1;
|
||||
new_expr_pos = push_conditions.count() - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// get push down conditions
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*expr_factory,
|
||||
*stmt,
|
||||
*view_table,
|
||||
old_push_conds,
|
||||
new_conds))) {
|
||||
LOG_WARN("failed to move expr into view", K(ret));
|
||||
} else if (OB_FAIL(view_stmt->add_condition_exprs(new_conds))) {
|
||||
LOG_WARN("failed to add view conditions exprs", K(ret));
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(*conds_exprs,
|
||||
old_push_conds))) {
|
||||
LOG_WARN("failed to remove push down filters", K(ret));
|
||||
push_conditions))) {
|
||||
LOG_WARN("failed to remove pushed conditions", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
or_expr_tables,
|
||||
&or_semi_infos))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
or_expr_tables,
|
||||
&push_conditions,
|
||||
&or_semi_infos))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table) || OB_ISNULL(view_stmt = view_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("view table is null", K(ret), K(view_table), K(view_stmt));
|
||||
} else {
|
||||
expr_pos = new_expr_pos;
|
||||
conds_exprs = &view_stmt->get_condition_exprs();
|
||||
@ -3216,32 +3224,5 @@ int ObTransformOrExpansion::check_left_bottom_table(ObSelectStmt &stmt,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformOrExpansion::get_all_tables(ObSelectStmt &stmt,
|
||||
ObIArray<TableItem *> &all_tables,
|
||||
ObIArray<SemiInfo *> &or_semi_infos)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_FAIL(or_semi_infos.assign(stmt.get_semi_infos()))) {
|
||||
LOG_WARN("failed to assign semi infos", K(ret));
|
||||
}
|
||||
ObSqlBitSet<> from_table_ids;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_from_item_size(); i ++) {
|
||||
TableItem *table_item = NULL;
|
||||
FromItem &from_item = stmt.get_from_item(i);
|
||||
if (from_item.is_joined_ &&
|
||||
OB_ISNULL(table_item = stmt.get_joined_table(from_item.table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else if (!from_item.is_joined_ &&
|
||||
OB_ISNULL(table_item = stmt.get_table_item_by_id(from_item.table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else if (OB_FAIL(all_tables.push_back(table_item))) {
|
||||
LOG_WARN("failed to push back", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} /* namespace sql */
|
||||
} /* namespace oceanbase */
|
||||
|
@ -373,9 +373,6 @@ private:
|
||||
TableItem *&view_table,
|
||||
int64_t &expr_pos,
|
||||
ObIArray<ObRawExpr*> *&conds_exprs);
|
||||
int get_all_tables(ObSelectStmt &stmt,
|
||||
ObIArray<TableItem *> &rel_tables,
|
||||
ObIArray<SemiInfo *> &or_semi_infos);
|
||||
int check_delay_expr(ObRawExpr* expr, bool &delay);
|
||||
int check_valid_rel_table(ObSelectStmt &stmt,
|
||||
ObRelIds &rel_ids,
|
||||
|
@ -3023,9 +3023,16 @@ int ObTransformPreProcess::transform_for_temporary_table(ObDMLStmt *&stmt,
|
||||
} else {
|
||||
trans_happened = true;
|
||||
}
|
||||
} else if(OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, table_item,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
table_item))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
table_item))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (!view_table->is_generated_table()
|
||||
|| OB_ISNULL(ref_query = view_table->ref_query_)
|
||||
|| !ref_query->is_single_table_stmt()
|
||||
@ -3693,9 +3700,16 @@ int ObTransformPreProcess::add_filter_for_rls_select(ObDMLStmt &stmt,
|
||||
if (OB_FAIL(add_filter_for_rls(stmt, table_item, columns, expr))) {
|
||||
LOG_WARN("failed to add filter for rls table", K(ret));
|
||||
}
|
||||
} else if(OB_FAIL(ObTransformUtils::create_view_with_table(&stmt, ctx_, &table_item,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
&table_item))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
&table_item))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (!view_table->is_generated_table()
|
||||
|| OB_ISNULL(ref_query = view_table->ref_query_)
|
||||
|| !ref_query->is_single_table_stmt()
|
||||
@ -4714,7 +4728,6 @@ int ObTransformPreProcess::create_source_view_for_merge_into(ObMergeStmt *merge_
|
||||
const int64_t SOURCE_TABLE_IDX = 1;
|
||||
TableItem *source_table = NULL;
|
||||
ObSEArray<ObRawExpr*, 8> insert_values_subquery_exprs;
|
||||
|
||||
if (OB_ISNULL(merge_stmt) || OB_ISNULL(ctx_) ||
|
||||
OB_ISNULL(ctx_->allocator_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -4722,10 +4735,15 @@ int ObTransformPreProcess::create_source_view_for_merge_into(ObMergeStmt *merge_
|
||||
} else if (OB_ISNULL(source_table = merge_stmt->get_table_item(SOURCE_TABLE_IDX))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret), K(merge_stmt), K(ctx_));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(merge_stmt,
|
||||
ctx_,
|
||||
source_table,
|
||||
view_table))) {
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
merge_stmt,
|
||||
view_table,
|
||||
source_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
merge_stmt,
|
||||
view_table,
|
||||
source_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::get_subquery_exprs(merge_stmt->get_values_vector(),
|
||||
insert_values_subquery_exprs))) {
|
||||
@ -7263,7 +7281,7 @@ int ObTransformPreProcess::transform_full_outer_join(ObDMLStmt *&stmt, bool &tra
|
||||
if (OB_ISNULL(joined_tables.at(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret), K(i), K(joined_tables));
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(*stmt, *joined_tables.at(i),
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(*stmt, joined_tables.at(i),
|
||||
is_happened))) {
|
||||
LOG_WARN("failed to recursively eliminate full join", K(ret));
|
||||
} else {
|
||||
@ -7275,24 +7293,26 @@ int ObTransformPreProcess::transform_full_outer_join(ObDMLStmt *&stmt, bool &tra
|
||||
}
|
||||
|
||||
int ObTransformPreProcess::recursively_eliminate_full_join(ObDMLStmt &stmt,
|
||||
TableItem &table_item,
|
||||
bool &trans_happened)
|
||||
TableItem *table_item,
|
||||
bool &trans_happened)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
JoinedTable *joined_table = NULL;
|
||||
TableItem *view_table = NULL;
|
||||
bool has_euqal = false;
|
||||
bool has_subquery = false;
|
||||
if (!table_item.is_joined_table()) {
|
||||
/* do nothing */
|
||||
} else if (OB_FALSE_IT(joined_table = static_cast<JoinedTable*>(&table_item))) {
|
||||
} else if (OB_ISNULL(joined_table->left_table_) || OB_ISNULL(joined_table->right_table_)) {
|
||||
JoinedTable *joined_table = static_cast<JoinedTable *>(table_item);
|
||||
TableItem *view_table = NULL;
|
||||
TableItem *from_table = table_item;
|
||||
if (OB_ISNULL(table_item)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null.", K(ret));
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(stmt, *joined_table->left_table_,
|
||||
LOG_WARN("table item is null", K(ret), K(table_item));
|
||||
} else if (!table_item->is_joined_table()) {
|
||||
/* do nothing */
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(stmt,
|
||||
joined_table->left_table_,
|
||||
trans_happened))) {
|
||||
LOG_WARN("failed to transform full nl join.", K(ret));
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(stmt, *joined_table->right_table_,
|
||||
} else if (OB_FAIL(recursively_eliminate_full_join(stmt,
|
||||
joined_table->right_table_,
|
||||
trans_happened))) {
|
||||
LOG_WARN("failed to transform full nl join.", K(ret));
|
||||
} else if (!joined_table->is_full_join()) {
|
||||
@ -7301,13 +7321,24 @@ int ObTransformPreProcess::recursively_eliminate_full_join(ObDMLStmt &stmt,
|
||||
LOG_WARN("failed to check join condition", K(ret));
|
||||
} else if (has_euqal || has_subquery) {
|
||||
/* do nothing */
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(&stmt, ctx_, joined_table,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
from_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
from_table))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("view table is null", K(ret), K(view_table));
|
||||
} else if (OB_FAIL(expand_full_outer_join(view_table->ref_query_))) {
|
||||
LOG_WARN("failed to create view for full nl join.", K(ret));
|
||||
} else {
|
||||
trans_happened = true;
|
||||
view_table->for_update_ = false;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -7410,7 +7441,6 @@ int ObTransformPreProcess::switch_left_outer_to_semi_join(ObSelectStmt *&sub_stm
|
||||
int ret = OB_SUCCESS;
|
||||
SemiInfo *semi_info = NULL;
|
||||
ObSEArray<SelectItem, 4> output_select_items;
|
||||
TableItem *view_item = NULL;
|
||||
ObSEArray<FromItem, 4> from_items;
|
||||
ObSEArray<SemiInfo *, 4> semi_infos;
|
||||
ObSEArray<JoinedTable *, 4> joined_tables;
|
||||
@ -7421,10 +7451,24 @@ int ObTransformPreProcess::switch_left_outer_to_semi_join(ObSelectStmt *&sub_stm
|
||||
} else if (OB_ISNULL(joined_table->left_table_) || OB_ISNULL(joined_table->right_table_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null pointer.", K(ret));
|
||||
} else if (joined_table->left_table_->is_joined_table() &&
|
||||
OB_FAIL(ObTransformUtils::create_view_with_table(sub_stmt, ctx_,
|
||||
joined_table->left_table_, view_item))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (joined_table->left_table_->is_joined_table()) {
|
||||
TableItem *view_table = NULL;
|
||||
TableItem *push_table = joined_table->left_table_;
|
||||
if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
sub_stmt,
|
||||
view_table,
|
||||
push_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
sub_stmt,
|
||||
view_table,
|
||||
push_table))) {
|
||||
LOG_WARN("failed to create inline view with table", K(ret));
|
||||
} else {
|
||||
joined_table->left_table_ = view_table;
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_ISNULL(semi_info = static_cast<SemiInfo*>(ctx_->allocator_->alloc(
|
||||
sizeof(SemiInfo))))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
|
@ -559,7 +559,7 @@ struct DistinctObjMeta
|
||||
* 以左-右-后的方式后续遍历from item及semi from item中的joined_table结构
|
||||
*/
|
||||
int recursively_eliminate_full_join(ObDMLStmt &stmt,
|
||||
TableItem &table_item,
|
||||
TableItem *table_item,
|
||||
bool &trans_happened);
|
||||
|
||||
/**
|
||||
|
@ -2510,10 +2510,9 @@ int ObTransformPredicateMoveAround::pushdown_semi_info_right_filter(ObDMLStmt *s
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
TableItem *right_table = NULL;
|
||||
ObSelectStmt *child_stmt = NULL;
|
||||
TableItem *view_table = NULL;
|
||||
bool can_push = false;
|
||||
ObSEArray<ObRawExpr*, 16> right_filters;
|
||||
ObSEArray<ObRawExpr*, 16> new_right_filters;
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(semi_info) || OB_ISNULL(ctx->expr_factory_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret), K(stmt), K(ctx), K(semi_info), K(ctx->expr_factory_));
|
||||
@ -2524,37 +2523,32 @@ int ObTransformPredicateMoveAround::pushdown_semi_info_right_filter(ObDMLStmt *s
|
||||
LOG_WARN("failed to extract table exprs", K(ret));
|
||||
} else if (right_filters.empty()) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(semi_info->semi_conditions_, right_filters))) {
|
||||
LOG_WARN("failed to remove right filters", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::can_push_down_filter_to_table(*right_table, can_push))) {
|
||||
LOG_WARN("failed to check can push down", K(ret), K(*right_table));
|
||||
} else if (can_push) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx, right_table, right_table))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (FALSE_IT(right_filters.reuse())) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(extract_semi_right_table_filter(stmt, semi_info, right_filters))) {
|
||||
LOG_WARN("failed to extract table exprs", K(ret));
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret) && !right_filters.empty()) {
|
||||
if (OB_ISNULL(right_table) || OB_UNLIKELY(!right_table->is_generated_table())
|
||||
|| OB_ISNULL(child_stmt = right_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected right table", K(ret), K(right_table), K(child_stmt));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(semi_info->semi_conditions_,
|
||||
right_filters))) {
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx->expr_factory_,
|
||||
*stmt,
|
||||
*right_table,
|
||||
right_filters,
|
||||
new_right_filters))) {
|
||||
ObArray<ObRawExpr *> new_right_filters;
|
||||
if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_,
|
||||
*stmt,
|
||||
*right_table,
|
||||
right_filters,
|
||||
new_right_filters))) {
|
||||
LOG_WARN("failed to move expr into view", K(ret));
|
||||
} else if (OB_FAIL(child_stmt->add_condition_exprs(new_right_filters))) {
|
||||
LOG_WARN("failed to add condotion exprs", K(ret));
|
||||
} else if (OB_FAIL(child_stmt->formalize_stmt(ctx->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
} else if (OB_FAIL(right_table->ref_query_->add_condition_exprs(new_right_filters))) {
|
||||
LOG_WARN("failed to add condition exprs", K(ret));
|
||||
}
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_table,
|
||||
right_table,
|
||||
&right_filters))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -293,9 +293,11 @@ int ObTransformSemiToInner::do_transform_by_rewrite_form(ObDMLStmt* stmt,
|
||||
trans_param))) {
|
||||
LOG_WARN("failed to do transform (INNER)", K(ret));
|
||||
// Just in case different parameters hit same plan, we need add const param constraint
|
||||
} else if (trans_param.need_add_limit_constraint_ && OB_FAIL(ObTransformUtils::add_const_param_constraints(
|
||||
stmt->get_limit_expr(), ctx_))) {
|
||||
LOG_WARN("failed to add const param constraints", K(ret));
|
||||
} else if (!trans_param.need_add_limit_constraint_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObTransformUtils::add_const_param_constraints(
|
||||
stmt->get_limit_expr(), ctx_))) {
|
||||
LOG_WARN("failed to add const param constriants", K(ret));
|
||||
}
|
||||
} else if (trans_param.use_aggr_inner()) {
|
||||
if (OB_FAIL(do_transform_with_aggr(*stmt, semi_info, ctx, trans_param))) {
|
||||
@ -1098,13 +1100,11 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt,
|
||||
TransformParam &trans_param)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
TableItem *right_table = NULL;
|
||||
TableItem *view_table = NULL;
|
||||
ObSelectStmt *ref_query = NULL;
|
||||
bool is_all_equal_cond = false;
|
||||
bool is_multi_join_cond = false;
|
||||
bool need_add_distinct = trans_param.need_add_distinct_;
|
||||
bool right_table_need_add_limit = trans_param.right_table_need_add_limit_;
|
||||
ObSEArray<ObRawExpr *, 2> view_filter_conds;
|
||||
ObSEArray<ObRawExpr *, 2> new_condition_exprs;
|
||||
if (OB_ISNULL(ctx_) || OB_ISNULL(semi_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -1121,18 +1121,29 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt,
|
||||
} else if (OB_FAIL(ObTransformUtils::add_limit_to_semi_right_table(&stmt, ctx_, semi_info))) {
|
||||
LOG_WARN("failed to add limit to semi right table", K(ret), K(stmt));
|
||||
}
|
||||
} else if (OB_FAIL(view_filter_conds.assign(trans_param.filter_conds_on_right_))) {
|
||||
LOG_WARN("failed to assign view filter conditions", K(ret));
|
||||
} else if (OB_FAIL(new_condition_exprs.assign(semi_info->semi_conditions_))) {
|
||||
LOG_WARN("failed to assign semi join conditions", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(new_condition_exprs, view_filter_conds))) {
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(new_condition_exprs,
|
||||
trans_param.filter_conds_on_right_))) {
|
||||
LOG_WARN("failed to remove non-correlated filter conditions on right table", K(ret));
|
||||
} else if (OB_FAIL(append(stmt.get_condition_exprs(), new_condition_exprs))) {
|
||||
LOG_WARN("failed to append semi conditions", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_from_items(&stmt, ctx_,
|
||||
stmt.get_table_item_by_id(semi_info->right_table_id_),
|
||||
trans_param.equal_right_exprs_, view_filter_conds, view_table))) {
|
||||
LOG_WARN("failed to merge from items as inner join", K(ret));
|
||||
} else if (OB_ISNULL(right_table = stmt.get_table_item_by_id(semi_info->right_table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("right table item is null", K(ret), K(right_table));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
right_table,
|
||||
&trans_param.filter_conds_on_right_,
|
||||
NULL,
|
||||
&trans_param.equal_right_exprs_))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
@ -1144,8 +1155,6 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt,
|
||||
LOG_WARN("unexpect null ref query", K(ret));
|
||||
} else if (OB_FAIL(add_distinct(*ref_query, trans_param.equal_left_exprs_, trans_param.equal_right_exprs_))) {
|
||||
LOG_WARN("failed to add distinct exprs", K(ret));
|
||||
} else if (OB_FAIL(ref_query->add_from_item(semi_info->right_table_id_, false))) {
|
||||
LOG_WARN("failed to add from items", K(ret));
|
||||
} else if (OB_FAIL(stmt.add_from_item(view_table->table_id_, false))) {
|
||||
LOG_WARN("failed to add from items", K(ret));
|
||||
} else if (OB_FAIL(find_basic_table(ref_query, ctx.table_id_))) {
|
||||
@ -1193,6 +1202,7 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt,
|
||||
TransformParam& trans_param)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
TableItem *right_table = NULL;
|
||||
TableItem* view_table = NULL;
|
||||
ObSelectStmt* ref_query = NULL;
|
||||
ObSEArray<ObRawExpr*, 4> new_condition_exprs;
|
||||
@ -1223,13 +1233,22 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt,
|
||||
LOG_WARN("failed to remove semi info", K(ret));
|
||||
} else if (OB_FAIL(append(stmt.get_condition_exprs(), new_condition_exprs))) {
|
||||
LOG_WARN("failed to append semi conditions", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_from_items(&stmt,
|
||||
ctx_,
|
||||
stmt.get_table_item_by_id(semi_info->right_table_id_),
|
||||
view_select_exprs,
|
||||
view_filter_conds,
|
||||
view_table))) {
|
||||
LOG_WARN("failed to merge from items as inner join", K(ret));
|
||||
} else if (OB_ISNULL(right_table = stmt.get_table_item_by_id(semi_info->right_table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("right table item is null", K(ret), K(right_table));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
&stmt,
|
||||
view_table,
|
||||
right_table,
|
||||
&view_filter_conds,
|
||||
NULL,
|
||||
&view_select_exprs))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
@ -1239,12 +1258,8 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt,
|
||||
} else if (OB_ISNULL(ref_query = view_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null ref query", K(ret));
|
||||
} else if (OB_FAIL(ref_query->add_from_item(semi_info->right_table_id_, false))) {
|
||||
LOG_WARN("failed to add from items", K(ret));
|
||||
} else if (OB_FAIL(stmt.add_from_item(view_table->table_id_, false))) {
|
||||
LOG_WARN("failed to add from items", K(ret));
|
||||
} else if (OB_FAIL(ref_query->add_agg_item(*static_cast<ObAggFunRawExpr*>(view_aggr_expr)))) {
|
||||
LOG_WARN("failed to add aggr item in view", K(ret));
|
||||
} else if (need_add_group_by) {
|
||||
if (OB_FAIL(add_group_by_with_cast(*ref_query, trans_param.equal_left_exprs_, trans_param.equal_right_exprs_))) {
|
||||
LOG_WARN("failed to add group by expr in view", K(ret));
|
||||
|
@ -588,6 +588,7 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt,
|
||||
} else {
|
||||
ObSEArray<ObRawExpr*, 16> push_down_conds;
|
||||
TableItem *view_item = NULL;
|
||||
TableItem *right_table = join_table->right_table_;
|
||||
if (OB_FAIL(get_push_down_conditions(stmt,
|
||||
join_table,
|
||||
join_table->get_join_conditions(),
|
||||
@ -595,12 +596,19 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt,
|
||||
LOG_WARN("failed to get_push_down_conditions", K(ret), K(join_table));
|
||||
} else if (push_down_conds.empty()) {
|
||||
/*do nothing*/
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_,
|
||||
join_table->right_table_,
|
||||
view_item))) {
|
||||
LOG_WARN("failed to create view with table", K(ret));
|
||||
} else if (OB_FAIL(push_down_on_condition(stmt, join_table, push_down_conds))) {
|
||||
LOG_WARN("failed to push down on condition", K(ret));
|
||||
} else if (ObOptimizerUtil::remove_item(join_table->get_join_conditions(), push_down_conds)) {
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
stmt,
|
||||
view_item,
|
||||
right_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
stmt,
|
||||
view_item,
|
||||
right_table,
|
||||
&push_down_conds))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else {
|
||||
trans_happened = true;
|
||||
}
|
||||
@ -608,40 +616,6 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt,
|
||||
return ret;
|
||||
}
|
||||
|
||||
//将left join 部分连接条件conds 下推到 right generate table
|
||||
//right table 为仅含 select 输出的 generate table
|
||||
int ObTransformSimplifySubquery::push_down_on_condition(ObDMLStmt *stmt,
|
||||
JoinedTable *join_table,
|
||||
ObIArray<ObRawExpr*> &conds) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr *, 16> new_conds;
|
||||
ObSelectStmt *child_stmt = NULL;
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(join_table) ||
|
||||
OB_ISNULL(ctx_->expr_factory_) || OB_ISNULL(ctx_->allocator_) ||
|
||||
OB_ISNULL(join_table->right_table_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected NULL", K(ret));
|
||||
} else if (!join_table->is_left_join() || !join_table->right_table_->is_generated_table()
|
||||
|| OB_ISNULL(child_stmt = join_table->right_table_->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected join table", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(join_table->get_join_conditions(), conds))) {
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_,
|
||||
*stmt,
|
||||
*join_table->right_table_,
|
||||
conds,
|
||||
new_conds))) {
|
||||
LOG_WARN("failed to move expr into view", K(ret));
|
||||
} else if (OB_FAIL(child_stmt->add_condition_exprs(new_conds))) {
|
||||
LOG_WARN("failed to add new conditions exprs", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int ObTransformSimplifySubquery::add_limit_for_exists_subquery(ObDMLStmt *stmt,
|
||||
bool &trans_happened)
|
||||
{
|
||||
|
@ -51,9 +51,6 @@ private:
|
||||
int try_push_down_outer_join_conds(ObDMLStmt *stmt,
|
||||
JoinedTable *join_table,
|
||||
bool &trans_happened);
|
||||
int push_down_on_condition(ObDMLStmt *stmt,
|
||||
JoinedTable *join_table,
|
||||
ObIArray<ObRawExpr*> &conds);
|
||||
|
||||
ObItemType get_opposite_expr_type(ObItemType item_type);
|
||||
|
||||
|
@ -976,9 +976,7 @@ int ObTransformTempTable::inner_create_temp_table(ObSelectStmt *parent_stmt,
|
||||
ObStmtMapInfo& common_map_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSelectStmt *child_stmt = NULL;
|
||||
ObSEArray<ObRawExpr*, 8> pushdown_exprs;
|
||||
if (OB_ISNULL(parent_stmt)) {
|
||||
if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null stmt", K(ret));
|
||||
} else if (parent_stmt->is_set_stmt()) {
|
||||
@ -988,46 +986,81 @@ int ObTransformTempTable::inner_create_temp_table(ObSelectStmt *parent_stmt,
|
||||
LOG_TRACE("succeed to create temp table", KPC(parent_stmt));
|
||||
}
|
||||
} else {
|
||||
if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_,
|
||||
parent_stmt,
|
||||
child_stmt,
|
||||
false,
|
||||
false))) {
|
||||
LOG_WARN("failed to create simple view", K(ret));
|
||||
//下压condition
|
||||
} else if (parent_stmt->get_condition_size() > 0 &&
|
||||
TableItem *view_table = NULL;
|
||||
ObSEArray<TableItem *, 8> from_tables;
|
||||
ObSEArray<SemiInfo *, 4> semi_infos;
|
||||
ObSEArray<ObRawExpr *, 8> pushdown_select;
|
||||
ObSEArray<ObRawExpr *, 8> pushdown_where;
|
||||
ObSEArray<ObRawExpr *, 8> pushdown_groupby;
|
||||
ObSEArray<ObRawExpr *, 8> pushdown_rollup;
|
||||
ObSEArray<ObRawExpr *, 8> pushdown_having;
|
||||
|
||||
if (parent_stmt->get_condition_size() > 0 &&
|
||||
OB_FAIL(pushdown_conditions(parent_stmt,
|
||||
map_info.cond_map_,
|
||||
common_map_info.cond_map_,
|
||||
pushdown_exprs))) {
|
||||
pushdown_where))) {
|
||||
LOG_WARN("failed to pushdown conditions", K(ret));
|
||||
} else if (!common_map_info.is_cond_equal_ ||
|
||||
!common_map_info.is_group_equal_) {
|
||||
//do nothing
|
||||
//下压group by
|
||||
} else if (parent_stmt->has_group_by() &&
|
||||
OB_FAIL(pushdown_group_by(parent_stmt, pushdown_exprs))) {
|
||||
OB_FAIL(ObTransformUtils::pushdown_group_by(parent_stmt,
|
||||
pushdown_groupby,
|
||||
pushdown_rollup,
|
||||
pushdown_select))) {
|
||||
LOG_WARN("failed to pushdown group by", K(ret));
|
||||
//下压having
|
||||
} else if (parent_stmt->get_having_expr_size() > 0 &&
|
||||
OB_FAIL(pushdown_having_conditions(parent_stmt,
|
||||
map_info.having_map_,
|
||||
common_map_info.having_map_,
|
||||
pushdown_exprs))) {
|
||||
pushdown_having))) {
|
||||
LOG_WARN("failed to pushdown having conditions", K(ret));
|
||||
} else if (is_mysql_mode() && !pushdown_exprs.empty() && OB_FAIL(pushdown_shared_subqueries(parent_stmt, pushdown_exprs))) {
|
||||
LOG_WARN("failed to extract shared expr", K(ret));
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*parent_stmt))) {
|
||||
LOG_WARN("failed to adjust pseudo column like exprs", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*child_stmt))) {
|
||||
LOG_WARN("failed to adjust pseudo column like exprs", K(ret));
|
||||
} else if (OB_FAIL(parent_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(child_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
}
|
||||
|
||||
ObSEArray<TableItem *, 8> origin_tables;
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(ObTransformUtils::pushdown_pseudo_column_like_exprs(*parent_stmt, pushdown_select))) {
|
||||
LOG_WARN("failed to pushdown pseudo column like exprs", K(ret));
|
||||
} else if (OB_FAIL(origin_tables.assign(parent_stmt->get_table_items()))) {
|
||||
LOG_WARN("failed to get table items", K(ret));
|
||||
} else if (OB_FAIL(parent_stmt->get_from_tables(from_tables))) {
|
||||
LOG_WARN("failed to get from tables", K(ret));
|
||||
} else if (OB_FAIL(semi_infos.assign(parent_stmt->get_semi_infos()))) {
|
||||
LOG_WARN("failed to assign semi info", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
parent_stmt,
|
||||
view_table,
|
||||
from_tables,
|
||||
&semi_infos))) {
|
||||
LOG_WARN("failed to create empty view", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
parent_stmt,
|
||||
view_table,
|
||||
from_tables,
|
||||
&pushdown_where,
|
||||
&semi_infos,
|
||||
&pushdown_select,
|
||||
&pushdown_groupby,
|
||||
&pushdown_rollup,
|
||||
&pushdown_having))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(view_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("null view query", K(ret));
|
||||
|
||||
// recover the order of table items,
|
||||
// the table_map in ObStmtMapInfo will be used in apply_temp_table
|
||||
} else if (OB_FAIL(view_table->ref_query_->get_table_items().assign(origin_tables))) {
|
||||
LOG_WARN("failed to adjust table map", K(ret));
|
||||
} else if (OB_FAIL(view_table->ref_query_->rebuild_tables_hash())) {
|
||||
LOG_WARN("failed to rebuild table hash", K(ret));
|
||||
} else if (OB_FAIL(view_table->ref_query_->update_column_item_rel_id())) {
|
||||
LOG_WARN("failed to update column item by id", K(ret));
|
||||
} else if (OB_FAIL(view_table->ref_query_->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -1107,35 +1140,13 @@ int ObTransformTempTable::create_spj(ObSelectStmt *parent_stmt)
|
||||
int ObTransformTempTable::pushdown_conditions(ObSelectStmt *parent_stmt,
|
||||
const ObIArray<int64_t> &cond_map,
|
||||
const ObIArray<int64_t> &common_cond_map,
|
||||
ObIArray<ObRawExpr*> &pushdown_exprs)
|
||||
ObIArray<ObRawExpr*> &pushdown_conds)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSQLSessionInfo *session_info = NULL;
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObSelectStmt *subquery = NULL;
|
||||
TableItem *table = NULL;
|
||||
int64_t table_id = OB_INVALID_ID;
|
||||
ObSEArray<ObRawExpr*, 8> keep_conds;
|
||||
ObSEArray<ObRawExpr*, 8> pushdown_conds;
|
||||
ObSEArray<ObRawExpr*, 8> rename_conds;
|
||||
if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) ||
|
||||
OB_ISNULL(session_info = ctx_->session_info_) ||
|
||||
OB_ISNULL(expr_factory = ctx_->expr_factory_)) {
|
||||
if (OB_ISNULL(parent_stmt)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null param", K(ret));
|
||||
} else if (1 != parent_stmt->get_table_size()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret));
|
||||
} else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
} else if (!table->is_generated_table()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect generate table item", KPC(table), K(ret));
|
||||
} else if (OB_ISNULL(subquery = table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null ref query", K(ret));
|
||||
} else if (OB_FALSE_IT(table_id = table->table_id_)) {
|
||||
} else if (cond_map.count() != common_cond_map.count()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect map info", K(cond_map), K(common_cond_map), K(ret));
|
||||
@ -1164,135 +1175,6 @@ int ObTransformTempTable::pushdown_conditions(ObSelectStmt *parent_stmt,
|
||||
if (OB_SUCC(ret) && !pushdown_conds.empty()) {
|
||||
if (OB_FAIL(parent_stmt->get_condition_exprs().assign(keep_conds))) {
|
||||
LOG_WARN("failed to assign exprs", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt,
|
||||
*subquery,
|
||||
table_id,
|
||||
session_info,
|
||||
*expr_factory,
|
||||
pushdown_conds,
|
||||
rename_conds))) {
|
||||
LOG_WARN("failed to rename pushdown filter", K(ret));
|
||||
} else if (OB_FAIL(append(subquery->get_condition_exprs(), rename_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief pushdown_group_by
|
||||
* 下压所有的group by expr、rollup expr到视图中
|
||||
* 同时需要把上层stmt的所有aggr expr下压到视图中计算
|
||||
*/
|
||||
int ObTransformTempTable::pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray<ObRawExpr*> &pushdown_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSQLSessionInfo *session_info = NULL;
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObSelectStmt *subquery = NULL;
|
||||
TableItem *table = NULL;
|
||||
int64_t table_id = OB_INVALID_ID;
|
||||
ObSEArray<ObRawExpr*, 8> pushdown_conds;
|
||||
ObSEArray<ObRawExpr*, 8> rename_conds;
|
||||
ObSEArray<ObAggFunRawExpr*, 8> aggr_items;
|
||||
|
||||
if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) ||
|
||||
OB_ISNULL(session_info = ctx_->session_info_) ||
|
||||
OB_ISNULL(expr_factory = ctx_->expr_factory_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null param", K(ret));
|
||||
} else if (1 != parent_stmt->get_table_size()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret));
|
||||
} else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
} else if (!table->is_generated_table()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect generate table item", KPC(table), K(ret));
|
||||
} else if (OB_ISNULL(subquery = table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null ref query", K(ret));
|
||||
} else if (OB_FALSE_IT(table_id = table->table_id_)) {
|
||||
//下推group by exprs
|
||||
} else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_group_exprs()))) {
|
||||
LOG_WARN("failed to append group by rollup exprs.", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt,
|
||||
*subquery,
|
||||
table_id,
|
||||
session_info,
|
||||
*expr_factory,
|
||||
pushdown_conds,
|
||||
rename_conds))) {
|
||||
LOG_WARN("failed to rename pushdown filter", K(ret));
|
||||
} else if (OB_FAIL(append(subquery->get_group_exprs(), rename_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FALSE_IT(pushdown_conds.reuse()) ||
|
||||
OB_FALSE_IT(rename_conds.reuse()) ||
|
||||
OB_FALSE_IT(parent_stmt->get_group_exprs().reset())) {
|
||||
//下推rollup exprs
|
||||
} else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_rollup_exprs()))) {
|
||||
LOG_WARN("failed to append group by rollup exprs.", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt,
|
||||
*subquery,
|
||||
table_id,
|
||||
session_info,
|
||||
*expr_factory,
|
||||
pushdown_conds,
|
||||
rename_conds))) {
|
||||
LOG_WARN("failed to rename pushdown filter", K(ret));
|
||||
} else if (OB_FAIL(append(subquery->get_rollup_exprs(), rename_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FALSE_IT(pushdown_conds.reuse()) ||
|
||||
OB_FALSE_IT(rename_conds.reuse()) ||
|
||||
OB_FALSE_IT(parent_stmt->get_rollup_exprs().reset())) {
|
||||
//下推aggr items
|
||||
} else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_aggr_items()))) {
|
||||
LOG_WARN("failed to append group by rollup exprs.", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt,
|
||||
*subquery,
|
||||
table_id,
|
||||
session_info,
|
||||
*expr_factory,
|
||||
pushdown_conds,
|
||||
rename_conds))) {
|
||||
LOG_WARN("failed to rename pushdown filter", K(ret));
|
||||
} else {
|
||||
//下推group by的同时需要把parent stmt的所有聚合函数下推到子查询,并输出
|
||||
parent_stmt->get_aggr_items().reset();
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < rename_conds.count(); ++i) {
|
||||
ObRawExpr *expr = rename_conds.at(i);
|
||||
if (OB_ISNULL(expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null expr", K(ret));
|
||||
} else if (!expr->is_aggr_expr()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect aggr expr", KPC(expr), K(ret));
|
||||
} else if (OB_FAIL(aggr_items.push_back(static_cast<ObAggFunRawExpr*>(expr)))) {
|
||||
LOG_WARN("failed to push back aggr expr", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
ObSEArray<ObRawExpr*, 8> new_column_list;
|
||||
if (OB_FAIL(append(subquery->get_aggr_items(), aggr_items))) {
|
||||
LOG_WARN("failed to append aggr items", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_columns_for_view(ctx_,
|
||||
*table,
|
||||
parent_stmt,
|
||||
rename_conds,
|
||||
new_column_list))) {
|
||||
LOG_WARN("failed to create columns for view", K(ret));
|
||||
} else if (OB_FAIL(parent_stmt->replace_relation_exprs(pushdown_conds, new_column_list))) {
|
||||
LOG_WARN("failed to replace relation exprs", K(ret));
|
||||
} else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1306,36 +1188,14 @@ int ObTransformTempTable::pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray<
|
||||
int ObTransformTempTable::pushdown_having_conditions(ObSelectStmt *parent_stmt,
|
||||
const ObIArray<int64_t> &having_map,
|
||||
const ObIArray<int64_t> &common_having_map,
|
||||
ObIArray<ObRawExpr*> &pushdown_exprs)
|
||||
ObIArray<ObRawExpr*> &pushdown_conds)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSQLSessionInfo *session_info = NULL;
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObSelectStmt *subquery = NULL;
|
||||
TableItem *table = NULL;
|
||||
int64_t table_id = OB_INVALID_ID;
|
||||
ObSEArray<ObRawExpr*, 8> keep_conds;
|
||||
ObSEArray<ObRawExpr*, 8> pushdown_conds;
|
||||
ObSEArray<ObRawExpr*, 8> rename_conds;
|
||||
|
||||
if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) ||
|
||||
OB_ISNULL(session_info = ctx_->session_info_) ||
|
||||
OB_ISNULL(expr_factory = ctx_->expr_factory_)) {
|
||||
if (OB_ISNULL(parent_stmt)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null param", K(ret));
|
||||
} else if (1 != parent_stmt->get_table_size()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret));
|
||||
} else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null table item", K(ret));
|
||||
} else if (!table->is_generated_table()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect generate table item", KPC(table), K(ret));
|
||||
} else if (OB_ISNULL(subquery = table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect null ref query", K(ret));
|
||||
} else if (OB_FALSE_IT(table_id = table->table_id_)) {
|
||||
} else if (having_map.count() != common_having_map.count()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpect map info", K(having_map), K(common_having_map), K(ret));
|
||||
@ -1365,20 +1225,6 @@ int ObTransformTempTable::pushdown_having_conditions(ObSelectStmt *parent_stmt,
|
||||
parent_stmt->get_having_exprs().reset();
|
||||
if (OB_FAIL(append(parent_stmt->get_condition_exprs(), keep_conds))) {
|
||||
LOG_WARN("failed to assign exprs", K(ret));
|
||||
} else if (pushdown_conds.empty()) {
|
||||
//do nothing
|
||||
} else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt,
|
||||
*subquery,
|
||||
table_id,
|
||||
session_info,
|
||||
*expr_factory,
|
||||
pushdown_conds,
|
||||
rename_conds))) {
|
||||
LOG_WARN("failed to rename pushdown filter", K(ret));
|
||||
} else if (OB_FAIL(append(subquery->get_having_exprs(), rename_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,8 +184,6 @@ public:
|
||||
const ObIArray<int64_t> &common_cond_map,
|
||||
ObIArray<ObRawExpr*> &pushdown_exprs);
|
||||
|
||||
int pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray<ObRawExpr*> &pushdown_exprs);
|
||||
|
||||
int pushdown_having_conditions(ObSelectStmt *parent_stmt,
|
||||
const ObIArray<int64_t> &having_map,
|
||||
const ObIArray<int64_t> &common_having_map,
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -288,7 +288,7 @@ public:
|
||||
ObSelectStmt *select_stmt);
|
||||
|
||||
static int create_select_item(ObIAllocator &allocator,
|
||||
common::ObIArray<ObRawExpr*> &select_exprs,
|
||||
const common::ObIArray<ObRawExpr*> &select_exprs,
|
||||
ObSelectStmt *select_stmt);
|
||||
|
||||
static int copy_stmt(ObStmtFactory &stmt_factory,
|
||||
@ -1090,31 +1090,27 @@ public:
|
||||
ObSelectStmt *right_stmt,
|
||||
ObSelectStmt *&union_stmt);
|
||||
|
||||
static int pushdown_group_by(ObSelectStmt *parent_stmt,
|
||||
ObIArray<ObRawExpr *> &pushdown_groupby,
|
||||
ObIArray<ObRawExpr *> &pushdown_rollup,
|
||||
ObIArray<ObRawExpr *> &pushdown_aggr);
|
||||
|
||||
static int create_simple_view(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
ObSelectStmt *&view_stmt,
|
||||
bool push_subquery = true,
|
||||
bool push_conditions = true);
|
||||
bool push_conditions = true,
|
||||
bool push_group_by = false,
|
||||
ObAliasRefRawExpr *alias_expr = NULL);
|
||||
|
||||
static int pushdown_pseudo_column_like_exprs(ObDMLStmt &upper_stmt,
|
||||
ObSelectStmt &view_stmt,
|
||||
ObIArray<ObRawExpr*> &pushdown_exprs);
|
||||
static int check_need_pushdown_pseudo_column(ObDMLStmt &view_stmt,
|
||||
ObRawExpr &expr,
|
||||
bool &need_pushdown);
|
||||
|
||||
static int adjust_updatable_view(ObRawExprFactory &expr_factory,
|
||||
ObDelUpdStmt *stmt,
|
||||
TableItem &view_table_item,
|
||||
ObIArray<uint64_t>* origin_table_ids = NULL);
|
||||
|
||||
static int push_down_groupby(ObTransformerCtx *ctx, ObSelectStmt *stmt, TableItem *view_table);
|
||||
|
||||
static int push_down_vector_assign(ObTransformerCtx *ctx,
|
||||
ObUpdateStmt *stmt,
|
||||
ObAliasRefRawExpr *root_expr,
|
||||
TableItem *view_table);
|
||||
|
||||
static int create_stmt_with_generated_table(ObTransformerCtx *ctx,
|
||||
ObSelectStmt *child_stmt,
|
||||
ObSelectStmt *&parent_stmt);
|
||||
@ -1136,11 +1132,6 @@ public:
|
||||
static int inner_copy_joined_table_expr(ObRawExprCopier &copier,
|
||||
JoinedTable *table);
|
||||
|
||||
static int create_view_with_table(ObDMLStmt *stmt,
|
||||
ObTransformerCtx *ctx,
|
||||
TableItem *table,
|
||||
TableItem *&view_table);
|
||||
|
||||
static int extract_right_tables_from_semi_infos(ObDMLStmt *stmt,
|
||||
const ObIArray<SemiInfo *> &semi_infos,
|
||||
ObIArray<TableItem *> &tables);
|
||||
@ -1358,18 +1349,6 @@ public:
|
||||
ObQueryRefRawExpr *query_ref,
|
||||
ObSelectStmt *subquery,
|
||||
bool &is_match);
|
||||
/**
|
||||
* @brief create_view_with_from_items
|
||||
* 使用给定的from items,创建一个generate table聚合这些表
|
||||
* 如果给定了new_select_exprs,则使用给定的表达式创建新的select item
|
||||
* 如果new_select_exprs为空,则使用from items包含表的所有列创建新的select item
|
||||
*/
|
||||
static int create_view_with_from_items(ObDMLStmt *stmt,
|
||||
ObTransformerCtx *ctx,
|
||||
TableItem *table_item,
|
||||
const ObIArray<ObRawExpr*> &new_select_exprs,
|
||||
const ObIArray<ObRawExpr*> &new_conds,
|
||||
TableItem *&view_table);
|
||||
|
||||
static int add_table_item(ObDMLStmt *stmt, TableItem *table_item);
|
||||
|
||||
@ -1651,21 +1630,46 @@ public:
|
||||
static int check_expr_valid_for_stmt_merge(ObIArray<ObRawExpr*> &select_exprs,
|
||||
bool &is_valid);
|
||||
|
||||
static int create_view_with_tables(ObDMLStmt *stmt,
|
||||
ObTransformerCtx *ctx,
|
||||
const ObIArray<TableItem *> &tables,
|
||||
const ObIArray<SemiInfo *> &semi_infos,
|
||||
TableItem *&view_table);
|
||||
static int replace_with_empty_view(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *&view_table,
|
||||
TableItem *from_table,
|
||||
ObIArray<SemiInfo *> *semi_infos = NULL);
|
||||
|
||||
static int construct_simple_view(ObDMLStmt *stmt,
|
||||
const ObIArray<TableItem *> &tables,
|
||||
const ObIArray<SemiInfo *> &semi_infos,
|
||||
ObTransformerCtx *ctx,
|
||||
ObSelectStmt *&simple_stmt);
|
||||
static int replace_with_empty_view(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *&view_table,
|
||||
ObIArray<TableItem *> &from_tables,
|
||||
ObIArray<SemiInfo *> *semi_infos = NULL);
|
||||
|
||||
static int create_inline_view(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *&view_table,
|
||||
TableItem * push_table,
|
||||
ObIArray<ObRawExpr *> *conditions = NULL,
|
||||
ObIArray<SemiInfo *> *semi_infos = NULL,
|
||||
ObIArray<ObRawExpr *> *select_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *group_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *rollup_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *having_exprs = NULL,
|
||||
ObIArray<OrderItem> *order_items = NULL);
|
||||
|
||||
static int create_inline_view(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *&view_table,
|
||||
ObIArray<TableItem *> &from_tables,
|
||||
ObIArray<ObRawExpr *> *conditions = NULL,
|
||||
ObIArray<SemiInfo *> *semi_infos = NULL,
|
||||
ObIArray<ObRawExpr *> *select_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *group_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *rollup_exprs = NULL,
|
||||
ObIArray<ObRawExpr *> *having_exprs = NULL,
|
||||
ObIArray<OrderItem> *order_items = NULL);
|
||||
|
||||
static int generate_select_list(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *table);
|
||||
TableItem *table,
|
||||
ObIArray<ObRawExpr *> *basic_select_exprs = NULL);
|
||||
|
||||
static int remove_const_exprs(ObIArray<ObRawExpr *> &input_exprs,
|
||||
ObIArray<ObRawExpr *> &output_exprs);
|
||||
@ -1735,7 +1739,8 @@ private:
|
||||
|
||||
static int extract_shared_exprs(ObDMLStmt *parent,
|
||||
ObSelectStmt *view_stmt,
|
||||
ObIArray<ObRawExpr *> &common_exprs);
|
||||
ObIArray<ObRawExpr *> &common_exprs,
|
||||
const ObIArray<ObRawExpr *> *extra_view_exprs = NULL);
|
||||
|
||||
static int generate_col_exprs(ObDMLStmt *stmt,
|
||||
const ObIArray<TableItem *> &tables,
|
||||
|
@ -274,41 +274,31 @@ int ObTransformWinMagic::do_transform_from_type(ObDMLStmt *&stmt,
|
||||
int ret = OB_SUCCESS;
|
||||
ObDMLStmt *main_stmt = stmt;
|
||||
TableItem *drill_down_table = NULL;
|
||||
TableItem *&rewrite_table = drill_down_table;
|
||||
TableItem *roll_up_table = NULL;
|
||||
ObSelectStmt *drill_down_stmt = NULL;
|
||||
ObSelectStmt *&rewrite_view_stmt = drill_down_stmt;
|
||||
ObDMLStmt *roll_up_stmt = NULL;
|
||||
bool match_main =false;
|
||||
|
||||
if (OB_ISNULL(stmt)) {
|
||||
if (OB_ISNULL(stmt) ||
|
||||
OB_ISNULL(drill_down_table = main_stmt->get_table_item(main_stmt->get_from_item(drill_down_idx))) ||
|
||||
OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("stmt is null", K(ret));
|
||||
} else if (OB_ISNULL(drill_down_table = main_stmt->get_table_item_by_id(
|
||||
main_stmt->get_from_item(drill_down_idx).table_id_))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
} else if (OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
LOG_WARN("stmt is null", K(ret), K(stmt), K(drill_down_table), K(drill_down_stmt));
|
||||
} else if (roll_up_idx == -1) {
|
||||
roll_up_stmt = main_stmt;
|
||||
match_main = true;
|
||||
} else if (OB_ISNULL(roll_up_table = main_stmt->get_table_item_by_id(
|
||||
main_stmt->get_from_item(roll_up_idx).table_id_))) {
|
||||
} else if (OB_ISNULL(roll_up_table = main_stmt->get_table_item(main_stmt->get_from_item(roll_up_idx))) ||
|
||||
OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
} else if (OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
LOG_WARN("rollup table is invalid", K(roll_up_table), K(roll_up_stmt));
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
//do nothing
|
||||
} else if (match_main) {
|
||||
if (OB_FAIL(adjust_column_and_table(main_stmt, rewrite_table, map_info))) {
|
||||
if (OB_FAIL(adjust_column_and_table(main_stmt, drill_down_table, map_info))) {
|
||||
LOG_WARN("adjust column and table failed");
|
||||
} else if (OB_FAIL(adjust_agg_to_win(rewrite_view_stmt))) {
|
||||
} else if (OB_FAIL(adjust_agg_to_win(drill_down_stmt))) {
|
||||
LOG_WARN("adjust agg to win faield", K(ret));
|
||||
}
|
||||
} else {
|
||||
@ -338,7 +328,6 @@ int ObTransformWinMagic::do_transform_from_type(ObDMLStmt *&stmt,
|
||||
LOG_WARN("failed to formalize stmt info", K(ret));
|
||||
}
|
||||
}
|
||||
LOG_DEBUG("transformed stmt: ",K(*stmt));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1352,12 +1341,12 @@ int ObTransformWinMagic::adjust_agg_to_win(ObSelectStmt *view_stmt)
|
||||
}
|
||||
|
||||
int ObTransformWinMagic::adjust_view_for_trans(ObDMLStmt *main_stmt,
|
||||
TableItem *&drill_down_table,
|
||||
TableItem *roll_up_table,
|
||||
TableItem *&transed_view_table,
|
||||
ObIArray<ObRawExpr *> &new_transed_output,
|
||||
ObStmtCompareContext &context,
|
||||
ObStmtMapInfo &map_info)
|
||||
TableItem *&drill_down_table,
|
||||
TableItem *roll_up_table,
|
||||
TableItem *&transed_view_table,
|
||||
ObIArray<ObRawExpr *> &new_transed_output,
|
||||
ObStmtCompareContext &context,
|
||||
ObStmtMapInfo &map_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSelectStmt *drill_down_stmt = NULL;
|
||||
@ -1369,21 +1358,27 @@ int ObTransformWinMagic::adjust_view_for_trans(ObDMLStmt *main_stmt,
|
||||
ObSEArray<ObRawExpr *, 4> new_select_exprs_for_trans;
|
||||
ObSEArray<ObRawExpr *, 4> old_roll_up_view_output_columns;
|
||||
ObSEArray<ObRawExpr *, 4> new_transed_view_output_columns;
|
||||
|
||||
if (OB_ISNULL(main_stmt) || OB_ISNULL(drill_down_table) || OB_ISNULL(roll_up_table) ||
|
||||
OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_) ||
|
||||
OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("pointer is null", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(main_stmt,
|
||||
ctx_,
|
||||
drill_down_table,
|
||||
transed_view_table))) {
|
||||
LOG_WARN("create view with table failed", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_,
|
||||
main_stmt,
|
||||
transed_view_table,
|
||||
drill_down_table))) {
|
||||
LOG_WARN("failed to create empty view table", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_,
|
||||
main_stmt,
|
||||
transed_view_table,
|
||||
drill_down_table))) {
|
||||
LOG_WARN("failed to create inline view", K(ret));
|
||||
} else if (OB_ISNULL(transed_view_table) ||
|
||||
OB_ISNULL(transed_view_table->ref_query_) ||
|
||||
transed_view_table->ref_query_->get_table_size() != 1 ) {
|
||||
OB_UNLIKELY(transed_view_table->ref_query_->get_table_size() != 1)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("transed view table is null", K(ret));
|
||||
LOG_WARN("transed view table is null", K(ret), K(transed_view_table));
|
||||
} else {
|
||||
drill_down_table = transed_view_table->ref_query_->get_table_item(0);
|
||||
}
|
||||
|
@ -926,16 +926,16 @@ Query Plan
|
||||
=======================================================================
|
||||
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
|
||||
-----------------------------------------------------------------------
|
||||
|0 |TEMP TABLE TRANSFORMATION | |2 |79 |
|
||||
|1 | TEMP TABLE INSERT |TEMP1 |11 |78 |
|
||||
|2 | HASH JOIN | |11 |76 |
|
||||
|3 | HASH JOIN | |121 |36 |
|
||||
|4 | HASH JOIN | |11 |15 |
|
||||
|0 |TEMP TABLE TRANSFORMATION | |2 |78 |
|
||||
|1 | TEMP TABLE INSERT |TEMP1 |11 |76 |
|
||||
|2 | HASH JOIN | |11 |74 |
|
||||
|3 | HASH JOIN | |121 |35 |
|
||||
|4 | HASH JOIN | |11 |14 |
|
||||
|5 | TABLE SCAN |t6 |11 |3 |
|
||||
|6 | HASH JOIN | |11 |9 |
|
||||
|7 | TABLE SCAN |t5 |11 |3 |
|
||||
|8 | TABLE SCAN |t4 |11 |3 |
|
||||
|9 | NESTED-LOOP JOIN CARTESIAN | |121 |9 |
|
||||
|9 | NESTED-LOOP JOIN CARTESIAN | |121 |8 |
|
||||
|10| TABLE SCAN |t3 |11 |3 |
|
||||
|11| MATERIAL | |11 |3 |
|
||||
|12| TABLE SCAN |t1 |11 |3 |
|
||||
@ -950,17 +950,17 @@ Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256
|
||||
1 - output(nil), filter(nil), rowset=256
|
||||
2 - output([t1.c1], [t2.c1], [t2.c2], [t5.c1], [t5.c2], [t6.c2]), filter(nil), rowset=256
|
||||
2 - output([t5.c2], [t2.c1], [t1.c1], [t2.c2], [t5.c1], [t6.c2]), filter(nil), rowset=256
|
||||
equal_conds([t1.c1 = t2.c1], [t2.c2 = t3.c1]), other_conds(nil)
|
||||
3 - output([t1.c1], [t5.c1], [t5.c2], [t6.c2], [t3.c1]), filter(nil), rowset=256
|
||||
3 - output([t5.c2], [t1.c1], [t5.c1], [t6.c2], [t3.c1]), filter(nil), rowset=256
|
||||
equal_conds([t3.c2 = t4.c1]), other_conds(nil)
|
||||
4 - output([t5.c1], [t5.c2], [t6.c2], [t4.c1]), filter(nil), rowset=256
|
||||
4 - output([t5.c2], [t5.c1], [t6.c2], [t4.c1]), filter(nil), rowset=256
|
||||
equal_conds([t5.c2 = t6.c1]), other_conds(nil)
|
||||
5 - output([t6.c1], [t6.c2]), filter(nil), rowset=256
|
||||
access([t6.c1], [t6.c2]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([t6.__pk_increment]), range(MIN ; MAX)always true
|
||||
6 - output([t5.c1], [t5.c2], [t4.c1]), filter(nil), rowset=256
|
||||
6 - output([t5.c2], [t5.c1], [t4.c1]), filter(nil), rowset=256
|
||||
equal_conds([t4.c2 = t5.c1]), other_conds(nil)
|
||||
7 - output([t5.c1], [t5.c2]), filter([t5.c2 != 44 OR t5.c2 != 55]), rowset=256
|
||||
access([t5.c1], [t5.c2]), partitions(p0)
|
||||
@ -989,11 +989,11 @@ Outputs & filters:
|
||||
15 - output([cast(T_FUN_COUNT(*), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.t2.c1)]), filter(nil), rowset=256
|
||||
group(nil), agg_func([T_FUN_COUNT(*)], [T_FUN_SUM(VIEW1.t2.c1)])
|
||||
16 - output([VIEW1.t2.c1]), filter([VIEW1.t5.c2 != 44]), rowset=256
|
||||
access([VIEW1.t2.c1], [VIEW1.t5.c2])
|
||||
access([VIEW1.t5.c2], [VIEW1.t2.c1])
|
||||
17 - output([T_FUN_SUM(VIEW2.t1.c1)], [cast(T_FUN_MAX(VIEW2.t2.c2), DECIMAL(11, 0)) + T_FUN_SUM(VIEW2.t5.c1 - VIEW2.t6.c2)]), filter(nil), rowset=256
|
||||
group(nil), agg_func([T_FUN_SUM(VIEW2.t1.c1)], [T_FUN_MAX(VIEW2.t2.c2)], [T_FUN_SUM(VIEW2.t5.c1 - VIEW2.t6.c2)])
|
||||
18 - output([VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t6.c2]), filter([VIEW2.t5.c2 != 55]), rowset=256
|
||||
access([VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t5.c2], [VIEW2.t6.c2])
|
||||
access([VIEW2.t5.c2], [VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t6.c2])
|
||||
select /*+ leading(t6, (t5, t4), (t3, t1), (t2)) */ count(*), sum(t2.c1) from nn1 t1, nn1 t2 , nn1 t3, nn1 t4, nn1 t5, nn1 t6
|
||||
where t1.c1 = t2.c1 and t2.c2 = t3.c1 and t3.c2 = t4.c1 and t4.c2 = t5.c1 and t5.c2 = t6.c1 and t5.c2 <> 44
|
||||
union ALL
|
||||
@ -2479,10 +2479,10 @@ Outputs & filters:
|
||||
conds(nil), nl_params_(nil), batch_join=false
|
||||
5 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
6 - output([UNION([1])]), filter(nil), rowset=256
|
||||
6 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
7 - output([UNION([1])]), filter(nil), rowset=256
|
||||
8 - output([1]), filter(nil), rowset=256
|
||||
7 - output(nil), filter(nil), rowset=256
|
||||
8 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
9 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds(nil)
|
||||
@ -2494,7 +2494,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
12 - output([1]), filter(nil), rowset=256
|
||||
12 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
13 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
@ -2509,10 +2509,10 @@ Outputs & filters:
|
||||
16 - output(nil), filter(nil), rowset=256
|
||||
17 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
18 - output([UNION([1])]), filter(nil), rowset=256
|
||||
18 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
19 - output([UNION([1])]), filter(nil), rowset=256
|
||||
20 - output([1]), filter(nil), rowset=256
|
||||
19 - output(nil), filter(nil), rowset=256
|
||||
20 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
21 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds(nil)
|
||||
@ -2524,7 +2524,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
24 - output([1]), filter(nil), rowset=256
|
||||
24 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
25 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
@ -2611,10 +2611,10 @@ Outputs & filters:
|
||||
conds(nil), nl_params_(nil), batch_join=false
|
||||
5 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
6 - output([UNION([1])]), filter(nil), rowset=256
|
||||
6 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
7 - output([UNION([1])]), filter(nil), rowset=256
|
||||
8 - output([1]), filter(nil), rowset=256
|
||||
7 - output(nil), filter(nil), rowset=256
|
||||
8 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
9 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds(nil)
|
||||
@ -2626,7 +2626,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
12 - output([1]), filter(nil), rowset=256
|
||||
12 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
13 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
@ -2641,10 +2641,10 @@ Outputs & filters:
|
||||
16 - output(nil), filter(nil), rowset=256
|
||||
17 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
18 - output([UNION([1])]), filter(nil), rowset=256
|
||||
18 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
19 - output([UNION([1])]), filter(nil), rowset=256
|
||||
20 - output([1]), filter(nil), rowset=256
|
||||
19 - output(nil), filter(nil), rowset=256
|
||||
20 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
21 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds(nil)
|
||||
@ -2656,7 +2656,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
24 - output([1]), filter(nil), rowset=256
|
||||
24 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
25 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
@ -2743,10 +2743,10 @@ Outputs & filters:
|
||||
conds(nil), nl_params_(nil), batch_join=false
|
||||
5 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
6 - output([UNION([1])]), filter(nil), rowset=256
|
||||
6 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
7 - output([UNION([1])]), filter(nil), rowset=256
|
||||
8 - output([1]), filter(nil), rowset=256
|
||||
7 - output(nil), filter(nil), rowset=256
|
||||
8 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
9 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds(nil)
|
||||
@ -2758,7 +2758,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
12 - output([1]), filter(nil), rowset=256
|
||||
12 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
13 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
@ -2773,10 +2773,10 @@ Outputs & filters:
|
||||
16 - output(nil), filter(nil), rowset=256
|
||||
17 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
18 - output([UNION([1])]), filter(nil), rowset=256
|
||||
18 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
19 - output([UNION([1])]), filter(nil), rowset=256
|
||||
20 - output([1]), filter(nil), rowset=256
|
||||
19 - output(nil), filter(nil), rowset=256
|
||||
20 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
21 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds(nil)
|
||||
@ -2788,7 +2788,7 @@ Outputs & filters:
|
||||
access([b.d1]), partitions(p0)
|
||||
is_index_back=false, is_global_index=false,
|
||||
range_key([b.__pk_increment]), range(MIN ; MAX)always true
|
||||
24 - output([1]), filter(nil), rowset=256
|
||||
24 - output(nil), filter(nil), rowset=256
|
||||
limit(1), offset(nil)
|
||||
25 - output(nil), filter(nil), rowset=256
|
||||
equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))])
|
||||
|
@ -35,7 +35,7 @@ Outputs & filters:
|
||||
2 - output(nil), filter(nil), rowset=256
|
||||
dop=2
|
||||
3 - output(nil), filter(nil), rowset=256
|
||||
4 - output([t1.c1], [t1.c2], [T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
|
||||
4 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))], [t1.c1], [t1.c2]), filter(nil), rowset=256
|
||||
group([t1.c1], [t1.c2]), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))])
|
||||
5 - output([t1.c1], [t1.c2], [T_FUN_COUNT(*)]), filter(nil), rowset=256
|
||||
6 - output([t1.c1], [t1.c2], [T_FUN_COUNT(*)]), filter(nil), rowset=256
|
||||
@ -62,10 +62,10 @@ Outputs & filters:
|
||||
dop=2
|
||||
18 - output([VIEW2.t1.c1], [VIEW2.t1.c2]), filter(nil), rowset=256
|
||||
access([VIEW2.t1.c1], [VIEW2.t1.c2])
|
||||
19 - output([VIEW3.t1.c1], [VIEW3.T_FUN_COUNT(*)]), filter(nil), rowset=256
|
||||
access([VIEW3.t1.c1], [VIEW3.T_FUN_COUNT(*)])
|
||||
20 - output([VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)]), filter(nil), rowset=256
|
||||
access([VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)])
|
||||
19 - output([VIEW3.T_FUN_COUNT(*)], [VIEW3.t1.c1]), filter(nil), rowset=256
|
||||
access([VIEW3.T_FUN_COUNT(*)], [VIEW3.t1.c1])
|
||||
20 - output([VIEW1.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2]), filter(nil), rowset=256
|
||||
access([VIEW1.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2])
|
||||
explain select /*+ use_px parallel(2) use_merge(a b) */ b.c2, sum(a.c3) from (select /*+ NO_USE_HASH_AGGREGATION */ c1, c2, count(*) c3 from t1 group by 1, 2) a, t2 b where a.c1 = b.c1 group by 1;
|
||||
Query Plan
|
||||
=========================================================================
|
||||
|
@ -221,7 +221,7 @@ Outputs & filters:
|
||||
3 - output(nil), filter(nil), rowset=256
|
||||
4 - output(nil), filter(nil), rowset=256
|
||||
access(nil)
|
||||
5 - output([1]), filter(nil), rowset=256
|
||||
5 - output(nil), filter(nil), rowset=256
|
||||
access(nil), partitions(p0)
|
||||
limit(1), offset(nil), is_index_back=false, is_global_index=false,
|
||||
range_key([t3.__pk_increment]), range(MIN ; MAX)always true
|
||||
|
Loading…
x
Reference in New Issue
Block a user