diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 1c736a9f62..27c61172a3 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -3822,7 +3822,8 @@ int ObJoinOrder::convert_subplan_scan_sharding_info(ObLogPlan &plan, if (OB_ISNULL(input_sharding) || OB_ISNULL(plan.get_stmt()) || OB_ISNULL(child_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(input_sharding), K(ret)); - } else if (input_sharding->is_single() || input_sharding->is_distributed_without_partitioning()) { + } else if (!input_sharding->get_can_reselect_replica() && + (input_sharding->is_single() || input_sharding->is_distributed_without_partitioning())) { output_sharding = input_sharding; } else if (OB_FAIL(ObOptimizerUtil::convert_subplan_scan_expr(expr_factory, subplan_root.get_output_equal_sets(), @@ -3878,6 +3879,7 @@ int ObJoinOrder::convert_subplan_scan_sharding_info(ObLogPlan &plan, } else if (OB_FAIL(temp_sharding->get_partition_func().assign(part_func))) { LOG_WARN("failed to assign part funcs", K(ret)); } else { + temp_sharding->set_can_reselect_replica(false); output_sharding = temp_sharding; LOG_TRACE("succeed to convert subplan scan sharding", K(*output_sharding)); } diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 7a0bf6eeff..646e0a41fe 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -7348,7 +7348,8 @@ int ObOptimizerUtil::compute_basic_sharding_info(const ObAddr &local_addr, if (OB_FAIL(ObOptimizerUtil::intersect(valid_addrs, intersect_addrs, candidate_addrs))) { LOG_WARN("failed to intersect addrs", K(ret)); } else if (OB_FALSE_IT(can_reselect_replica = can_reselect_replica && - valid_addrs.count() == candidate_addrs.count())) { + valid_addrs.count() == candidate_addrs.count() && + valid_addrs.count() == intersect_addrs.count())) { // do nothing } else if (OB_FAIL(intersect_addrs.assign(candidate_addrs))) { LOG_WARN("failed to assign addrs", K(ret));