diff --git a/dialects/mysql.go b/dialects/mysql.go index 6b92752b..79298c56 100644 --- a/dialects/mysql.go +++ b/dialects/mysql.go @@ -510,10 +510,16 @@ func (db *mysql) GetColumns(queryer core.Queryer, ctx context.Context, tableName } col.Length = len1 col.Length2 = len2 - if _, ok := schemas.SqlTypes[colType]; ok { - col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2} - } else { + if _, ok := schemas.SqlTypes[colType]; !ok { + if !strings.HasPrefix(colType, "UNSIGNED ") { + return nil, nil, fmt.Errorf("unknown colType %v", colType) + } + colType = colType[len("UNSIGNED "):] + } + if _, ok := schemas.SqlTypes[colType]; !ok { return nil, nil, fmt.Errorf("unknown colType %v", colType) + } else { + col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2} } if colKey == "PRI" { diff --git a/tests/session_pk_test.go b/tests/session_pk_test.go index 43de4eea..baf84547 100644 --- a/tests/session_pk_test.go +++ b/tests/session_pk_test.go @@ -325,6 +325,48 @@ func TestUint64Id(t *testing.T) { assert.EqualValues(t, 1, cnt) } +func TestUnsignedfloat(t *testing.T) { + assert.NoError(t, PrepareEngine()) + + type UnsignedFloat struct { + Id int64 + UnsignedFloat float64 `xorm:"UNSIGNED FLOAT"` + } + + err := testEngine.DropTables(&UnsignedFloat{}) + assert.NoError(t, err) + + err = testEngine.CreateTables(&UnsignedFloat{}) + assert.NoError(t, err) + + tables, err := testEngine.DBMetas() + assert.NoError(t, err) + + assert.EqualValues(t, 1, len(tables)) + cols := tables[0].Columns() + assert.EqualValues(t, 2, len(cols)) + if testEngine.Dialect().URI().DBType == schemas.MYSQL { + assert.EqualValues(t, "UNSIGNED FLOAT", cols[1].SQLType.Name) + } + + idbean := &UnsignedFloat{UnsignedFloat: 12345678.90123456} + cnt, err := testEngine.Insert(idbean) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + bean := new(UnsignedFloat) + has, err := testEngine.Get(bean) + assert.NoError(t, err) + assert.True(t, has) + assert.EqualValues(t, bean.Id, idbean.Id) + + beans := make([]UnsignedFloat, 0) + err = testEngine.Find(&beans) + assert.NoError(t, err) + assert.EqualValues(t, 1, len(beans)) + assert.EqualValues(t, *bean, beans[0]) +} + func TestStringPK(t *testing.T) { assert.NoError(t, PrepareEngine())