diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 595fdc5c67..a185a6de64 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -12007,6 +12007,10 @@ int ObJoinOrder::can_extract_unprecise_range(const uint64_t table_id, if (OB_ISNULL(l_expr) || OB_ISNULL(r_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null expr", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::get_expr_without_lossless_cast(l_expr, l_expr))) { + LOG_WARN("failed to get expr without lossless cast", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::get_expr_without_lossless_cast(r_expr, r_expr))) { + LOG_WARN("failed to get expr without lossless cast", K(ret)); } else if (l_expr->is_dynamic_const_expr() && r_expr->is_column_ref_expr()) { column = static_cast(r_expr); exec_param = l_expr; @@ -12035,6 +12039,8 @@ int ObJoinOrder::can_extract_unprecise_range(const uint64_t table_id, if (OB_ISNULL(first_expr) || OB_ISNULL(patten_expr) || OB_ISNULL(escape_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null expr", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::get_expr_without_lossless_cast(first_expr, first_expr))) { + LOG_WARN("failed to get expr without lossless cast", K(ret)); } else if (first_expr->is_column_ref_expr() && patten_expr->is_dynamic_const_expr() && escape_expr->is_static_const_expr()) { diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index a3ddf89af4..f0dd93d597 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -6193,6 +6193,22 @@ int ObOptimizerUtil::is_lossless_column_cast(const ObRawExpr *expr, bool &is_los is_lossless = NUMBER_SCALE_UNKNOWN_YET == dst_type.get_scale() && PRECISION_UNKNOWN_YET == dst_type.get_precision(); } + } else if (ObCharType == child_type.get_type()) { + if (ObVarcharType == dst_type.get_type() && !expr->is_const_expr()) { + if ((dst_acc.get_length() >= child_type.get_accuracy().get_length() || + dst_acc.get_length() == -1) && + dst_type.get_obj_meta().get_collation_type() == child_type.get_obj_meta().get_collation_type()) { + is_lossless = true; + } + } + } else if (ObNCharType == child_type.get_type()) { + if (ObNVarchar2Type == dst_type.get_type() && !expr->is_const_expr()) { + if ((dst_acc.get_length() >= child_type.get_accuracy().get_length() || + dst_acc.get_length() == -1) && + dst_type.get_obj_meta().get_collation_type() == child_type.get_obj_meta().get_collation_type()) { + is_lossless = true; + } + } } } LOG_DEBUG("lossless column cast", K(child_type), K(child_tc), K(dst_type), K(dst_tc),