support last_day in mysql mode
This commit is contained in:
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user