diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 83e8ee44df..4c99b7dc50 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -6467,15 +6467,15 @@ int JoinPath::compute_join_path_ordering() } else if (JoinAlgo::MERGE_JOIN == join_algo_) { if (FULL_OUTER_JOIN != join_type_ && RIGHT_OUTER_JOIN != join_type_) { // 目前 ObMergeJoin 的实现只能继承左支的序 - if (!is_left_need_sort()) { + if (!is_left_need_sort() && !is_left_need_exchange()) { set_interesting_order_info(left_path_->get_interesting_order_info()); if(OB_FAIL(append(ordering_, left_path_->ordering_))) { LOG_WARN("failed to append join ordering", K(ret)); } else if (OB_FAIL(parent_->check_join_interesting_order(this))) { LOG_WARN("failed to update join interesting order info", K(ret)); } else { - is_range_order_ = is_fully_partition_wise() && left_path_->is_range_order_; - is_local_order_ = is_fully_partition_wise() && !left_path_->is_range_order_; + is_range_order_ = left_path_->is_range_order_; + is_local_order_ = left_path_->is_local_order_; } } else { int64_t interesting_order_info = OrderingFlag::NOT_MATCH; @@ -6487,7 +6487,7 @@ int JoinPath::compute_join_path_ordering() LOG_WARN("failed to check all interesting order", K(ret)); } else { add_interesting_order_flag(interesting_order_info); - is_local_order_ = is_fully_partition_wise(); + is_local_order_ = is_fully_partition_wise() || join_dist_algo_ == DIST_NONE_ALL; } } } else { /*do nothing*/ } @@ -8656,6 +8656,7 @@ int ObJoinOrder::compute_subquery_path_property(const uint64_t table_id, } else { path->set_interesting_order_info(interesting_order_info); path->is_local_order_ = root->get_is_local_order(); + path->is_range_order_ = root->get_is_range_order(); path->exchange_allocated_ = root->is_exchange_allocated(); path->phy_plan_type_ = root->get_phy_plan_type(); path->location_type_ = root->get_location_type(); diff --git a/src/sql/optimizer/ob_log_distinct.cpp b/src/sql/optimizer/ob_log_distinct.cpp index e9680a929e..ad3eb51bb8 100644 --- a/src/sql/optimizer/ob_log_distinct.cpp +++ b/src/sql/optimizer/ob_log_distinct.cpp @@ -77,7 +77,7 @@ int ObLogDistinct::compute_op_ordering() } else if (OB_FAIL(ObLogicalOperator::compute_op_ordering())) { LOG_WARN("failed to compute op ordering", K(ret)); } else { - is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty(); + is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty() && !is_range_order_; } return ret; } diff --git a/src/sql/optimizer/ob_log_group_by.cpp b/src/sql/optimizer/ob_log_group_by.cpp index c31b1dd3d9..f5e59d5b26 100644 --- a/src/sql/optimizer/ob_log_group_by.cpp +++ b/src/sql/optimizer/ob_log_group_by.cpp @@ -703,13 +703,13 @@ int ObLogGroupBy::compute_op_ordering() LOG_WARN("failed to set op ordering.", K(ret)); } else { is_range_order_ = child->get_is_range_order(); - is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty(); + is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty() && !is_range_order_; } } else if (OB_FAIL(set_op_ordering(child->get_op_ordering()))) { LOG_WARN("failed to set op ordering", K(ret)); } else { is_range_order_ = child->get_is_range_order(); - is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty(); + is_local_order_ = is_fully_partition_wise() && !get_op_ordering().empty() && !is_range_order_; } return ret; } diff --git a/src/sql/optimizer/ob_log_window_function.cpp b/src/sql/optimizer/ob_log_window_function.cpp index 03037b8c67..b091f7af21 100644 --- a/src/sql/optimizer/ob_log_window_function.cpp +++ b/src/sql/optimizer/ob_log_window_function.cpp @@ -485,7 +485,8 @@ int ObLogWindowFunction::compute_op_ordering() is_local_order_ = (range_dist_parallel_ || is_fully_partition_wise() || (get_sort_keys().empty() && child->get_is_local_order()) - ) && !get_op_ordering().empty(); + ) && !get_op_ordering().empty() + && !is_range_order_; } return ret; }