Add div_by_zero check in int_div expr
This commit is contained in:
@ -802,7 +802,8 @@ int ObExprDiv::cg_expr(ObExprCGCtx &op_cg_ctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_ISNULL(op_cg_ctx.session_)) {
|
if (OB_FAIL(ret)) {
|
||||||
|
} else if (OB_ISNULL(op_cg_ctx.session_)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpected session is null", K(ret));
|
LOG_WARN("unexpected session is null", K(ret));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -240,7 +240,11 @@ int ObExprIntDiv::div_int_int(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &datum
|
|||||||
} else if (is_finish) {
|
} else if (is_finish) {
|
||||||
//do nothing
|
//do nothing
|
||||||
} else if (right->get_int() == 0) {
|
} else if (right->get_int() == 0) {
|
||||||
|
if (expr.is_error_div_by_zero_) {
|
||||||
|
ret = OB_DIVISION_BY_ZERO;
|
||||||
|
} else {
|
||||||
datum.set_null();
|
datum.set_null();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
char expr_str[OB_MAX_TWO_OPERATOR_EXPR_LENGTH];
|
char expr_str[OB_MAX_TWO_OPERATOR_EXPR_LENGTH];
|
||||||
int64_t pos = 0;
|
int64_t pos = 0;
|
||||||
@ -274,7 +278,11 @@ int ObExprIntDiv::div_int_uint(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &datu
|
|||||||
} else if (is_finish) {
|
} else if (is_finish) {
|
||||||
//do nothing
|
//do nothing
|
||||||
} else if (right->get_uint() == 0) {
|
} else if (right->get_uint() == 0) {
|
||||||
|
if (expr.is_error_div_by_zero_) {
|
||||||
|
ret = OB_DIVISION_BY_ZERO;
|
||||||
|
} else {
|
||||||
datum.set_null();
|
datum.set_null();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int64_t left_i = left->get_int();
|
int64_t left_i = left->get_int();
|
||||||
uint64_t left_ui = left_i < 0 ? -left_i : left_i;
|
uint64_t left_ui = left_i < 0 ? -left_i : left_i;
|
||||||
@ -302,7 +310,11 @@ int ObExprIntDiv::div_uint_uint(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &dat
|
|||||||
} else if (is_finish) {
|
} else if (is_finish) {
|
||||||
//do nothing
|
//do nothing
|
||||||
} else if (right->get_uint() == 0) {
|
} else if (right->get_uint() == 0) {
|
||||||
|
if (expr.is_error_div_by_zero_) {
|
||||||
|
ret = OB_DIVISION_BY_ZERO;
|
||||||
|
} else {
|
||||||
datum.set_null();
|
datum.set_null();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
uint64_t left_ui = left->get_uint();
|
uint64_t left_ui = left->get_uint();
|
||||||
uint64_t right_ui = right->get_uint();
|
uint64_t right_ui = right->get_uint();
|
||||||
@ -324,7 +336,11 @@ int ObExprIntDiv::div_uint_int(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &datu
|
|||||||
} else if (is_finish) {
|
} else if (is_finish) {
|
||||||
//do nothing
|
//do nothing
|
||||||
} else if (right->get_int() == 0) {
|
} else if (right->get_int() == 0) {
|
||||||
|
if (expr.is_error_div_by_zero_) {
|
||||||
|
ret = OB_DIVISION_BY_ZERO;
|
||||||
|
} else {
|
||||||
datum.set_null();
|
datum.set_null();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
uint64_t left_ui = left->get_uint();
|
uint64_t left_ui = left->get_uint();
|
||||||
int64_t right_i = right->get_int();
|
int64_t right_i = right->get_int();
|
||||||
@ -352,7 +368,11 @@ int ObExprIntDiv::div_number(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &datum)
|
|||||||
} else if (is_finish) {
|
} else if (is_finish) {
|
||||||
//do nothing
|
//do nothing
|
||||||
} else if (right->get_number().is_zero()) {
|
} else if (right->get_number().is_zero()) {
|
||||||
|
if (expr.is_error_div_by_zero_) {
|
||||||
|
ret = OB_DIVISION_BY_ZERO;
|
||||||
|
} else {
|
||||||
datum.set_null();
|
datum.set_null();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
number::ObNumber lnum(left->get_number());
|
number::ObNumber lnum(left->get_number());
|
||||||
number::ObNumber rnum(right->get_number());
|
number::ObNumber rnum(right->get_number());
|
||||||
@ -428,5 +448,24 @@ int ObExprIntDiv::cg_expr(ObExprCGCtx &op_cg_ctx,
|
|||||||
} else {
|
} else {
|
||||||
rt_expr.eval_func_ = ObExprIntDiv::div_number;
|
rt_expr.eval_func_ = ObExprIntDiv::div_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (OB_FAIL(ret)) {
|
||||||
|
} else if (OB_ISNULL(op_cg_ctx.session_)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("unexpected session is null", K(ret));
|
||||||
|
} else {
|
||||||
|
stmt::StmtType stmt_type = op_cg_ctx.session_->get_stmt_type();
|
||||||
|
if (lib::is_mysql_mode()
|
||||||
|
&& is_error_for_division_by_zero(op_cg_ctx.session_->get_sql_mode())
|
||||||
|
&& is_strict_mode(op_cg_ctx.session_->get_sql_mode())
|
||||||
|
&& !op_cg_ctx.session_->is_ignore_stmt()
|
||||||
|
&& (stmt::T_INSERT == stmt_type
|
||||||
|
|| stmt::T_REPLACE == stmt_type
|
||||||
|
|| stmt::T_UPDATE == stmt_type)) {
|
||||||
|
rt_expr.is_error_div_by_zero_ = true;
|
||||||
|
} else {
|
||||||
|
rt_expr.is_error_div_by_zero_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user