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