diff --git a/pkg/expression/builtin_time.go b/pkg/expression/builtin_time.go index ce1423d2d45d7..827de124c2eb0 100644 --- a/pkg/expression/builtin_time.go +++ b/pkg/expression/builtin_time.go @@ -3420,9 +3420,12 @@ func (du *baseDateArithmetical) vecGetIntervalFromInt(b *baseBuiltinFunc, ctx se result.ReserveString(n) i64s := buf.Int64s() + unsigned := mysql.HasUnsignedFlag(b.args[1].GetType().GetFlag()) for i := 0; i < n; i++ { if buf.IsNull(i) { result.AppendNull() + } else if unsigned { + result.AppendString(strconv.FormatUint(uint64(i64s[i]), 10)) } else { result.AppendString(strconv.FormatInt(i64s[i], 10)) } diff --git a/tests/integrationtest/r/expression/time.result b/tests/integrationtest/r/expression/time.result index 2058327552618..0888b7c8b701f 100644 --- a/tests/integrationtest/r/expression/time.result +++ b/tests/integrationtest/r/expression/time.result @@ -868,6 +868,57 @@ a "1000-01-01 00:00:00" + INTERVAL a MICROSECOND 9223372036854775808.00 NULL 18446744073709551615.00 NULL 18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-06 00:00:00 +-1.60 0999-12-31 00:00:00 +-1.50 0999-12-31 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-02 00:00:00 +1.60 1000-01-02 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-05 00:00:00 +-1.60 0999-12-30 00:00:00 +-1.50 0999-12-30 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY +-9223372036854775809.00 1000-01-01 00:00:00 +-9223372036854775808.00 1000-01-01 00:00:00 +-1000.50 1000-01-01 00:00:00 +-1.60 1000-01-01 00:00:00 +-1.50 1000-01-01 00:00:00 +-1.40 1000-01-01 00:00:00 +-1.00 1000-01-01 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL set @@tidb_enable_vectorized_expression=1; select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; a "1000-01-01 00:00:00" + INTERVAL a YEAR @@ -920,6 +971,57 @@ a "1000-01-01 00:00:00" + INTERVAL a MICROSECOND 9223372036854775808.00 NULL 18446744073709551615.00 NULL 18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-06 00:00:00 +-1.60 0999-12-31 00:00:00 +-1.50 0999-12-31 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-02 00:00:00 +1.60 1000-01-02 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-05 00:00:00 +-1.60 0999-12-30 00:00:00 +-1.50 0999-12-30 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY +-9223372036854775809.00 1000-01-01 00:00:00 +-9223372036854775808.00 1000-01-01 00:00:00 +-1000.50 1000-01-01 00:00:00 +-1.60 1000-01-01 00:00:00 +-1.50 1000-01-01 00:00:00 +-1.40 1000-01-01 00:00:00 +-1.00 1000-01-01 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL create table t2(a decimal(65, 2), d datetime); set @old_sql_mode=@@sql_mode; set @@sql_mode=''; diff --git a/tests/integrationtest/t/expression/time.test b/tests/integrationtest/t/expression/time.test index 46ad17a40b834..50efbebbba102 100644 --- a/tests/integrationtest/t/expression/time.test +++ b/tests/integrationtest/t/expression/time.test @@ -283,11 +283,17 @@ set @@tidb_enable_vectorized_expression=0; select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; set @@tidb_enable_vectorized_expression=1; select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; create table t2(a decimal(65, 2), d datetime); set @old_sql_mode=@@sql_mode;