Patch bugfix from 3.1.x.
This commit is contained in:
@ -102,9 +102,7 @@ int ObTransformOuterJoinLimitPushDown::check_basic(ObDMLStmt* stmt, OjLimitPushD
|
|||||||
select_stmt->has_group_by() || select_stmt->has_having() || select_stmt->has_rollup() ||
|
select_stmt->has_group_by() || select_stmt->has_having() || select_stmt->has_rollup() ||
|
||||||
select_stmt->has_window_function() || select_stmt->has_sequence() ||
|
select_stmt->has_window_function() || select_stmt->has_sequence() ||
|
||||||
select_stmt->get_semi_infos().count() > 0 ||
|
select_stmt->get_semi_infos().count() > 0 ||
|
||||||
// disable meaningless distinct co-exists with orderby cases.
|
select_stmt->has_distinct()) {
|
||||||
// distinct with limit only is allowed and no need special handling.
|
|
||||||
(select_stmt->has_distinct() && select_stmt->has_order_by())) {
|
|
||||||
is_valid = false;
|
is_valid = false;
|
||||||
} else if (OB_FAIL(check_limit(select_stmt, is_valid_limit))) {
|
} else if (OB_FAIL(check_limit(select_stmt, is_valid_limit))) {
|
||||||
LOG_WARN("failed to check the validity of limit expr", K(ret));
|
LOG_WARN("failed to check the validity of limit expr", K(ret));
|
||||||
@ -421,22 +419,31 @@ int ObTransformOuterJoinLimitPushDown::check_validity_for_target_table(OjLimitPu
|
|||||||
int ObTransformOuterJoinLimitPushDown::do_transform(OjLimitPushDownHelper& helper)
|
int ObTransformOuterJoinLimitPushDown::do_transform(OjLimitPushDownHelper& helper)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
TableItem* target_view_table = NULL;
|
ObSelectStmt *ref_query = NULL;
|
||||||
if (OB_ISNULL(helper.select_stmt_) || OB_ISNULL(helper.target_table_)) {
|
if (OB_ISNULL(helper.select_stmt_) || OB_ISNULL(helper.target_table_)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("invalid parameter in helper", K(ret));
|
LOG_WARN("invalid parameter in helper", K(ret));
|
||||||
} else if (helper.need_create_view_ && OB_FAIL(prepare_view_table(helper.select_stmt_,
|
} else if (OB_FAIL(remove_and_copy_condition_orderby(helper.select_stmt_,
|
||||||
helper.target_table_,
|
helper.extracted_conditions_,
|
||||||
helper.extracted_conditions_,
|
helper.saved_order_items_))) {
|
||||||
helper.saved_order_items_,
|
LOG_WARN("failed to do remove and copy for condition and orderby", K(ret));
|
||||||
helper.view_table_))) {
|
} else if (helper.need_create_view_ &&
|
||||||
|
OB_FAIL(ObTransformUtils::create_view_with_table(helper.select_stmt_,
|
||||||
|
ctx_,
|
||||||
|
helper.target_table_,
|
||||||
|
helper.view_table_))) {
|
||||||
LOG_WARN("failed to prepare new view for pushing down", K(ret));
|
LOG_WARN("failed to prepare new view for pushing down", K(ret));
|
||||||
|
} else if (OB_ISNULL(helper.view_table_) ||
|
||||||
|
!helper.view_table_->is_generated_table() ||
|
||||||
|
OB_ISNULL(ref_query = helper.view_table_->ref_query_)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("invalid view table", K(ret));
|
||||||
} else if (OB_FAIL(pushdown_view_table(helper.select_stmt_,
|
} else if (OB_FAIL(pushdown_view_table(helper.select_stmt_,
|
||||||
helper.view_table_,
|
helper.view_table_,
|
||||||
helper.extracted_conditions_,
|
helper.extracted_conditions_,
|
||||||
helper.saved_order_items_,
|
helper.saved_order_items_,
|
||||||
!helper.need_create_view_,
|
!helper.need_create_view_,
|
||||||
helper.is_limit_only_))) {
|
helper.is_limit_only_))) {
|
||||||
LOG_WARN("failed to push down view table", K(ret));
|
LOG_WARN("failed to push down view table", K(ret));
|
||||||
} else { /* do nothing */
|
} else { /* do nothing */
|
||||||
}
|
}
|
||||||
@ -449,32 +456,6 @@ int ObTransformOuterJoinLimitPushDown::do_transform(OjLimitPushDownHelper& helpe
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObTransformOuterJoinLimitPushDown::prepare_view_table(ObSelectStmt* stmt, TableItem* target_table,
|
|
||||||
ObIArray<ObRawExpr*>& extracted_conditions, ObIArray<OrderItem>& saved_order_items, TableItem*& view_table)
|
|
||||||
{
|
|
||||||
int ret = OB_SUCCESS;
|
|
||||||
ObSelectStmt* ref_query = NULL;
|
|
||||||
// before warpping with view, remove extracted condition exprs in upper stmt,
|
|
||||||
// and do condition exprs copy avoid being modified by create_view_with_table,
|
|
||||||
// which will be added back to the created view later.
|
|
||||||
// order by exprs have been copied at former collection stage.
|
|
||||||
if (OB_ISNULL(stmt) || OB_ISNULL(target_table)) {
|
|
||||||
ret = OB_ERR_UNEXPECTED;
|
|
||||||
LOG_WARN("invalid stmt", K(ret));
|
|
||||||
} else if (OB_FAIL(remove_and_copy_condition_orderby(stmt, extracted_conditions, saved_order_items))) {
|
|
||||||
LOG_WARN("failed to do remove and copy for condition and orderby", K(ret));
|
|
||||||
} else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, target_table, view_table))) {
|
|
||||||
LOG_WARN("failed to create view with table", K(ret));
|
|
||||||
} else if (OB_ISNULL(view_table) || !view_table->is_generated_table() ||
|
|
||||||
OB_ISNULL(ref_query = view_table->ref_query_)) {
|
|
||||||
ret = OB_ERR_UNEXPECTED;
|
|
||||||
LOG_WARN("get unexpected view table", K(ret), K(*view_table));
|
|
||||||
} else {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ObTransformOuterJoinLimitPushDown::remove_and_copy_condition_orderby(
|
int ObTransformOuterJoinLimitPushDown::remove_and_copy_condition_orderby(
|
||||||
ObSelectStmt* stmt, ObIArray<ObRawExpr*>& extracted_conditions, ObIArray<OrderItem>& saved_order_items)
|
ObSelectStmt* stmt, ObIArray<ObRawExpr*>& extracted_conditions, ObIArray<OrderItem>& saved_order_items)
|
||||||
{
|
{
|
||||||
@ -532,8 +513,6 @@ int ObTransformOuterJoinLimitPushDown::add_condition_expr_for_viewtable(
|
|||||||
if (OB_ISNULL(generated_view)) {
|
if (OB_ISNULL(generated_view)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("invalid generated_view", K(ret));
|
LOG_WARN("invalid generated_view", K(ret));
|
||||||
} else if (OB_FAIL(append(generated_view->get_condition_exprs(), extracted_conditions))) {
|
|
||||||
LOG_WARN("failed to append condition exprs back", K(ret));
|
|
||||||
} else if (need_rename) {
|
} else if (need_rename) {
|
||||||
// renaming for saved condition expr from upper level
|
// renaming for saved condition expr from upper level
|
||||||
// after pushdown into generated_view condition exprs.
|
// after pushdown into generated_view condition exprs.
|
||||||
@ -541,7 +520,10 @@ int ObTransformOuterJoinLimitPushDown::add_condition_expr_for_viewtable(
|
|||||||
ObSEArray<ObRawExpr*, 16> new_column_exprs;
|
ObSEArray<ObRawExpr*, 16> new_column_exprs;
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < extracted_conditions.count(); ++i) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < extracted_conditions.count(); ++i) {
|
||||||
ObRawExpr* expr = extracted_conditions.at(i);
|
ObRawExpr* expr = extracted_conditions.at(i);
|
||||||
if (OB_FAIL(ObRawExprUtils::extract_column_exprs(expr, old_column_exprs))) {
|
if (OB_ISNULL(expr)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("invalid condition", K(ret));
|
||||||
|
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(expr, old_column_exprs))) {
|
||||||
LOG_WARN("failed to extract column expr", K(ret));
|
LOG_WARN("failed to extract column expr", K(ret));
|
||||||
} else if (OB_FAIL(ObTransformUtils::convert_column_expr_to_select_expr(
|
} else if (OB_FAIL(ObTransformUtils::convert_column_expr_to_select_expr(
|
||||||
old_column_exprs, *generated_view, new_column_exprs))) {
|
old_column_exprs, *generated_view, new_column_exprs))) {
|
||||||
@ -552,6 +534,11 @@ int ObTransformOuterJoinLimitPushDown::add_condition_expr_for_viewtable(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
if (OB_FAIL(append(generated_view->get_condition_exprs(), extracted_conditions))) {
|
||||||
|
LOG_WARN("failed to append condition exprs back", K(ret));
|
||||||
|
} else {/* do nothing */}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,37 +549,34 @@ int ObTransformOuterJoinLimitPushDown::add_orderby_for_viewtable(
|
|||||||
if (OB_ISNULL(generated_view) || OB_ISNULL(upper_stmt)) {
|
if (OB_ISNULL(generated_view) || OB_ISNULL(upper_stmt)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("invalid parameter", K(ret));
|
LOG_WARN("invalid parameter", K(ret));
|
||||||
} else if (!need_rename) {
|
} else if (need_rename) {
|
||||||
// directly assign saved order items to generated_view
|
|
||||||
generated_view->get_order_items().reset();
|
|
||||||
if (OB_FAIL(generated_view->get_order_items().assign(saved_order_items))) {
|
|
||||||
LOG_WARN("assign new order items failed", K(ret));
|
|
||||||
} else { /* do nothing */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// single table item generated_table into here.
|
|
||||||
// order by column needs to be renamed before moving
|
// order by column needs to be renamed before moving
|
||||||
// from upper_stmt to inner generated_view.
|
// from upper_stmt to inner generated_view.
|
||||||
ObSEArray<ObRawExpr*, 16> old_order_exprs;
|
for (int64_t i = 0; OB_SUCC(ret) && i < saved_order_items.count(); i++) {
|
||||||
ObSEArray<ObRawExpr*, 16> new_order_exprs;
|
ObSEArray<ObRawExpr*, 16> old_order_exprs;
|
||||||
if (OB_FAIL(append(generated_view->get_order_items(), upper_stmt->get_order_items()))) {
|
ObSEArray<ObRawExpr*, 16> new_order_exprs;
|
||||||
|
if (OB_ISNULL(saved_order_items.at(i).expr_)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("invalid expr", K(ret));
|
||||||
|
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(saved_order_items.at(i).expr_,
|
||||||
|
old_order_exprs))) {
|
||||||
|
LOG_WARN("failed to extract column expr", K(ret));
|
||||||
|
} else if (OB_FAIL(ObTransformUtils::convert_column_expr_to_select_expr(old_order_exprs,
|
||||||
|
*generated_view,
|
||||||
|
new_order_exprs))) {
|
||||||
|
LOG_WARN("failed to convert columnexpr to select expr", K(ret));
|
||||||
|
} else if (OB_FAIL(ObTransformUtils::replace_expr(old_order_exprs,
|
||||||
|
new_order_exprs,
|
||||||
|
saved_order_items.at(i).expr_))) {
|
||||||
|
LOG_WARN("failed to replace expr for order item", K(ret));
|
||||||
|
} else {/* do nothing */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
if (OB_FAIL(append(generated_view->get_order_items(), saved_order_items))) {
|
||||||
LOG_WARN("failed to append order item", K(ret));
|
LOG_WARN("failed to append order item", K(ret));
|
||||||
} else {
|
} else {/* do nothing */
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < upper_stmt->get_order_item_size(); ++i) {
|
|
||||||
if (OB_FAIL(old_order_exprs.push_back(upper_stmt->get_order_items().at(i).expr_))) {
|
|
||||||
LOG_WARN("failed to append order item", K(ret));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (OB_SUCC(ret)) {
|
|
||||||
if (OB_FAIL(ObTransformUtils::convert_column_expr_to_select_expr(
|
|
||||||
old_order_exprs, *generated_view, new_order_exprs))) {
|
|
||||||
LOG_WARN("failed to convert columnexpr to select expr", K(ret));
|
|
||||||
} else if (OB_FAIL(ObTransformUtils::replace_expr_for_order_item(
|
|
||||||
old_order_exprs, new_order_exprs, generated_view->get_order_items()))) {
|
|
||||||
LOG_WARN("failed to replace expr for order item", K(ret));
|
|
||||||
} else { /* do nothing */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@ -88,9 +88,6 @@ private:
|
|||||||
|
|
||||||
int check_validity_for_target_table(OjLimitPushDownHelper& helper, bool& is_valid);
|
int check_validity_for_target_table(OjLimitPushDownHelper& helper, bool& is_valid);
|
||||||
|
|
||||||
int prepare_view_table(ObSelectStmt* stmt, TableItem* target_table, ObIArray<ObRawExpr*>& extracted_conditions,
|
|
||||||
ObIArray<OrderItem>& saved_order_items, TableItem*& view_table);
|
|
||||||
|
|
||||||
int pushdown_view_table(ObSelectStmt* stmt, TableItem* target_table, ObIArray<ObRawExpr*>& extracted_conditions,
|
int pushdown_view_table(ObSelectStmt* stmt, TableItem* target_table, ObIArray<ObRawExpr*>& extracted_conditions,
|
||||||
ObIArray<OrderItem>& saved_order_items, bool need_rename, bool is_limit_only);
|
ObIArray<OrderItem>& saved_order_items, bool need_rename, bool is_limit_only);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user