[to #50697318] fix while case when loop syntax & case result type deduce & arg_case transform

This commit is contained in:
obdev
2023-08-02 05:54:32 +00:00
committed by ob-robot
parent 258affd57c
commit 0c3303e4c1
2 changed files with 21 additions and 4 deletions

View File

@ -1029,7 +1029,7 @@ int ObExprOperator::is_same_kind_type_for_case(const ObExprResType &type1, const
return ret;
}
// coaesce expr, case when expr
// coalesce expr, case when expr
int ObExprOperator::aggregate_result_type_for_case(
ObExprResType &type,
const ObExprResType *types,
@ -1057,12 +1057,14 @@ int ObExprOperator::aggregate_result_type_for_case(
}
nth = OB_INVALID_ID == nth ? 0 : nth;
const ObExprResType &res_type = types[nth];
if (need_merge_type && lib::is_oracle_mode() && ObTinyIntType == types[0].get_type()) {
if (need_merge_type && lib::is_oracle_mode() && is_called_in_sql
&& ObTinyIntType == types[0].get_type()) {
ret = OB_ERR_CALL_WRONG_ARG;
LOG_WARN("PLS-00306: wrong number or types of arguments in call", K(ret));
}
for (int64_t i = 1; OB_SUCC(ret) && i < param_num; ++i) {
if (need_merge_type && lib::is_oracle_mode() && ObTinyIntType == types[i].get_type()) {
if (need_merge_type && lib::is_oracle_mode() && is_called_in_sql
&& ObTinyIntType == types[i].get_type()) {
ret = OB_ERR_CALL_WRONG_ARG;
LOG_WARN("PLS-00306: wrong number or types of arguments in call", K(ret));
} else if (OB_FAIL(ObExprOperator::is_same_kind_type_for_case(res_type,
@ -1075,7 +1077,15 @@ int ObExprOperator::aggregate_result_type_for_case(
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(aggregate_result_type_for_merge(type, types, param_num, conn_coll_type,
if (need_merge_type && lib::is_oracle_mode() && ObTinyIntType == types[0].get_type()) {
// bypass `aggregate_result_type_for_merge()` when oracle `case expression` returns boolean,
// also known as ObTinyIntType. `aggregate_result_type_for_merge()` would merge
// ObTinyIntType into ObInt32Type.
type.set_type(ObTinyIntType);
if (OB_FAIL(aggregate_numeric_accuracy_for_merge(type, types, param_num, is_oracle_mode))) {
LOG_WARN("fail to aggregate numeric accuracy", K(ret));
}
} else if (OB_FAIL(aggregate_result_type_for_merge(type, types, param_num, conn_coll_type,
is_oracle_mode, default_length_semantics, session, need_merge_type, skip_null,
is_called_in_sql))) {
LOG_WARN("fail to aggregate result type", K(ret));