Skip to content

Commit

Permalink
expression: handle builtin time getInterval from Decimal\Real (#11479) (
Browse files Browse the repository at this point in the history
  • Loading branch information
sre-bot authored Aug 1, 2019
1 parent e0d3ea6 commit d523d65
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
5 changes: 3 additions & 2 deletions expression/builtin_time.go
Original file line number Diff line number Diff line change
Expand Up @@ -2657,10 +2657,11 @@ func (du *baseDateArithmitical) getIntervalFromString(ctx sessionctx.Context, ar
}

func (du *baseDateArithmitical) getIntervalFromDecimal(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) {
interval, isNull, err := args[1].EvalString(ctx, row)
decimal, isNull, err := args[1].EvalDecimal(ctx, row)
if isNull || err != nil {
return "", true, err
}
interval := decimal.String()

switch strings.ToUpper(unit) {
case "HOUR_MINUTE", "MINUTE_SECOND", "YEAR_MONTH", "DAY_HOUR", "DAY_MINUTE",
Expand Down Expand Up @@ -2726,7 +2727,7 @@ func (du *baseDateArithmitical) getIntervalFromReal(ctx sessionctx.Context, args
if isNull || err != nil {
return "", true, err
}
return strconv.FormatFloat(interval, 'f', -1, 64), false, nil
return strconv.FormatFloat(interval, 'f', args[1].GetType().Decimal, 64), false, nil
}

func (du *baseDateArithmitical) add(ctx sessionctx.Context, date types.Time, interval string, unit string) (types.Time, bool, error) {
Expand Down
26 changes: 26 additions & 0 deletions expression/builtin_time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2761,3 +2761,29 @@ func (s *testEvaluatorSuite) TestTidbParseTso(c *C) {
c.Assert(d.IsNull(), IsTrue)
}
}

func (s *testEvaluatorSuite) TestGetIntervalFromDecimal(c *C) {
defer testleak.AfterTest(c)()
du := baseDateArithmitical{}

tests := []struct {
param string
expect string
unit string
}{
{"1.100", "1:100", "MINUTE_SECOND"},
{"1.10000", "1-10000", "YEAR_MONTH"},
{"1.10000", "1 10000", "DAY_HOUR"},
{"11000", "0 00:00:11000", "DAY_MICROSECOND"},
{"11000", "00:00:11000", "HOUR_MICROSECOND"},
{"11.1000", "00:11:1000", "HOUR_SECOND"},
{"1000", "00:1000", "MINUTE_MICROSECOND"},
}

for _, test := range tests {
interval, isNull, err := du.getIntervalFromDecimal(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum("CURRENT DATE"), types.NewDecimalDatum(newMyDecimal(c, test.param))}), chunk.Row{}, test.unit)
c.Assert(isNull, IsFalse)
c.Assert(err, IsNil)
c.Assert(interval, Equals, test.expect)
}
}
18 changes: 18 additions & 0 deletions expression/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4650,3 +4650,21 @@ func (s *testIntegrationSuite) TestFuncCaseWithLeftJoin(c *C) {

tk.MustQuery("select t1.id from kankan1 t1 left join kankan2 t2 on t1.id = t2.id where (case when t1.name='b' then 'case2' when t1.name='a' then 'case1' else NULL end) = 'case1' order by t1.id").Check(testkit.Rows("1", "2"))
}

func (s *testIntegrationSuite) TestIssue11309(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk.MustExec(`drop table if exists t;`)
tk.MustExec(`CREATE TABLE t (a decimal(6,3),b double(6,3),c float(6,3));`)
tk.MustExec(`INSERT INTO t VALUES (1.100,1.100,1.100);`)
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL a MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2003-11-18 07:27:53`))
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL b MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2003-11-18 07:27:53`))
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL c MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2003-11-18 07:27:53`))
tk.MustExec(`drop table if exists t;`)
tk.MustExec(`CREATE TABLE t (a decimal(11,7),b double(11,7),c float(11,7));`)
tk.MustExec(`INSERT INTO t VALUES (123.9999999,123.9999999,123.9999999),(-123.9999999,-123.9999999,-123.9999999);`)
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL a MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2004-03-13 03:14:52`, `2003-07-25 11:35:34`))
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL b MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2004-03-13 03:14:52`, `2003-07-25 11:35:34`))
tk.MustQuery(`SELECT DATE_ADD('2003-11-18 07:25:13',INTERVAL c MINUTE_SECOND) FROM t`).Check(testkit.Rows(`2003-11-18 09:29:13`, `2003-11-18 05:21:13`))
tk.MustExec(`drop table if exists t;`)
}

0 comments on commit d523d65

Please sign in to comment.