fix the error in mysql: unknown colType UNSIGNED FLOAT (#2143)

Error: unknown colType UNSIGNED FLOAT
in mysql 5.6.27 or 5.7.32

Fix #2123

Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/2143
Co-authored-by: Ryan Liu <azhai@126.com>
Co-committed-by: Ryan Liu <azhai@126.com>
This commit is contained in:
Ryan Liu 2023-09-16 15:43:12 +00:00 committed by Lunny Xiao
parent e5be0f4129
commit ac88a5705a
5 changed files with 61 additions and 15 deletions

View File

@ -328,7 +328,7 @@ func (db *mssql) SQLType(c *schemas.Column) string {
res = schemas.Int res = schemas.Int
case schemas.Text, schemas.MediumText, schemas.TinyText, schemas.LongText, schemas.Json: case schemas.Text, schemas.MediumText, schemas.TinyText, schemas.LongText, schemas.Json:
res = db.defaultVarchar + "(MAX)" res = db.defaultVarchar + "(MAX)"
case schemas.Double: case schemas.Double, schemas.UnsignedFloat:
res = schemas.Real res = schemas.Real
case schemas.Uuid: case schemas.Uuid:
res = schemas.Varchar res = schemas.Varchar

View File

@ -319,6 +319,9 @@ func (db *mysql) SQLType(c *schemas.Column) string {
case schemas.UnsignedTinyInt: case schemas.UnsignedTinyInt:
res = schemas.TinyInt res = schemas.TinyInt
isUnsigned = true isUnsigned = true
case schemas.UnsignedFloat:
res = schemas.Float
isUnsigned = true
default: default:
res = t res = t
} }
@ -510,11 +513,10 @@ func (db *mysql) GetColumns(queryer core.Queryer, ctx context.Context, tableName
} }
col.Length = len1 col.Length = len1
col.Length2 = len2 col.Length2 = len2
if _, ok := schemas.SqlTypes[colType]; ok { if _, ok := schemas.SqlTypes[colType]; !ok {
col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2}
} else {
return nil, nil, fmt.Errorf("unknown colType %v", colType) return nil, nil, fmt.Errorf("unknown colType %v", colType)
} }
col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2}
if colKey == "PRI" { if colKey == "PRI" {
col.IsPrimaryKey = true col.IsPrimaryKey = true

View File

@ -928,7 +928,7 @@ func (db *postgres) SQLType(c *schemas.Column) string {
return schemas.Uuid return schemas.Uuid
case schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob: case schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob:
return schemas.Bytea return schemas.Bytea
case schemas.Double: case schemas.Double, schemas.UnsignedFloat:
return "DOUBLE PRECISION" return "DOUBLE PRECISION"
default: default:
if c.IsAutoIncrement { if c.IsAutoIncrement {

View File

@ -139,9 +139,10 @@ var (
Money = "MONEY" Money = "MONEY"
SmallMoney = "SMALLMONEY" SmallMoney = "SMALLMONEY"
Real = "REAL" Real = "REAL"
Float = "FLOAT" Float = "FLOAT"
Double = "DOUBLE" UnsignedFloat = "UNSIGNED FLOAT"
Double = "DOUBLE"
Binary = "BINARY" Binary = "BINARY"
VarBinary = "VARBINARY" VarBinary = "VARBINARY"
@ -208,13 +209,14 @@ var (
SmallDateTime: TIME_TYPE, SmallDateTime: TIME_TYPE,
Year: TIME_TYPE, Year: TIME_TYPE,
Decimal: NUMERIC_TYPE, Decimal: NUMERIC_TYPE,
Numeric: NUMERIC_TYPE, Numeric: NUMERIC_TYPE,
Real: NUMERIC_TYPE, Real: NUMERIC_TYPE,
Float: NUMERIC_TYPE, Float: NUMERIC_TYPE,
Double: NUMERIC_TYPE, UnsignedFloat: NUMERIC_TYPE,
Money: NUMERIC_TYPE, Double: NUMERIC_TYPE,
SmallMoney: NUMERIC_TYPE, Money: NUMERIC_TYPE,
SmallMoney: NUMERIC_TYPE,
Binary: BLOB_TYPE, Binary: BLOB_TYPE,
VarBinary: BLOB_TYPE, VarBinary: BLOB_TYPE,

View File

@ -325,6 +325,48 @@ func TestUint64Id(t *testing.T) {
assert.EqualValues(t, 1, cnt) 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) { func TestStringPK(t *testing.T) {
assert.NoError(t, PrepareEngine()) assert.NoError(t, PrepareEngine())