fields.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
  2. //
  3. // Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved.
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public
  6. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  7. // You can obtain one at http://mozilla.org/MPL/2.0/.
  8. package mysql
  9. import (
  10. "database/sql"
  11. "reflect"
  12. )
  13. var typeDatabaseName = map[fieldType]string{
  14. fieldTypeBit: "BIT",
  15. fieldTypeBLOB: "BLOB",
  16. fieldTypeDate: "DATE",
  17. fieldTypeDateTime: "DATETIME",
  18. fieldTypeDecimal: "DECIMAL",
  19. fieldTypeDouble: "DOUBLE",
  20. fieldTypeEnum: "ENUM",
  21. fieldTypeFloat: "FLOAT",
  22. fieldTypeGeometry: "GEOMETRY",
  23. fieldTypeInt24: "MEDIUMINT",
  24. fieldTypeJSON: "JSON",
  25. fieldTypeLong: "INT",
  26. fieldTypeLongBLOB: "LONGBLOB",
  27. fieldTypeLongLong: "BIGINT",
  28. fieldTypeMediumBLOB: "MEDIUMBLOB",
  29. fieldTypeNewDate: "DATE",
  30. fieldTypeNewDecimal: "DECIMAL",
  31. fieldTypeNULL: "NULL",
  32. fieldTypeSet: "SET",
  33. fieldTypeShort: "SMALLINT",
  34. fieldTypeString: "CHAR",
  35. fieldTypeTime: "TIME",
  36. fieldTypeTimestamp: "TIMESTAMP",
  37. fieldTypeTiny: "TINYINT",
  38. fieldTypeTinyBLOB: "TINYBLOB",
  39. fieldTypeVarChar: "VARCHAR",
  40. fieldTypeVarString: "VARCHAR",
  41. fieldTypeYear: "YEAR",
  42. }
  43. var (
  44. scanTypeFloat32 = reflect.TypeOf(float32(0))
  45. scanTypeFloat64 = reflect.TypeOf(float64(0))
  46. scanTypeInt8 = reflect.TypeOf(int8(0))
  47. scanTypeInt16 = reflect.TypeOf(int16(0))
  48. scanTypeInt32 = reflect.TypeOf(int32(0))
  49. scanTypeInt64 = reflect.TypeOf(int64(0))
  50. scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{})
  51. scanTypeNullInt = reflect.TypeOf(sql.NullInt64{})
  52. scanTypeNullTime = reflect.TypeOf(NullTime{})
  53. scanTypeUint8 = reflect.TypeOf(uint8(0))
  54. scanTypeUint16 = reflect.TypeOf(uint16(0))
  55. scanTypeUint32 = reflect.TypeOf(uint32(0))
  56. scanTypeUint64 = reflect.TypeOf(uint64(0))
  57. scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{})
  58. scanTypeUnknown = reflect.TypeOf(new(interface{}))
  59. )
  60. type mysqlField struct {
  61. tableName string
  62. name string
  63. length uint32
  64. flags fieldFlag
  65. fieldType fieldType
  66. decimals byte
  67. }
  68. func (mf *mysqlField) scanType() reflect.Type {
  69. switch mf.fieldType {
  70. case fieldTypeTiny:
  71. if mf.flags&flagNotNULL != 0 {
  72. if mf.flags&flagUnsigned != 0 {
  73. return scanTypeUint8
  74. }
  75. return scanTypeInt8
  76. }
  77. return scanTypeNullInt
  78. case fieldTypeShort, fieldTypeYear:
  79. if mf.flags&flagNotNULL != 0 {
  80. if mf.flags&flagUnsigned != 0 {
  81. return scanTypeUint16
  82. }
  83. return scanTypeInt16
  84. }
  85. return scanTypeNullInt
  86. case fieldTypeInt24, fieldTypeLong:
  87. if mf.flags&flagNotNULL != 0 {
  88. if mf.flags&flagUnsigned != 0 {
  89. return scanTypeUint32
  90. }
  91. return scanTypeInt32
  92. }
  93. return scanTypeNullInt
  94. case fieldTypeLongLong:
  95. if mf.flags&flagNotNULL != 0 {
  96. if mf.flags&flagUnsigned != 0 {
  97. return scanTypeUint64
  98. }
  99. return scanTypeInt64
  100. }
  101. return scanTypeNullInt
  102. case fieldTypeFloat:
  103. if mf.flags&flagNotNULL != 0 {
  104. return scanTypeFloat32
  105. }
  106. return scanTypeNullFloat
  107. case fieldTypeDouble:
  108. if mf.flags&flagNotNULL != 0 {
  109. return scanTypeFloat64
  110. }
  111. return scanTypeNullFloat
  112. case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar,
  113. fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB,
  114. fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB,
  115. fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON,
  116. fieldTypeTime:
  117. return scanTypeRawBytes
  118. case fieldTypeDate, fieldTypeNewDate,
  119. fieldTypeTimestamp, fieldTypeDateTime:
  120. // NullTime is always returned for more consistent behavior as it can
  121. // handle both cases of parseTime regardless if the field is nullable.
  122. return scanTypeNullTime
  123. default:
  124. return scanTypeUnknown
  125. }
  126. }