refine char padding
This commit is contained in:
@ -66,15 +66,16 @@ int ObExprPad::calc_result_type3(ObExprResType &type,
|
|||||||
padding_str.set_calc_type(text_type);
|
padding_str.set_calc_type(text_type);
|
||||||
|
|
||||||
if (is_oracle_mode()) {
|
if (is_oracle_mode()) {
|
||||||
|
//for oracle mode, this funcion is only used for padding char/nchar types
|
||||||
const ObSQLSessionInfo *session = type_ctx.get_session();
|
const ObSQLSessionInfo *session = type_ctx.get_session();
|
||||||
if (OB_ISNULL(session)) {
|
if (OB_ISNULL(session)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("session is NULL", K(ret));
|
LOG_WARN("session is NULL", K(ret));
|
||||||
} else {
|
} else {
|
||||||
ObSEArray<ObExprResType*, 2, ObNullAllocator> types;
|
ObSEArray<ObExprResType*, 2, ObNullAllocator> types;
|
||||||
OZ(types.push_back(&source));
|
|
||||||
OZ(types.push_back(&padding_str));
|
OZ(types.push_back(&padding_str));
|
||||||
OZ(aggregate_string_type_and_charset_oracle(*session, types, type));
|
OZ(aggregate_string_type_and_charset_oracle(*session, types, type));
|
||||||
|
OZ(types.push_back(&source));
|
||||||
OZ(deduce_string_param_calc_type_and_charset(*session, type, types));
|
OZ(deduce_string_param_calc_type_and_charset(*session, type, types));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -120,7 +121,20 @@ int ObExprPad::calc_pad_expr(const ObExpr &expr, ObEvalCtx &ctx,
|
|||||||
byte_delta = src_str.length() - src_char_len;
|
byte_delta = src_str.length() - src_char_len;
|
||||||
len_int -= byte_delta;
|
len_int -= byte_delta;
|
||||||
}
|
}
|
||||||
if (src_char_len < len_int) {
|
|
||||||
|
if (lib::is_oracle_mode() && 1 == expr.extra_) {
|
||||||
|
//for column convert char/nchar padding, the padded length should be less than max length of target types
|
||||||
|
const int64_t max_len = expr.is_called_in_sql_ ? OB_MAX_ORACLE_CHAR_LENGTH_BYTE : OB_MAX_ORACLE_PL_CHAR_LENGTH_BYTE;
|
||||||
|
int64_t min_mb_len = 0;
|
||||||
|
if (OB_FAIL(ObCharset::get_mbminlen_by_coll(expr.datum_meta_.cs_type_, min_mb_len))) {
|
||||||
|
LOG_WARN("fail to get min mb len", K(ret));
|
||||||
|
} else {
|
||||||
|
int64_t max_pad_chars = (max_len - src_str.length())/min_mb_len;
|
||||||
|
len_int = std::min(len_int, max_pad_chars + src_char_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OB_SUCC(ret) && src_char_len < len_int) {
|
||||||
ObDatum len_char;
|
ObDatum len_char;
|
||||||
len_char.ptr_ = reinterpret_cast<const char*>(&len_int);
|
len_char.ptr_ = reinterpret_cast<const char*>(&len_int);
|
||||||
len_char.pack_ = sizeof(len_int);
|
len_char.pack_ = sizeof(len_int);
|
||||||
@ -147,6 +161,7 @@ int ObExprPad::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr,
|
|||||||
UNUSED(expr_cg_ctx);
|
UNUSED(expr_cg_ctx);
|
||||||
UNUSED(raw_expr);
|
UNUSED(raw_expr);
|
||||||
rt_expr.eval_func_ = calc_pad_expr;
|
rt_expr.eval_func_ = calc_pad_expr;
|
||||||
|
rt_expr.extra_ = raw_expr.get_extra();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5217,6 +5217,7 @@ int ObRawExprUtils::build_pad_expr(ObRawExprFactory &expr_factory,
|
|||||||
if (expr->is_for_generated_column()) {
|
if (expr->is_for_generated_column()) {
|
||||||
pad_expr->set_for_generated_column();
|
pad_expr->set_for_generated_column();
|
||||||
}
|
}
|
||||||
|
pad_expr->set_extra(1); //mark for column convert
|
||||||
expr = pad_expr;
|
expr = pad_expr;
|
||||||
if (OB_FAIL(expr->formalize(session_info))) {
|
if (OB_FAIL(expr->formalize(session_info))) {
|
||||||
LOG_WARN("fail to extract info", K(ret));
|
LOG_WARN("fail to extract info", K(ret));
|
||||||
|
|||||||
Reference in New Issue
Block a user