Fix shared exprs bugs when create inline view

This commit is contained in:
xianyu-w 2023-02-14 12:12:15 +00:00 committed by ob-robot
parent 50a6b3cda3
commit 0664c26d30
24 changed files with 911 additions and 1452 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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 */

View File

@ -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,

View File

@ -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;

View File

@ -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);
/**

View File

@ -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;
}

View File

@ -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));

View File

@ -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)
{

View File

@ -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);

View File

@ -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 exprrollup 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));
}
}
}

View File

@ -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

View File

@ -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 itemsgenerate 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,

View File

@ -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);
}

View File

@ -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)))])

View File

@ -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
=========================================================================

View File

@ -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