From df62f7c83721afd1e0cc4b91584dbdaa978334cc Mon Sep 17 00:00:00 2001 From: Rodrigo Boratto Date: Wed, 2 Nov 2022 11:03:38 -0300 Subject: [PATCH 1/3] CockroachDB default types In cockroachdb, the default values returns something like `field:::TIMESTAMPZ`, and the validation here is only by the default value, without its type, this regex is required. --- migrator.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/migrator.go b/migrator.go index debed56..f749f84 100644 --- a/migrator.go +++ b/migrator.go @@ -424,6 +424,9 @@ func (m Migrator) ColumnTypes(value interface{}) (columnTypes []gorm.ColumnType, if column.DefaultValueValue.Valid { column.DefaultValueValue.String = regexp.MustCompile(`'(.*)'::[\w\s]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") + column.DefaultValueValue.String = regexp.MustCompile(`'(.*)'::[\w]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") + // cockroachdb, removing :::type + column.DefaultValueValue.String = regexp.MustCompile(`(.*):::[\w]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") } if datetimePrecision.Valid { From 6e0fcdfd1094a4692c0089698ef1f537ab93ee9f Mon Sep 17 00:00:00 2001 From: Rodrigo Boratto Date: Wed, 2 Nov 2022 11:39:33 -0300 Subject: [PATCH 2/3] - considering column aliases for type checking in AlterColumn method --- migrator.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/migrator.go b/migrator.go index f749f84..dc5a135 100644 --- a/migrator.go +++ b/migrator.go @@ -281,7 +281,22 @@ func (m Migrator) AlterColumn(value interface{}, field string) error { } fileType := clause.Expr{SQL: m.DataTypeOf(field)} + // check for typeName and SQL name + isSameType := true if fieldColumnType.DatabaseTypeName() != fileType.SQL { + isSameType = false + // if different, also check for aliases + aliases := m.GetTypeAliases(fieldColumnType.DatabaseTypeName()) + for _, alias := range aliases { + if strings.HasPrefix(fileType.SQL, alias) { + isSameType = true + break + } + } + } + + // not same, migrate + if !isSameType { filedColumnAutoIncrement, _ := fieldColumnType.AutoIncrement() if field.AutoIncrement && filedColumnAutoIncrement { // update serialDatabaseType, _ := getSerialDatabaseType(fileType.SQL) From 68156b51d41bb2fd075773d7d938d39c8f4b9694 Mon Sep 17 00:00:00 2001 From: Rodrigo Boratto Date: Tue, 27 Dec 2022 11:02:39 -0300 Subject: [PATCH 3/3] Merging cockroachdb + postgreSQL regex together. It work in all these cases: `'field'::character varying` `'field':::character varying` `field::character varying` `field:::character varying` --- migrator.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/migrator.go b/migrator.go index dc5a135..f26bac0 100644 --- a/migrator.go +++ b/migrator.go @@ -6,7 +6,6 @@ import ( "regexp" "strings" - "github.com/jackc/pgx/v5" "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/migrator" @@ -438,10 +437,7 @@ func (m Migrator) ColumnTypes(value interface{}) (columnTypes []gorm.ColumnType, } if column.DefaultValueValue.Valid { - column.DefaultValueValue.String = regexp.MustCompile(`'(.*)'::[\w\s]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") - column.DefaultValueValue.String = regexp.MustCompile(`'(.*)'::[\w]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") - // cockroachdb, removing :::type - column.DefaultValueValue.String = regexp.MustCompile(`(.*):::[\w]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") + column.DefaultValueValue.String = regexp.MustCompile(`'?(.*)\b'?:+[\w\s]+$`).ReplaceAllString(column.DefaultValueValue.String, "$1") } if datetimePrecision.Valid {