From d79c4f90311c4d4815af090d8ca906869ace1820 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Fri, 9 Feb 2024 07:28:50 +0000 Subject: [PATCH] disable predicate moving into values_table_query --- src/sql/optimizer/ob_log_expr_values.cpp | 7 ++++++- src/sql/rewrite/ob_transform_predicate_move_around.cpp | 7 +++++++ src/sql/rewrite/ob_transform_view_merge.cpp | 3 ++- src/sql/rewrite/ob_transform_where_subquery_pullup.cpp | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/sql/optimizer/ob_log_expr_values.cpp b/src/sql/optimizer/ob_log_expr_values.cpp index 85d648656..e66c28b64 100644 --- a/src/sql/optimizer/ob_log_expr_values.cpp +++ b/src/sql/optimizer/ob_log_expr_values.cpp @@ -311,7 +311,12 @@ int ObLogExprValues::allocate_expr_post(ObAllocExprContext &ctx) LOG_WARN("failed to construct sequence values", K(ret)); } else if (OB_FAIL(mark_probably_local_exprs())) { LOG_WARN("failed to mark local exprs", K(ret)); - } else { /*do nothing*/ } + } else if (is_values_table_) { /* defence code */ + if (OB_UNLIKELY(value_desc_.count() != get_output_exprs().count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("defence code, EXPRESSION request output_exprs equals to value_desc", K(ret)); + } + } return ret; } diff --git a/src/sql/rewrite/ob_transform_predicate_move_around.cpp b/src/sql/rewrite/ob_transform_predicate_move_around.cpp index d21a0d2fe..ba466f5ac 100644 --- a/src/sql/rewrite/ob_transform_predicate_move_around.cpp +++ b/src/sql/rewrite/ob_transform_predicate_move_around.cpp @@ -2841,6 +2841,9 @@ int ObTransformPredicateMoveAround::pushdown_into_semi_info(ObDMLStmt *stmt, OB_ISNULL(right_table = stmt->get_table_item_by_id(semi_info->right_table_id_))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("params have null", K(ret), K(stmt), K(semi_info), K(right_table)); + } else if (right_table->is_values_table()) { + /* not allow predicate moving into values table */ + OPT_TRACE("right table is values table"); } else if (OB_FAIL(stmt->get_table_rel_ids(semi_info->left_table_ids_, left_rel_ids))) { LOG_WARN("failed to get left rel ids", K(ret)); } else if (OB_FAIL(stmt->get_table_rel_ids(semi_info->right_table_id_, right_rel_ids))) { @@ -3044,6 +3047,10 @@ int ObTransformPredicateMoveAround::pushdown_into_table(ObDMLStmt *stmt, !table_item->is_generated_table() && !table_item->is_temp_table()) { // do nothing + } else if (table_item->is_generated_table() && + NULL != table_item->ref_query_ && + table_item->ref_query_->is_values_table_query()) { + /* not allow predicate moving into values table query */ } else if (OB_FAIL(rename_preds.assign(table_preds))) { LOG_WARN("failed to assgin exprs", K(ret)); } else if (OB_FAIL(ObTransformUtils::extract_table_exprs(*stmt, diff --git a/src/sql/rewrite/ob_transform_view_merge.cpp b/src/sql/rewrite/ob_transform_view_merge.cpp index e9d07df3a..903bdda82 100644 --- a/src/sql/rewrite/ob_transform_view_merge.cpp +++ b/src/sql/rewrite/ob_transform_view_merge.cpp @@ -369,7 +369,8 @@ int ObTransformViewMerge::check_semi_right_table_can_be_merged(ObDMLStmt *stmt, || ref_query->has_sequence() || ref_query->is_hierarchical_query() || ref_query->has_ora_rowscn() - || (lib::is_mysql_mode() && ref_query->has_for_update())) { + || (lib::is_mysql_mode() && ref_query->has_for_update()) + || ref_query->is_values_table_query()) { can_be = false; } else if (OB_FAIL(ref_query->has_rownum(has_rownum))) { LOG_WARN("failed to check has rownum expr", K(ret)); diff --git a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp index 209a53b27..3271a7716 100644 --- a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp +++ b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp @@ -1238,7 +1238,7 @@ int ObWhereSubQueryPullup::check_subquery_validity(ObDMLStmt &stmt, } else if (!is_valid) { // do nothing OPT_TRACE("hint reject transform"); - } else if (!subquery->is_spj() || subquery->has_subquery()) { + } else if (!subquery->is_spj() || subquery->has_subquery() || subquery->is_values_table_query()) { is_valid = false; OPT_TRACE("subquery is not spj or has subquery"); } else if (OB_FAIL(subquery->get_column_exprs(columns))) {