code: func ComputeMul(a, b Datum) (d Datum, err error) {
  	switch a.Kind() {
  	case KindInt64:
  		switch b.Kind() {
  		case KindInt64:
  			r, err1 := MulInt64(a.GetInt64(), b.GetInt64())
  			d.SetInt64(r)
  			return d, errors.Trace(err1)
  		case KindUint64:
  			r, err1 := MulInteger(b.GetUint64(), a.GetInt64())
  			d.SetUint64(r)
  			return d, errors.Trace(err1)
  		}
  	case KindUint64:
  		switch b.Kind() {
  		case KindInt64:
  			r, err1 := MulInteger(a.GetUint64(), b.GetInt64())
  			d.SetUint64(r)
  			return d, errors.Trace(err1)
  		case KindUint64:
  			r, err1 := MulUint64(a.GetUint64(), b.GetUint64())
  			d.SetUint64(r)
  			return d, errors.Trace(err1)
  		}
  	case KindFloat64:
  		switch b.Kind() {
  		case KindFloat64:
  			r := a.GetFloat64() * b.GetFloat64()
  			d.SetFloat64(r)
  			return d, nil
  		}
  	case KindMysqlDecimal:
  		switch b.Kind() {
  		case KindMysqlDecimal:
  			r := new(MyDecimal)
  			err = DecimalMul(a.GetMysqlDecimal(), b.GetMysqlDecimal(), r)
  			d.SetMysqlDecimal(r)
  			return d, nil
  		}
  	}
  
  	_, err = InvOp2(a.GetValue(), b.GetValue(), opcode.Mul)
  	return d, errors.Trace(err)
  }
docs: // ComputeMul computes the result of a*b.