From 424995d1faff3a872afcfd529298b1c6ec0f03a6 Mon Sep 17 00:00:00 2001 From: Debiancc Date: Sat, 30 Mar 2019 11:27:05 +0800 Subject: [PATCH] types: fix converting decimal to datetime and timestamp (#9899) --- expression/integration_test.go | 12 ++++++++++++ types/convert_test.go | 2 ++ types/datum.go | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/expression/integration_test.go b/expression/integration_test.go index 973c6e9973e3d..8f4a4718fe204 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -4116,3 +4116,15 @@ func (s *testIntegrationSuite) TestIssue9710(c *C) { break } } + +// for issue #9770 +func (s *testIntegrationSuite) TestDecimalConvertToTime(c *C) { + tk := testkit.NewTestKit(c, s.store) + defer s.cleanEnv(c) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime(6), b timestamp)") + tk.MustExec("insert t values (20010101100000.123456, 20110707101112.123456)") + tk.MustQuery("select * from t").Check(testkit.Rows("2001-01-01 10:00:00.123456 2011-07-07 10:11:12")) +} diff --git a/types/convert_test.go b/types/convert_test.go index f6487f980bfe7..6398b9b87eeac 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -630,7 +630,9 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeDatetime, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") signedAccept(c, mysql.TypeDatetime, ZeroDatetime, "0000-00-00 00:00:00") signedAccept(c, mysql.TypeDatetime, int64(0), "0000-00-00 00:00:00") + signedAccept(c, mysql.TypeDatetime, NewDecFromFloatForTest(20010101100000.123456), "2001-01-01 10:00:00") signedAccept(c, mysql.TypeTimestamp, "2012-08-23 12:34:03.123456", "2012-08-23 12:34:03") + signedAccept(c, mysql.TypeTimestamp, NewDecFromFloatForTest(20010101100000.123456), "2001-01-01 10:00:00") signedAccept(c, mysql.TypeDuration, "10:11:12", "10:11:12") signedAccept(c, mysql.TypeDuration, ZeroDatetime, "00:00:00") signedAccept(c, mysql.TypeDuration, ZeroDuration, "00:00:00") diff --git a/types/datum.go b/types/datum.go index 06a7a8c9dc3bf..92bfb65ec86c4 100644 --- a/types/datum.go +++ b/types/datum.go @@ -961,6 +961,8 @@ func (d *Datum) convertToMysqlTimestamp(sc *stmtctx.StatementContext, target *Fi t, err = ParseTime(sc, d.GetString(), mysql.TypeTimestamp, fsp) case KindInt64: t, err = ParseTimeFromNum(sc, d.GetInt64(), mysql.TypeTimestamp, fsp) + case KindMysqlDecimal: + t, err = ParseTimeFromFloatString(sc, d.GetMysqlDecimal().String(), mysql.TypeTimestamp, fsp) default: return invalidConv(d, mysql.TypeTimestamp) } @@ -998,6 +1000,8 @@ func (d *Datum) convertToMysqlTime(sc *stmtctx.StatementContext, target *FieldTy return ret, errors.Trace(err) } t, err = t.RoundFrac(sc, fsp) + case KindMysqlDecimal: + t, err = ParseTimeFromFloatString(sc, d.GetMysqlDecimal().String(), tp, fsp) case KindString, KindBytes: t, err = ParseTime(sc, d.GetString(), tp, fsp) case KindInt64: