support last_day in mysql mode

This commit is contained in:
jg0
2021-07-27 21:39:15 +08:00
committed by wangzelin.wzl
parent 09edba0ff6
commit 74d0236609
45 changed files with 26893 additions and 25079 deletions

View File

@ -593,7 +593,11 @@ int ObExprLastDay::calc_result_type1(ObExprResType& type, ObExprResType& type1,
{
int ret = OB_SUCCESS;
UNUSED(type_ctx);
type.set_datetime();
if (is_oracle_mode()) {
type.set_datetime();
} else {
type.set_date();
}
type.set_scale(OB_MAX_DATE_PRECISION);
type1.set_calc_type(ObDateTimeType);
type1.set_calc_scale(OB_MAX_DATETIME_PRECISION);
@ -606,14 +610,20 @@ int ObExprLastDay::calc_result1(common::ObObj& result, const common::ObObj& obj,
UNUSED(expr_ctx);
int64_t ori_date_utc = 0;
int64_t res_date_utc = 0;
if (obj.is_null_oracle()) {
const ObObjType res_type = is_oracle_mode() ? ObDateTimeType : ObDateType;
if (obj.is_null()) {
result.set_null();
} else if (OB_FAIL(obj.get_datetime(ori_date_utc))) {
LOG_WARN("fail to get datetime", K(ret));
} else if (OB_FAIL(ObTimeConverter::calc_last_date_of_the_month(ori_date_utc, res_date_utc))) {
LOG_WARN("fail to calc last mday", K(ret));
} else if (OB_FAIL(ObTimeConverter::calc_last_date_of_the_month(ori_date_utc, res_date_utc,
res_type))) {
LOG_WARN("fail to calc last mday", K(ret), K(ori_date_utc), K(res_type));
} else {
result.set_datetime(res_date_utc);
if (is_oracle_mode()) {
result.set_datetime(res_date_utc);
} else {
result.set_date(static_cast<int32_t>(res_date_utc));
}
result.set_scale(OB_MAX_DATE_PRECISION);
}
return ret;
@ -645,12 +655,18 @@ int ObExprLastDay::calc_last_day(const ObExpr& expr, ObEvalCtx& ctx, ObDatum& ex
} else if (param1->is_null()) {
expr_datum.set_null();
} else {
const ObObjType res_type = is_oracle_mode() ? ObDateTimeType : ObDateType;
int64_t ori_date_utc = param1->get_datetime();
int64_t res_date_utc = 0;
if (OB_FAIL(ObTimeConverter::calc_last_date_of_the_month(ori_date_utc, res_date_utc))) {
if (OB_FAIL(ObTimeConverter::calc_last_date_of_the_month(ori_date_utc, res_date_utc,
res_type))) {
LOG_WARN("fail to calc last mday", K(ret));
} else {
expr_datum.set_datetime(res_date_utc);
if (is_oracle_mode()) {
expr_datum.set_datetime(res_date_utc);
} else {
expr_datum.set_date(static_cast<int32_t>(res_date_utc));
}
}
}