792b4dba2c
* update github.com/blevesearch/bleve v2.0.2 -> v2.0.3 * github.com/denisenkom/go-mssqldb v0.9.0 -> v0.10.0 * github.com/editorconfig/editorconfig-core-go v2.4.1 -> v2.4.2 * github.com/go-chi/cors v1.1.1 -> v1.2.0 * github.com/go-git/go-billy v5.0.0 -> v5.1.0 * github.com/go-git/go-git v5.2.0 -> v5.3.0 * github.com/go-ldap/ldap v3.2.4 -> v3.3.0 * github.com/go-redis/redis v8.6.0 -> v8.8.2 * github.com/go-sql-driver/mysql v1.5.0 -> v1.6.0 * github.com/go-swagger/go-swagger v0.26.1 -> v0.27.0 * github.com/lib/pq v1.9.0 -> v1.10.1 * github.com/mattn/go-sqlite3 v1.14.6 -> v1.14.7 * github.com/go-testfixtures/testfixtures v3.5.0 -> v3.6.0 * github.com/issue9/identicon v1.0.1 -> v1.2.0 * github.com/klauspost/compress v1.11.8 -> v1.12.1 * github.com/mgechev/revive v1.0.3 -> v1.0.6 * github.com/microcosm-cc/bluemonday v1.0.7 -> v1.0.8 * github.com/niklasfasching/go-org v1.4.0 -> v1.5.0 * github.com/olivere/elastic v7.0.22 -> v7.0.24 * github.com/pelletier/go-toml v1.8.1 -> v1.9.0 * github.com/prometheus/client_golang v1.9.0 -> v1.10.0 * github.com/xanzy/go-gitlab v0.44.0 -> v0.48.0 * github.com/yuin/goldmark v1.3.3 -> v1.3.5 * github.com/6543/go-version v1.2.4 -> v1.3.1 * do github.com/lib/pq v1.10.0 -> v1.10.1 again ...
195 lines
4.6 KiB
Go
Vendored
195 lines
4.6 KiB
Go
Vendored
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
|
//
|
|
// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package mysql
|
|
|
|
import (
|
|
"database/sql"
|
|
"reflect"
|
|
)
|
|
|
|
func (mf *mysqlField) typeDatabaseName() string {
|
|
switch mf.fieldType {
|
|
case fieldTypeBit:
|
|
return "BIT"
|
|
case fieldTypeBLOB:
|
|
if mf.charSet != collations[binaryCollation] {
|
|
return "TEXT"
|
|
}
|
|
return "BLOB"
|
|
case fieldTypeDate:
|
|
return "DATE"
|
|
case fieldTypeDateTime:
|
|
return "DATETIME"
|
|
case fieldTypeDecimal:
|
|
return "DECIMAL"
|
|
case fieldTypeDouble:
|
|
return "DOUBLE"
|
|
case fieldTypeEnum:
|
|
return "ENUM"
|
|
case fieldTypeFloat:
|
|
return "FLOAT"
|
|
case fieldTypeGeometry:
|
|
return "GEOMETRY"
|
|
case fieldTypeInt24:
|
|
return "MEDIUMINT"
|
|
case fieldTypeJSON:
|
|
return "JSON"
|
|
case fieldTypeLong:
|
|
return "INT"
|
|
case fieldTypeLongBLOB:
|
|
if mf.charSet != collations[binaryCollation] {
|
|
return "LONGTEXT"
|
|
}
|
|
return "LONGBLOB"
|
|
case fieldTypeLongLong:
|
|
return "BIGINT"
|
|
case fieldTypeMediumBLOB:
|
|
if mf.charSet != collations[binaryCollation] {
|
|
return "MEDIUMTEXT"
|
|
}
|
|
return "MEDIUMBLOB"
|
|
case fieldTypeNewDate:
|
|
return "DATE"
|
|
case fieldTypeNewDecimal:
|
|
return "DECIMAL"
|
|
case fieldTypeNULL:
|
|
return "NULL"
|
|
case fieldTypeSet:
|
|
return "SET"
|
|
case fieldTypeShort:
|
|
return "SMALLINT"
|
|
case fieldTypeString:
|
|
if mf.charSet == collations[binaryCollation] {
|
|
return "BINARY"
|
|
}
|
|
return "CHAR"
|
|
case fieldTypeTime:
|
|
return "TIME"
|
|
case fieldTypeTimestamp:
|
|
return "TIMESTAMP"
|
|
case fieldTypeTiny:
|
|
return "TINYINT"
|
|
case fieldTypeTinyBLOB:
|
|
if mf.charSet != collations[binaryCollation] {
|
|
return "TINYTEXT"
|
|
}
|
|
return "TINYBLOB"
|
|
case fieldTypeVarChar:
|
|
if mf.charSet == collations[binaryCollation] {
|
|
return "VARBINARY"
|
|
}
|
|
return "VARCHAR"
|
|
case fieldTypeVarString:
|
|
if mf.charSet == collations[binaryCollation] {
|
|
return "VARBINARY"
|
|
}
|
|
return "VARCHAR"
|
|
case fieldTypeYear:
|
|
return "YEAR"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
var (
|
|
scanTypeFloat32 = reflect.TypeOf(float32(0))
|
|
scanTypeFloat64 = reflect.TypeOf(float64(0))
|
|
scanTypeInt8 = reflect.TypeOf(int8(0))
|
|
scanTypeInt16 = reflect.TypeOf(int16(0))
|
|
scanTypeInt32 = reflect.TypeOf(int32(0))
|
|
scanTypeInt64 = reflect.TypeOf(int64(0))
|
|
scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
|
|
scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
|
|
scanTypeNullTime = reflect.TypeOf(nullTime{})
|
|
scanTypeUint8 = reflect.TypeOf(uint8(0))
|
|
scanTypeUint16 = reflect.TypeOf(uint16(0))
|
|
scanTypeUint32 = reflect.TypeOf(uint32(0))
|
|
scanTypeUint64 = reflect.TypeOf(uint64(0))
|
|
scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
|
|
scanTypeUnknown = reflect.TypeOf(new(interface{}))
|
|
)
|
|
|
|
type mysqlField struct {
|
|
tableName string
|
|
name string
|
|
length uint32
|
|
flags fieldFlag
|
|
fieldType fieldType
|
|
decimals byte
|
|
charSet uint8
|
|
}
|
|
|
|
func (mf *mysqlField) scanType() reflect.Type {
|
|
switch mf.fieldType {
|
|
case fieldTypeTiny:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
if mf.flags&flagUnsigned != 0 {
|
|
return scanTypeUint8
|
|
}
|
|
return scanTypeInt8
|
|
}
|
|
return scanTypeNullInt
|
|
|
|
case fieldTypeShort, fieldTypeYear:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
if mf.flags&flagUnsigned != 0 {
|
|
return scanTypeUint16
|
|
}
|
|
return scanTypeInt16
|
|
}
|
|
return scanTypeNullInt
|
|
|
|
case fieldTypeInt24, fieldTypeLong:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
if mf.flags&flagUnsigned != 0 {
|
|
return scanTypeUint32
|
|
}
|
|
return scanTypeInt32
|
|
}
|
|
return scanTypeNullInt
|
|
|
|
case fieldTypeLongLong:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
if mf.flags&flagUnsigned != 0 {
|
|
return scanTypeUint64
|
|
}
|
|
return scanTypeInt64
|
|
}
|
|
return scanTypeNullInt
|
|
|
|
case fieldTypeFloat:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
return scanTypeFloat32
|
|
}
|
|
return scanTypeNullFloat
|
|
|
|
case fieldTypeDouble:
|
|
if mf.flags&flagNotNULL != 0 {
|
|
return scanTypeFloat64
|
|
}
|
|
return scanTypeNullFloat
|
|
|
|
case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar,
|
|
fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB,
|
|
fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB,
|
|
fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON,
|
|
fieldTypeTime:
|
|
return scanTypeRawBytes
|
|
|
|
case fieldTypeDate, fieldTypeNewDate,
|
|
fieldTypeTimestamp, fieldTypeDateTime:
|
|
// NullTime is always returned for more consistent behavior as it can
|
|
// handle both cases of parseTime regardless if the field is nullable.
|
|
return scanTypeNullTime
|
|
|
|
default:
|
|
return scanTypeUnknown
|
|
}
|
|
}
|