Skip to content

Commit 26ee4fc

Browse files
authored
expresssion: fix div result type infer bug if a integer type has minimum display length (#56158) (#56212)
close #55837
1 parent 4261bf4 commit 26ee4fc

File tree

4 files changed

+17
-6
lines changed

4 files changed

+17
-6
lines changed

pkg/expression/builtin_arithmetic.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,6 @@ func (c *arithmeticDivideFunctionClass) getFunction(ctx BuildContext, args []Exp
646646
if err := c.verifyArgs(args); err != nil {
647647
return nil, err
648648
}
649-
lhsTp, rhsTp := args[0].GetType(), args[1].GetType()
650649
lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1])
651650
if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal {
652651
bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal)
@@ -662,6 +661,7 @@ func (c *arithmeticDivideFunctionClass) getFunction(ctx BuildContext, args []Exp
662661
if err != nil {
663662
return nil, err
664663
}
664+
lhsTp, rhsTp := args[0].GetType(), args[1].GetType()
665665
c.setType4DivDecimal(bf.tp, lhsTp, rhsTp, ctx.GetEvalCtx().GetDivPrecisionIncrement())
666666
sig := &builtinArithmeticDivideDecimalSig{bf}
667667
sig.setPbCode(tipb.ScalarFuncSig_DivideDecimal)

pkg/expression/typeinfer_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -752,19 +752,19 @@ func (s *InferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCase {
752752
{"c_double_d * c_char", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength},
753753
{"c_double_d * c_enum", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength},
754754

755-
{"c_int_d / c_int_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 16, 4},
756-
{"c_int_d / c_bigint_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 16, 4},
755+
{"c_int_d / c_int_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 15, 4},
756+
{"c_int_d / c_bigint_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 15, 4},
757757
{"c_int_d / c_char", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength},
758-
{"c_int_d / c_time_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 16, 4},
758+
{"c_int_d / c_time_d", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 15, 4},
759759
{"c_int_d / c_double_d", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength},
760-
{"c_int_d / c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 19, 4},
760+
{"c_int_d / c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 18, 4},
761761
{"c_datetime / c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 29, 6}, // TODO: flen should be 25.
762762
{"c_bigint_d / c_decimal", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 28, 4}, // TODO: flen should be 28.
763763
{"c_double_d / c_decimal", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength},
764764
{"c_double_d / c_char", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength},
765765
{"c_double_d / c_enum", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength},
766766
{"2/3", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 6, 4},
767-
{"-2/3", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 7, 4},
767+
{"-2/3", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 6, 4},
768768

769769
{"c_int_d DIV c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0},
770770
{"c_uint_d DIV c_uint_d", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0},

tests/integrationtest/r/executor/issues.result

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,3 +868,9 @@ set @@tidb_max_chunk_size = default;
868868
select tan(9021874879467600608071521900001091070693729763119983979);
869869
tan(9021874879467600608071521900001091070693729763119983979)
870870
8.068627196084492
871+
CREATE TABLE test_55837 (col1 int(4) NOT NULL, col2 bigint(4) NOT NULL, KEY col2_index (col2));
872+
insert into test_55837 values(0,1725292800),(0,1725292800);
873+
select from_unixtime( if(col2 >9999999999, col2/1000, col2), '%Y-%m-%d %H:%i:%s') as result from test_55837;
874+
result
875+
2024-09-03 00:00:00
876+
2024-09-03 00:00:00

tests/integrationtest/t/executor/issues.test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,3 +663,8 @@ set @@tidb_max_chunk_size = default;
663663

664664
# TestIssue52672
665665
select tan(9021874879467600608071521900001091070693729763119983979);
666+
667+
# TestIssue55837
668+
CREATE TABLE test_55837 (col1 int(4) NOT NULL, col2 bigint(4) NOT NULL, KEY col2_index (col2));
669+
insert into test_55837 values(0,1725292800),(0,1725292800);
670+
select from_unixtime( if(col2 >9999999999, col2/1000, col2), '%Y-%m-%d %H:%i:%s') as result from test_55837;

0 commit comments

Comments
 (0)