in marshal.go [772:823]
func marshalVarint(info TypeInfo, value interface{}) ([]byte, error) {
var (
retBytes []byte
err error
)
switch v := value.(type) {
case unsetColumn:
return nil, nil
case uint64:
if v > uint64(math.MaxInt64) {
retBytes = make([]byte, 9)
binary.BigEndian.PutUint64(retBytes[1:], v)
} else {
retBytes = make([]byte, 8)
binary.BigEndian.PutUint64(retBytes, v)
}
case big.Int:
retBytes = encBigInt2C(&v)
default:
retBytes, err = marshalBigInt(info, value)
}
if err == nil {
// trim down to most significant byte
i := 0
for ; i < len(retBytes)-1; i++ {
b0 := retBytes[i]
if b0 != 0 && b0 != 0xFF {
break
}
b1 := retBytes[i+1]
if b0 == 0 && b1 != 0 {
if b1&0x80 == 0 {
i++
}
break
}
if b0 == 0xFF && b1 != 0xFF {
if b1&0x80 > 0 {
i++
}
break
}
}
retBytes = retBytes[i:]
}
return retBytes, err
}