diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index dcb5b488cc..58ef9a1219 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -9580,7 +9580,7 @@ int ObLogPlan::check_if_subplan_filter_match_repart(ObLogicalOperator *top, if (OB_ISNULL(top)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (!top->is_distributed()) { + } else if (top->is_match_all()) { is_match_repart = false; } else if (OB_FAIL(append(input_esets, top->get_output_equal_sets()))) { LOG_WARN("failed to append equal sets", K(ret)); @@ -9589,7 +9589,8 @@ int ObLogPlan::check_if_subplan_filter_match_repart(ObLogicalOperator *top, ObLogicalOperator *pre_child = NULL; ObSEArray left_keys; ObSEArray right_keys; - ObSEArray pre_child_keys; + ObSEArray pre_left_keys; + ObSEArray pre_right_keys; ObSEArray target_part_keys; ObSEArray null_safe_info; is_match_repart = true; @@ -9628,17 +9629,23 @@ int ObLogPlan::check_if_subplan_filter_match_repart(ObLogicalOperator *top, } else if (!is_match_repart) { //do nothing } else if (i < 1) { - if (OB_FAIL(pre_child_keys.assign(right_keys))) { + if (OB_FAIL(pre_left_keys.assign(left_keys))) { + LOG_WARN("failed to assign exprs", K(ret)); + } else if (OB_FAIL(pre_right_keys.assign(right_keys))) { LOG_WARN("failed to assign exprs", K(ret)); } else { pre_child = child; } + } else if (!ObOptimizerUtil::is_exprs_equivalent(left_keys, + pre_left_keys, + input_esets)) { + is_match_repart = false; } else if(OB_ISNULL(pre_child)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); } else if (OB_FAIL(ObShardingInfo::check_if_match_partition_wise( input_esets, - pre_child_keys, + pre_right_keys, right_keys, pre_child->get_strong_sharding(), child->get_strong_sharding(), diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 8c061715de..2539c3ab97 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -558,6 +558,20 @@ bool ObOptimizerUtil::is_expr_equivalent(const ObRawExpr *from, return found; } +bool ObOptimizerUtil::is_exprs_equivalent(const common::ObIArray &from, + const common::ObIArray &to, + const EqualSets &equal_sets) +{ + bool b_ret = true; + if (from.count() != to.count()) { + b_ret = false; + } + for (int64_t i = 0; b_ret && i < from.count(); ++i) { + b_ret = is_expr_equivalent(from.at(i), to.at(i), equal_sets); + } + return b_ret; +} + bool ObOptimizerUtil::is_expr_equivalent(const ObRawExpr *from, const ObRawExpr *to) { diff --git a/src/sql/optimizer/ob_optimizer_util.h b/src/sql/optimizer/ob_optimizer_util.h index d9feb7d112..d665c8564b 100644 --- a/src/sql/optimizer/ob_optimizer_util.h +++ b/src/sql/optimizer/ob_optimizer_util.h @@ -144,6 +144,10 @@ public: const ObRawExpr *to, const EqualSets &equal_sets); + static bool is_exprs_equivalent(const common::ObIArray &from, + const common::ObIArray &to, + const EqualSets &equal_sets); + static bool is_expr_equivalent(const ObRawExpr *from, const ObRawExpr *to);