diff --git a/pkg/expression/builtin_control.go b/pkg/expression/builtin_control.go index 37218a99c2c39..b08f04e0d485b 100644 --- a/pkg/expression/builtin_control.go +++ b/pkg/expression/builtin_control.go @@ -84,12 +84,25 @@ func setFlenFromArgs(evalType types.EvalType, resultFieldType *types.FieldType, } else if evalType == types.ETString { maxLen := 0 for i := range argTps { - argFlen := argTps[i].GetFlen() - if argFlen == types.UnspecifiedLength { - resultFieldType.SetFlen(types.UnspecifiedLength) - return + switch argTps[i].GetType() { + case mysql.TypeTiny: + maxLen = maxlen(4, maxLen) + case mysql.TypeShort: + maxLen = maxlen(6, maxLen) + case mysql.TypeInt24: + maxLen = maxlen(9, maxLen) + case mysql.TypeLong: + maxLen = maxlen(11, maxLen) + case mysql.TypeLonglong: + maxLen = maxlen(20, maxLen) + default: + argFlen := argTps[i].GetFlen() + if argFlen == types.UnspecifiedLength { + resultFieldType.SetFlen(types.UnspecifiedLength) + return + } + maxLen = maxlen(argFlen, maxLen) } - maxLen = maxlen(argFlen, maxLen) } resultFieldType.SetFlen(maxLen) } else { diff --git a/tests/integrationtest/r/expression/issues.result b/tests/integrationtest/r/expression/issues.result index 73504330046ff..2deeaa4b54043 100644 --- a/tests/integrationtest/r/expression/issues.result +++ b/tests/integrationtest/r/expression/issues.result @@ -2814,3 +2814,9 @@ SELECT @@GLOBAL.information_schema_stats_expiry; 0 set @@SESSION.information_schema_stats_expiry=default; set @@GLOBAL.information_schema_stats_expiry=default; +DROP TABLE IF EXISTS test.t; +CREATE TABLE test.t (id bigint(11) UNSIGNED PRIMARY KEY); +INSERT INTO test.t VALUES (1234567890123456); +SELECT IFNULL(id, 'abcdef') FROM test.t; +IFNULL(id, 'abcdef') +1234567890123456 diff --git a/tests/integrationtest/t/expression/issues.test b/tests/integrationtest/t/expression/issues.test index b9150f4921f54..97d8550bdd285 100644 --- a/tests/integrationtest/t/expression/issues.test +++ b/tests/integrationtest/t/expression/issues.test @@ -1918,3 +1918,9 @@ SELECT @@GLOBAL.information_schema_stats_expiry; SELECT @@GLOBAL.information_schema_stats_expiry; set @@SESSION.information_schema_stats_expiry=default; set @@GLOBAL.information_schema_stats_expiry=default; + +# TestIssue56462 +DROP TABLE IF EXISTS test.t; +CREATE TABLE test.t (id bigint(11) UNSIGNED PRIMARY KEY); +INSERT INTO test.t VALUES (1234567890123456); +SELECT IFNULL(id, 'abcdef') FROM test.t;