From 07f3795f934819f3fd7f09fa8cbf2960a4d07b61 Mon Sep 17 00:00:00 2001 From: heige Date: Wed, 17 Mar 2021 11:32:17 +0800 Subject: [PATCH] optimize MigrateColumn method for regexp (#4188) --- migrator/migrator.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/migrator/migrator.go b/migrator/migrator.go index 263c3ffc..075b5ca6 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -12,6 +12,11 @@ import ( "gorm.io/gorm/schema" ) +var ( + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) + regFullDataType = regexp.MustCompile(`[^\d]*(\d+)[^\d]?`) +) + // Migrator m struct type Migrator struct { Config @@ -373,8 +378,10 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy alterColumn = true } else { // has size in data type and not equal - matches := regexp.MustCompile(`[^\d](\d+)[^\d]?`).FindAllStringSubmatch(realDataType, -1) - matches2 := regexp.MustCompile(`[^\d]*(\d+)[^\d]?`).FindAllStringSubmatch(fullDataType, -1) + + // Since the following code is frequently called in the for loop, reg optimization is needed here + matches := regRealDataType.FindAllStringSubmatch(realDataType, -1) + matches2 := regFullDataType.FindAllStringSubmatch(fullDataType, -1) if (len(matches) == 1 && matches[0][1] != fmt.Sprint(field.Size) || !field.PrimaryKey) && (len(matches2) == 1 && matches2[0][1] != fmt.Sprint(length)) { alterColumn = true }