// See https://dev.mysql.com/doc/refman/5.7/en/arithmetic-functions.html#operator_div func (o *BinaryOperation) evalIntDiv(a interface{}, b interface{}) (interface{}, error) { switch x := a.(type) { case int64: switch y := b.(type) { case int64: if y == 0 { return nil, nil } return types.DivInt64(x, y) case uint64: if y == 0 { return nil, nil } return types.DivIntWithUint(x, y) } case uint64: switch y := b.(type) { case int64: if y == 0 { return nil, nil } return types.DivUintWithInt(x, y) case uint64: if y == 0 { return nil, nil } return x / y, nil } } // if any is none integer, use decimal to calculate x, err := types.ToDecimal(a) if err != nil { return nil, o.traceErr(err) } y, err := types.ToDecimal(b) if err != nil { return nil, o.traceErr(err) } if f, _ := y.Float64(); f == 0 { return nil, nil } return x.Div(y).IntPart(), nil }
func computeIntDiv(a, b interface{}) (interface{}, error) { switch x := a.(type) { case int64: switch y := b.(type) { case int64: if y == 0 { return nil, nil } return types.DivInt64(x, y) case uint64: if y == 0 { return nil, nil } return types.DivIntWithUint(x, y) } case uint64: switch y := b.(type) { case int64: if y == 0 { return nil, nil } return types.DivUintWithInt(x, y) case uint64: if y == 0 { return nil, nil } return x / y, nil } } // if any is none integer, use decimal to calculate x, err := types.ToDecimal(a) if err != nil { return nil, err } y, err := types.ToDecimal(b) if err != nil { return nil, err } if f, _ := y.Float64(); f == 0 { return nil, nil } return x.Div(y).IntPart(), nil }
func computeIntDiv(a, b types.Datum) (d types.Datum, err error) { switch a.Kind() { case types.KindInt64: x := a.GetInt64() switch b.Kind() { case types.KindInt64: y := b.GetInt64() if y == 0 { return d, nil } r, err1 := types.DivInt64(x, y) d.SetInt64(r) return d, errors.Trace(err1) case types.KindUint64: y := b.GetUint64() if y == 0 { return d, nil } r, err1 := types.DivIntWithUint(x, y) d.SetUint64(r) return d, errors.Trace(err1) } case types.KindUint64: x := a.GetUint64() switch b.Kind() { case types.KindInt64: y := b.GetInt64() if y == 0 { return d, nil } r, err1 := types.DivUintWithInt(x, y) d.SetUint64(r) return d, errors.Trace(err1) case types.KindUint64: y := b.GetUint64() if y == 0 { return d, nil } d.SetUint64(x / y) return d, nil } } // if any is none integer, use decimal to calculate x, err := a.ToDecimal() if err != nil { return d, errors.Trace(err) } y, err := b.ToDecimal() if err != nil { return d, errors.Trace(err) } if f, _ := y.Float64(); f == 0 { return d, nil } d.SetInt64(x.Div(y).IntPart()) return d, nil }