in phoenix/phoenix.go [39:116]
func (a Adapter) GetColumnTypeDefinition(col *message.ColumnMetaData) *internal.Column {
column := &internal.Column{
Name: col.GetColumnName(),
TypeName: col.GetType().GetName(),
Nullable: col.GetNullable() != 0,
}
// Handle precision and length
switch col.GetType().GetName() {
case "DECIMAL":
precision := int64(col.GetPrecision())
if precision == 0 {
precision = math.MaxInt64
}
scale := int64(col.GetScale())
if scale == 0 {
scale = math.MaxInt64
}
column.PrecisionScale = &internal.PrecisionScale{
Precision: precision,
Scale: scale,
}
case "VARCHAR", "CHAR", "BINARY":
column.Length = int64(col.GetPrecision())
case "VARBINARY":
column.Length = math.MaxInt64
}
// Handle scan types
switch col.GetType().GetName() {
case "INTEGER", "UNSIGNED_INT", "BIGINT", "UNSIGNED_LONG", "TINYINT", "UNSIGNED_TINYINT", "SMALLINT", "UNSIGNED_SMALLINT":
column.ScanType = reflect.TypeOf(int64(0))
case "FLOAT", "UNSIGNED_FLOAT", "DOUBLE", "UNSIGNED_DOUBLE":
column.ScanType = reflect.TypeOf(float64(0))
case "DECIMAL", "VARCHAR", "CHAR":
column.ScanType = reflect.TypeOf("")
case "BOOLEAN":
column.ScanType = reflect.TypeOf(false)
case "TIME", "DATE", "TIMESTAMP", "UNSIGNED_TIME", "UNSIGNED_DATE", "UNSIGNED_TIMESTAMP":
column.ScanType = reflect.TypeOf(time.Time{})
case "BINARY", "VARBINARY":
column.ScanType = reflect.TypeOf([]byte{})
default:
column.ScanType = reflect.TypeOf(new(interface{})).Elem()
}
// Handle rep type special cases for decimals, floats, date, time and timestamp
switch col.GetType().GetName() {
case "DECIMAL":
column.Rep = message.Rep_BIG_DECIMAL
case "FLOAT":
column.Rep = message.Rep_FLOAT
case "UNSIGNED_FLOAT":
column.Rep = message.Rep_FLOAT
case "TIME", "UNSIGNED_TIME":
column.Rep = message.Rep_JAVA_SQL_TIME
case "DATE", "UNSIGNED_DATE":
column.Rep = message.Rep_JAVA_SQL_DATE
case "TIMESTAMP", "UNSIGNED_TIMESTAMP":
column.Rep = message.Rep_JAVA_SQL_TIMESTAMP
default:
column.Rep = col.GetType().GetRep()
}
return column
}