github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/store/sqlstore/upgrade.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"database/sql"
     8  	"encoding/json"
     9  	"os"
    10  	"strings"
    11  	"time"
    12  
    13  	"github.com/blang/semver"
    14  	"github.com/pkg/errors"
    15  
    16  	"github.com/mattermost/mattermost-server/v5/mlog"
    17  	"github.com/mattermost/mattermost-server/v5/model"
    18  	"github.com/mattermost/mattermost-server/v5/services/timezones"
    19  )
    20  
    21  const (
    22  	CurrentSchemaVersion   = Version5330
    23  	Version5330            = "5.33.0"
    24  	Version5320            = "5.32.0"
    25  	Version5310            = "5.31.0"
    26  	Version5300            = "5.30.0"
    27  	Version5291            = "5.29.1"
    28  	Version5290            = "5.29.0"
    29  	Version5281            = "5.28.1"
    30  	Version5280            = "5.28.0"
    31  	Version5270            = "5.27.0"
    32  	Version5260            = "5.26.0"
    33  	Version5250            = "5.25.0"
    34  	Version5240            = "5.24.0"
    35  	Version5230            = "5.23.0"
    36  	Version5220            = "5.22.0"
    37  	Version5210            = "5.21.0"
    38  	Version5200            = "5.20.0"
    39  	Version5190            = "5.19.0"
    40  	Version5180            = "5.18.0"
    41  	Version5170            = "5.17.0"
    42  	Version5160            = "5.16.0"
    43  	Version5150            = "5.15.0"
    44  	Version5140            = "5.14.0"
    45  	Version5130            = "5.13.0"
    46  	Version5120            = "5.12.0"
    47  	Version5110            = "5.11.0"
    48  	Version5100            = "5.10.0"
    49  	Version590             = "5.9.0"
    50  	Version580             = "5.8.0"
    51  	Version570             = "5.7.0"
    52  	Version560             = "5.6.0"
    53  	Version550             = "5.5.0"
    54  	Version540             = "5.4.0"
    55  	Version530             = "5.3.0"
    56  	Version520             = "5.2.0"
    57  	Version510             = "5.1.0"
    58  	Version500             = "5.0.0"
    59  	Version4100            = "4.10.0"
    60  	Version490             = "4.9.0"
    61  	Version481             = "4.8.1"
    62  	Version480             = "4.8.0"
    63  	Version472             = "4.7.2"
    64  	Version471             = "4.7.1"
    65  	Version470             = "4.7.0"
    66  	Version460             = "4.6.0"
    67  	Version450             = "4.5.0"
    68  	Version440             = "4.4.0"
    69  	Version430             = "4.3.0"
    70  	Version420             = "4.2.0"
    71  	Version410             = "4.1.0"
    72  	Version400             = "4.0.0"
    73  	Version3100            = "3.10.0"
    74  	Version390             = "3.9.0"
    75  	Version380             = "3.8.0"
    76  	Version370             = "3.7.0"
    77  	Version360             = "3.6.0"
    78  	Version350             = "3.5.0"
    79  	Version340             = "3.4.0"
    80  	Version330             = "3.3.0"
    81  	Version320             = "3.2.0"
    82  	Version310             = "3.1.0"
    83  	Version300             = "3.0.0"
    84  	OldestSupportedVersion = Version300
    85  )
    86  
    87  const (
    88  	ExitVersionSave                 = 1003
    89  	ExitThemeMigration              = 1004
    90  	ExitTeamInviteIDMigrationFailed = 1006
    91  )
    92  
    93  // upgradeDatabase attempts to migrate the schema to the latest supported version.
    94  // The value of model.CurrentVersion is accepted as a parameter for unit testing, but it is not
    95  // used to stop migrations at that version.
    96  func upgradeDatabase(sqlStore *SqlStore, currentModelVersionString string) error {
    97  	currentModelVersion, err := semver.Parse(currentModelVersionString)
    98  	if err != nil {
    99  		return errors.Wrapf(err, "failed to parse current model version %s", currentModelVersionString)
   100  	}
   101  
   102  	nextUnsupportedMajorVersion := semver.Version{
   103  		Major: currentModelVersion.Major + 1,
   104  	}
   105  
   106  	oldestSupportedVersion, err := semver.Parse(OldestSupportedVersion)
   107  	if err != nil {
   108  		return errors.Wrapf(err, "failed to parse oldest supported version %s", OldestSupportedVersion)
   109  	}
   110  
   111  	var currentSchemaVersion *semver.Version
   112  	currentSchemaVersionString := sqlStore.GetCurrentSchemaVersion()
   113  	if currentSchemaVersionString != "" {
   114  		currentSchemaVersion, err = semver.New(currentSchemaVersionString)
   115  		if err != nil {
   116  			return errors.Wrapf(err, "failed to parse database schema version %s", currentSchemaVersionString)
   117  		}
   118  	}
   119  
   120  	// Assume a fresh database if no schema version has been recorded.
   121  	if currentSchemaVersion == nil {
   122  		if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); err != nil {
   123  			return errors.Wrap(err, "failed to initialize schema version for fresh database")
   124  		}
   125  
   126  		currentSchemaVersion = &currentModelVersion
   127  		mlog.Info("The database schema version has been set", mlog.String("version", currentSchemaVersion.String()))
   128  		return nil
   129  	}
   130  
   131  	// Upgrades prior to the oldest supported version are not supported.
   132  	if currentSchemaVersion.LT(oldestSupportedVersion) {
   133  		return errors.Errorf("Database schema version %s is no longer supported. This Mattermost server supports automatic upgrades from schema version %s through schema version %s. Please manually upgrade to at least version %s before continuing.", *currentSchemaVersion, oldestSupportedVersion, currentModelVersion, oldestSupportedVersion)
   134  	}
   135  
   136  	// Allow forwards compatibility only within the same major version.
   137  	if currentSchemaVersion.GTE(nextUnsupportedMajorVersion) {
   138  		return errors.Errorf("Database schema version %s is not supported. This Mattermost server supports only >=%s, <%s. Please upgrade to at least version %s before continuing.", *currentSchemaVersion, currentModelVersion, nextUnsupportedMajorVersion, nextUnsupportedMajorVersion)
   139  	} else if currentSchemaVersion.GT(currentModelVersion) {
   140  		mlog.Warn("The database schema version and model versions do not match", mlog.String("schema_version", currentSchemaVersion.String()), mlog.String("model_version", currentModelVersion.String()))
   141  	}
   142  
   143  	// Otherwise, apply any necessary migrations. Note that these methods currently invoke
   144  	// os.Exit instead of returning an error.
   145  	upgradeDatabaseToVersion31(sqlStore)
   146  	upgradeDatabaseToVersion32(sqlStore)
   147  	upgradeDatabaseToVersion33(sqlStore)
   148  	upgradeDatabaseToVersion34(sqlStore)
   149  	upgradeDatabaseToVersion35(sqlStore)
   150  	upgradeDatabaseToVersion36(sqlStore)
   151  	upgradeDatabaseToVersion37(sqlStore)
   152  	upgradeDatabaseToVersion38(sqlStore)
   153  	upgradeDatabaseToVersion39(sqlStore)
   154  	upgradeDatabaseToVersion310(sqlStore)
   155  	upgradeDatabaseToVersion40(sqlStore)
   156  	upgradeDatabaseToVersion41(sqlStore)
   157  	upgradeDatabaseToVersion42(sqlStore)
   158  	upgradeDatabaseToVersion43(sqlStore)
   159  	upgradeDatabaseToVersion44(sqlStore)
   160  	upgradeDatabaseToVersion45(sqlStore)
   161  	upgradeDatabaseToVersion46(sqlStore)
   162  	upgradeDatabaseToVersion47(sqlStore)
   163  	upgradeDatabaseToVersion471(sqlStore)
   164  	upgradeDatabaseToVersion472(sqlStore)
   165  	upgradeDatabaseToVersion48(sqlStore)
   166  	upgradeDatabaseToVersion481(sqlStore)
   167  	upgradeDatabaseToVersion49(sqlStore)
   168  	upgradeDatabaseToVersion410(sqlStore)
   169  	upgradeDatabaseToVersion50(sqlStore)
   170  	upgradeDatabaseToVersion51(sqlStore)
   171  	upgradeDatabaseToVersion52(sqlStore)
   172  	upgradeDatabaseToVersion53(sqlStore)
   173  	upgradeDatabaseToVersion54(sqlStore)
   174  	upgradeDatabaseToVersion55(sqlStore)
   175  	upgradeDatabaseToVersion56(sqlStore)
   176  	upgradeDatabaseToVersion57(sqlStore)
   177  	upgradeDatabaseToVersion58(sqlStore)
   178  	upgradeDatabaseToVersion59(sqlStore)
   179  	upgradeDatabaseToVersion510(sqlStore)
   180  	upgradeDatabaseToVersion511(sqlStore)
   181  	upgradeDatabaseToVersion512(sqlStore)
   182  	upgradeDatabaseToVersion513(sqlStore)
   183  	upgradeDatabaseToVersion514(sqlStore)
   184  	upgradeDatabaseToVersion515(sqlStore)
   185  	upgradeDatabaseToVersion516(sqlStore)
   186  	upgradeDatabaseToVersion517(sqlStore)
   187  	upgradeDatabaseToVersion518(sqlStore)
   188  	upgradeDatabaseToVersion519(sqlStore)
   189  	upgradeDatabaseToVersion520(sqlStore)
   190  	upgradeDatabaseToVersion521(sqlStore)
   191  	upgradeDatabaseToVersion522(sqlStore)
   192  	upgradeDatabaseToVersion523(sqlStore)
   193  	upgradeDatabaseToVersion524(sqlStore)
   194  	upgradeDatabaseToVersion525(sqlStore)
   195  	upgradeDatabaseToVersion526(sqlStore)
   196  	upgradeDatabaseToVersion527(sqlStore)
   197  	upgradeDatabaseToVersion528(sqlStore)
   198  	upgradeDatabaseToVersion5281(sqlStore)
   199  	upgradeDatabaseToVersion529(sqlStore)
   200  	upgradeDatabaseToVersion5291(sqlStore)
   201  	upgradeDatabaseToVersion530(sqlStore)
   202  	upgradeDatabaseToVersion531(sqlStore)
   203  	upgradeDatabaseToVersion532(sqlStore)
   204  	upgradeDatabaseToVersion533(sqlStore)
   205  
   206  	return nil
   207  }
   208  
   209  func saveSchemaVersion(sqlStore *SqlStore, version string) {
   210  	if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); err != nil {
   211  		mlog.Critical(err.Error())
   212  		time.Sleep(time.Second)
   213  		os.Exit(ExitVersionSave)
   214  	}
   215  
   216  	mlog.Warn("The database schema version has been upgraded", mlog.String("version", version))
   217  }
   218  
   219  func shouldPerformUpgrade(sqlStore *SqlStore, currentSchemaVersion string, expectedSchemaVersion string) bool {
   220  	storedSchemaVersion := sqlStore.GetCurrentSchemaVersion()
   221  
   222  	storedVersion, err := semver.Parse(storedSchemaVersion)
   223  	if err != nil {
   224  		mlog.Error("Error parsing stored schema version", mlog.Err(err))
   225  		return false
   226  	}
   227  
   228  	currentVersion, err := semver.Parse(currentSchemaVersion)
   229  	if err != nil {
   230  		mlog.Error("Error parsing current schema version", mlog.Err(err))
   231  		return false
   232  	}
   233  
   234  	if storedVersion.Major == currentVersion.Major && storedVersion.Minor == currentVersion.Minor {
   235  		mlog.Warn("Attempting to upgrade the database schema version",
   236  			mlog.String("stored_version", storedSchemaVersion), mlog.String("current_version", currentSchemaVersion), mlog.String("new_version", expectedSchemaVersion))
   237  		return true
   238  	}
   239  
   240  	return false
   241  }
   242  
   243  func upgradeDatabaseToVersion31(sqlStore *SqlStore) {
   244  	if shouldPerformUpgrade(sqlStore, Version300, Version310) {
   245  		sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "ContentType", "varchar(128)", "varchar(128)", "")
   246  		saveSchemaVersion(sqlStore, Version310)
   247  	}
   248  }
   249  
   250  func upgradeDatabaseToVersion32(sqlStore *SqlStore) {
   251  	if shouldPerformUpgrade(sqlStore, Version310, Version320) {
   252  		sqlStore.CreateColumnIfNotExists("TeamMembers", "DeleteAt", "bigint(20)", "bigint", "0")
   253  
   254  		saveSchemaVersion(sqlStore, Version320)
   255  	}
   256  }
   257  
   258  func themeMigrationFailed(err error) {
   259  	mlog.Critical("Failed to migrate User.ThemeProps to Preferences table", mlog.Err(err))
   260  	time.Sleep(time.Second)
   261  	os.Exit(ExitThemeMigration)
   262  }
   263  
   264  func upgradeDatabaseToVersion33(sqlStore *SqlStore) {
   265  	if shouldPerformUpgrade(sqlStore, Version320, Version330) {
   266  		if sqlStore.DoesColumnExist("Users", "ThemeProps") {
   267  			params := map[string]interface{}{
   268  				"Category": model.PREFERENCE_CATEGORY_THEME,
   269  				"Name":     "",
   270  			}
   271  
   272  			transaction, err := sqlStore.GetMaster().Begin()
   273  			if err != nil {
   274  				themeMigrationFailed(err)
   275  			}
   276  			defer finalizeTransaction(transaction)
   277  
   278  			// increase size of Value column of Preferences table to match the size of the ThemeProps column
   279  			if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   280  				if _, err := transaction.Exec("ALTER TABLE Preferences ALTER COLUMN Value TYPE varchar(2000)"); err != nil {
   281  					themeMigrationFailed(err)
   282  					return
   283  				}
   284  			} else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL {
   285  				if _, err := transaction.Exec("ALTER TABLE Preferences MODIFY Value text"); err != nil {
   286  					themeMigrationFailed(err)
   287  					return
   288  				}
   289  			}
   290  
   291  			// copy data across
   292  			if _, err := transaction.Exec(
   293  				`INSERT INTO
   294  					Preferences(UserId, Category, Name, Value)
   295  				SELECT
   296  					Id, '`+model.PREFERENCE_CATEGORY_THEME+`', '', ThemeProps
   297  				FROM
   298  					Users
   299  				WHERE
   300  					Users.ThemeProps != 'null'`, params); err != nil {
   301  				themeMigrationFailed(err)
   302  				return
   303  			}
   304  
   305  			// delete old data
   306  			if _, err := transaction.Exec("ALTER TABLE Users DROP COLUMN ThemeProps"); err != nil {
   307  				themeMigrationFailed(err)
   308  				return
   309  			}
   310  
   311  			if err := transaction.Commit(); err != nil {
   312  				themeMigrationFailed(err)
   313  				return
   314  			}
   315  
   316  			// rename solarized_* code themes to solarized-* to match client changes in 3.0
   317  			var data model.Preferences
   318  			if _, err := sqlStore.GetMaster().Select(&data, "SELECT * FROM Preferences WHERE Category = '"+model.PREFERENCE_CATEGORY_THEME+"' AND Value LIKE '%solarized_%'"); err == nil {
   319  				for i := range data {
   320  					data[i].Value = strings.Replace(data[i].Value, "solarized_", "solarized-", -1)
   321  				}
   322  
   323  				sqlStore.Preference().Save(&data)
   324  			}
   325  		}
   326  
   327  		sqlStore.CreateColumnIfNotExists("OAuthApps", "IsTrusted", "tinyint(1)", "boolean", "0")
   328  		sqlStore.CreateColumnIfNotExists("OAuthApps", "IconURL", "varchar(512)", "varchar(512)", "")
   329  		sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ClientId", "varchar(26)", "varchar(26)", "")
   330  		sqlStore.CreateColumnIfNotExists("OAuthAccessData", "UserId", "varchar(26)", "varchar(26)", "")
   331  		sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ExpiresAt", "bigint", "bigint", "0")
   332  
   333  		if sqlStore.DoesColumnExist("OAuthAccessData", "AuthCode") {
   334  			sqlStore.RemoveIndexIfExists("idx_oauthaccessdata_auth_code", "OAuthAccessData")
   335  			sqlStore.RemoveColumnIfExists("OAuthAccessData", "AuthCode")
   336  		}
   337  
   338  		sqlStore.RemoveColumnIfExists("Users", "LastActivityAt")
   339  		sqlStore.RemoveColumnIfExists("Users", "LastPingAt")
   340  
   341  		sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "TriggerWhen", "tinyint", "integer", "0")
   342  
   343  		saveSchemaVersion(sqlStore, Version330)
   344  	}
   345  }
   346  
   347  func upgradeDatabaseToVersion34(sqlStore *SqlStore) {
   348  	if shouldPerformUpgrade(sqlStore, Version330, Version340) {
   349  		sqlStore.CreateColumnIfNotExists("Status", "Manual", "BOOLEAN", "BOOLEAN", "0")
   350  		sqlStore.CreateColumnIfNotExists("Status", "ActiveChannel", "varchar(26)", "varchar(26)", "")
   351  
   352  		saveSchemaVersion(sqlStore, Version340)
   353  	}
   354  }
   355  
   356  func upgradeDatabaseToVersion35(sqlStore *SqlStore) {
   357  	if shouldPerformUpgrade(sqlStore, Version340, Version350) {
   358  		sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''")
   359  		sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'")
   360  		sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''")
   361  		sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'")
   362  		sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''")
   363  		sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'")
   364  
   365  		// The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost
   366  		sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]")
   367  
   368  		// Increase maximum length of the Channel table Purpose column.
   369  		if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" {
   370  			sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)")
   371  		}
   372  
   373  		sqlStore.Session().RemoveAllSessions()
   374  
   375  		saveSchemaVersion(sqlStore, Version350)
   376  	}
   377  }
   378  
   379  func upgradeDatabaseToVersion36(sqlStore *SqlStore) {
   380  	if shouldPerformUpgrade(sqlStore, Version350, Version360) {
   381  		sqlStore.CreateColumnIfNotExists("Posts", "HasReactions", "tinyint", "boolean", "0")
   382  
   383  		// Create Team Description column
   384  		sqlStore.CreateColumnIfNotExists("Teams", "Description", "varchar(255)", "varchar(255)", "")
   385  
   386  		// Add a Position column to users.
   387  		sqlStore.CreateColumnIfNotExists("Users", "Position", "varchar(64)", "varchar(64)", "")
   388  
   389  		// Remove ActiveChannel column from Status
   390  		sqlStore.RemoveColumnIfExists("Status", "ActiveChannel")
   391  
   392  		saveSchemaVersion(sqlStore, Version360)
   393  	}
   394  }
   395  
   396  func upgradeDatabaseToVersion37(sqlStore *SqlStore) {
   397  	if shouldPerformUpgrade(sqlStore, Version360, Version370) {
   398  		// Add EditAt column to Posts
   399  		sqlStore.CreateColumnIfNotExists("Posts", "EditAt", " bigint", " bigint", "0")
   400  
   401  		saveSchemaVersion(sqlStore, Version370)
   402  	}
   403  }
   404  
   405  func upgradeDatabaseToVersion38(sqlStore *SqlStore) {
   406  	if shouldPerformUpgrade(sqlStore, Version370, Version380) {
   407  		// Add the IsPinned column to posts.
   408  		sqlStore.CreateColumnIfNotExists("Posts", "IsPinned", "boolean", "boolean", "0")
   409  
   410  		saveSchemaVersion(sqlStore, Version380)
   411  	}
   412  }
   413  
   414  func upgradeDatabaseToVersion39(sqlStore *SqlStore) {
   415  	if shouldPerformUpgrade(sqlStore, Version380, Version390) {
   416  		sqlStore.CreateColumnIfNotExists("OAuthAccessData", "Scope", "varchar(128)", "varchar(128)", model.DEFAULT_SCOPE)
   417  		sqlStore.RemoveTableIfExists("PasswordRecovery")
   418  
   419  		saveSchemaVersion(sqlStore, Version390)
   420  	}
   421  }
   422  
   423  func upgradeDatabaseToVersion310(sqlStore *SqlStore) {
   424  	if shouldPerformUpgrade(sqlStore, Version390, Version3100) {
   425  		saveSchemaVersion(sqlStore, Version3100)
   426  	}
   427  }
   428  
   429  func upgradeDatabaseToVersion40(sqlStore *SqlStore) {
   430  	if shouldPerformUpgrade(sqlStore, Version3100, Version400) {
   431  		saveSchemaVersion(sqlStore, Version400)
   432  	}
   433  }
   434  
   435  func upgradeDatabaseToVersion41(sqlStore *SqlStore) {
   436  	if shouldPerformUpgrade(sqlStore, Version400, Version410) {
   437  		// Increase maximum length of the Users table Roles column.
   438  		if sqlStore.GetMaxLengthOfColumnIfExists("Users", "Roles") != "256" {
   439  			sqlStore.AlterColumnTypeIfExists("Users", "Roles", "varchar(256)", "varchar(256)")
   440  		}
   441  
   442  		sqlStore.RemoveTableIfExists("JobStatuses")
   443  
   444  		saveSchemaVersion(sqlStore, Version410)
   445  	}
   446  }
   447  
   448  func upgradeDatabaseToVersion42(sqlStore *SqlStore) {
   449  	if shouldPerformUpgrade(sqlStore, Version410, Version420) {
   450  		saveSchemaVersion(sqlStore, Version420)
   451  	}
   452  }
   453  
   454  func upgradeDatabaseToVersion43(sqlStore *SqlStore) {
   455  	if shouldPerformUpgrade(sqlStore, Version420, Version430) {
   456  		saveSchemaVersion(sqlStore, Version430)
   457  	}
   458  }
   459  
   460  func upgradeDatabaseToVersion44(sqlStore *SqlStore) {
   461  	if shouldPerformUpgrade(sqlStore, Version430, Version440) {
   462  		// Add the IsActive column to UserAccessToken.
   463  		sqlStore.CreateColumnIfNotExists("UserAccessTokens", "IsActive", "boolean", "boolean", "1")
   464  
   465  		saveSchemaVersion(sqlStore, Version440)
   466  	}
   467  }
   468  
   469  func upgradeDatabaseToVersion45(sqlStore *SqlStore) {
   470  	if shouldPerformUpgrade(sqlStore, Version440, Version450) {
   471  		saveSchemaVersion(sqlStore, Version450)
   472  	}
   473  }
   474  
   475  func upgradeDatabaseToVersion46(sqlStore *SqlStore) {
   476  	if shouldPerformUpgrade(sqlStore, Version450, Version460) {
   477  		sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "Username", "varchar(64)", "varchar(64)", "")
   478  		sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "")
   479  		saveSchemaVersion(sqlStore, Version460)
   480  	}
   481  }
   482  
   483  func upgradeDatabaseToVersion47(sqlStore *SqlStore) {
   484  	if shouldPerformUpgrade(sqlStore, Version460, Version470) {
   485  		sqlStore.AlterColumnTypeIfExists("Users", "Position", "varchar(128)", "varchar(128)")
   486  		sqlStore.AlterColumnTypeIfExists("OAuthAuthData", "State", "varchar(1024)", "varchar(1024)")
   487  		sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email")
   488  		sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Username")
   489  		saveSchemaVersion(sqlStore, Version470)
   490  	}
   491  }
   492  
   493  func upgradeDatabaseToVersion471(sqlStore *SqlStore) {
   494  	// If any new instances started with 4.7, they would have the bad Email column on the
   495  	// ChannelMemberHistory table. So for those cases we need to do an upgrade between
   496  	// 4.7.0 and 4.7.1
   497  	if shouldPerformUpgrade(sqlStore, Version470, Version471) {
   498  		sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email")
   499  		saveSchemaVersion(sqlStore, Version471)
   500  	}
   501  }
   502  
   503  func upgradeDatabaseToVersion472(sqlStore *SqlStore) {
   504  	if shouldPerformUpgrade(sqlStore, Version471, Version472) {
   505  		sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels")
   506  		saveSchemaVersion(sqlStore, Version472)
   507  	}
   508  }
   509  
   510  func upgradeDatabaseToVersion48(sqlStore *SqlStore) {
   511  	if shouldPerformUpgrade(sqlStore, Version472, Version480) {
   512  		saveSchemaVersion(sqlStore, Version480)
   513  	}
   514  }
   515  
   516  func upgradeDatabaseToVersion481(sqlStore *SqlStore) {
   517  	if shouldPerformUpgrade(sqlStore, Version480, Version481) {
   518  		sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels")
   519  		saveSchemaVersion(sqlStore, Version481)
   520  	}
   521  }
   522  
   523  func upgradeDatabaseToVersion49(sqlStore *SqlStore) {
   524  	// This version of Mattermost includes an App-Layer migration which migrates from hard-coded roles configured by
   525  	// a number of parameters in `config.json` to a `Roles` table in the database. The migration code can be seen
   526  	// in the file `app/app.go` in the function `DoAdvancedPermissionsMigration()`.
   527  
   528  	if shouldPerformUpgrade(sqlStore, Version481, Version490) {
   529  		sqlStore.CreateColumnIfNotExists("Teams", "LastTeamIconUpdate", "bigint", "bigint", "0")
   530  		defaultTimezone := timezones.DefaultUserTimezone()
   531  		defaultTimezoneValue, err := json.Marshal(defaultTimezone)
   532  		if err != nil {
   533  			mlog.Critical(err.Error())
   534  		}
   535  		sqlStore.CreateColumnIfNotExists("Users", "Timezone", "varchar(256)", "varchar(256)", string(defaultTimezoneValue))
   536  		sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels")
   537  		saveSchemaVersion(sqlStore, Version490)
   538  	}
   539  }
   540  
   541  func upgradeDatabaseToVersion410(sqlStore *SqlStore) {
   542  	if shouldPerformUpgrade(sqlStore, Version490, Version4100) {
   543  
   544  		sqlStore.RemoveIndexIfExists("Name_2", "Channels")
   545  		sqlStore.RemoveIndexIfExists("Name_2", "Emoji")
   546  		sqlStore.RemoveIndexIfExists("ClientId_2", "OAuthAccessData")
   547  
   548  		saveSchemaVersion(sqlStore, Version4100)
   549  		sqlStore.GetMaster().Exec("UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'")
   550  	}
   551  }
   552  
   553  func upgradeDatabaseToVersion50(sqlStore *SqlStore) {
   554  	// This version of Mattermost includes an App-Layer migration which migrates from hard-coded emojis configured
   555  	// in `config.json` to a `Permission` in the database. The migration code can be seen
   556  	// in the file `app/app.go` in the function `DoEmojisPermissionsMigration()`.
   557  
   558  	// This version of Mattermost also includes a online-migration which migrates some roles from the `Roles` columns of
   559  	// TeamMember and ChannelMember rows to the new SchemeAdmin and SchemeUser columns. If you need to downgrade to a
   560  	// version of Mattermost prior to 5.0, you should take your server offline and run the following SQL statements
   561  	// prior to launching the downgraded version:
   562  	//
   563  	//    UPDATE Teams SET SchemeId = NULL;
   564  	//    UPDATE Channels SET SchemeId = NULL;
   565  	//    UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_user'), SchemeUser = NULL where SchemeUser = 1;
   566  	//    UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_admin'), SchemeAdmin = NULL where SchemeAdmin = 1;
   567  	//    UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_user'), SchemeUser = NULL where SchemeUser = 1;
   568  	//    UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_admin'), SchemeAdmin = NULL where SchemeAdmin = 1;
   569  	//    DELETE from Systems WHERE Name = 'migration_advanced_permissions_phase_2';
   570  
   571  	if shouldPerformUpgrade(sqlStore, Version4100, Version500) {
   572  
   573  		sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "SchemeId", "varchar(26)", "varchar(26)")
   574  		sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "SchemeId", "varchar(26)", "varchar(26)")
   575  
   576  		sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeUser", "boolean", "boolean")
   577  		sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeAdmin", "boolean", "boolean")
   578  		sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeUser", "boolean", "boolean")
   579  		sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeAdmin", "boolean", "boolean")
   580  
   581  		sqlStore.CreateColumnIfNotExists("Roles", "BuiltIn", "boolean", "boolean", "0")
   582  		sqlStore.GetMaster().Exec("UPDATE Roles SET BuiltIn=true")
   583  		sqlStore.GetMaster().Exec("UPDATE Roles SET SchemeManaged=false WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin')")
   584  		sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "ChannelLocked", "boolean", "boolean", "0")
   585  
   586  		sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels")
   587  
   588  		saveSchemaVersion(sqlStore, Version500)
   589  	}
   590  }
   591  
   592  func upgradeDatabaseToVersion51(sqlStore *SqlStore) {
   593  	if shouldPerformUpgrade(sqlStore, Version500, Version510) {
   594  		saveSchemaVersion(sqlStore, Version510)
   595  	}
   596  }
   597  
   598  func upgradeDatabaseToVersion52(sqlStore *SqlStore) {
   599  	if shouldPerformUpgrade(sqlStore, Version510, Version520) {
   600  		sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "Username", "varchar(64)", "varchar(64)", "")
   601  		sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "")
   602  		saveSchemaVersion(sqlStore, Version520)
   603  	}
   604  }
   605  
   606  func upgradeDatabaseToVersion53(sqlStore *SqlStore) {
   607  	if shouldPerformUpgrade(sqlStore, Version520, Version530) {
   608  		saveSchemaVersion(sqlStore, Version530)
   609  	}
   610  }
   611  
   612  func upgradeDatabaseToVersion54(sqlStore *SqlStore) {
   613  	if shouldPerformUpgrade(sqlStore, Version530, Version540) {
   614  		sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "varchar(500)", "varchar(500)")
   615  		sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "varchar(500)", "varchar(500)")
   616  		if err := sqlStore.Channel().MigratePublicChannels(); err != nil {
   617  			mlog.Critical("Failed to migrate PublicChannels table", mlog.Err(err))
   618  			time.Sleep(time.Second)
   619  			os.Exit(ExitGenericFailure)
   620  		}
   621  		saveSchemaVersion(sqlStore, Version540)
   622  	}
   623  }
   624  
   625  func upgradeDatabaseToVersion55(sqlStore *SqlStore) {
   626  	if shouldPerformUpgrade(sqlStore, Version540, Version550) {
   627  		saveSchemaVersion(sqlStore, Version550)
   628  	}
   629  }
   630  
   631  func upgradeDatabaseToVersion56(sqlStore *SqlStore) {
   632  	if shouldPerformUpgrade(sqlStore, Version550, Version560) {
   633  		sqlStore.CreateColumnIfNotExists("PluginKeyValueStore", "ExpireAt", "bigint(20)", "bigint", "0")
   634  
   635  		// migrating user's accepted terms of service data into the new table
   636  		sqlStore.GetMaster().Exec("INSERT INTO UserTermsOfService SELECT Id, AcceptedTermsOfServiceId as TermsOfServiceId, :CreateAt FROM Users WHERE AcceptedTermsOfServiceId != \"\" AND AcceptedTermsOfServiceId IS NOT NULL", map[string]interface{}{"CreateAt": model.GetMillis()})
   637  
   638  		if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   639  			sqlStore.RemoveIndexIfExists("idx_users_email_lower", "lower(Email)")
   640  			sqlStore.RemoveIndexIfExists("idx_users_username_lower", "lower(Username)")
   641  			sqlStore.RemoveIndexIfExists("idx_users_nickname_lower", "lower(Nickname)")
   642  			sqlStore.RemoveIndexIfExists("idx_users_firstname_lower", "lower(FirstName)")
   643  			sqlStore.RemoveIndexIfExists("idx_users_lastname_lower", "lower(LastName)")
   644  		}
   645  
   646  		saveSchemaVersion(sqlStore, Version560)
   647  	}
   648  
   649  }
   650  
   651  func upgradeDatabaseToVersion57(sqlStore *SqlStore) {
   652  	if shouldPerformUpgrade(sqlStore, Version560, Version570) {
   653  		saveSchemaVersion(sqlStore, Version570)
   654  	}
   655  }
   656  
   657  func upgradeDatabaseToVersion58(sqlStore *SqlStore) {
   658  	if shouldPerformUpgrade(sqlStore, Version570, Version580) {
   659  		// idx_channels_txt was removed in `upgradeDatabaseToVersion50`, but merged as part of
   660  		// v5.1, so the migration wouldn't apply to anyone upgrading from v5.0. Remove it again to
   661  		// bring the upgraded (from v5.0) and fresh install schemas back in sync.
   662  		sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels")
   663  
   664  		// Fix column types and defaults where gorp converged on a different schema value than the
   665  		// original migration.
   666  		sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "text", "VARCHAR(500)")
   667  		sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "text", "VARCHAR(500)")
   668  		sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "IconURL", "text", "VARCHAR(1024)")
   669  		sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "Username", model.NewString("NULL"), model.NewString(""))
   670  		sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "IconURL", nil, model.NewString(""))
   671  		sqlStore.AlterColumnDefaultIfExists("PluginKeyValueStore", "ExpireAt", model.NewString("NULL"), model.NewString("NULL"))
   672  
   673  		saveSchemaVersion(sqlStore, Version580)
   674  	}
   675  }
   676  
   677  func upgradeDatabaseToVersion59(sqlStore *SqlStore) {
   678  	if shouldPerformUpgrade(sqlStore, Version580, Version590) {
   679  		saveSchemaVersion(sqlStore, Version590)
   680  	}
   681  }
   682  
   683  func upgradeDatabaseToVersion510(sqlStore *SqlStore) {
   684  	if shouldPerformUpgrade(sqlStore, Version590, Version5100) {
   685  		sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "GroupConstrained", "tinyint(4)", "boolean")
   686  		sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "GroupConstrained", "tinyint(4)", "boolean")
   687  
   688  		sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId")
   689  		sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId")
   690  
   691  		saveSchemaVersion(sqlStore, Version5100)
   692  	}
   693  }
   694  
   695  func upgradeDatabaseToVersion511(sqlStore *SqlStore) {
   696  	if shouldPerformUpgrade(sqlStore, Version5100, Version5110) {
   697  		// Enforce all teams have an InviteID set
   698  		var teams []*model.Team
   699  		if _, err := sqlStore.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE InviteId = ''"); err != nil {
   700  			mlog.Error("Error fetching Teams without InviteID", mlog.Err(err))
   701  		} else {
   702  			for _, team := range teams {
   703  				team.InviteId = model.NewId()
   704  				if _, err := sqlStore.Team().Update(team); err != nil {
   705  					mlog.Error("Error updating Team InviteIDs", mlog.String("team_id", team.Id), mlog.Err(err))
   706  				}
   707  			}
   708  		}
   709  
   710  		saveSchemaVersion(sqlStore, Version5110)
   711  	}
   712  }
   713  
   714  func upgradeDatabaseToVersion512(sqlStore *SqlStore) {
   715  	if shouldPerformUpgrade(sqlStore, Version5110, Version5120) {
   716  		sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeGuest", "boolean", "boolean")
   717  		sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeGuest", "boolean", "boolean")
   718  		sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultTeamGuestRole", "text", "VARCHAR(64)")
   719  		sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultChannelGuestRole", "text", "VARCHAR(64)")
   720  
   721  		sqlStore.GetMaster().Exec("UPDATE Schemes SET DefaultTeamGuestRole = '', DefaultChannelGuestRole = ''")
   722  
   723  		// Saturday, January 24, 2065 5:20:00 AM GMT. To remove all personal access token sessions.
   724  		sqlStore.GetMaster().Exec("DELETE FROM Sessions WHERE ExpiresAt > 3000000000000")
   725  
   726  		saveSchemaVersion(sqlStore, Version5120)
   727  	}
   728  }
   729  
   730  func upgradeDatabaseToVersion513(sqlStore *SqlStore) {
   731  	if shouldPerformUpgrade(sqlStore, Version5120, Version5130) {
   732  		// The previous jobs ran once per minute, cluttering the Jobs table with somewhat useless entries. Clean that up.
   733  		sqlStore.GetMaster().Exec("DELETE FROM Jobs WHERE Type = 'plugins'")
   734  
   735  		saveSchemaVersion(sqlStore, Version5130)
   736  	}
   737  }
   738  
   739  func upgradeDatabaseToVersion514(sqlStore *SqlStore) {
   740  	if shouldPerformUpgrade(sqlStore, Version5130, Version5140) {
   741  		saveSchemaVersion(sqlStore, Version5140)
   742  	}
   743  }
   744  
   745  func upgradeDatabaseToVersion515(sqlStore *SqlStore) {
   746  	if shouldPerformUpgrade(sqlStore, Version5140, Version5150) {
   747  		saveSchemaVersion(sqlStore, Version5150)
   748  	}
   749  }
   750  
   751  func upgradeDatabaseToVersion516(sqlStore *SqlStore) {
   752  	if shouldPerformUpgrade(sqlStore, Version5150, Version5160) {
   753  		if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   754  			sqlStore.GetMaster().Exec("ALTER TABLE Tokens ALTER COLUMN Extra TYPE varchar(2048)")
   755  		} else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL {
   756  			sqlStore.GetMaster().Exec("ALTER TABLE Tokens MODIFY Extra text")
   757  		}
   758  		saveSchemaVersion(sqlStore, Version5160)
   759  
   760  		// Fix mismatches between the canonical and migrated schemas.
   761  		sqlStore.AlterColumnTypeIfExists("TeamMembers", "SchemeGuest", "tinyint(4)", "boolean")
   762  		sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultTeamGuestRole", "varchar(64)", "VARCHAR(64)")
   763  		sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultChannelGuestRole", "varchar(64)", "VARCHAR(64)")
   764  		sqlStore.AlterColumnTypeIfExists("Teams", "AllowedDomains", "text", "VARCHAR(1000)")
   765  		sqlStore.AlterColumnTypeIfExists("Channels", "GroupConstrained", "tinyint(1)", "boolean")
   766  		sqlStore.AlterColumnTypeIfExists("Teams", "GroupConstrained", "tinyint(1)", "boolean")
   767  
   768  		// One known mismatch remains: ChannelMembers.SchemeGuest. The requisite migration
   769  		// is left here for posterity, but we're avoiding fix this given the corresponding
   770  		// table rewrite in most MySQL and Postgres instances.
   771  		// sqlStore.AlterColumnTypeIfExists("ChannelMembers", "SchemeGuest", "tinyint(4)", "boolean")
   772  
   773  		sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId")
   774  		sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId")
   775  	}
   776  }
   777  
   778  func upgradeDatabaseToVersion517(sqlStore *SqlStore) {
   779  	if shouldPerformUpgrade(sqlStore, Version5160, Version5170) {
   780  		saveSchemaVersion(sqlStore, Version5170)
   781  	}
   782  }
   783  
   784  func upgradeDatabaseToVersion518(sqlStore *SqlStore) {
   785  	if shouldPerformUpgrade(sqlStore, Version5170, Version5180) {
   786  		saveSchemaVersion(sqlStore, Version5180)
   787  	}
   788  }
   789  
   790  func upgradeDatabaseToVersion519(sqlStore *SqlStore) {
   791  	if shouldPerformUpgrade(sqlStore, Version5180, Version5190) {
   792  		saveSchemaVersion(sqlStore, Version5190)
   793  	}
   794  }
   795  
   796  func upgradeDatabaseToVersion520(sqlStore *SqlStore) {
   797  	if shouldPerformUpgrade(sqlStore, Version5190, Version5200) {
   798  		sqlStore.CreateColumnIfNotExistsNoDefault("Bots", "LastIconUpdate", "bigint", "bigint")
   799  
   800  		sqlStore.CreateColumnIfNotExists("GroupTeams", "SchemeAdmin", "boolean", "boolean", "0")
   801  		sqlStore.CreateIndexIfNotExists("idx_groupteams_schemeadmin", "GroupTeams", "SchemeAdmin")
   802  
   803  		sqlStore.CreateColumnIfNotExists("GroupChannels", "SchemeAdmin", "boolean", "boolean", "0")
   804  		sqlStore.CreateIndexIfNotExists("idx_groupchannels_schemeadmin", "GroupChannels", "SchemeAdmin")
   805  
   806  		saveSchemaVersion(sqlStore, Version5200)
   807  	}
   808  }
   809  
   810  func upgradeDatabaseToVersion521(sqlStore *SqlStore) {
   811  	if shouldPerformUpgrade(sqlStore, Version5200, Version5210) {
   812  		saveSchemaVersion(sqlStore, Version5210)
   813  	}
   814  }
   815  
   816  func upgradeDatabaseToVersion522(sqlStore *SqlStore) {
   817  	if shouldPerformUpgrade(sqlStore, Version5210, Version5220) {
   818  		sqlStore.CreateIndexIfNotExists("idx_teams_scheme_id", "Teams", "SchemeId")
   819  		sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId")
   820  		sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId")
   821  		sqlStore.CreateIndexIfNotExists("idx_schemes_channel_guest_role", "Schemes", "DefaultChannelGuestRole")
   822  		sqlStore.CreateIndexIfNotExists("idx_schemes_channel_user_role", "Schemes", "DefaultChannelUserRole")
   823  		sqlStore.CreateIndexIfNotExists("idx_schemes_channel_admin_role", "Schemes", "DefaultChannelAdminRole")
   824  
   825  		saveSchemaVersion(sqlStore, Version5220)
   826  	}
   827  }
   828  
   829  func upgradeDatabaseToVersion523(sqlStore *SqlStore) {
   830  	if shouldPerformUpgrade(sqlStore, Version5220, Version5230) {
   831  		saveSchemaVersion(sqlStore, Version5230)
   832  	}
   833  }
   834  
   835  func upgradeDatabaseToVersion524(sqlStore *SqlStore) {
   836  	if shouldPerformUpgrade(sqlStore, Version5230, Version5240) {
   837  		sqlStore.CreateColumnIfNotExists("UserGroups", "AllowReference", "boolean", "boolean", "0")
   838  		sqlStore.GetMaster().Exec("UPDATE UserGroups SET Name = null, AllowReference = false")
   839  		sqlStore.AlterPrimaryKey("Reactions", []string{"PostId", "UserId", "EmojiName"})
   840  
   841  		saveSchemaVersion(sqlStore, Version5240)
   842  	}
   843  }
   844  
   845  func upgradeDatabaseToVersion525(sqlStore *SqlStore) {
   846  	if shouldPerformUpgrade(sqlStore, Version5240, Version5250) {
   847  		saveSchemaVersion(sqlStore, Version5250)
   848  	}
   849  }
   850  
   851  func upgradeDatabaseToVersion526(sqlStore *SqlStore) {
   852  	if shouldPerformUpgrade(sqlStore, Version5250, Version5260) {
   853  		sqlStore.CreateColumnIfNotExists("Sessions", "ExpiredNotify", "boolean", "boolean", "0")
   854  
   855  		saveSchemaVersion(sqlStore, Version5260)
   856  	}
   857  }
   858  
   859  func upgradeDatabaseToVersion527(sqlStore *SqlStore) {
   860  	if shouldPerformUpgrade(sqlStore, Version5260, Version5270) {
   861  		saveSchemaVersion(sqlStore, Version5270)
   862  	}
   863  }
   864  
   865  func upgradeDatabaseToVersion528(sqlStore *SqlStore) {
   866  	if shouldPerformUpgrade(sqlStore, Version5270, Version5280) {
   867  		if err := precheckMigrationToVersion528(sqlStore); err != nil {
   868  			mlog.Critical("Error upgrading DB schema to 5.28.0", mlog.Err(err))
   869  			os.Exit(ExitGenericFailure)
   870  		}
   871  
   872  		sqlStore.CreateColumnIfNotExistsNoDefault("Commands", "PluginId", "VARCHAR(190)", "VARCHAR(190)")
   873  		sqlStore.GetMaster().Exec("UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL")
   874  
   875  		sqlStore.AlterColumnTypeIfExists("Teams", "Type", "VARCHAR(255)", "VARCHAR(255)")
   876  		sqlStore.AlterColumnTypeIfExists("Teams", "SchemeId", "VARCHAR(26)", "VARCHAR(26)")
   877  		sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Username", "varchar(255)", "varchar(255)")
   878  		sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "IconURL", "text", "varchar(1024)")
   879  
   880  		saveSchemaVersion(sqlStore, Version5280)
   881  	}
   882  }
   883  
   884  func upgradeDatabaseToVersion5281(sqlStore *SqlStore) {
   885  	if shouldPerformUpgrade(sqlStore, Version5280, Version5281) {
   886  		sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "MiniPreview", "MEDIUMBLOB", "bytea")
   887  
   888  		saveSchemaVersion(sqlStore, Version5281)
   889  	}
   890  }
   891  
   892  func precheckMigrationToVersion528(sqlStore *SqlStore) error {
   893  	teamsQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE
   894  				WHEN CHAR_LENGTH(SchemeId) > 26 THEN 1
   895  				ELSE 0
   896  			END),0) as schemeidwrong,
   897  			COALESCE(SUM(CASE
   898  				WHEN CHAR_LENGTH(Type) > 255 THEN 1
   899  				ELSE 0
   900  			END),0) as typewrong`).
   901  		From("Teams").ToSql()
   902  	if err != nil {
   903  		return err
   904  	}
   905  	webhooksQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE
   906  				WHEN CHAR_LENGTH(Username) > 255 THEN 1
   907  				ELSE 0
   908  			END),0) as usernamewrong,
   909  			COALESCE(SUM(CASE
   910  				WHEN CHAR_LENGTH(IconURL) > 1024 THEN 1
   911  				ELSE 0
   912  			END),0) as iconurlwrong`).
   913  		From("IncomingWebhooks").ToSql()
   914  	if err != nil {
   915  		return err
   916  	}
   917  
   918  	var schemeIDWrong, typeWrong int
   919  	row := sqlStore.GetMaster().Db.QueryRow(teamsQuery)
   920  	if err = row.Scan(&schemeIDWrong, &typeWrong); err != nil && err != sql.ErrNoRows {
   921  		return err
   922  	} else if err == nil && schemeIDWrong > 0 {
   923  		return errors.New("Migration failure: " +
   924  			"Teams column SchemeId has data larger that 26 characters")
   925  	} else if err == nil && typeWrong > 0 {
   926  		return errors.New("Migration failure: " +
   927  			"Teams column Type has data larger that 255 characters")
   928  	}
   929  
   930  	var usernameWrong, iconURLWrong int
   931  	row = sqlStore.GetMaster().Db.QueryRow(webhooksQuery)
   932  	if err = row.Scan(&usernameWrong, &iconURLWrong); err != nil && err != sql.ErrNoRows {
   933  		mlog.Error("Error fetching IncomingWebhooks columns data", mlog.Err(err))
   934  	} else if err == nil && usernameWrong > 0 {
   935  		return errors.New("Migration failure: " +
   936  			"IncomingWebhooks column Username has data larger that 255 characters")
   937  	} else if err == nil && iconURLWrong > 0 {
   938  		return errors.New("Migration failure: " +
   939  			"IncomingWebhooks column IconURL has data larger that 1024 characters")
   940  	}
   941  
   942  	return nil
   943  }
   944  
   945  func upgradeDatabaseToVersion529(sqlStore *SqlStore) {
   946  	if hasMissingMigrationsVersion529(sqlStore) {
   947  		mlog.Info("Applying migrations for version 5.29")
   948  		sqlStore.AlterColumnTypeIfExists("SidebarCategories", "Id", "VARCHAR(128)", "VARCHAR(128)")
   949  		sqlStore.AlterColumnDefaultIfExists("SidebarCategories", "Id", model.NewString(""), nil)
   950  		sqlStore.AlterColumnTypeIfExists("SidebarChannels", "CategoryId", "VARCHAR(128)", "VARCHAR(128)")
   951  		sqlStore.AlterColumnDefaultIfExists("SidebarChannels", "CategoryId", model.NewString(""), nil)
   952  
   953  		sqlStore.CreateColumnIfNotExistsNoDefault("Threads", "ChannelId", "VARCHAR(26)", "VARCHAR(26)")
   954  
   955  		updateThreadChannelsQuery := "UPDATE Threads INNER JOIN Posts ON Posts.Id=Threads.PostId SET Threads.ChannelId=Posts.ChannelId WHERE Threads.ChannelId IS NULL"
   956  		if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES {
   957  			updateThreadChannelsQuery = "UPDATE Threads SET ChannelId=Posts.ChannelId FROM Posts WHERE Posts.Id=Threads.PostId AND Threads.ChannelId IS NULL"
   958  		}
   959  		if _, err := sqlStore.GetMaster().Exec(updateThreadChannelsQuery); err != nil {
   960  			mlog.Error("Error updating ChannelId in Threads table", mlog.Err(err))
   961  		}
   962  	}
   963  
   964  	if shouldPerformUpgrade(sqlStore, Version5281, Version5290) {
   965  		saveSchemaVersion(sqlStore, Version5290)
   966  	}
   967  }
   968  
   969  func hasMissingMigrationsVersion529(sqlStore *SqlStore) bool {
   970  	scIdInfo, err := sqlStore.GetColumnInfo("SidebarCategories", "Id")
   971  	if err != nil {
   972  		mlog.Error("Error getting column info for migration check",
   973  			mlog.String("table", "SidebarCategories"),
   974  			mlog.String("column", "Id"),
   975  			mlog.Err(err),
   976  		)
   977  		return true
   978  	}
   979  	if !sqlStore.IsVarchar(scIdInfo.DataType) || scIdInfo.CharMaximumLength != 128 {
   980  		return true
   981  	}
   982  	scCategoryIdInfo, err := sqlStore.GetColumnInfo("SidebarChannels", "CategoryId")
   983  	if err != nil {
   984  		mlog.Error("Error getting column info for migration check",
   985  			mlog.String("table", "SidebarChannels"),
   986  			mlog.String("column", "CategoryId"),
   987  			mlog.Err(err),
   988  		)
   989  		return true
   990  	}
   991  	if !sqlStore.IsVarchar(scCategoryIdInfo.DataType) || scCategoryIdInfo.CharMaximumLength != 128 {
   992  		return true
   993  	}
   994  	if !sqlStore.DoesColumnExist("Threads", "ChannelId") {
   995  		return true
   996  	}
   997  	return false
   998  }
   999  
  1000  func upgradeDatabaseToVersion5291(sqlStore *SqlStore) {
  1001  	if shouldPerformUpgrade(sqlStore, Version5290, Version5291) {
  1002  		saveSchemaVersion(sqlStore, Version5291)
  1003  	}
  1004  }
  1005  
  1006  func upgradeDatabaseToVersion530(sqlStore *SqlStore) {
  1007  	if hasMissingMigrationsVersion530(sqlStore) {
  1008  		mlog.Info("Applying migrations for version 5.30")
  1009  		sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "Content", "longtext", "text")
  1010  		sqlStore.CreateColumnIfNotExists("SidebarCategories", "Muted", "tinyint(1)", "boolean", "0")
  1011  	}
  1012  	if shouldPerformUpgrade(sqlStore, Version5291, Version5300) {
  1013  		saveSchemaVersion(sqlStore, Version5300)
  1014  	}
  1015  }
  1016  
  1017  func hasMissingMigrationsVersion530(sqlStore *SqlStore) bool {
  1018  	if !sqlStore.DoesColumnExist("FileInfo", "Content") {
  1019  		return true
  1020  	}
  1021  	if !sqlStore.DoesColumnExist("SidebarCategories", "Muted") {
  1022  		return true
  1023  	}
  1024  	return false
  1025  }
  1026  
  1027  func upgradeDatabaseToVersion531(sqlStore *SqlStore) {
  1028  	if shouldPerformUpgrade(sqlStore, Version5300, Version5310) {
  1029  		saveSchemaVersion(sqlStore, Version5310)
  1030  	}
  1031  }
  1032  
  1033  func upgradeDatabaseToVersion532(sqlStore *SqlStore) {
  1034  	if hasMissingMigrationsVersion532(sqlStore) {
  1035  		sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "Shared", "tinyint(1)", "boolean")
  1036  		sqlStore.CreateColumnIfNotExists("ThreadMemberships", "UnreadMentions", "bigint", "bigint", "0")
  1037  		sqlStore.CreateColumnIfNotExistsNoDefault("Reactions", "UpdateAt", "bigint", "bigint")
  1038  		sqlStore.CreateColumnIfNotExistsNoDefault("Reactions", "DeleteAt", "bigint", "bigint")
  1039  	}
  1040  
  1041  	if shouldPerformUpgrade(sqlStore, Version5310, Version5320) {
  1042  		saveSchemaVersion(sqlStore, Version5320)
  1043  	}
  1044  }
  1045  
  1046  func hasMissingMigrationsVersion532(sqlStore *SqlStore) bool {
  1047  	scIdInfo, err := sqlStore.GetColumnInfo("Posts", "FileIds")
  1048  	if err != nil {
  1049  		mlog.Error("Error getting column info for migration check",
  1050  			mlog.String("table", "Posts"),
  1051  			mlog.String("column", "FileIds"),
  1052  			mlog.Err(err),
  1053  		)
  1054  		return true
  1055  	}
  1056  
  1057  	if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES {
  1058  		if !sqlStore.IsVarchar(scIdInfo.DataType) || scIdInfo.CharMaximumLength != 300 {
  1059  			return true
  1060  		}
  1061  	} else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL {
  1062  		if scIdInfo.DataType != "text" {
  1063  			return true
  1064  		}
  1065  	}
  1066  
  1067  	if !sqlStore.DoesColumnExist("Channels", "Shared") {
  1068  		return true
  1069  	}
  1070  
  1071  	if !sqlStore.DoesColumnExist("ThreadMemberships", "UnreadMentions") {
  1072  		return true
  1073  	}
  1074  
  1075  	if !sqlStore.DoesColumnExist("Reactions", "UpdateAt") {
  1076  		return true
  1077  	}
  1078  
  1079  	if !sqlStore.DoesColumnExist("Reactions", "DeleteAt") {
  1080  		return true
  1081  	}
  1082  
  1083  	return false
  1084  }
  1085  
  1086  func upgradeDatabaseToVersion533(sqlStore *SqlStore) {
  1087  	if shouldPerformUpgrade(sqlStore, Version5320, Version5330) {
  1088  		saveSchemaVersion(sqlStore, Version5330)
  1089  	}
  1090  }