diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 39b6bbb215..e4e8d2e605 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -8737,6 +8737,24 @@ from typestable`, {3, "third row"}, }, }, + { + Query: "select case when 1 then 59 + 81 / 1 end;", + Expected: []sql.Row{ + {"140.0000"}, + }, + }, + { + Query: "select case 1 when 2 then null else (6 * 2) / 1 end;", + Expected: []sql.Row{ + {"12.0000"}, + }, + }, + { + Query: "select case 1 when 1 then (6 * 2) / 1 when 2 then null else null end;", + Expected: []sql.Row{ + {"12.0000"}, + }, + }, } var KeylessQueries = []QueryTest{ diff --git a/sql/expression/case.go b/sql/expression/case.go index 1e5f69db00..ea43a6f647 100644 --- a/sql/expression/case.go +++ b/sql/expression/case.go @@ -180,8 +180,12 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } - ret, _, err := t.Convert(bval) - return ret, err + // When unable to convert to the type of the case, return the original value + // A common error here is "Out of bounds value for decimal type" + if ret, _, err := t.Convert(bval); err == nil { + return ret, nil + } + return bval, nil } } @@ -190,8 +194,12 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } - ret, _, err := t.Convert(val) - return ret, err + // When unable to convert to the type of the case, return the original value + // A common error here is "Out of bounds value for decimal type" + if ret, _, err := t.Convert(val); err == nil { + return ret, nil + } + return val, nil }