diff --git a/src/sql/resolver/dml/ob_stmt_expr_visitor.h b/src/sql/resolver/dml/ob_stmt_expr_visitor.h index 203749ee50..64cf75d8d6 100644 --- a/src/sql/resolver/dml/ob_stmt_expr_visitor.h +++ b/src/sql/resolver/dml/ob_stmt_expr_visitor.h @@ -181,6 +181,8 @@ public: int add_replace_exprs(const ObIArray &from_exprs, const ObIArray &to_exprs, const ObIArray *skip_exprs = NULL); + void set_skip_bool_param_mysql(bool skip) { replacer_.set_skip_bool_param_mysql(skip); } + bool is_skip_bool_param_mysql() { return replacer_.is_skip_bool_param_mysql(); } private: int add_skip_expr(const ObRawExpr *skip_expr); int check_expr_need_skip(const ObRawExpr *skip_expr, bool &need_skip); diff --git a/src/sql/resolver/expr/ob_raw_expr_replacer.cpp b/src/sql/resolver/expr/ob_raw_expr_replacer.cpp index eac1e9b25d..52c30430fb 100644 --- a/src/sql/resolver/expr/ob_raw_expr_replacer.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_replacer.cpp @@ -21,7 +21,7 @@ namespace oceanbase namespace sql { ObRawExprReplacer::ObRawExprReplacer() - : replace_happened_(false) + : replace_happened_(false), skip_bool_param_mysql_(false) {} ObRawExprReplacer::~ObRawExprReplacer() @@ -117,6 +117,15 @@ int ObRawExprReplacer::visit(ObOpRawExpr &expr) for (int64_t i = 0; OB_SUCC(ret) && i < count; ++i) { if (OB_FAIL(check_need_replace(expr.get_param_expr(i), new_expr, need_replace))) { LOG_WARN("failed to check need replace", K(ret)); + } else if (is_skip_bool_param_mysql()) { + if (T_OP_IS == expr.get_expr_type() && i == 1) { + //do nothing + } else if (T_OP_IS_NOT == expr.get_expr_type() && i == 1) { + //do nothing + } else if (need_replace) { + ret = expr.replace_param_expr(i, new_expr); + replace_happened_ = true; + } } else if (need_replace) { ret = expr.replace_param_expr(i, new_expr); replace_happened_ = true; diff --git a/src/sql/resolver/expr/ob_raw_expr_replacer.h b/src/sql/resolver/expr/ob_raw_expr_replacer.h index 4892dfc10e..5c2ce1b1c4 100644 --- a/src/sql/resolver/expr/ob_raw_expr_replacer.h +++ b/src/sql/resolver/expr/ob_raw_expr_replacer.h @@ -54,6 +54,8 @@ public: virtual bool skip_child(ObRawExpr &expr) override; bool get_replace_happened() const { return replace_happened_; } + void set_skip_bool_param_mysql(bool skip) { skip_bool_param_mysql_ = skip; } + bool is_skip_bool_param_mysql() { return skip_bool_param_mysql_; } int add_replace_expr(ObRawExpr *from_expr, ObRawExpr *to_expr); int add_replace_exprs(const ObIArray &from_exprs, @@ -78,6 +80,9 @@ private: hash::ObHashMap expr_replace_map_; bool replace_happened_; + //If true, skip param epxrs which are resolved as flags instead of exprs in mysql. + //(e.g. the second param of IS expr) + bool skip_bool_param_mysql_; }; } // end namespace sql diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 5e8947eee2..78ad5c991e 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -8524,41 +8524,33 @@ int ObTransformPreProcess::replace_remove_const_exprs(ObSelectStmt *stmt, LOG_WARN("failed to init compare context", K(ret)); } else { if (is_mysql_mode()) { - if (OB_FAIL(ObTransformUtils::replace_exprs(static_const_exprs, static_remove_const_exprs, stmt->get_having_exprs()))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::replace_exprs(column_ref_exprs, column_ref_remove_const_exprs, stmt->get_having_exprs()))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); + ObStmtExprReplacer replacer; + replacer.remove_all(); + replacer.add_scope(SCOPE_HAVING); + replacer.add_scope(SCOPE_SELECT); + replacer.add_scope(SCOPE_ORDERBY); + replacer.set_recursive(false); + replacer.set_skip_bool_param_mysql(true); + if (OB_FAIL(replacer.add_replace_exprs(static_const_exprs, static_remove_const_exprs))) { + LOG_WARN("failed to add replace exprs", K(ret)); + } else if (OB_FAIL(replacer.add_replace_exprs(column_ref_exprs, column_ref_remove_const_exprs))) { + LOG_WARN("failed to add replace exprs", K(ret)); + } else if (OB_FAIL(stmt->iterate_stmt_expr(replacer))) { + LOG_WARN("failed to iterate stmt expr", K(ret)); } - } else if (is_oracle_mode() && OB_FAIL(ObTransformUtils::replace_exprs(exec_params, exec_params_remove_const_exprs, stmt->get_having_exprs()))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } - } - for (int i = 0; OB_SUCC(ret) && i < stmt->get_select_item_size(); ++i) { - if (OB_ISNULL(stmt->get_select_item(i).expr_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret)); - } else if (is_mysql_mode()) { - if (OB_FAIL(ObTransformUtils::replace_expr(static_const_exprs, static_remove_const_exprs, stmt->get_select_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::replace_expr(column_ref_exprs, column_ref_remove_const_exprs, stmt->get_select_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); + } else { + ObStmtExprReplacer replacer; + replacer.remove_all(); + replacer.add_scope(SCOPE_HAVING); + replacer.add_scope(SCOPE_SELECT); + replacer.add_scope(SCOPE_ORDERBY); + replacer.set_recursive(false); + replacer.set_skip_bool_param_mysql(false); + if (OB_FAIL(replacer.add_replace_exprs(exec_params, exec_params_remove_const_exprs))) { + LOG_WARN("failed to add replace exprs", K(ret)); + } else if (OB_FAIL(stmt->iterate_stmt_expr(replacer))) { + LOG_WARN("failed to iterate stmt expr", K(ret)); } - } else if (OB_FAIL(ObTransformUtils::replace_expr(exec_params, exec_params_remove_const_exprs, stmt->get_select_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } - } - for (int i = 0; OB_SUCC(ret) && i < stmt->get_order_item_size(); ++i) { - if (OB_ISNULL(stmt->get_order_item(i).expr_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret)); - } else if (is_mysql_mode()) { - if (OB_FAIL(ObTransformUtils::replace_expr(static_const_exprs, static_remove_const_exprs, stmt->get_order_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::replace_expr(column_ref_exprs, column_ref_remove_const_exprs, stmt->get_order_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); - } - } else if (OB_FAIL(ObTransformUtils::replace_expr(exec_params, exec_params_remove_const_exprs, stmt->get_order_item(i).expr_))) { - LOG_WARN("failed to replace exec_params in having expr", K(ret)); } }