1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // Copyright 2015 PingCAP, Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package mysql
- type lengthAndDecimal struct {
- length int64
- decimal int64
- }
- // defaultLengthAndDecimal provides default Flen and Decimal for fields
- // from CREATE TABLE when they are unspecified.
- var defaultLengthAndDecimal = map[byte]lengthAndDecimal{
- TypeBit: {1, 0},
- TypeTiny: {4, 0},
- TypeShort: {6, 0},
- TypeInt24: {9, 0},
- TypeLong: {11, 0},
- TypeLonglong: {20, 0},
- TypeDouble: {22, -1},
- TypeFloat: {12, -1},
- TypeNewDecimal: {10, 0},
- TypeDuration: {10, 0},
- TypeDate: {10, 0},
- TypeTimestamp: {19, 0},
- TypeDatetime: {19, 0},
- TypeYear: {4, 0},
- TypeString: {1, 0},
- TypeVarchar: {5, 0},
- TypeVarString: {5, 0},
- TypeTinyBlob: {255, 0},
- TypeBlob: {65535, 0},
- TypeMediumBlob: {16777215, 0},
- TypeLongBlob: {4294967295, 0},
- TypeJSON: {4294967295, 0},
- TypeNull: {0, 0},
- TypeSet: {-1, 0},
- TypeEnum: {-1, 0},
- }
- // IsIntegerType indicate whether tp is an integer type.
- func IsIntegerType(tp byte) bool {
- switch tp {
- case TypeTiny, TypeShort, TypeInt24, TypeLong, TypeLonglong:
- return true
- }
- return false
- }
- // GetDefaultFieldLengthAndDecimal returns the default display length (flen) and decimal length for column.
- // Call this when no Flen assigned in ddl.
- // or column value is calculated from an expression.
- // For example: "select count(*) from t;", the column type is int64 and Flen in ResultField will be 21.
- // See https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html
- func GetDefaultFieldLengthAndDecimal(tp byte) (flen int64, decimal int64) {
- val, ok := defaultLengthAndDecimal[tp]
- if ok {
- return val.length, val.decimal
- }
- return -1, -1
- }
- // defaultLengthAndDecimal provides default Flen and Decimal for fields
- // from CAST when they are unspecified.
- var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{
- TypeString: {0, -1}, // Flen & Decimal differs.
- TypeDate: {10, 0},
- TypeDatetime: {19, 0},
- TypeNewDecimal: {10, 0},
- TypeDuration: {10, 0},
- TypeLonglong: {22, 0},
- TypeDouble: {22, -1},
- TypeFloat: {12, -1},
- TypeJSON: {4194304, 0}, // Flen differs.
- }
- // GetDefaultFieldLengthAndDecimalForCast returns the default display length (flen) and decimal length for casted column
- // when flen or decimal is not specified.
- func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen int64, decimal int64) {
- val, ok := defaultLengthAndDecimalForCast[tp]
- if ok {
- return val.length, val.decimal
- }
- return -1, -1
- }
|