From a77cd1cf275d92267d3356d0287d0b659f23676c Mon Sep 17 00:00:00 2001 From: chimyue Date: Mon, 8 Jan 2024 14:42:55 +0000 Subject: [PATCH] fix subplan filter pkey distributed plan bug --- src/sql/optimizer/ob_log_plan.cpp | 5 +-- src/sql/optimizer/ob_log_plan.h | 3 +- src/sql/optimizer/ob_log_subplan_filter.cpp | 36 +++++++++++++-------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index bcb48cc45d..1748e84776 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -5319,7 +5319,8 @@ int ObLogPlan::get_repartition_keys(const EqualSets &equal_sets, const ObIArray &src_keys, const ObIArray &target_keys, const ObIArray &target_part_keys, - ObIArray &src_part_keys) + ObIArray &src_part_keys, + const bool ignore_no_match /* default false */ ) { int ret = OB_SUCCESS; if (OB_UNLIKELY(src_keys.count() != target_keys.count())) { @@ -5355,7 +5356,7 @@ int ObLogPlan::get_repartition_keys(const EqualSets &equal_sets, } } else { /*do nothing*/ } } - if (OB_SUCC(ret) && !is_find) { + if (OB_SUCC(ret) && !is_find && !ignore_no_match) { ret = OB_ERR_UNEXPECTED; LOG_WARN("can not find part expr", K(target_part_keys.at(i)), K(src_keys), K(target_keys), K(ret)); diff --git a/src/sql/optimizer/ob_log_plan.h b/src/sql/optimizer/ob_log_plan.h index 6ea3e5fb23..437d5268e8 100644 --- a/src/sql/optimizer/ob_log_plan.h +++ b/src/sql/optimizer/ob_log_plan.h @@ -669,7 +669,8 @@ public: const ObIArray &src_keys, const ObIArray &target_keys, const ObIArray &target_part_keys, - ObIArray &src_part_keys); + ObIArray &src_part_keys, + const bool ignore_no_match = false); /** @brief Allcoate operator for subquery path */ int allocate_subquery_path(SubQueryPath *subpath, diff --git a/src/sql/optimizer/ob_log_subplan_filter.cpp b/src/sql/optimizer/ob_log_subplan_filter.cpp index d6aa55bbc7..5d93d1d1ec 100644 --- a/src/sql/optimizer/ob_log_subplan_filter.cpp +++ b/src/sql/optimizer/ob_log_subplan_filter.cpp @@ -746,6 +746,8 @@ int ObLogSubPlanFilter::get_repart_sharding_info(ObLogicalOperator* child_op, input_esets, strong_sharding))) { LOG_WARN("failed to rebuild repart sharding info", K(ret)); + } else if (NULL == strong_sharding) { + strong_sharding = get_plan()->get_optimizer_context().get_distributed_sharding(); } if (OB_SUCC(ret)) { @@ -760,6 +762,8 @@ int ObLogSubPlanFilter::get_repart_sharding_info(ObLogicalOperator* child_op, input_esets, out_sharding))) { LOG_WARN("failed to rebuild repart sharding info", K(ret)); + } else if (NULL == out_sharding) { + /* do nothing */ } else if (OB_FAIL(weak_sharding.push_back(out_sharding))) { LOG_WARN("failed to push back sharding", K(ret)); } @@ -782,6 +786,23 @@ int ObLogSubPlanFilter::rebuild_repart_sharding_info(const ObShardingInfo *input OB_ISNULL(input_sharding)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); + } else if (OB_FAIL(get_plan()->get_repartition_keys(input_esets, + src_keys, + target_keys, + input_sharding->get_partition_keys(), + repart_exprs, + true))) { + LOG_WARN("failed to get repartition keys", K(ret)); + } else if (OB_FAIL(get_plan()->get_repartition_keys(input_esets, + src_keys, + target_keys, + input_sharding->get_sub_partition_keys(), + repart_sub_exprs, + true))) { + LOG_WARN("failed to get sub repartition keys", K(ret)); + } else if (input_sharding->get_partition_keys().count() != repart_exprs.count() + || input_sharding->get_sub_partition_keys().count() != repart_sub_exprs.count()) { + out_sharding = NULL; } else if (OB_ISNULL(out_sharding = reinterpret_cast( get_plan()->get_allocator().alloc(sizeof(ObShardingInfo))))) { ret = OB_ALLOCATE_MEMORY_FAILED; @@ -791,20 +812,7 @@ int ObLogSubPlanFilter::rebuild_repart_sharding_info(const ObShardingInfo *input LOG_WARN("failed to assign sharding info", K(ret)); } else { ObRawExprCopier copier(get_plan()->get_optimizer_context().get_expr_factory()); - if (OB_FAIL(get_plan()->get_repartition_keys(input_esets, - src_keys, - target_keys, - input_sharding->get_partition_keys(), - repart_exprs))) { - LOG_WARN("failed to get repartition keys", K(ret)); - } else if (OB_FAIL(get_plan()->get_repartition_keys(input_esets, - src_keys, - target_keys, - input_sharding->get_sub_partition_keys(), - repart_sub_exprs))) { - LOG_WARN("failed to get sub repartition keys", K(ret)); - } else if (OB_FAIL(copier.add_replaced_expr(input_sharding->get_partition_keys(), - repart_exprs))) { + if (OB_FAIL(copier.add_replaced_expr(input_sharding->get_partition_keys(), repart_exprs))) { LOG_WARN("failed to add replace pair", K(ret)); } else if (OB_FAIL(copier.add_replaced_expr(input_sharding->get_sub_partition_keys(), repart_sub_exprs))) {