From be88b18a8e30ce133b01525e424cc52368870298 Mon Sep 17 00:00:00 2001 From: Ryan Liu Date: Sat, 16 Sep 2023 15:43:12 +0000 Subject: [PATCH] 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 Reviewed-on: https://gitea.com/xorm/xorm/pulls/2143 Co-authored-by: Ryan Liu Co-committed-by: Ryan Liu (cherry picked from commit ac88a5705aafc0109221cf98c74b4304b66d3a76) --- dialects/mssql.go | 2 +- dialects/mysql.go | 8 +++++--- dialects/postgres.go | 2 +- schemas/type.go | 22 +++++++++++---------- tests/session_pk_test.go | 42 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/dialects/mssql.go b/dialects/mssql.go index 2c64e637..1413b441 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -328,7 +328,7 @@ func (db *mssql) SQLType(c *schemas.Column) string { res = schemas.Int case schemas.Text, schemas.MediumText, schemas.TinyText, schemas.LongText, schemas.Json: res = db.defaultVarchar + "(MAX)" - case schemas.Double: + case schemas.Double, schemas.UnsignedFloat: res = schemas.Real case schemas.Uuid: res = schemas.Varchar diff --git a/dialects/mysql.go b/dialects/mysql.go index 6b92752b..2c061a14 100644 --- a/dialects/mysql.go +++ b/dialects/mysql.go @@ -319,6 +319,9 @@ func (db *mysql) SQLType(c *schemas.Column) string { case schemas.UnsignedTinyInt: res = schemas.TinyInt isUnsigned = true + case schemas.UnsignedFloat: + res = schemas.Float + isUnsigned = true default: res = t } @@ -510,11 +513,10 @@ 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 { return nil, nil, fmt.Errorf("unknown colType %v", colType) } + col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2} if colKey == "PRI" { col.IsPrimaryKey = true diff --git a/dialects/postgres.go b/dialects/postgres.go index 53f66184..03966f2d 100644 --- a/dialects/postgres.go +++ b/dialects/postgres.go @@ -928,7 +928,7 @@ func (db *postgres) SQLType(c *schemas.Column) string { return schemas.Uuid case schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob: return schemas.Bytea - case schemas.Double: + case schemas.Double, schemas.UnsignedFloat: return "DOUBLE PRECISION" default: if c.IsAutoIncrement { diff --git a/schemas/type.go b/schemas/type.go index b8b30851..3dbcee7e 100644 --- a/schemas/type.go +++ b/schemas/type.go @@ -139,9 +139,10 @@ var ( Money = "MONEY" SmallMoney = "SMALLMONEY" - Real = "REAL" - Float = "FLOAT" - Double = "DOUBLE" + Real = "REAL" + Float = "FLOAT" + UnsignedFloat = "UNSIGNED FLOAT" + Double = "DOUBLE" Binary = "BINARY" VarBinary = "VARBINARY" @@ -208,13 +209,14 @@ var ( SmallDateTime: TIME_TYPE, Year: TIME_TYPE, - Decimal: NUMERIC_TYPE, - Numeric: NUMERIC_TYPE, - Real: NUMERIC_TYPE, - Float: NUMERIC_TYPE, - Double: NUMERIC_TYPE, - Money: NUMERIC_TYPE, - SmallMoney: NUMERIC_TYPE, + Decimal: NUMERIC_TYPE, + Numeric: NUMERIC_TYPE, + Real: NUMERIC_TYPE, + Float: NUMERIC_TYPE, + UnsignedFloat: NUMERIC_TYPE, + Double: NUMERIC_TYPE, + Money: NUMERIC_TYPE, + SmallMoney: NUMERIC_TYPE, Binary: BLOB_TYPE, VarBinary: BLOB_TYPE, 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())