fix rewrite bug: replace column with const value
This commit is contained in:
		| @ -45,6 +45,7 @@ namespace common | |||||||
| #define CM_SET_MIN_IF_OVERFLOW           (1ULL << 9) | #define CM_SET_MIN_IF_OVERFLOW           (1ULL << 9) | ||||||
| #define CM_ERROR_ON_SCALE_OVER           (1ULL << 10) | #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_ERROR_FOR_DIVISION_BY_ZERO    (1ULL << 53) | ||||||
| #define CM_NO_ZERO_IN_DATE               (1ULL << 54) // reserve | #define CM_NO_ZERO_IN_DATE               (1ULL << 54) // reserve | ||||||
| #define CM_NO_ZERO_DATE                  (1ULL << 55) | #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_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_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_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 | struct ObObjCastParams | ||||||
| { | { | ||||||
|  | |||||||
| @ -294,6 +294,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, | |||||||
|   ObRawExpr *cast_raw_expr = NULL; |   ObRawExpr *cast_raw_expr = NULL; | ||||||
|   const sql::ObSQLSessionInfo *session = NULL; |   const sql::ObSQLSessionInfo *session = NULL; | ||||||
|   bool is_explicit_cast = false; |   bool is_explicit_cast = false; | ||||||
|  |   bool is_to_column_cs_level = false; | ||||||
|   if (OB_ISNULL(session = type_ctx.get_session()) || |   if (OB_ISNULL(session = type_ctx.get_session()) || | ||||||
|       OB_ISNULL(cast_raw_expr = get_raw_expr())) { |       OB_ISNULL(cast_raw_expr = get_raw_expr())) { | ||||||
|     ret = OB_ERR_UNEXPECTED; |     ret = OB_ERR_UNEXPECTED; | ||||||
| @ -310,6 +311,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type, | |||||||
|              "dst", ob_obj_type_str(dst_type.get_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()))) { |   } 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. |   // 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(), |   } else if (!check_cast_allowed(type1.get_type(), type1.get_collation_type(), | ||||||
|                                  dst_type.get_type(), dst_type.get_collation_type(), |                                  dst_type.get_type(), dst_type.get_collation_type(), | ||||||
|                                  is_explicit_cast)) { |                                  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())); |       type1.set_calc_type(get_calc_cast_type(type1.get_type(), dst_type.get_type())); | ||||||
|       int32_t length = 0; |       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())) { |       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 |                                  ? CS_LEVEL_IMPLICIT | ||||||
|                                  : type1.get_collation_level()); |                                  : type1.get_collation_level()); | ||||||
|         int32_t len = dst_type.get_length(); |         int32_t len = dst_type.get_length(); | ||||||
|  | |||||||
| @ -1054,22 +1054,16 @@ int ObTransformJoinElimination::do_eliminate_left_outer_join(ObDMLStmt *stmt, | |||||||
|           LOG_WARN("get unexpected null", K(ret)); |           LOG_WARN("get unexpected null", K(ret)); | ||||||
|         } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, to_expr))) { |         } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, to_expr))) { | ||||||
|           LOG_WARN("failed to create new raw expr", K(ret)); |           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 */ |                                                              0,    /* result_flag */ | ||||||
|                                                              ctx_->session_info_, cm))) { |                                                              ctx_->session_info_, | ||||||
|  |                                                              cm))) { | ||||||
|           LOG_WARN("fail to get default cast mode", K(ret)); |           LOG_WARN("fail to get default cast mode", K(ret)); | ||||||
|         } else if (is_mysql_mode() && |         } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, | ||||||
|                    OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_,  |  | ||||||
|                                                             to_expr,  |                                                             to_expr,  | ||||||
|                                                             from_expr->get_result_type(),  |                                                             from_expr->get_result_type(),  | ||||||
|                                                             cast_expr, ctx_->session_info_, |                                                             cast_expr, ctx_->session_info_, | ||||||
|                                                             false, cm))) { |                                                             false, cm | CM_TO_COLUMN_CS_LEVEL))) { | ||||||
|           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)); |           LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); | ||||||
|         } else if (OB_ISNULL(cast_expr)) { |         } else if (OB_ISNULL(cast_expr)) { | ||||||
|           ret = OB_ERR_UNEXPECTED; |           ret = OB_ERR_UNEXPECTED; | ||||||
|  | |||||||
| @ -313,22 +313,15 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT | |||||||
|       } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, |       } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, | ||||||
|                                                          to_expr))) { |                                                          to_expr))) { | ||||||
|         LOG_WARN("failed to build null expr", K(ret)); |         LOG_WARN("failed to build null 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 */ |                                                            0,    /* result_flag */ | ||||||
|                                                            ctx_->session_info_, cm))) { |                                                            ctx_->session_info_, cm))) { | ||||||
|         LOG_WARN("fail to get default cast mode", K(ret)); |         LOG_WARN("fail to get default cast mode", K(ret)); | ||||||
|       } else if (is_mysql_mode() && |       } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_, | ||||||
|                   OB_FAIL(ObRawExprUtils::create_cast_expr(*ctx_->expr_factory_,  |  | ||||||
|                                                           to_expr, |                                                           to_expr, | ||||||
|                                                           from_expr->get_result_type(), |                                                           from_expr->get_result_type(), | ||||||
|                                                           cast_expr, ctx_->session_info_, |                                                           cast_expr, ctx_->session_info_, | ||||||
|                                                             false, cm))) { |                                                           false, cm | CM_TO_COLUMN_CS_LEVEL))) { | ||||||
|           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)); |         LOG_WARN("failed to cast expr", K(ret), K(*from_expr), K(*to_expr)); | ||||||
|       } else if (OB_ISNULL(to_expr = cast_expr)) { |       } else if (OB_ISNULL(to_expr = cast_expr)) { | ||||||
|         ret = OB_ERR_UNEXPECTED; |         ret = OB_ERR_UNEXPECTED; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 wjhh2008
					wjhh2008