Solve the problem of scale misalignment when the parameter type of the IN expression is double.
This commit is contained in:
@ -480,6 +480,21 @@ int ObExprInOrNotIn::calc_result_typeN(ObExprResType &type,
|
|||||||
{
|
{
|
||||||
int ret = ObVectorExprOperator::calc_result_typeN(type, types, param_num, type_ctx);
|
int ret = ObVectorExprOperator::calc_result_typeN(type, types, param_num, type_ctx);
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
|
if (ob_is_double_type(types[0].get_calc_type())) {
|
||||||
|
common::ObScale double_scale = 0;
|
||||||
|
int calc_scale_done = false;
|
||||||
|
for (int64_t i = 0; i < param_num && !calc_scale_done; ++i) {
|
||||||
|
if (types[i].get_calc_scale() == -1) {
|
||||||
|
double_scale = -1;
|
||||||
|
calc_scale_done = true;
|
||||||
|
} else if (types[i].get_calc_scale() > double_scale) {
|
||||||
|
double_scale = types[i].get_calc_scale();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int64_t i = 0; i < param_num; ++i) {
|
||||||
|
types[i].set_calc_scale(double_scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
type.set_scale(DEFAULT_SCALE_FOR_INTEGER);
|
type.set_scale(DEFAULT_SCALE_FOR_INTEGER);
|
||||||
type.set_precision(DEFAULT_PRECISION_FOR_BOOL);
|
type.set_precision(DEFAULT_PRECISION_FOR_BOOL);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user