diff --git a/go.mod b/go.mod index 37c6236d3..ae0b0da3c 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.2.1 gorm.io/datatypes v1.2.7 gorm.io/driver/mysql v1.6.0 - gorm.io/driver/postgres v1.6.0 + gorm.io/driver/postgres v1.6.1 gorm.io/driver/sqlite v1.6.0 gorm.io/gorm v1.31.2 ) diff --git a/go.sum b/go.sum index d1d3abf8e..388c4ee0e 100644 --- a/go.sum +++ b/go.sum @@ -292,8 +292,8 @@ gorm.io/datatypes v1.2.7 h1:ww9GAhF1aGXZY3EB3cJPJ7//JiuQo7DlQA7NNlVaTdk= gorm.io/datatypes v1.2.7/go.mod h1:M2iO+6S3hhi4nAyYe444Pcb0dcIiOMJ7QHaUXxyiNZY= gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= -gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= -gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/postgres v1.6.1 h1:9dA1M08/ZHE0AKrnqeoG0m1Ha9cW7UALU/OPqIjIyF8= +gorm.io/driver/postgres v1.6.1/go.mod h1:N6HRC/7+yKySXENJ1O4Yh/upkpSJG4vw0H5Rk0UHx3A= gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= gorm.io/driver/sqlserver v1.6.0 h1:VZOBQVsVhkHU/NzNhRJKoANt5pZGQAS1Bwc6m6dgfnc= diff --git a/vendor/gorm.io/driver/postgres/migrator.go b/vendor/gorm.io/driver/postgres/migrator.go index 6b57ce69f..7cbc09fb4 100644 --- a/vendor/gorm.io/driver/postgres/migrator.go +++ b/vendor/gorm.io/driver/postgres/migrator.go @@ -3,10 +3,10 @@ package postgres import ( "database/sql" "fmt" - "github.com/jackc/pgx/v5" "regexp" "strings" + "github.com/jackc/pgx/v5" "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/migrator" @@ -68,6 +68,11 @@ var typeAliasMap = map[string][]string{ "time with time zone": {"timetz"}, } +var ( + autoIncrementValuePattern = regexp.MustCompile(`^nextval\('"?[^']+seq"?'::regclass\)$`) + defaultValueValuePattern = regexp.MustCompile(`^(.*?)(?:::.*)?$`) +) + type Migrator struct { migrator.Migrator } @@ -167,9 +172,10 @@ func (m Migrator) CreateIndex(value interface{}, name string) error { func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { return m.RunWithValue(value, func(stmt *gorm.Statement) error { + currentSchema, _ := m.CurrentSchema(stmt, stmt.Table) return m.DB.Exec( - "ALTER INDEX ? RENAME TO ?", - clause.Column{Name: oldName}, clause.Column{Name: newName}, + "ALTER INDEX ?.? RENAME TO ?", + currentSchema, clause.Column{Name: oldName}, clause.Column{Name: newName}, ).Error }) } @@ -182,7 +188,8 @@ func (m Migrator) DropIndex(value interface{}, name string) error { } } - return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + currentSchema, _ := m.CurrentSchema(stmt, stmt.Table) + return m.DB.Exec("DROP INDEX ?.?", currentSchema, clause.Column{Name: name}).Error }) } @@ -320,15 +327,19 @@ func (m Migrator) AlterColumn(value interface{}, field string) error { err := m.RunWithValue(value, func(stmt *gorm.Statement) error { if stmt.Schema != nil { if field := stmt.Schema.LookUpField(field); field != nil { - var ( - columnTypes, _ = m.DB.Migrator().ColumnTypes(value) - fieldColumnType *migrator.ColumnType - ) + columnTypes, err := m.DB.Migrator().ColumnTypes(value) + if err != nil { + return err + } + var fieldColumnType *migrator.ColumnType for _, columnType := range columnTypes { if columnType.Name() == field.DBName { fieldColumnType, _ = columnType.(*migrator.ColumnType) } } + if fieldColumnType == nil { + return fmt.Errorf("failed to find column type for field %s", field.DBName) + } fileType := clause.Expr{SQL: m.DataTypeOf(field)} // check for typeName and SQL name @@ -501,7 +512,6 @@ func (m Migrator) ColumnTypes(value interface{}) (columnTypes []gorm.ColumnType, column.LengthValue = typeLenValue } - autoIncrementValuePattern := regexp.MustCompile(`^nextval\('"?[^']+seq"?'::regclass\)$`) if autoIncrementValuePattern.MatchString(column.DefaultValueValue.String) || (identityIncrement.Valid && identityIncrement.String != "") { column.AutoIncrementValue = sql.NullBool{Bool: true, Valid: true} column.DefaultValueValue = sql.NullString{} @@ -581,11 +591,7 @@ func (m Migrator) ColumnTypes(value interface{}) (columnTypes []gorm.ColumnType, // check column type { - dataTypeRows, err := m.queryRaw(`SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type - FROM pg_attribute a JOIN pg_class b ON a.attrelid = b.oid AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = ?) - WHERE a.attnum > 0 -- hide internal columns - AND NOT a.attisdropped -- hide deleted columns - AND b.relname = ?`, currentSchema, table).Rows() + dataTypeRows, err := m.queryRaw(`SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type FROM pg_attribute a JOIN pg_class b ON a.attrelid = b.oid AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = ?) WHERE a.attnum > 0 AND NOT a.attisdropped AND b.relname = ?`, currentSchema, table).Rows() if err != nil { return err } @@ -739,7 +745,8 @@ func (m Migrator) GetIndexes(value interface{}) ([]gorm.Index, error) { err := m.RunWithValue(value, func(stmt *gorm.Statement) error { result := make([]*Index, 0) - scanErr := m.queryRaw(indexSql, stmt.Table).Scan(&result).Error + currentSchema, curTable := m.CurrentSchema(stmt, stmt.Table) + scanErr := m.queryRaw(indexSql+" AND ct.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = ?)", curTable, currentSchema).Scan(&result).Error if scanErr != nil { return scanErr } @@ -816,6 +823,6 @@ func (m Migrator) RenameColumn(dst interface{}, oldName, field string) error { } func parseDefaultValueValue(defaultValue string) string { - value := regexp.MustCompile(`^(.*?)(?:::.*)?$`).ReplaceAllString(defaultValue, "$1") + value := defaultValueValuePattern.ReplaceAllString(defaultValue, "$1") return strings.Trim(value, "'") } diff --git a/vendor/gorm.io/driver/postgres/postgres.go b/vendor/gorm.io/driver/postgres/postgres.go index 2d8fd9973..dade1b574 100644 --- a/vendor/gorm.io/driver/postgres/postgres.go +++ b/vendor/gorm.io/driver/postgres/postgres.go @@ -31,6 +31,7 @@ type Config struct { PreferSimpleProtocol bool WithoutReturning bool Conn gorm.ConnPool + OptionOpenDB []stdlib.OptionOpenDB } var ( @@ -102,10 +103,9 @@ func (dialector Dialector) Initialize(db *gorm.DB) (err error) { config.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol } result := timeZoneMatcher.FindStringSubmatch(dialector.Config.DSN) - var options []stdlib.OptionOpenDB if len(result) > 2 { config.RuntimeParams["timezone"] = result[2] - options = append(options, stdlib.OptionAfterConnect(func(ctx context.Context, conn *pgx.Conn) error { + dialector.OptionOpenDB = append(dialector.OptionOpenDB, stdlib.OptionAfterConnect(func(ctx context.Context, conn *pgx.Conn) error { loc, tzErr := time.LoadLocation(result[2]) if tzErr != nil { return tzErr @@ -118,7 +118,7 @@ func (dialector Dialector) Initialize(db *gorm.DB) (err error) { return nil })) } - db.ConnPool = stdlib.OpenDB(*config, options...) + db.ConnPool = stdlib.OpenDB(*config, dialector.OptionOpenDB...) } return } diff --git a/vendor/modules.txt b/vendor/modules.txt index f38ec99e2..046a7525c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -485,8 +485,8 @@ gorm.io/datatypes # gorm.io/driver/mysql v1.6.0 ## explicit; go 1.18 gorm.io/driver/mysql -# gorm.io/driver/postgres v1.6.0 -## explicit; go 1.20 +# gorm.io/driver/postgres v1.6.1 +## explicit; go 1.25.0 gorm.io/driver/postgres # gorm.io/driver/sqlite v1.6.0 ## explicit; go 1.20