Documentation ¶
Index ¶
- Constants
- Variables
- func AddDate(year, month, day int64, ot gotime.Time) (nt gotime.Time)
- func AddInt64(a int64, b int64) (int64, error)
- func AddInteger(a uint64, b int64) (uint64, error)
- func AddUint64(a uint64, b uint64) (uint64, error)
- func AdjustYear(y int64, shouldAdjust bool) (int64, error)
- func CheckFsp(fsp int) (int, error)
- func CompareFloat64(x, y float64) int
- func CompareInt64(x, y int64) int
- func CompareString(x, y string) int
- func CompareUint64(x, y uint64) int
- func ConvertFloatToInt(fval float64, lowerBound, upperBound int64, tp byte) (int64, error)
- func ConvertIntToInt(val int64, lowerBound int64, upperBound int64, tp byte) (int64, error)
- func ConvertUintToInt(val uint64, upperBound int64, tp byte) (int64, error)
- func ConvertUintToUint(val uint64, upperBound uint64, tp byte) (uint64, error)
- func DateDiff(startTime, endTime MysqlTime) int
- func DateFSP(date string) (fsp int)
- func DatumsToStrNoErr(datums []Datum) string
- func DatumsToString(datums []Datum, handleSpecialValue bool) (string, error)
- func DecimalAdd(from1, from2, to *MyDecimal) error
- func DecimalDiv(from1, from2, to *MyDecimal, fracIncr int) error
- func DecimalMod(from1, from2, to *MyDecimal) error
- func DecimalMul(from1, from2, to *MyDecimal) error
- func DecimalPeak(b []byte) (int, error)
- func DecimalSub(from1, from2, to *MyDecimal) error
- func DefaultCharsetForType(tp byte) (string, string)
- func DefaultParamTypeForValue(value interface{}, tp *FieldType)
- func DefaultTypeForValue(value interface{}, tp *FieldType)
- func DivInt64(a int64, b int64) (int64, error)
- func DivIntWithUint(a int64, b uint64) (uint64, error)
- func DivUintWithInt(a uint64, b int64) (uint64, error)
- func EOFAsNil(err error) error
- func ExtractDatetimeNum(t *Time, unit string) (int64, error)
- func ExtractDurationNum(d *Duration, unit string) (int64, error)
- func ExtractTimeValue(unit string, format string) (int64, int64, int64, float64, error)
- func GetFormatType(format string) (isDuration, isDate bool)
- func GetFsp(s string) (fsp int)
- func GetLastDay(year, month int) int
- func GetMaxFloat(flen int, decimal int) float64
- func HasCharset(ft *FieldType) bool
- func InvOp2(x, y interface{}, o opcode.Op) (interface{}, error)
- func IsBinaryStr(ft *FieldType) bool
- func IsClockUnit(unit string) bool
- func IsDateFormat(format string) bool
- func IsNonBinaryStr(ft *FieldType) bool
- func IsString(tp byte) bool
- func IsTemporalWithDate(tp byte) bool
- func IsTypeBlob(tp byte) bool
- func IsTypeChar(tp byte) bool
- func IsTypeFractionable(tp byte) bool
- func IsTypeNumeric(tp byte) bool
- func IsTypePrefixable(tp byte) bool
- func IsTypeTemporal(tp byte) bool
- func IsTypeTime(tp byte) bool
- func IsTypeUnspecified(tp byte) bool
- func IsTypeVarchar(tp byte) bool
- func KindStr(kind byte) (r string)
- func MergeFieldType(a byte, b byte) byte
- func MulInt64(a int64, b int64) (int64, error)
- func MulInteger(a uint64, b int64) (uint64, error)
- func MulUint64(a uint64, b uint64) (uint64, error)
- func ParseDateFormat(format string) []string
- func ParseFrac(s string, fsp int) (v int, overflow bool, err error)
- func ParseYear(str string) (int16, error)
- func Round(f float64, dec int) float64
- func RoundFloat(f float64) float64
- func RoundFrac(t gotime.Time, fsp int) (gotime.Time, error)
- func SetBinChsClnFlag(ft *FieldType)
- func SubInt64(a int64, b int64) (int64, error)
- func SubIntWithUint(a int64, b uint64) (uint64, error)
- func SubUint64(a uint64, b uint64) (uint64, error)
- func SubUintWithInt(a uint64, b int64) (uint64, error)
- func TimestampDiff(unit string, t1 Time, t2 Time) int64
- func ToString(value interface{}) (string, error)
- func Truncate(f float64, dec int) float64
- func TruncateFloat(f float64, flen int, decimal int) (float64, error)
- func TruncateOverflowMySQLTime(d gotime.Duration) (gotime.Duration, error)
- func TypeStr(tp byte) (r string)
- func TypeToStr(tp byte, cs string) (r string)
- type BinaryLiteral
- type BitLiteral
- type Datum
- func ComputePlus(a, b Datum) (d Datum, err error)
- func CopyDatum(datum Datum) Datum
- func CopyRow(dr []Datum) []Datum
- func MakeDatums(args ...interface{}) []Datum
- func MaxValueDatum() Datum
- func MinNotNullDatum() Datum
- func NewBinaryLiteralDatum(b BinaryLiteral) (d Datum)
- func NewBytesDatum(b []byte) (d Datum)
- func NewDatum(in interface{}) (d Datum)
- func NewDecimalDatum(dec *MyDecimal) (d Datum)
- func NewDurationDatum(dur Duration) (d Datum)
- func NewFloat32Datum(f float32) (d Datum)
- func NewFloat64Datum(f float64) (d Datum)
- func NewIntDatum(i int64) (d Datum)
- func NewMysqlBitDatum(b BinaryLiteral) (d Datum)
- func NewMysqlEnumDatum(e Enum) (d Datum)
- func NewStringDatum(s string) (d Datum)
- func NewTimeDatum(t Time) (d Datum)
- func NewUintDatum(i uint64) (d Datum)
- func (d *Datum) Collation() byte
- func (d *Datum) Copy() *Datum
- func (d *Datum) Frac() int
- func (d *Datum) GetBinaryLiteral() BinaryLiteral
- func (d *Datum) GetBytes() []byte
- func (d *Datum) GetFloat32() float32
- func (d *Datum) GetFloat64() float64
- func (d *Datum) GetInt64() int64
- func (d *Datum) GetInterface() interface{}
- func (d *Datum) GetMysqlBit() BinaryLiteral
- func (d *Datum) GetMysqlDecimal() *MyDecimal
- func (d *Datum) GetMysqlDuration() Duration
- func (d *Datum) GetMysqlEnum() Enum
- func (d *Datum) GetMysqlJSON() json.BinaryJSON
- func (d *Datum) GetMysqlSet() Set
- func (d *Datum) GetMysqlTime() Time
- func (d *Datum) GetRaw() []byte
- func (d *Datum) GetString() string
- func (d *Datum) GetUint64() uint64
- func (d *Datum) GetValue() interface{}
- func (d *Datum) IsNull() bool
- func (d *Datum) Kind() byte
- func (d *Datum) Length() int
- func (d *Datum) SetAutoID(id int64, flag uint)
- func (d *Datum) SetBinaryLiteral(b BinaryLiteral)
- func (d *Datum) SetBytes(b []byte)
- func (d *Datum) SetBytesAsString(b []byte)
- func (d *Datum) SetCollation(collation byte)
- func (d *Datum) SetFloat32(f float32)
- func (d *Datum) SetFloat64(f float64)
- func (d *Datum) SetFrac(frac int)
- func (d *Datum) SetInt64(i int64)
- func (d *Datum) SetInterface(x interface{})
- func (d *Datum) SetLength(l int)
- func (d *Datum) SetMinNotNull()
- func (d *Datum) SetMysqlBit(b BinaryLiteral)
- func (d *Datum) SetMysqlDecimal(b *MyDecimal)
- func (d *Datum) SetMysqlDuration(b Duration)
- func (d *Datum) SetMysqlEnum(b Enum)
- func (d *Datum) SetMysqlJSON(b json.BinaryJSON)
- func (d *Datum) SetMysqlSet(b Set)
- func (d *Datum) SetMysqlTime(b Time)
- func (d *Datum) SetNull()
- func (d *Datum) SetRaw(b []byte)
- func (d *Datum) SetString(s string)
- func (d *Datum) SetUint64(i uint64)
- func (d *Datum) SetValue(val interface{})
- func (d *Datum) ToBytes() ([]byte, error)
- func (d *Datum) ToMysqlJSON() (j json.BinaryJSON, err error)
- func (d *Datum) ToString() (string, error)
- type Duration
- func (d Duration) Add(v Duration) (Duration, error)
- func (d Duration) Compare(o Duration) int
- func (d Duration) Hour() int
- func (d Duration) MicroSecond() int
- func (d Duration) Minute() int
- func (d Duration) RoundFrac(fsp int) (Duration, error)
- func (d Duration) Second() int
- func (d Duration) String() string
- func (d Duration) Sub(v Duration) (Duration, error)
- func (d Duration) ToNumber() *MyDecimal
- type Enum
- type EvalType
- type FieldType
- func (ft *FieldType) Clone() *FieldType
- func (ft *FieldType) CompactStr() string
- func (ft *FieldType) Equal(other *FieldType) bool
- func (ft *FieldType) EvalType() EvalType
- func (ft *FieldType) FormatAsCastType(w io.Writer)
- func (ft *FieldType) Hybrid() bool
- func (ft *FieldType) InfoSchemaStr() string
- func (ft *FieldType) Init(tp byte)
- func (ft *FieldType) Restore(ctx *format.RestoreCtx) error
- func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx)
- func (ft *FieldType) StorageLength() int
- func (ft *FieldType) String() string
- type HexLiteral
- type MyDecimal
- func (d *MyDecimal) Compare(to *MyDecimal) int
- func (d *MyDecimal) FromBin(bin []byte, precision, frac int) (binSize int, err error)
- func (d *MyDecimal) FromFloat64(f float64) error
- func (d *MyDecimal) FromInt(val int64) *MyDecimal
- func (d *MyDecimal) FromString(str []byte) error
- func (d *MyDecimal) FromUint(val uint64) *MyDecimal
- func (d *MyDecimal) GetDigitsFrac() int8
- func (d *MyDecimal) IsNegative() bool
- func (d *MyDecimal) IsZero() bool
- func (d *MyDecimal) PrecisionAndFrac() (precision, frac int)
- func (d *MyDecimal) Round(to *MyDecimal, frac int, roundMode RoundMode) (err error)
- func (d *MyDecimal) Shift(shift int) error
- func (d *MyDecimal) String() string
- func (d *MyDecimal) ToBin(precision, frac int) ([]byte, error)
- func (d *MyDecimal) ToFloat64() (float64, error)
- func (d *MyDecimal) ToHashKey() ([]byte, error)
- func (d *MyDecimal) ToInt() (int64, error)
- func (d *MyDecimal) ToString() (str []byte)
- func (d *MyDecimal) ToUint() (uint64, error)
- type MysqlTime
- func (t MysqlTime) Day() int
- func (t MysqlTime) GoTime(loc *gotime.Location) (gotime.Time, error)
- func (t MysqlTime) Hour() int
- func (t MysqlTime) IsLeapYear() bool
- func (t MysqlTime) Microsecond() int
- func (t MysqlTime) Minute() int
- func (t MysqlTime) Month() int
- func (t MysqlTime) Second() int
- func (t MysqlTime) Week(mode int) int
- func (t MysqlTime) Weekday() gotime.Weekday
- func (t MysqlTime) Year() int
- func (t MysqlTime) YearDay() int
- func (t MysqlTime) YearWeek(mode int) (int, int)
- type RoundMode
- type Set
- type Time
- func (t Time) Clock() (hour int, minute int, second int)
- func (t Time) Compare(o Time) int
- func (t *Time) ConvertTimeZone(from, to *gotime.Location) error
- func (t Time) ConvertToDuration() (Duration, error)
- func (t Time) DateFormat(layout string) (string, error)
- func (t *Time) FromPackedUint(packed uint64) error
- func (t Time) InvalidZero() bool
- func (t Time) IsZero() bool
- func (t Time) String() string
- func (t Time) ToNumber() *MyDecimal
- func (t Time) ToPackedUint() (uint64, error)
Constants ¶
const ( KindNull byte = 0 KindInt64 byte = 1 KindUint64 byte = 2 KindFloat32 byte = 3 KindFloat64 byte = 4 KindString byte = 5 KindBytes byte = 6 KindBinaryLiteral byte = 7 // Used for BIT / HEX literals. KindMysqlDecimal byte = 8 KindMysqlDuration byte = 9 KindMysqlEnum byte = 10 KindMysqlBit byte = 11 // Used for BIT table column values. KindMysqlSet byte = 12 KindMysqlTime byte = 13 KindInterface byte = 14 KindMinNotNull byte = 15 KindMaxValue byte = 16 KindRaw byte = 17 KindMysqlJSON byte = 18 )
Kind constants.
const ( // UnspecifiedFsp is the unspecified fractional seconds part. UnspecifiedFsp = -1 // MaxFsp is the maximum digit of fractional seconds part. MaxFsp = 6 // MinFsp is the minimum digit of fractional seconds part. MinFsp = 0 // DefaultFsp is the default digit of fractional seconds part. // MySQL use 0 as the default Fsp. DefaultFsp = 0 )
const ( DateFormat = "2006-01-02" TimeFormat = "2006-01-02 15:04:05" // TimeFSPFormat is time format with fractional seconds precision. TimeFSPFormat = "2006-01-02 15:04:05.000000" )
Time format without fractional seconds precision.
const ( // MinYear is the minimum for mysql year type. MinYear int16 = 1901 // MaxYear is the maximum for mysql year type. MaxYear int16 = 2155 // MaxDuration is the maximum for duration. MaxDuration int64 = 838*10000 + 59*100 + 59 // MinTime is the minimum for mysql time type. MinTime = -gotime.Duration(838*3600+59*60+59) * gotime.Second // MaxTime is the maximum for mysql time type. MaxTime = gotime.Duration(838*3600+59*60+59) * gotime.Second // ZeroDatetimeStr is the string representation of a zero datetime. ZeroDatetimeStr = "0000-00-00 00:00:00" // ZeroDateStr is the string representation of a zero date. ZeroDateStr = "0000-00-00" // TimeMaxHour is the max hour for mysql time type. TimeMaxHour = 838 // TimeMaxMinute is the max minute for mysql time type. TimeMaxMinute = 59 // TimeMaxSecond is the max second for mysql time type. TimeMaxSecond = 59 // TimeMaxValue is the maximum value for mysql time type. TimeMaxValue = TimeMaxHour*10000 + TimeMaxMinute*100 + TimeMaxSecond // TimeMaxValueSeconds is the maximum second value for mysql time type. TimeMaxValueSeconds = TimeMaxHour*3600 + TimeMaxMinute*60 + TimeMaxSecond )
const MyDecimalStructSize = 40
MyDecimalStructSize is the struct size of MyDecimal.
const (
UnspecifiedLength = -1
)
UnspecifiedLength is unspecified length.
const VarStorageLen = -1
VarStorageLen indicates this column is a variable length column.
Variables ¶
var ( // ErrDataTooLong is returned when converts a string value that is longer than field type length. ErrDataTooLong = terror.ClassTypes.New(codeDataTooLong, "Data Too Long") // ErrIllegalValueForType is returned when value of type is illegal. ErrIllegalValueForType = terror.ClassTypes.New(codeIllegalValueForType, mysql.MySQLErrName[mysql.ErrIllegalValueForType]) // ErrTruncated is returned when data has been truncated during conversion. ErrTruncated = terror.ClassTypes.New(codeTruncated, "Data Truncated") // ErrTruncatedWrongVal is returned when data has been truncated during conversion. ErrTruncatedWrongVal = terror.ClassTypes.New(codeTruncatedWrongValue, msgTruncatedWrongVal) // ErrOverflow is returned when data is out of range for a field type. ErrOverflow = terror.ClassTypes.New(codeOverflow, msgOverflow) // ErrDivByZero is return when do division by 0. ErrDivByZero = terror.ClassTypes.New(codeDivByZero, "Division by 0") // ErrTooBigDisplayWidth is return when display width out of range for column. ErrTooBigDisplayWidth = terror.ClassTypes.New(codeTooBigDisplayWidth, "Too Big Display width") // ErrTooBigFieldLength is return when column length too big for column. ErrTooBigFieldLength = terror.ClassTypes.New(codeTooBigFieldLength, "Too Big Field length") // ErrTooBigSet is returned when too many strings for column. ErrTooBigSet = terror.ClassTypes.New(codeTooBigSet, "Too Big Set") // ErrTooBigScale is returned when type DECIMAL/NUMERIC scale is bigger than mysql.MaxDecimalScale. ErrTooBigScale = terror.ClassTypes.New(codeTooBigScale, mysql.MySQLErrName[mysql.ErrTooBigScale]) // ErrTooBigPrecision is returned when type DECIMAL/NUMERIC precision is bigger than mysql.MaxDecimalWidth ErrTooBigPrecision = terror.ClassTypes.New(codeTooBigPrecision, mysql.MySQLErrName[mysql.ErrTooBigPrecision]) // ErrWrongFieldSpec is return when incorrect column specifier for column. ErrWrongFieldSpec = terror.ClassTypes.New(codeWrongFieldSpec, "Wrong Field Spec") // ErrBadNumber is return when parsing an invalid binary decimal number. ErrBadNumber = terror.ClassTypes.New(codeBadNumber, "Bad Number") // ErrInvalidDefault is returned when meet a invalid default value. // ErrInvalidDefault = ErrInvalidDefault // ErrCastAsSignedOverflow is returned when positive out-of-range integer, and convert to it's negative complement. ErrCastAsSignedOverflow = terror.ClassTypes.New(codeUnknown, msgCastAsSignedOverflow) // ErrCastNegIntAsUnsigned is returned when a negative integer be casted to an unsigned int. ErrCastNegIntAsUnsigned = terror.ClassTypes.New(codeUnknown, msgCastNegIntAsUnsigned) // ErrMBiggerThanD is returned when precision less than the scale. ErrMBiggerThanD = terror.ClassTypes.New(codeMBiggerThanD, mysql.MySQLErrName[mysql.ErrMBiggerThanD]) // ErrWarnDataOutOfRange is returned when the value in a numeric column that is outside the permissible range of the column data type. // See https://dev.mysql.com/doc/refman/5.5/en/out-of-range-and-overflow.html for details ErrWarnDataOutOfRange = terror.ClassTypes.New(codeDataOutOfRange, mysql.MySQLErrName[mysql.ErrWarnDataOutOfRange]) // ErrDuplicatedValueInType is returned when enum column has duplicated value. ErrDuplicatedValueInType = terror.ClassTypes.New(codeDuplicatedValueInType, mysql.MySQLErrName[mysql.ErrDuplicatedValueInType]) )
var ( ErrInvalidTimeFormat = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, "invalid time format: '%v'") ErrInvalidYearFormat = errors.New("invalid year format") ErrInvalidYear = errors.New("invalid year") ErrZeroDate = errors.New("datetime zero in date") ErrIncorrectDatetimeValue = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, "Incorrect datetime value: '%s'") ErrTruncatedWrongValue = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrTruncatedWrongValue]) )
Portable analogs of some common call errors.
var ( // ZeroDuration is the zero value for Duration type. ZeroDuration = Duration{Duration: gotime.Duration(0), Fsp: DefaultFsp} // ZeroTime is the zero value for TimeInternal type. ZeroTime = MysqlTime{} // ZeroDatetime is the zero value for datetime Time. ZeroDatetime = Time{ Time: ZeroTime, Type: mysql.TypeDatetime, Fsp: DefaultFsp, } // ZeroTimestamp is the zero value for timestamp Time. ZeroTimestamp = Time{ Time: ZeroTime, Type: mysql.TypeTimestamp, Fsp: DefaultFsp, } // ZeroDate is the zero value for date Time. ZeroDate = Time{ Time: ZeroTime, Type: mysql.TypeDate, Fsp: DefaultFsp, } )
Zero values for different types.
var ( // MinDatetime is the minimum for mysql datetime type. MinDatetime = FromDate(1000, 1, 1, 0, 0, 0, 0) // MaxDatetime is the maximum for mysql datetime type. MaxDatetime = FromDate(9999, 12, 31, 23, 59, 59, 999999) // BoundTimezone is the timezone for min and max timestamp. BoundTimezone = gotime.UTC // MinTimestamp is the minimum for mysql timestamp type. MinTimestamp = Time{ Time: FromDate(1970, 1, 1, 0, 0, 1, 0), Type: mysql.TypeTimestamp, Fsp: DefaultFsp, } // MaxTimestamp is the maximum for mysql timestamp type. MaxTimestamp = Time{ Time: FromDate(2038, 1, 19, 3, 14, 7, 999999), Type: mysql.TypeTimestamp, Fsp: DefaultFsp, } // WeekdayNames lists names of weekdays, which are used in builtin time function `dayname`. WeekdayNames = []string{ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", } // MonthNames lists names of months, which are used in builtin time function `monthname`. MonthNames = []string{ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", } )
var ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'")
ErrInvalidDefault is returned when meet a invalid default value.
var SignedLowerBound = map[byte]int64{ mysql.TypeTiny: math.MinInt8, mysql.TypeShort: math.MinInt16, mysql.TypeInt24: mysql.MinInt24, mysql.TypeLong: math.MinInt32, mysql.TypeLonglong: math.MinInt64, }
SignedLowerBound indicates the min int64 values of different mysql types.
var SignedUpperBound = map[byte]int64{ mysql.TypeTiny: math.MaxInt8, mysql.TypeShort: math.MaxInt16, mysql.TypeInt24: mysql.MaxInt24, mysql.TypeLong: math.MaxInt32, mysql.TypeLonglong: math.MaxInt64, }
SignedUpperBound indicates the max int64 values of different mysql types.
var UnsignedUpperBound = map[byte]uint64{ mysql.TypeTiny: math.MaxUint8, mysql.TypeShort: math.MaxUint16, mysql.TypeInt24: mysql.MaxUint24, mysql.TypeLong: math.MaxUint32, mysql.TypeLonglong: math.MaxUint64, mysql.TypeBit: math.MaxUint64, mysql.TypeEnum: math.MaxUint64, mysql.TypeSet: math.MaxUint64, }
UnsignedUpperBound indicates the max uint64 values of different mysql types.
var ZeroBinaryLiteral = BinaryLiteral{}
ZeroBinaryLiteral is a BinaryLiteral literal with zero value.
Functions ¶
func AddDate ¶
AddDate fix gap between mysql and golang api When we execute select date_add('2018-01-31',interval 1 month) in mysql we got 2018-02-28 but in tidb we got 2018-03-03. Dig it and we found it's caused by golang api time.Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time , it says October 32 converts to November 1 ,it conflits with mysql. See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add
func AddInteger ¶
AddInteger adds uint64 a and int64 b and returns uint64 if no overflow error.
func AdjustYear ¶
AdjustYear is used for adjusting year and checking its validation.
func CompareFloat64 ¶
CompareFloat64 returns an integer comparing the float64 x to y.
func CompareInt64 ¶
CompareInt64 returns an integer comparing the int64 x to y.
func CompareString ¶
CompareString returns an integer comparing the string x to y.
func CompareUint64 ¶
CompareUint64 returns an integer comparing the uint64 x to y.
func ConvertFloatToInt ¶
ConvertFloatToInt converts a float64 value to a int value.
func ConvertIntToInt ¶
ConvertIntToInt converts an int value to another int value of different precision.
func ConvertUintToInt ¶
ConvertUintToInt converts an uint value to an int value.
func ConvertUintToUint ¶
ConvertUintToUint converts an uint value to another uint value of different precision.
func DatumsToStrNoErr ¶
DatumsToStrNoErr converts some datums to a formatted string. If an error occurs, it will print a log instead of returning an error.
func DatumsToString ¶
DatumsToString converts several datums to formatted string.
func DecimalAdd ¶
DecimalAdd adds two decimals, sets the result to 'to'. Note: DO NOT use `from1` or `from2` as `to` since the metadata of `to` may be changed during evaluating.
func DecimalDiv ¶
DecimalDiv does division of two decimals.
from1 - dividend from2 - divisor to - quotient fracIncr - increment of fraction
func DecimalMod ¶
DecimalMod does modulus of two decimals.
from1 - dividend from2 - divisor to - modulus RETURN VALUE E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW/E_DEC_DIV_ZERO; NOTES see do_div_mod() DESCRIPTION the modulus R in R = M mod N is defined as 0 <= |R| < |M| sign R == sign M R = M - k*N, where k is integer thus, there's no requirement for M or N to be integers
func DecimalMul ¶
DecimalMul multiplies two decimals.
from1, from2 - factors to - product RETURN VALUE E_DEC_OK/E_DEC_TRUNCATED/E_DEC_OVERFLOW; NOTES in this implementation, with wordSize=4 we have digitsPerWord=9, and 63-digit number will take only 7 words (basically a 7-digit "base 999999999" number). Thus there's no need in fast multiplication algorithms, 7-digit numbers can be multiplied with a naive O(n*n) method. XXX if this library is to be used with huge numbers of thousands of digits, fast multiplication must be implemented.
func DecimalPeak ¶
DecimalPeak returns the length of the encoded decimal.
func DecimalSub ¶
DecimalSub subs one decimal from another, sets the result to 'to'.
func DefaultCharsetForType ¶
DefaultCharsetForType returns the default charset/collation for mysql type.
func DefaultParamTypeForValue ¶
func DefaultParamTypeForValue(value interface{}, tp *FieldType)
DefaultParamTypeForValue returns the default FieldType for the parameterized value.
func DefaultTypeForValue ¶
func DefaultTypeForValue(value interface{}, tp *FieldType)
DefaultTypeForValue returns the default FieldType for the value.
func DivInt64 ¶
DivInt64 divides int64 a with b, returns int64 if no overflow error. It just checks overflow, if b is zero, a "divide by zero" panic throws.
func DivIntWithUint ¶
DivIntWithUint divides int64 a with uint64 b, returns uint64 if no overflow error. It just checks overflow, if b is zero, a "divide by zero" panic throws.
func DivUintWithInt ¶
DivUintWithInt divides uint64 a with int64 b, returns uint64 if no overflow error. It just checks overflow, if b is zero, a "divide by zero" panic throws.
func ExtractDatetimeNum ¶
ExtractDatetimeNum extracts time value number from datetime unit and format.
func ExtractDurationNum ¶
ExtractDurationNum extracts duration value number from duration unit and format.
func ExtractTimeValue ¶
ExtractTimeValue extracts time value from time unit and format.
func GetFormatType ¶
GetFormatType checks the type(Duration, Date or Datetime) of a format string.
func GetMaxFloat ¶
GetMaxFloat gets the max float for given flen and decimal.
func HasCharset ¶
HasCharset indicates if a COLUMN has an associated charset. Returning false here prevents some information statements(like `SHOW CREATE TABLE`) from attaching a CHARACTER SET clause to the column.
func IsBinaryStr ¶
IsBinaryStr returns a boolean indicating whether the field type is a binary string type.
func IsClockUnit ¶
IsClockUnit returns true when unit is interval unit with hour, minute or second.
func IsDateFormat ¶
IsDateFormat returns true when the specified time format could contain only date.
func IsNonBinaryStr ¶
IsNonBinaryStr returns a boolean indicating whether the field type is a non-binary string type.
func IsTemporalWithDate ¶
IsTemporalWithDate returns a boolean indicating whether the tp is time type with date.
func IsTypeBlob ¶
IsTypeBlob returns a boolean indicating whether the tp is a blob type.
func IsTypeChar ¶
IsTypeChar returns a boolean indicating whether the tp is the char type like a string type or a varchar type.
func IsTypeFractionable ¶
IsTypeFractionable returns a boolean indicating whether the tp can has time fraction.
func IsTypeNumeric ¶
IsTypeNumeric returns a boolean indicating whether the tp is numeric type.
func IsTypePrefixable ¶
IsTypePrefixable returns a boolean indicating whether an index on a column with the tp can be defined with a prefix.
func IsTypeTemporal ¶
IsTypeTemporal checks if a type is a temporal type.
func IsTypeTime ¶
IsTypeTime returns a boolean indicating whether the tp is time type like datetime, date or timestamp.
func IsTypeUnspecified ¶
IsTypeUnspecified returns a boolean indicating whether the tp is the Unspecified type.
func IsTypeVarchar ¶
IsTypeVarchar returns a boolean indicating whether the tp is the varchar type like a varstring type or a varchar type.
func MergeFieldType ¶
MergeFieldType merges two MySQL type to a new type. This is used in hybrid field type expression. For example "select case c when 1 then 2 when 2 then 'tidb' from t;" The result field type of the case expression is the merged type of the two when clause. See https://github.com/mysql/mysql-server/blob/5.7/sql/field.cc#L1042
func MulInteger ¶
MulInteger multiplies uint64 a and int64 b, and returns uint64 if no overflow error.
func ParseDateFormat ¶
ParseDateFormat parses a formatted date string and returns separated components.
func ParseFrac ¶
ParseFrac parses the input string according to fsp, returns the microsecond, and also a bool value to indice overflow. eg: "999" fsp=2 will overflow.
func Round ¶
Round rounds the argument f to dec decimal places. dec defaults to 0 if not specified. dec can be negative to cause dec digits left of the decimal point of the value f to become zero.
func RoundFloat ¶
RoundFloat rounds float val to the nearest integer value with float64 format, like MySQL Round function. RoundFloat uses default rounding mode, see https://dev.mysql.com/doc/refman/5.7/en/precision-math-rounding.html so rounding use "round half away from zero". e.g, 1.5 -> 2, -1.5 -> -2.
func RoundFrac ¶
RoundFrac rounds fractional seconds precision with new fsp and returns a new one. We will use the “round half up” rule, e.g, >= 0.5 -> 1, < 0.5 -> 0, so 2011:11:11 10:10:10.888888 round 0 -> 2011:11:11 10:10:11 and 2011:11:11 10:10:10.111111 round 0 -> 2011:11:11 10:10:10
func SetBinChsClnFlag ¶
func SetBinChsClnFlag(ft *FieldType)
SetBinChsClnFlag sets charset, collation as 'binary' and adds binaryFlag to FieldType.
func SubIntWithUint ¶
SubIntWithUint subtracts int64 a with uint64 b and returns uint64 if no overflow error.
func SubUintWithInt ¶
SubUintWithInt subtracts uint64 a with int64 b and returns uint64 if no overflow error.
func TimestampDiff ¶
TimestampDiff returns t2 - t1 where t1 and t2 are date or datetime expressions. The unit for the result (an integer) is given by the unit argument. The legal values for unit are "YEAR" "QUARTER" "MONTH" "DAY" "HOUR" "SECOND" and so on.
func Truncate ¶
Truncate truncates the argument f to dec decimal places. dec defaults to 0 if not specified. dec can be negative to cause dec digits left of the decimal point of the value f to become zero.
func TruncateFloat ¶
TruncateFloat tries to truncate f. If the result exceeds the max/min float that flen/decimal allowed, returns the max/min float allowed.
func TruncateOverflowMySQLTime ¶
TruncateOverflowMySQLTime truncates d when it overflows, and return ErrTruncatedWrongVal.
Types ¶
type BinaryLiteral ¶
type BinaryLiteral []byte
BinaryLiteral is the internal type for storing bit / hex literal type.
func NewBinaryLiteralFromUint ¶
func NewBinaryLiteralFromUint(value uint64, byteSize int) BinaryLiteral
NewBinaryLiteralFromUint creates a new BinaryLiteral instance by the given uint value in BitEndian. byteSize will be used as the length of the new BinaryLiteral, with leading bytes filled to zero. If byteSize is -1, the leading zeros in new BinaryLiteral will be trimmed.
func ParseBitStr ¶
func ParseBitStr(s string) (BinaryLiteral, error)
ParseBitStr parses bit string. The string format can be b'val', B'val' or 0bval, val must be 0 or 1. See https://dev.mysql.com/doc/refman/5.7/en/bit-value-literals.html
func ParseHexStr ¶
func ParseHexStr(s string) (BinaryLiteral, error)
ParseHexStr parses hexadecimal string literal. See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html
func (BinaryLiteral) Compare ¶
func (b BinaryLiteral) Compare(b2 BinaryLiteral) int
Compare compares BinaryLiteral to another one
func (BinaryLiteral) String ¶
func (b BinaryLiteral) String() string
String implements fmt.Stringer interface.
func (BinaryLiteral) ToBitLiteralString ¶
func (b BinaryLiteral) ToBitLiteralString(trimLeadingZero bool) string
ToBitLiteralString returns the bit literal representation for the literal.
func (BinaryLiteral) ToString ¶
func (b BinaryLiteral) ToString() string
ToString returns the string representation for the literal.
type BitLiteral ¶
type BitLiteral BinaryLiteral
BitLiteral is the bit literal type.
func NewBitLiteral ¶
func NewBitLiteral(s string) (BitLiteral, error)
NewBitLiteral parses bit string as BitLiteral type.
type Datum ¶
type Datum struct {
// contains filtered or unexported fields
}
Datum is a data box holds different kind of data. It has better performance and is easier to use than `interface{}`.
func ComputePlus ¶
ComputePlus computes the result of a+b.
func MakeDatums ¶
func MakeDatums(args ...interface{}) []Datum
MakeDatums creates datum slice from interfaces.
func MinNotNullDatum ¶
func MinNotNullDatum() Datum
MinNotNullDatum returns a datum represents minimum not null value.
func NewBinaryLiteralDatum ¶
func NewBinaryLiteralDatum(b BinaryLiteral) (d Datum)
NewBinaryLiteralDatum creates a new BinaryLiteral Datum for a BinaryLiteral value.
func NewBytesDatum ¶
NewBytesDatum creates a new Datum from a byte slice.
func NewDatum ¶
func NewDatum(in interface{}) (d Datum)
NewDatum creates a new Datum from an interface{}.
func NewDecimalDatum ¶
NewDecimalDatum creates a new Datum form a MyDecimal value.
func NewDurationDatum ¶
NewDurationDatum creates a new Datum from a Duration value.
func NewFloat32Datum ¶
NewFloat32Datum creates a new Datum from a float32 value.
func NewFloat64Datum ¶
NewFloat64Datum creates a new Datum from a float64 value.
func NewIntDatum ¶
NewIntDatum creates a new Datum from an int64 value.
func NewMysqlBitDatum ¶
func NewMysqlBitDatum(b BinaryLiteral) (d Datum)
NewMysqlBitDatum creates a new MysqlBit Datum for a BinaryLiteral value.
func NewMysqlEnumDatum ¶
NewMysqlEnumDatum creates a new MysqlEnum Datum for a Enum value.
func NewStringDatum ¶
NewStringDatum creates a new Datum from a string.
func NewTimeDatum ¶
NewTimeDatum creates a new Time from a Time value.
func NewUintDatum ¶
NewUintDatum creates a new Datum from an uint64 value.
func (*Datum) GetBinaryLiteral ¶
func (d *Datum) GetBinaryLiteral() BinaryLiteral
GetBinaryLiteral gets Bit value
func (*Datum) GetInterface ¶
func (d *Datum) GetInterface() interface{}
GetInterface gets interface value.
func (*Datum) GetMysqlBit ¶
func (d *Datum) GetMysqlBit() BinaryLiteral
GetMysqlBit gets MysqlBit value
func (*Datum) GetMysqlDecimal ¶
GetMysqlDecimal gets Decimal value
func (*Datum) GetMysqlDuration ¶
GetMysqlDuration gets Duration value
func (*Datum) GetMysqlJSON ¶
func (d *Datum) GetMysqlJSON() json.BinaryJSON
GetMysqlJSON gets json.BinaryJSON value
func (*Datum) GetValue ¶
func (d *Datum) GetValue() interface{}
GetValue gets the value of the datum of any kind.
func (*Datum) SetBinaryLiteral ¶
func (d *Datum) SetBinaryLiteral(b BinaryLiteral)
SetBinaryLiteral sets Bit value
func (*Datum) SetBytesAsString ¶
SetBytesAsString sets bytes value to datum as string type.
func (*Datum) SetCollation ¶
SetCollation sets the collation of the datum.
func (*Datum) SetInterface ¶
func (d *Datum) SetInterface(x interface{})
SetInterface sets interface to datum.
func (*Datum) SetMinNotNull ¶
func (d *Datum) SetMinNotNull()
SetMinNotNull sets datum to minNotNull value.
func (*Datum) SetMysqlBit ¶
func (d *Datum) SetMysqlBit(b BinaryLiteral)
SetMysqlBit sets MysqlBit value
func (*Datum) SetMysqlDecimal ¶
SetMysqlDecimal sets Decimal value
func (*Datum) SetMysqlDuration ¶
SetMysqlDuration sets Duration value
func (*Datum) SetMysqlJSON ¶
func (d *Datum) SetMysqlJSON(b json.BinaryJSON)
SetMysqlJSON sets json.BinaryJSON value
func (*Datum) SetMysqlTime ¶
SetMysqlTime sets types.Time value
func (*Datum) ToMysqlJSON ¶
func (d *Datum) ToMysqlJSON() (j json.BinaryJSON, err error)
ToMysqlJSON is similar to convertToMysqlJSON, except the latter parses from string, but the former uses it as primitive.
type Duration ¶
type Duration struct { gotime.Duration // Fsp is short for Fractional Seconds Precision. // See http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html Fsp int }
Duration is the type for MySQL TIME type.
func (Duration) Compare ¶
Compare returns an integer comparing the Duration instant t to o. If d is after o, return 1, equal o, return 0, before o, return -1.
func (Duration) MicroSecond ¶
MicroSecond returns current microsecond. e.g, hour("11:11:11.11") -> 110000
func (Duration) RoundFrac ¶
RoundFrac rounds fractional seconds precision with new fsp and returns a new one. We will use the “round half up” rule, e.g, >= 0.5 -> 1, < 0.5 -> 0, so 10:10:10.999999 round 0 -> 10:10:11 and 10:10:10.000000 round 0 -> 10:10:10
type Enum ¶
Enum is for MySQL enum type.
func ParseEnumName ¶
ParseEnumName creates a Enum with item name.
func ParseEnumValue ¶
ParseEnumValue creates a Enum with special number.
type EvalType ¶
type EvalType byte
EvalType indicates the specified types that arguments and result of a built-in function should be.
const ( // ETInt represents type INT in evaluation. ETInt EvalType = iota // ETReal represents type REAL in evaluation. ETReal // ETDecimal represents type DECIMAL in evaluation. ETDecimal // ETString represents type STRING in evaluation. ETString // ETDatetime represents type DATETIME in evaluation. ETDatetime // ETTimestamp represents type TIMESTAMP in evaluation. ETTimestamp // ETDuration represents type DURATION in evaluation. ETDuration // ETJson represents type JSON in evaluation. ETJson )
func AggregateEvalType ¶
AggregateEvalType aggregates arguments' EvalType of a multi-argument function.
func (EvalType) IsStringKind ¶
IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes.
type FieldType ¶
type FieldType struct { Tp byte Flag uint Flen int Decimal int Charset string Collate string // Elems is the element list for enum and set type. Elems []string }
FieldType records field type information.
func AggFieldType ¶
AggFieldType aggregates field types for a multi-argument function like `IF`, `IFNULL`, `COALESCE` whose return type is determined by the arguments' FieldTypes. Aggregation is performed by MergeFieldType function.
func NewFieldType ¶
NewFieldType returns a FieldType, with a type and other information about field type.
func (*FieldType) CompactStr ¶
CompactStr only considers Tp/CharsetBin/Flen/Deimal. This is used for showing column type in infoschema.
func (*FieldType) FormatAsCastType ¶
FormatAsCastType is used for write AST back to string.
func (*FieldType) Hybrid ¶
Hybrid checks whether a type is a hybrid type, which can represent different types of value in specific context.
func (*FieldType) InfoSchemaStr ¶
InfoSchemaStr joins the CompactStr with unsigned flag and returns a string.
func (*FieldType) Restore ¶
func (ft *FieldType) Restore(ctx *format.RestoreCtx) error
Restore implements Node interface.
func (*FieldType) RestoreAsCastType ¶
func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx)
RestoreAsCastType is used for write AST back to string.
func (*FieldType) StorageLength ¶
StorageLength is the length of stored value for the type.
type HexLiteral ¶
type HexLiteral BinaryLiteral
HexLiteral is the hex literal type.
func NewHexLiteral ¶
func NewHexLiteral(s string) (HexLiteral, error)
NewHexLiteral parses hexadecimal string as HexLiteral type.
type MyDecimal ¶
type MyDecimal struct {
// contains filtered or unexported fields
}
MyDecimal represents a decimal value.
func NewDecFromFloatForTest ¶
NewDecFromFloatForTest creates a MyDecimal from float, as it returns no error, it should only be used in test.
func NewDecFromInt ¶
NewDecFromInt creates a MyDecimal from int.
func NewDecFromStringForTest ¶
NewDecFromStringForTest creates a MyDecimal from string, as it returns no error, it should only be used in test.
func NewDecFromUint ¶
NewDecFromUint creates a MyDecimal from uint.
func NewMaxOrMinDec ¶
NewMaxOrMinDec returns the max or min value decimal for given precision and fraction.
func (*MyDecimal) FromFloat64 ¶
FromFloat64 creates a decimal from float64 value.
func (*MyDecimal) FromString ¶
FromString parses decimal from string.
func (*MyDecimal) GetDigitsFrac ¶
GetDigitsFrac returns the digitsFrac.
func (*MyDecimal) IsNegative ¶
IsNegative returns whether a decimal is negative.
func (*MyDecimal) PrecisionAndFrac ¶
PrecisionAndFrac returns the internal precision and frac number.
func (*MyDecimal) Round ¶
Round rounds the decimal to "frac" digits.
to - result buffer. d == to is allowed frac - to what position after fraction point to round. can be negative! roundMode - round to nearest even or truncate ModeHalfEven rounds normally. Truncate just truncates the decimal.
NOTES
scale can be negative ! one TRUNCATED error (line XXX below) isn't treated very logical :(
RETURN VALUE
eDecOK/eDecTruncated
func (*MyDecimal) Shift ¶
Shift shifts decimal digits in given number (with rounding if it need), shift > 0 means shift to left shift, shift < 0 means right shift. In fact it is multiplying on 10^shift.
RETURN
eDecOK OK eDecOverflow operation lead to overflow, number is untoched eDecTruncated number was rounded to fit into buffer
func (*MyDecimal) ToBin ¶
ToBin converts decimal to its binary fixed-length representation two representations of the same length can be compared with memcmp with the correct -1/0/+1 result
PARAMS precision/frac - if precision is 0, internal value of the decimal will be used, then the encoded value is not memory comparable. NOTE the buffer is assumed to be of the size decimalBinSize(precision, frac) RETURN VALUE bin - binary value errCode - eDecOK/eDecTruncate/eDecOverflow DESCRIPTION for storage decimal numbers are converted to the "binary" format. This format has the following properties: 1. length of the binary representation depends on the {precision, frac} as provided by the caller and NOT on the digitsInt/digitsFrac of the decimal to convert. 2. binary representations of the same {precision, frac} can be compared with memcmp - with the same result as DecimalCompare() of the original decimals (not taking into account possible precision loss during conversion). This binary format is as follows: 1. First the number is converted to have a requested precision and frac. 2. Every full digitsPerWord digits of digitsInt part are stored in 4 bytes as is 3. The first digitsInt % digitesPerWord digits are stored in the reduced number of bytes (enough bytes to store this number of digits - see dig2bytes) 4. same for frac - full word are stored as is, the last frac % digitsPerWord digits - in the reduced number of bytes. 5. If the number is negative - every byte is inversed. 5. The very first bit of the resulting byte array is inverted (because memcmp compares unsigned bytes, see property 2 above) Example: 1234567890.1234 internally is represented as 3 words 1 234567890 123400000 (assuming we want a binary representation with precision=14, frac=4) in hex it's 00-00-00-01 0D-FB-38-D2 07-5A-EF-40 now, middle word is full - it stores 9 decimal digits. It goes into binary representation as is: ........... 0D-FB-38-D2 ............ First word has only one decimal digit. We can store one digit in one byte, no need to waste four: 01 0D-FB-38-D2 ............ now, last word. It's 123400000. We can store 1234 in two bytes: 01 0D-FB-38-D2 04-D2 So, we've packed 12 bytes number in 7 bytes. And now we invert the highest bit to get the final result: 81 0D FB 38 D2 04 D2 And for -1234567890.1234 it would be 7E F2 04 C7 2D FB 2D
func (*MyDecimal) ToHashKey ¶
ToHashKey removes the leading and trailing zeros and generates a hash key. Two Decimals dec0 and dec1 with different fraction will generate the same hash keys if dec0.Compare(dec1) == 0.
type MysqlTime ¶
type MysqlTime struct {
// contains filtered or unexported fields
}
MysqlTime is the internal struct type for Time.
func FromDate ¶
func FromDate(year int, month int, day int, hour int, minute int, second int, microsecond int) MysqlTime
FromDate makes a internal time representation from the given date.
func FromGoTime ¶
FromGoTime translates time.Time to mysql time internal representation.
func (MysqlTime) IsLeapYear ¶
IsLeapYear returns if it's leap year.
func (MysqlTime) Microsecond ¶
Microsecond returns the microsecond value.
type Set ¶
Set is for MySQL Set type.
func ParseSetName ¶
ParseSetName creates a Set with name.
func ParseSetValue ¶
ParseSetValue creates a Set with special number.
type Time ¶
type Time struct { Time MysqlTime Type uint8 // Fsp is short for Fractional Seconds Precision. // See http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html Fsp int }
Time is the struct for handling datetime, timestamp and date. TODO: check if need a NewTime function to set Fsp default value?
func MaxMySQLTime ¶
MaxMySQLTime returns Time with maximum mysql time type.
func (Time) Compare ¶
Compare returns an integer comparing the time instant t to o. If t is after o, return 1, equal o, return 0, before o, return -1.
func (*Time) ConvertTimeZone ¶
ConvertTimeZone converts the time value from one timezone to another. The input time should be a valid timestamp.
func (Time) ConvertToDuration ¶
ConvertToDuration converts mysql datetime, timestamp and date to mysql time type. e.g, 2012-12-12T10:10:10 -> 10:10:10 2012-12-12 -> 0
func (Time) DateFormat ¶
DateFormat returns a textual representation of the time value formatted according to layout. See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format
func (*Time) FromPackedUint ¶
FromPackedUint decodes Time from a packed uint64 value.
func (Time) InvalidZero ¶
InvalidZero returns a boolean indicating whether the month or day is zero.
func (Time) ToNumber ¶
ToNumber returns a formatted number. e.g, 2012-12-12 -> 20121212 2012-12-12T10:10:10 -> 20121212101010 2012-12-12T10:10:10.123456 -> 20121212101010.123456
func (Time) ToPackedUint ¶
ToPackedUint encodes Time to a packed uint64 value.
1 bit 0 17 bits year*13+month (year 0-9999, month 0-12) 5 bits day (0-31) 5 bits hour (0-23) 6 bits minute (0-59) 6 bits second (0-59) 24 bits microseconds (0-999999) Total: 64 bits = 8 bytes 0YYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff