164 lines
4.8 KiB
Go
164 lines
4.8 KiB
Go
// Copyright 2014 The ql Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSES/QL-LICENSE file.
|
|
|
|
// 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 types
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/pingcap/tidb/parser/mysql"
|
|
"github.com/pingcap/tidb/parser/terror"
|
|
)
|
|
|
|
// IsTypeBlob returns a boolean indicating whether the tp is a blob type.
|
|
func IsTypeBlob(tp byte) bool {
|
|
switch tp {
|
|
case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// IsTypeChar returns a boolean indicating
|
|
// whether the tp is the char type like a string type or a varchar type.
|
|
func IsTypeChar(tp byte) bool {
|
|
return tp == mysql.TypeString || tp == mysql.TypeVarchar
|
|
}
|
|
|
|
var type2Str = map[byte]string{
|
|
mysql.TypeBit: "bit",
|
|
mysql.TypeBlob: "text",
|
|
mysql.TypeDate: "date",
|
|
mysql.TypeDatetime: "datetime",
|
|
mysql.TypeUnspecified: "unspecified",
|
|
mysql.TypeNewDecimal: "decimal",
|
|
mysql.TypeDouble: "double",
|
|
mysql.TypeEnum: "enum",
|
|
mysql.TypeFloat: "float",
|
|
mysql.TypeGeometry: "geometry",
|
|
mysql.TypeInt24: "mediumint",
|
|
mysql.TypeJSON: "json",
|
|
mysql.TypeLong: "int",
|
|
mysql.TypeLonglong: "bigint",
|
|
mysql.TypeLongBlob: "longtext",
|
|
mysql.TypeMediumBlob: "mediumtext",
|
|
mysql.TypeNull: "null",
|
|
mysql.TypeSet: "set",
|
|
mysql.TypeShort: "smallint",
|
|
mysql.TypeString: "char",
|
|
mysql.TypeDuration: "time",
|
|
mysql.TypeTimestamp: "timestamp",
|
|
mysql.TypeTiny: "tinyint",
|
|
mysql.TypeTinyBlob: "tinytext",
|
|
mysql.TypeVarchar: "varchar",
|
|
mysql.TypeVarString: "var_string",
|
|
mysql.TypeYear: "year",
|
|
}
|
|
|
|
var str2Type = map[string]byte{
|
|
"bit": mysql.TypeBit,
|
|
"text": mysql.TypeBlob,
|
|
"date": mysql.TypeDate,
|
|
"datetime": mysql.TypeDatetime,
|
|
"unspecified": mysql.TypeUnspecified,
|
|
"decimal": mysql.TypeNewDecimal,
|
|
"double": mysql.TypeDouble,
|
|
"enum": mysql.TypeEnum,
|
|
"float": mysql.TypeFloat,
|
|
"geometry": mysql.TypeGeometry,
|
|
"mediumint": mysql.TypeInt24,
|
|
"json": mysql.TypeJSON,
|
|
"int": mysql.TypeLong,
|
|
"bigint": mysql.TypeLonglong,
|
|
"longtext": mysql.TypeLongBlob,
|
|
"mediumtext": mysql.TypeMediumBlob,
|
|
"null": mysql.TypeNull,
|
|
"set": mysql.TypeSet,
|
|
"smallint": mysql.TypeShort,
|
|
"char": mysql.TypeString,
|
|
"time": mysql.TypeDuration,
|
|
"timestamp": mysql.TypeTimestamp,
|
|
"tinyint": mysql.TypeTiny,
|
|
"tinytext": mysql.TypeTinyBlob,
|
|
"varchar": mysql.TypeVarchar,
|
|
"var_string": mysql.TypeVarString,
|
|
"year": mysql.TypeYear,
|
|
}
|
|
|
|
// TypeStr converts tp to a string.
|
|
func TypeStr(tp byte) (r string) {
|
|
return type2Str[tp]
|
|
}
|
|
|
|
// TypeToStr converts a field to a string.
|
|
// It is used for converting Text to Blob,
|
|
// or converting Char to Binary.
|
|
// Args:
|
|
// tp: type enum
|
|
// cs: charset
|
|
func TypeToStr(tp byte, cs string) (r string) {
|
|
ts := type2Str[tp]
|
|
if cs != "binary" {
|
|
return ts
|
|
}
|
|
if IsTypeBlob(tp) {
|
|
ts = strings.Replace(ts, "text", "blob", 1)
|
|
} else if IsTypeChar(tp) {
|
|
ts = strings.Replace(ts, "char", "binary", 1)
|
|
}
|
|
return ts
|
|
}
|
|
|
|
// StrToType convert a string to type enum.
|
|
// Args:
|
|
// ts: type string
|
|
func StrToType(ts string) (tp byte) {
|
|
if strings.Contains(ts, "blob") {
|
|
ts = strings.Replace(ts, "blob", "text", 1)
|
|
} else if strings.Contains(ts, "binary") {
|
|
ts = strings.Replace(ts, "binary", "char", 1)
|
|
}
|
|
|
|
if tp, ok := str2Type[ts]; ok {
|
|
return tp
|
|
}
|
|
|
|
return mysql.TypeUnspecified
|
|
}
|
|
|
|
var (
|
|
dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4}
|
|
)
|
|
|
|
// constant values.
|
|
const (
|
|
digitsPerWord = 9 // A word holds 9 digits.
|
|
wordSize = 4 // A word is 4 bytes int32.
|
|
)
|
|
|
|
var (
|
|
// ErrInvalidDefault is returned when meet a invalid default value.
|
|
ErrInvalidDefault = terror.ClassTypes.NewStd(mysql.ErrInvalidDefault)
|
|
// ErrDataOutOfRange is returned when meet a value out of range.
|
|
ErrDataOutOfRange = terror.ClassTypes.NewStd(mysql.ErrDataOutOfRange)
|
|
// ErrTruncatedWrongValue is returned when meet a value bigger than 99999999999999999999999999999999999999999999999999999999999999999 during parsing.
|
|
ErrTruncatedWrongValue = terror.ClassTypes.NewStd(mysql.ErrTruncatedWrongValue)
|
|
// ErrIllegalValueForType is returned when strconv.ParseFloat meet strconv.ErrRange during parsing.
|
|
ErrIllegalValueForType = terror.ClassTypes.NewStd(mysql.ErrIllegalValueForType)
|
|
)
|