提交 8d81ad6e 编写于 作者: S st0 提交者: LINGuanRen

cherry-pick to opensource branch

上级 4255c905
......@@ -3447,14 +3447,21 @@ static int time_date(
int ret = OB_SUCCESS;
const ObTimeZoneInfo* tz_info = params.dtc_params_.tz_info_;
int32_t value = 0;
int64_t datetime_value = 0;
if (OB_UNLIKELY(ObTimeTC != in.get_type_class() || ObDateTC != ob_obj_type_class(expect_type))) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("invalid input type",
K(ret), K(in), K(expect_type));
} else if (OB_FAIL(ObTimeConverter::datetime_to_date(params.cur_time_, tz_info, value))) {
LOG_WARN("datetime_to_date failed", K(ret), K(params.cur_time_));
} else {
out.set_date(value);
ObTimeConvertCtx cvrt_ctx(tz_info, false);
if (OB_FAIL(ObTimeConverter::time_to_datetime(in.get_time(), params.cur_time_, tz_info,
datetime_value, ObDateTimeType))) {
LOG_WARN("time to datetime failed", K(ret), K(in), K(params.cur_time_));
} else if (ObTimeConverter::datetime_to_date(datetime_value, NULL, value)) {
LOG_WARN("date to datetime failed", K(ret), K(datetime_value));
} else {
out.set_date(value);
}
}
SET_RES_ACCURACY(DEFAULT_PRECISION_FOR_TEMPORAL, DEFAULT_SCALE_FOR_DATE, DEFAULT_LENGTH_FOR_TEMPORAL);
UNUSED(cast_mode);
......@@ -4189,9 +4196,12 @@ static int string_year(
} else if (OB_FAIL(string_int(
ObIntType, params, in, int64, CM_UNSET_STRING_INTEGER_TRUNC(CM_SET_WARN_ON_FAIL(cast_mode))))) {
} else if (0 == int64.get_int()) {
const uint8_t base_year = 100;
uint8_t value = 4 == in.get_string().length() ? ObTimeConverter::ZERO_YEAR : base_year;
const uint8_t base_year = 100;
uint8_t value = OB_SUCCESS == params.warning_ ?
(4 == in.get_string().length() ? ObTimeConverter::ZERO_YEAR : base_year) :
ObTimeConverter::ZERO_YEAR;
SET_RES_YEAR(out);
CAST_FAIL(params.warning_);
} else if (CAST_FAIL(int_year(ObYearType, params, int64, out, cast_mode))) {
} else if (CAST_FAIL(params.warning_)) {
}
......
......@@ -972,8 +972,8 @@ int ObStaticEngineExprCG::add_so_check_expr_above(ObIArray<ObExpr>& exprs, ObExp
return ret;
}
int ObStaticEngineExprCG::replace_var_rt_expr(ObExpr* origin_expr, ObExpr* var_expr, ObExpr* parent_expr,
int32_t var_idx) // child pos of parent_expr
int ObStaticEngineExprCG::replace_var_rt_expr(ObExpr* origin_expr, const ObRawExpr *origin_raw_expr,
ObExpr* var_expr, ObExpr* parent_expr, int32_t var_idx) // child pos of parent_expr
{
int ret = OB_SUCCESS;
if (OB_ISNULL(origin_expr)) {
......@@ -981,13 +981,18 @@ int ObStaticEngineExprCG::replace_var_rt_expr(ObExpr* origin_expr, ObExpr* var_e
LOG_WARN("expr is null", K(ret), K(origin_expr));
} else {
while (OB_SUCC(ret)) {
// from_unixtime may add implicit cast above origin param expr, find origin param.
if (T_FUN_SYS_CAST == origin_expr->type_ && CM_IS_EXPLICIT_CAST(origin_expr->extra_)) {
if (OB_ISNULL(origin_raw_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("origin raw expr is null", K(ret));
// from_unixtime may add implicit cast above origin param expr, find origin param.
} else if (T_FUN_SYS_CAST == origin_expr->type_
&& CM_IS_IMPLICIT_CAST(origin_raw_expr->get_extra())) {
if (OB_UNLIKELY(origin_expr->arg_cnt_ < 1) || OB_ISNULL(origin_expr->args_[0])) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid param", KPC(origin_expr));
} else {
origin_expr = origin_expr->args_[0];
origin_raw_expr = origin_raw_expr->get_param_expr(0);
}
} else if (T_FUN_ENUM_TO_STR == origin_expr->type_ || T_FUN_SET_TO_STR == origin_expr->type_) {
if (OB_UNLIKELY(origin_expr->arg_cnt_ < 2) || OB_ISNULL(origin_expr->args_[1])) {
......@@ -995,6 +1000,7 @@ int ObStaticEngineExprCG::replace_var_rt_expr(ObExpr* origin_expr, ObExpr* var_e
LOG_WARN("invalid param", K(ret), KPC(origin_expr));
} else {
origin_expr = origin_expr->args_[1];
origin_raw_expr = origin_raw_expr->get_param_expr(1);
}
} else {
break;
......
......@@ -63,7 +63,8 @@ public:
static int generate_rt_expr(const ObRawExpr& src, common::ObIArray<ObRawExpr*>& exprs, ObExpr*& dst);
static int replace_var_rt_expr(ObExpr* origin_expr, ObExpr* var_expr, ObExpr* parent_expr, int32_t var_idx);
static int replace_var_rt_expr(ObExpr* origin_expr, const ObRawExpr *origin_raw_expr, ObExpr* var_expr,
ObExpr* parent_expr, int32_t var_idx);
// Attention : Please think over before you have to use this function.
// This function is different from generate_rt_expr.
......
......@@ -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));
}
}
......
......@@ -459,8 +459,12 @@ int ObDMLStmtPrinter::print_table(
ObIArray<ObString>* column_list = NULL;
bool is_set_subquery = false;
bool is_generated_table = true;
const bool force_col_alias =
stmt_->is_select_stmt() && (static_cast<const ObSelectStmt*>(stmt_)->is_star_select());
// force print alias name for select item in generated table. Otherwise,
// create view v as select 1 from dual where 1 > (select `abs(c1)` from (select abs(c1) from t));
// Definition of v would be:
// CREATE VIEW `v` AS select 1 AS `1` from DUAL where (1 > (select `abs(c1)` from ((select abs(`test`.`t`.`c1`) from `test`.`t`)) ))
// `abs(c1)` would be an unknown column.
const bool force_col_alias = stmt_->is_select_stmt();
ObSelectStmtPrinter stmt_printer(buf_,
buf_len_,
pos_,
......
......@@ -417,8 +417,9 @@ int ObDMLResolver::resolve_into_variables(
if (OB_SUCC(ret)) {
if (T_USER_VARIABLE_IDENTIFIER == ch_node->type_) {
ObString var_name(ch_node->str_len_, ch_node->str_value_);
OZ(user_vars.push_back(var_name));
OZ(user_var_idx.add_member(i));
ObCharset::casedn(CS_TYPE_UTF8MB4_GENERAL_CI, var_name);
OZ (user_vars.push_back(var_name));
OZ (user_var_idx.add_member(i));
} else {
if (params_.is_prepare_protocol_) {
ObSEArray<ObQualifiedName, 1> columns;
......
......@@ -4405,11 +4405,14 @@ int ObBasicSessionInfo::set_time_zone(
LOG_INFO(
"ignore unknow time zone, perhaps in remote/distribute task processer when server start_time is zero",
K(str_val));
ret = OB_SUCCESS;
if (OB_FAIL(tz_info_wrap_.get_tz_info_pos().set_tz_name(str_val.ptr(), no_sp_len))) {
LOG_WARN("fail to set time zone info name", K(str_val), K(ret));
offset = 0;
if (OB_FAIL(ObTimeConverter::str_to_offset(ObString("+8:00"), offset, ret_more,
is_oralce_mode, check_timezone_valid))) {
if (ret != OB_ERR_UNKNOWN_TIME_ZONE) {
LOG_WARN("fail to convert time zone", K(str_val), K(ret));
}
} else {
tz_info_wrap_.set_tz_info_position();
tz_info_wrap_.set_tz_info_offset(offset);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册