fix rewrite bug: replace column with const value
This commit is contained in:
parent
fe0de4b0d5
commit
f34a588a9a
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user