diff --git a/expression/builtin_arithmetic.go b/expression/builtin_arithmetic.go index e834cad55bff..b21b9dc6a591 100644 --- a/expression/builtin_arithmetic.go +++ b/expression/builtin_arithmetic.go @@ -117,11 +117,13 @@ func setFlenDecimal4RealOrDecimal(ctx sessionctx.Context, retTp *types.FieldType retTp.SetFlen(types.UnspecifiedLength) return } - digitsInt := mathutil.Max(a.GetFlen()-a.GetDecimal(), b.GetFlen()-b.GetDecimal()) if isMultiply { - digitsInt = a.GetFlen() - a.GetDecimal() + b.GetFlen() - b.GetDecimal() + digitsInt := a.GetFlen() - a.GetDecimal() + b.GetFlen() - b.GetDecimal() + retTp.SetFlenUnderLimit(digitsInt + retTp.GetDecimal()) + } else { + digitsInt := mathutil.Max(a.GetFlen()-a.GetDecimal(), b.GetFlen()-b.GetDecimal()) + retTp.SetFlenUnderLimit(digitsInt + retTp.GetDecimal() + 1) } - retTp.SetFlenUnderLimit(digitsInt + retTp.GetDecimal() + 1) if isReal { retTp.SetFlen(mathutil.Min(retTp.GetFlen(), mysql.MaxRealWidth)) return diff --git a/expression/builtin_arithmetic_test.go b/expression/builtin_arithmetic_test.go index 564da2678ac5..0d79464ddb65 100644 --- a/expression/builtin_arithmetic_test.go +++ b/expression/builtin_arithmetic_test.go @@ -71,7 +71,7 @@ func TestSetFlenDecimal4RealOrDecimal(t *testing.T) { setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) require.Equal(t, 1, ret.GetDecimal()) - require.Equal(t, 6, ret.GetFlen()) + require.Equal(t, 5, ret.GetFlen()) b.SetFlen(65) setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) diff --git a/expression/typeinfer_test.go b/expression/typeinfer_test.go index 7e0a69e260b4..b2554c4f3d54 100644 --- a/expression/typeinfer_test.go +++ b/expression/typeinfer_test.go @@ -742,9 +742,9 @@ func (s *InferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCase { {"c_int_d * c_char", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, {"c_int_d * c_time_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"c_int_d * c_double_d", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, - {"c_int_d * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 17, 3}, - {"c_datetime * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 29, 5}, - {"c_bigint_d * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 27, 3}, + {"c_int_d * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 16, 3}, + {"c_datetime * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 28, 5}, + {"c_bigint_d * c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 26, 3}, {"c_double_d * c_decimal", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, {"c_double_d * c_char", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, {"c_double_d * c_enum", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength},