disable expr pullup and const propagate with var assign

This commit is contained in:
yinyj17
2023-12-12 12:17:51 +00:00
committed by ob-robot
parent a323b61a4e
commit 6c4338e939
3 changed files with 32 additions and 13 deletions

View File

@ -227,16 +227,16 @@ int ObTransformConstPropagate::do_transform(ObDMLStmt *stmt,
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObSharedExprChecker shared_expr_checker; ObSharedExprChecker shared_expr_checker;
bool hint_allowed_trans = false; bool allow_trans = false;
if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->session_info_)) { if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->session_info_)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid parameter", K(ret)); LOG_WARN("invalid parameter", K(ret));
} else if (OB_FAIL(ObTransformRule::check_hint_status(*stmt, hint_allowed_trans))) { } else if (OB_FAIL(check_allow_trans(stmt, allow_trans))) {
LOG_WARN("failed to check_hint_status", K(ret)); LOG_WARN("failed to check trans allowed", K(ret));
} else if (!stmt->is_insert_stmt() && OB_FAIL(shared_expr_checker.init(*stmt))) { } else if (!stmt->is_insert_stmt() && OB_FAIL(shared_expr_checker.init(*stmt))) {
LOG_WARN("failed to init shared expr checker", K(ret)); LOG_WARN("failed to init shared expr checker", K(ret));
} else { } else {
ConstInfoContext const_ctx(shared_expr_checker, hint_allowed_trans); ConstInfoContext const_ctx(shared_expr_checker, allow_trans);
bool has_rollup_or_groupingsets = false; bool has_rollup_or_groupingsets = false;
bool is_happened = false; bool is_happened = false;
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
@ -487,6 +487,22 @@ int ObTransformConstPropagate::do_transform(ObDMLStmt *stmt,
return ret; return ret;
} }
// const info is always collected even if transform is not allowed
int ObTransformConstPropagate::check_allow_trans(ObDMLStmt *stmt, bool &allow_trans)
{
int ret = OB_SUCCESS;
bool hint_allowed_trans = false;
if (OB_ISNULL(stmt)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid parameter", K(ret));
} else if (OB_FAIL(ObTransformRule::check_hint_status(*stmt, hint_allowed_trans))) {
LOG_WARN("failed to check_hint_status", K(ret));
} else {
allow_trans = hint_allowed_trans && !stmt->is_contains_assignment();
}
return ret;
}
int ObTransformConstPropagate::exclude_redundancy_join_cond(ObIArray<ObRawExpr*> &condition_exprs, int ObTransformConstPropagate::exclude_redundancy_join_cond(ObIArray<ObRawExpr*> &condition_exprs,
ObIArray<ExprConstInfo> &expr_const_infos, ObIArray<ExprConstInfo> &expr_const_infos,
ObIArray<ObRawExpr*> &excluded_exprs) ObIArray<ObRawExpr*> &excluded_exprs)
@ -644,7 +660,7 @@ int ObTransformConstPropagate::recursive_collect_const_info_from_table(ObDMLStmt
if (LEFT_OUTER_JOIN == joined_table->joined_type_ || if (LEFT_OUTER_JOIN == joined_table->joined_type_ ||
RIGHT_OUTER_JOIN == joined_table->joined_type_) { RIGHT_OUTER_JOIN == joined_table->joined_type_) {
// FULL_OUT_JOIN is not transformed because may eliminate all equal join conditions // FULL_OUT_JOIN is not transformed because may eliminate all equal join conditions
ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.hint_allowed_trans_); ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.allow_trans_);
bool left_happened = false; bool left_happened = false;
bool right_happened = false; bool right_happened = false;
bool condition_happened = false; bool condition_happened = false;
@ -1058,7 +1074,7 @@ int ObTransformConstPropagate::replace_expr_internal(ObRawExpr *&cur_expr,
bool used_in_compare) bool used_in_compare)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (const_ctx.hint_allowed_trans_) { if (const_ctx.allow_trans_) {
ObSEArray<ObRawExpr *, 8> parent_exprs; ObSEArray<ObRawExpr *, 8> parent_exprs;
if (OB_FAIL(recursive_replace_expr(cur_expr, if (OB_FAIL(recursive_replace_expr(cur_expr,
parent_exprs, parent_exprs,
@ -1850,7 +1866,7 @@ int ObTransformConstPropagate::recursive_collect_equal_pair_from_condition(ObDML
} else if (T_OP_OR == expr->get_expr_type()) { } else if (T_OP_OR == expr->get_expr_type()) {
ObArray<ExprConstInfo> complex_infos; ObArray<ExprConstInfo> complex_infos;
for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) {
ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.hint_allowed_trans_); ConstInfoContext tmp_ctx(const_ctx.shared_expr_checker_, const_ctx.allow_trans_);
bool child_happened = false; bool child_happened = false;
bool current_happened = false; bool current_happened = false;
if (OB_FAIL(SMART_CALL(recursive_collect_equal_pair_from_condition(stmt, if (OB_FAIL(SMART_CALL(recursive_collect_equal_pair_from_condition(stmt,
@ -1962,7 +1978,7 @@ int ObTransformConstPropagate::replace_check_constraint_exprs(ObDMLStmt *stmt,
if (OB_ISNULL(stmt)) { if (OB_ISNULL(stmt)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(stmt)); LOG_WARN("get unexpected null", K(ret), K(stmt));
} else if (!const_ctx.hint_allowed_trans_) { } else if (!const_ctx.allow_trans_) {
/* do nothing */ /* do nothing */
} else { } else {
LOG_TRACE("begin replace check constraint exprs", K(const_ctx), K(stmt->get_check_constraint_items())); LOG_TRACE("begin replace check constraint exprs", K(const_ctx), K(stmt->get_check_constraint_items()));

View File

@ -91,10 +91,10 @@ private:
struct ConstInfoContext { struct ConstInfoContext {
ConstInfoContext(const ObSharedExprChecker &shared_expr_checker, ConstInfoContext(const ObSharedExprChecker &shared_expr_checker,
bool hint_allowed_trans) : active_const_infos_(), bool allow_trans) : active_const_infos_(),
expired_const_infos_(), expired_const_infos_(),
extra_excluded_exprs_(), extra_excluded_exprs_(),
hint_allowed_trans_(hint_allowed_trans), allow_trans_(allow_trans),
shared_expr_checker_(shared_expr_checker) shared_expr_checker_(shared_expr_checker)
{ {
} }
@ -109,13 +109,13 @@ private:
common::ObSEArray<ExprConstInfo, 4> active_const_infos_; common::ObSEArray<ExprConstInfo, 4> active_const_infos_;
common::ObSEArray<ExprConstInfo, 4> expired_const_infos_; common::ObSEArray<ExprConstInfo, 4> expired_const_infos_;
common::ObSEArray<ObRawExpr *, 4> extra_excluded_exprs_; common::ObSEArray<ObRawExpr *, 4> extra_excluded_exprs_;
bool hint_allowed_trans_; bool allow_trans_;
const ObSharedExprChecker &shared_expr_checker_; const ObSharedExprChecker &shared_expr_checker_;
TO_STRING_KV(K_(active_const_infos), TO_STRING_KV(K_(active_const_infos),
K_(expired_const_infos), K_(expired_const_infos),
K_(extra_excluded_exprs), K_(extra_excluded_exprs),
K_(hint_allowed_trans)); K_(allow_trans));
}; };
struct PullupConstInfo { struct PullupConstInfo {
@ -139,6 +139,8 @@ private:
K_(need_add_constraint)); K_(need_add_constraint));
}; };
int check_allow_trans(ObDMLStmt *stmt, bool &allow_trans);
int recursive_collect_const_info_from_table(ObDMLStmt *stmt, int recursive_collect_const_info_from_table(ObDMLStmt *stmt,
TableItem *table_item, TableItem *table_item,
ConstInfoContext &const_ctx, ConstInfoContext &const_ctx,

View File

@ -493,7 +493,8 @@ bool ObTransformExprPullup::is_view_acceptable_for_rewrite(TableItem &view)
&& !view.ref_query_->is_hierarchical_query() && !view.ref_query_->is_hierarchical_query()
&& !view.ref_query_->has_select_into() && !view.ref_query_->has_select_into()
&& !view.ref_query_->is_set_stmt() && !view.ref_query_->is_set_stmt()
&& !view.ref_query_->is_distinct(); && !view.ref_query_->is_distinct()
&& !view.ref_query_->is_contains_assignment();
} }
int ObTransformExprPullup::check_stmt_validity(const ObDMLStmt *stmt, bool &is_valid) int ObTransformExprPullup::check_stmt_validity(const ObDMLStmt *stmt, bool &is_valid)