diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 0441a30238..c3d3f156ed 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -3776,9 +3776,9 @@ int ObLogPlan::inner_remove_redundancy_pred(ObIArray &join_pred, right_table.is_superset(right_expr->get_relation_ids()))) { // the pred does not join the given two tables, // decide whether remove this qual later - } else if (ObOptimizerUtil::is_expr_equivalent(left_expr, - right_expr, - equal_sets)) { + } else if (ObOptimizerUtil::in_same_equalset(left_expr, + right_expr, + equal_sets)) { // remove preds which is equation between two exprs in the same equal sets has_checked.at(i) = true; OPT_TRACE("remove redundancy join condition:", cur_expr); diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index cb205d5301..0903e58512 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -509,6 +509,23 @@ bool ObOptimizerUtil::is_same_ordering(const common::ObIArray &orderi return is_same; } +bool ObOptimizerUtil::in_same_equalset(const ObRawExpr *from, + const ObRawExpr *to, + const EqualSets &equal_sets) +{ + bool found = false; + int64_t N = equal_sets.count(); + for (int64_t i = 0; !found && i < N; ++i) { + if (OB_ISNULL(equal_sets.at(i))) { + LOG_WARN_RET(OB_ERR_UNEXPECTED, "get null equal set"); + } else if (find_equal_expr(*equal_sets.at(i), from) && + find_equal_expr(*equal_sets.at(i), to)) { + found = true; + } + } + return found; +} + bool ObOptimizerUtil::is_expr_equivalent(const ObRawExpr *from, const ObRawExpr *to, const EqualSets &equal_sets) diff --git a/src/sql/optimizer/ob_optimizer_util.h b/src/sql/optimizer/ob_optimizer_util.h index e35d5954ea..aec2a1276a 100644 --- a/src/sql/optimizer/ob_optimizer_util.h +++ b/src/sql/optimizer/ob_optimizer_util.h @@ -136,6 +136,10 @@ public: const common::ObIArray &ordering2, const EqualSets &equal_sets); + static bool in_same_equalset(const ObRawExpr *from, + const ObRawExpr *to, + const EqualSets &equal_sets); + static bool is_expr_equivalent(const ObRawExpr *from, const ObRawExpr *to, const EqualSets &equal_sets);