提交 f34a588a 编写于 作者: W wjhh2008 提交者: wangzelin.wzl

fix rewrite bug: replace column with const value

上级 fe0de4b0
......@@ -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
{
......
......@@ -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();
......
......@@ -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;
......
......@@ -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));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册