Skip to content

Commit

Permalink
expression: fix type infer of unaryMinus which should return ETDecima…
Browse files Browse the repository at this point in the history
…l if ETInt overflow int (#11989) (#11991)
  • Loading branch information
sre-bot authored and winkyao committed Sep 2, 2019
1 parent 2b99cdd commit ddf2411
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
7 changes: 3 additions & 4 deletions expression/builtin_op.go
Original file line number Diff line number Diff line change
Expand Up @@ -642,16 +642,15 @@ func (c *unaryMinusFunctionClass) handleIntOverflow(arg *Constant) (overflow boo

// typeInfer infers unaryMinus function return type. when the arg is an int constant and overflow,
// typerInfer will infers the return type as types.ETDecimal, not types.ETInt.
func (c *unaryMinusFunctionClass) typeInfer(ctx sessionctx.Context, argExpr Expression) (types.EvalType, bool) {
func (c *unaryMinusFunctionClass) typeInfer(argExpr Expression) (types.EvalType, bool) {
tp := argExpr.GetType().EvalType()
if tp != types.ETInt && tp != types.ETDecimal {
tp = types.ETReal
}

sc := ctx.GetSessionVars().StmtCtx
overflow := false
// TODO: Handle float overflow.
if arg, ok := argExpr.(*Constant); sc.InSelectStmt && ok && tp == types.ETInt {
if arg, ok := argExpr.(*Constant); ok && tp == types.ETInt {
overflow = c.handleIntOverflow(arg)
if overflow {
tp = types.ETDecimal
Expand All @@ -666,7 +665,7 @@ func (c *unaryMinusFunctionClass) getFunction(ctx sessionctx.Context, args []Exp
}

argExpr, argExprTp := args[0], args[0].GetType()
_, intOverflow := c.typeInfer(ctx, argExpr)
_, intOverflow := c.typeInfer(argExpr)

var bf baseBuiltinFunc
switch argExprTp.EvalType() {
Expand Down
6 changes: 6 additions & 0 deletions expression/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2080,6 +2080,12 @@ func (s *testIntegrationSuite) TestOpBuiltin(c *C) {
// for unaryPlus
result = tk.MustQuery(`select +1, +0, +(-9), +(-0.001), +0.999, +null, +"aaa"`)
result.Check(testkit.Rows("1 0 -9 -0.001 0.999 <nil> aaa"))
// for unaryMinus
tk.MustExec("drop table if exists f")
tk.MustExec("create table f(a decimal(65,0))")
tk.MustExec("insert into f value (-17000000000000000000)")
result = tk.MustQuery("select a from f")
result.Check(testkit.Rows("-17000000000000000000"))
}

func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) {
Expand Down

0 comments on commit ddf2411

Please sign in to comment.