diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 99ed2f3f9f..d6fcec1fd7 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -6967,6 +6967,24 @@ Select * from ( {"6"}, }, }, + { + Query: "SELECT CASE WHEN COUNT( * ) THEN 10 * CAST(-19 AS SIGNED ) + CAST(82 AS DECIMAL) END;", + Expected: []sql.Row{ + {"-108"}, + }, + }, + { + Query: "SELECT CASE WHEN COUNT( * ) THEN 10.0 * CAST(2012 AS UNSIGNED) + CAST(82 AS CHAR) END;", + Expected: []sql.Row{ + {20202.0}, + }, + }, + { + Query: "SELECT CASE WHEN COUNT( * ) THEN 10.0 * CAST(1234 AS DATE) + CAST(82 AS CHAR) END;", + Expected: []sql.Row{ + {nil}, + }, + }, { Query: "SELECT 2.0 + CAST(5 AS DECIMAL)", Expected: []sql.Row{{"7.0"}}, diff --git a/sql/expression/div.go b/sql/expression/div.go index d67dd60d10..3a6d698667 100644 --- a/sql/expression/div.go +++ b/sql/expression/div.go @@ -389,6 +389,16 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type maxFrac = s } } + case *Convert: + if c.cachedDecimalType != nil { + p, s := GetPrecisionAndScale(c.cachedDecimalType) + if whole := p - s; whole > maxWhole { + maxWhole = whole + } + if s > maxFrac { + maxFrac = s + } + } case *Literal: if types.IsNumber(c.Type()) { l, err := c.Eval(nil, nil)