From a0d6ff1feadcac2480af2b3cbc4db3d47b0a8f42 Mon Sep 17 00:00:00 2001 From: piyongcai Date: Wed, 12 Jan 2022 13:11:40 +0800 Subject: [PATCH] time.Time, []byte type add alias support. (rebase master) (#4992) * time.Time, []byte type add alias support * reformat --- schema/field.go | 3 ++- schema/field_test.go | 37 ++++++++++++++++++++++--------------- statement.go | 3 +++ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/schema/field.go b/schema/field.go index d4f879c57..485bbdf3d 100644 --- a/schema/field.go +++ b/schema/field.go @@ -346,7 +346,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { } } - if _, ok := field.TagSettings["EMBEDDED"]; ok || (fieldStruct.Anonymous && !isValuer && (field.Creatable || field.Updatable || field.Readable)) { + if _, ok := field.TagSettings["EMBEDDED"]; field.GORMDataType != Time && field.GORMDataType != Bytes && + (ok || (fieldStruct.Anonymous && !isValuer && (field.Creatable || field.Updatable || field.Readable))) { kind := reflect.Indirect(fieldValue).Kind() switch kind { case reflect.Struct: diff --git a/schema/field_test.go b/schema/field_test.go index 2cf2d0838..8fa46b876 100644 --- a/schema/field_test.go +++ b/schema/field_test.go @@ -262,21 +262,24 @@ func TestParseFieldWithPermission(t *testing.T) { } type ( - ID int64 - INT int - INT8 int8 - INT16 int16 - INT32 int32 - INT64 int64 - UINT uint - UINT8 uint8 - UINT16 uint16 - UINT32 uint32 - UINT64 uint64 - FLOAT32 float32 - FLOAT64 float64 - BOOL bool - STRING string + ID int64 + INT int + INT8 int8 + INT16 int16 + INT32 int32 + INT64 int64 + UINT uint + UINT8 uint8 + UINT16 uint16 + UINT32 uint32 + UINT64 uint64 + FLOAT32 float32 + FLOAT64 float64 + BOOL bool + STRING string + TIME time.Time + BYTES []byte + TypeAlias struct { ID INT `gorm:"column:fint"` @@ -293,6 +296,8 @@ type ( FLOAT64 `gorm:"column:ffloat64"` BOOL `gorm:"column:fbool"` STRING `gorm:"column:fstring"` + TIME `gorm:"column:ftime"` + BYTES `gorm:"column:fbytes"` } ) @@ -318,6 +323,8 @@ func TestTypeAliasField(t *testing.T) { {Name: "FLOAT64", DBName: "ffloat64", BindNames: []string{"FLOAT64"}, DataType: schema.Float, Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:ffloat64"`}, {Name: "BOOL", DBName: "fbool", BindNames: []string{"BOOL"}, DataType: schema.Bool, Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:fbool"`}, {Name: "STRING", DBName: "fstring", BindNames: []string{"STRING"}, DataType: schema.String, Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:fstring"`}, + {Name: "TIME", DBName: "ftime", BindNames: []string{"TIME"}, DataType: schema.Time, Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:ftime"`}, + {Name: "BYTES", DBName: "fbytes", BindNames: []string{"BYTES"}, DataType: schema.Bytes, Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:fbytes"`}, } for _, f := range fields { diff --git a/statement.go b/statement.go index f69339d4f..146722a9c 100644 --- a/statement.go +++ b/statement.go @@ -232,6 +232,9 @@ func (stmt *Statement) AddVar(writer clause.Writer, vars ...interface{}) { case reflect.Slice, reflect.Array: if rv.Len() == 0 { writer.WriteString("(NULL)") + } else if rv.Type().Elem() == reflect.TypeOf(uint8(0)) { + stmt.Vars = append(stmt.Vars, v) + stmt.DB.Dialector.BindVarTo(writer, stmt, v) } else { writer.WriteByte('(') for i := 0; i < rv.Len(); i++ {