cherry-pick to opensource branch
This commit is contained in:
@ -835,13 +835,14 @@ static OB_INLINE int common_string_year(const ObExpr& expr, const ObString& in_s
|
||||
if (OB_FAIL(common_string_int(expr, extra, in_str, is_str_int_cast, tmp_res, warning))) {
|
||||
LOG_WARN("common_string_int failed", K(ret), K(in_str));
|
||||
} else if (0 == tmp_int) {
|
||||
// cast '0000' to year, result is 0. cast '0'/'00'/'00000' to year, result is 2000.
|
||||
if (4 == in_str.length()) {
|
||||
// cast '0000' to year, result is 0. cast '0'/'00'/'00000' to year, result is 2000.
|
||||
if (OB_SUCCESS != warning || 4 == in_str.length()) {
|
||||
SET_RES_YEAR(ObTimeConverter::ZERO_YEAR);
|
||||
} else {
|
||||
const uint8_t base_year = 100;
|
||||
SET_RES_YEAR(base_year);
|
||||
}
|
||||
CAST_FAIL(warning);
|
||||
} else {
|
||||
if (CAST_FAIL(common_int_year(expr, tmp_int, res_datum, warning))) {
|
||||
LOG_WARN("common_int_year failed", K(ret), K(tmp_int));
|
||||
@ -4283,9 +4284,14 @@ CAST_FUNC_NAME(time, date)
|
||||
int32_t out_val = 0;
|
||||
ObPhysicalPlanCtx *phy_plan_ctx = ctx.exec_ctx_.get_physical_plan_ctx();
|
||||
int64_t cur_time = phy_plan_ctx ? phy_plan_ctx->get_cur_time().get_datetime() : 0;
|
||||
if (OB_FAIL(ObTimeConverter::datetime_to_date(cur_time, session->get_timezone_info(),
|
||||
out_val))) {
|
||||
int64_t datetime_value = 0;
|
||||
int64_t in_val = child_res->get_time();
|
||||
ObTimeConvertCtx cvrt_ctx(session->get_timezone_info(), false);
|
||||
if (OB_FAIL(ObTimeConverter::time_to_datetime(in_val, cur_time, session->get_timezone_info(),
|
||||
datetime_value, ObDateTimeType))) {
|
||||
LOG_WARN("datetime_to_date failed", K(ret), K(cur_time));
|
||||
} else if (ObTimeConverter::datetime_to_date(datetime_value, NULL, out_val)) {
|
||||
LOG_WARN("date to datetime failed", K(ret), K(datetime_value));
|
||||
} else {
|
||||
res_datum.set_date(out_val);
|
||||
}
|
||||
|
||||
@ -212,7 +212,8 @@ int ObExprFromUnixTime::cg_expr(ObExprCGCtx& op_cg_ctx, const ObRawExpr& raw_exp
|
||||
if (OB_ISNULL(rt_expr.args_[0]) || OB_ISNULL(rt_expr.args_[1]) || OB_ISNULL(rt_expr.args_[2])) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid null args", K(ret), K(rt_expr.args_[0]), K(rt_expr.args_[1]), K(rt_expr.args_[2]));
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(rt_expr.args_[1], rt_expr.args_[2], &rt_expr, 2))) {
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(rt_expr.args_[1], raw_expr.get_param_expr(1),
|
||||
rt_expr.args_[2], &rt_expr, 2))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret), K(rt_expr));
|
||||
} else if (ob_is_string_tc(rt_expr.args_[2]->datum_meta_.type_)) {
|
||||
rt_expr.eval_func_ = &eval_fromtime_normal;
|
||||
|
||||
@ -124,10 +124,12 @@ int ObExprBaseGreatest::cg_expr(ObExprCGCtx& op_cg_ctx, const ObRawExpr& raw_exp
|
||||
const uint32_t real_param_num = param_num / 3;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < real_param_num; i++) {
|
||||
if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + real_param_num], &rt_expr, i + real_param_num))) {
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + real_param_num],
|
||||
&rt_expr, i + real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + 2 * real_param_num], &rt_expr, i + 2 * real_param_num))) {
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + 2 * real_param_num],
|
||||
&rt_expr, i + 2 * real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
@ -350,10 +350,10 @@ int ObExprBaseLeast::cg_expr(ObExprCGCtx& op_cg_ctx, const ObRawExpr& raw_expr,
|
||||
const uint32_t real_param_num = param_num / 3;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < real_param_num; i++) {
|
||||
if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + real_param_num], &rt_expr, i + real_param_num))) {
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + real_param_num], &rt_expr, i + real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + 2 * real_param_num], &rt_expr, i + 2 * real_param_num))) {
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + 2 * real_param_num], &rt_expr, i + 2 * real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,10 +229,10 @@ int ObExprNullif::cg_expr(ObExprCGCtx& expr_cg_ctx, const ObRawExpr& raw_expr, O
|
||||
const uint32_t real_param_num = param_num / 3;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < real_param_num; i++) {
|
||||
if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + real_param_num], &rt_expr, i + real_param_num))) {
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + real_param_num], &rt_expr, i + real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
} else if (OB_FAIL(ObStaticEngineExprCG::replace_var_rt_expr(
|
||||
rt_expr.args_[i], rt_expr.args_[i + 2 * real_param_num], &rt_expr, i + 2 * real_param_num))) {
|
||||
rt_expr.args_[i], raw_expr.get_param_expr(i), rt_expr.args_[i + 2 * real_param_num], &rt_expr, i + 2 * real_param_num))) {
|
||||
LOG_WARN("replace var rt expr failed", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user