code: func checkArgs(args ...interface{}) error {
  	for i, v := range args {
  		switch x := v.(type) {
  		case bool:
  			if x {
  				args[i] = int64(1)
  			} else {
  				args[i] = int64(0)
  			}
  		case int8:
  			args[i] = int64(x)
  		case int16:
  			args[i] = int64(x)
  		case int32:
  			args[i] = int64(x)
  		case int:
  			args[i] = int64(x)
  		case uint8:
  			args[i] = uint64(x)
  		case uint16:
  			args[i] = uint64(x)
  		case uint32:
  			args[i] = uint64(x)
  		case uint:
  			args[i] = uint64(x)
  		case int64:
  		case uint64:
  		case float32:
  		case float64:
  		case string:
  		case []byte:
  		case time.Duration:
  			args[i] = types.Duration{Duration: x}
  		case time.Time:
  			args[i] = types.Time{Time: types.FromGoTime(x), Type: mysql.TypeDatetime}
  		case nil:
  		default:
  			return errors.Errorf("cannot use arg[%d] (type %T):unsupported type", i, v)
  		}
  	}
  	return nil
  }
docs: // checkArgs makes sure all the arguments' types are known and can be handled.
  // integer types are converted to int64 and uint64, time.Time is converted to types.Time.
  // time.Duration is converted to types.Duration, other known types are leaved as it is.