diff --git a/src/share/object/ob_obj_cast.h b/src/share/object/ob_obj_cast.h index e1ff13bf5..e6b0b2108 100644 --- a/src/share/object/ob_obj_cast.h +++ b/src/share/object/ob_obj_cast.h @@ -45,6 +45,7 @@ namespace common #define CM_SET_MIN_IF_OVERFLOW (1ULL << 9) #define CM_ERROR_ON_SCALE_OVER (1ULL << 10) +#define CM_TO_COLUMN_CS_LEVEL (1ULL << 52) #define CM_ERROR_FOR_DIVISION_BY_ZERO (1ULL << 53) #define CM_NO_ZERO_IN_DATE (1ULL << 54) // reserve #define CM_NO_ZERO_DATE (1ULL << 55) @@ -99,6 +100,7 @@ typedef uint64_t ObCastMode; #define CM_IS_SET_MIN_IF_OVERFLOW(mode) ((CM_SET_MIN_IF_OVERFLOW & (mode)) != 0) #define CM_IS_ERROR_ON_SCALE_OVER(mode) ((CM_ERROR_ON_SCALE_OVER & (mode)) != 0) #define CM_IS_JSON_VALUE(mode) CM_IS_ERROR_ON_SCALE_OVER(mode) +#define CM_IS_TO_COLUMN_CS_LEVEL(mode) ((CM_TO_COLUMN_CS_LEVEL & (mode)) != 0) struct ObObjCastParams { diff --git a/src/sql/engine/expr/ob_expr_cast.cpp b/src/sql/engine/expr/ob_expr_cast.cpp index f61cb4a61..9d7296419 100644 --- a/src/sql/engine/expr/ob_expr_cast.cpp +++ b/src/sql/engine/expr/ob_expr_cast.cpp @@ -294,6 +294,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, ObRawExpr *cast_raw_expr = NULL; const sql::ObSQLSessionInfo *session = NULL; bool is_explicit_cast = false; + bool is_to_column_cs_level = false; if (OB_ISNULL(session = type_ctx.get_session()) || OB_ISNULL(cast_raw_expr = get_raw_expr())) { ret = OB_ERR_UNEXPECTED; @@ -310,6 +311,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, "dst", ob_obj_type_str(dst_type.get_type())); } else if (FALSE_IT(is_explicit_cast = CM_IS_EXPLICIT_CAST(cast_raw_expr->get_extra()))) { // check cast supported in cast_map but not support here. + } else if (FALSE_IT(is_to_column_cs_level = CM_IS_TO_COLUMN_CS_LEVEL(cast_raw_expr->get_extra()))) { } else if (!check_cast_allowed(type1.get_type(), type1.get_collation_type(), dst_type.get_type(), dst_type.get_collation_type(), is_explicit_cast)) { @@ -355,7 +357,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, type1.set_calc_type(get_calc_cast_type(type1.get_type(), dst_type.get_type())); int32_t length = 0; if (ob_is_string_or_lob_type(dst_type.get_type()) || ob_is_raw(dst_type.get_type()) || ob_is_json(dst_type.get_type())) { - type.set_collation_level(is_explicit_cast + type.set_collation_level((is_explicit_cast || is_to_column_cs_level) ? CS_LEVEL_IMPLICIT : type1.get_collation_level()); int32_t len = dst_type.get_length(); diff --git a/src/sql/rewrite/ob_transform_join_elimination.cpp b/src/sql/rewrite/ob_transform_join_elimination.cpp index d04096a84..3b86d732f 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.cpp +++ b/src/sql/rewrite/ob_transform_join_elimination.cpp @@ -1054,22 +1054,16 @@ int ObTransformJoinElimination::do_eliminate_left_outer_join(ObDMLStmt *stmt, LOG_WARN("get unexpected null", K(ret)); } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, to_expr))) { LOG_WARN("failed to create new raw expr", K(ret)); - } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(true,/* explicit_cast */ + } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(false,/* explicit_cast */ 0, /* result_flag */ - ctx_->session_info_, cm))) { + ctx_->session_info_, + cm))) { LOG_WARN("fail to get default cast mode", K(ret)); - } else if (is_mysql_mode() && - OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, + } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, to_expr, from_expr->get_result_type(), cast_expr, ctx_->session_info_, - false, cm))) { - LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); - } else if (is_oracle_mode() && - OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, - to_expr, - from_expr->get_result_type(), - cast_expr, ctx_->session_info_))) { + false, cm | CM_TO_COLUMN_CS_LEVEL))) { LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); } else if (OB_ISNULL(cast_expr)) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/rewrite/ob_transform_left_join_to_anti.cpp b/src/sql/rewrite/ob_transform_left_join_to_anti.cpp index 85815c338..504a93e21 100644 --- a/src/sql/rewrite/ob_transform_left_join_to_anti.cpp +++ b/src/sql/rewrite/ob_transform_left_join_to_anti.cpp @@ -313,23 +313,16 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, to_expr))) { LOG_WARN("failed to build null expr", K(ret)); - } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(true,/* explicit_cast */ - 0, /* result_flag */ - ctx_->session_info_, cm))) { + } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(false,/* explicit_cast */ + 0, /* result_flag */ + ctx_->session_info_, cm))) { LOG_WARN("fail to get default cast mode", K(ret)); - } else if (is_mysql_mode() && - OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, - to_expr, - from_expr->get_result_type(), - cast_expr, ctx_->session_info_, - false, cm))) { - LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); - } else if (is_oracle_mode() && - OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, - to_expr, - from_expr->get_result_type(), - cast_expr, ctx_->session_info_))) { - LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); + } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, + to_expr, + from_expr->get_result_type(), + cast_expr, ctx_->session_info_, + false, cm | CM_TO_COLUMN_CS_LEVEL))) { + LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); } else if (OB_ISNULL(to_expr = cast_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null cast expr", K(ret));