[MM-40952] migrations: Add if statements for some queries (#19359)

* migrations: add if statements for some queries

* add better checks to upgrade posts v6 migration

* use "is null" instead of "= null"

* fix down script for users v6

* reflect review comments
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2022-01-19 10:57:28 +03:00
коммит произвёл GitHub
родитель 509f49c813
Коммит 56c7da5817
18 изменённых файлов: 287 добавлений и 93 удалений

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@@ -38,4 +38,28 @@ PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists; EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists; DEALLOCATE PREPARE alterIfNotExists;
CREATE PROCEDURE Migrate_If_Version_Below_5280 ()
BEGIN
DECLARE
CURRENT_DB_VERSION TEXT;
DECLARE
SYSTEMS_TABLE_EXISTS INT;
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'Systems'
AND table_schema = DATABASE() INTO SYSTEMS_TABLE_EXISTS;
IF (SYSTEMS_TABLE_EXISTS > 0) THEN
SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('5.28.0')) THEN
UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL; UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL;
END IF;
END IF;
END;
CALL Migrate_If_Version_Below_5280 ();
DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_5280;

Просмотреть файл

@@ -27,20 +27,23 @@ PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists; EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists; DEALLOCATE PREPARE alterIfNotExists;
CREATE PROCEDURE MigrateRoles () CREATE PROCEDURE Migrate_If_Version_Below_500 ()
BEGIN DECLARE BEGIN
SchemaVersion TEXT; DECLARE
SELECT Value FROM Systems WHERE Name = 'Version' INTO SchemaVersion; CURRENT_DB_VERSION TEXT;
IF(SchemaVersion = '4.10.0') THEN SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('5.0.0')) THEN
UPDATE Roles SET SchemeManaged = 0 UPDATE Roles SET SchemeManaged = 0
WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin'); WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin');
END IF; END IF;
END; END;
CALL Migrate_If_Version_Below_500 ();
Call MigrateRoles(); DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_500;
DROP PROCEDURE IF EXISTS MigrateRoles;
SET @preparedStatement = (SELECT IF( SET @preparedStatement = (SELECT IF(
( (

Просмотреть файл

@@ -98,4 +98,19 @@ PREPARE createIndexIfNotExists FROM @preparedStatement;
EXECUTE createIndexIfNotExists; EXECUTE createIndexIfNotExists;
DEALLOCATE PREPARE createIndexIfNotExists; DEALLOCATE PREPARE createIndexIfNotExists;
CREATE PROCEDURE Migrate_If_Version_Below_5120 ()
BEGIN
DECLARE
CURRENT_DB_VERSION TEXT;
SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('5.12.0')) THEN
DELETE FROM Sessions where ExpiresAt > 3000000000000; DELETE FROM Sessions where ExpiresAt > 3000000000000;
END IF;
END;
CALL Migrate_If_Version_Below_5120 ();
DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_5120;

Просмотреть файл

@@ -86,14 +86,19 @@ PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists; EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists; DEALLOCATE PREPARE alterIfNotExists;
CREATE PROCEDURE SharedChannelsSupport () CREATE PROCEDURE Migrate_If_Version_Below_5350 ()
BEGIN DECLARE BEGIN
SchemaVersion TEXT; DECLARE
SELECT Value FROM Systems WHERE Name = 'Version' INTO SchemaVersion; CURRENT_DB_VERSION TEXT;
IF(SchemaVersion = '5.34.0') THEN SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('5.35.0')) THEN
UPDATE UploadSessions SET RemoteId='', ReqFileId='' WHERE RemoteId IS NULL; UPDATE UploadSessions SET RemoteId='', ReqFileId='' WHERE RemoteId IS NULL;
END IF; END IF;
END; END;
CALL Migrate_If_Version_Below_5350 ();
Call SharedChannelsSupport(); DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_5350;
DROP PROCEDURE IF EXISTS SharedChannelsSupport;

Просмотреть файл

@@ -36,7 +36,25 @@ PREPARE createIndexIfNotExists FROM @preparedStatement;
EXECUTE createIndexIfNotExists; EXECUTE createIndexIfNotExists;
DEALLOCATE PREPARE createIndexIfNotExists; DEALLOCATE PREPARE createIndexIfNotExists;
UPDATE Threads CREATE PROCEDURE Migrate_Empty_Threads ()
BEGIN
DECLARE
EMPTY_THREADS_EXIST INT;
SELECT
COUNT(*)
FROM
Threads
WHERE
ChannelId IS NULL INTO EMPTY_THREADS_EXIST;
IF(EMPTY_THREADS_EXIST > 0) THEN
UPDATE
Threads
INNER JOIN Posts ON Posts.Id = Threads.PostId INNER JOIN Posts ON Posts.Id = Threads.PostId
SET Threads.ChannelId=Posts.ChannelId SET
WHERE Threads.ChannelId IS NULL; Threads.ChannelId = Posts.ChannelId
WHERE
Threads.ChannelId IS NULL;
END IF;
END;
CALL Migrate_Empty_Threads ();
DROP PROCEDURE IF EXISTS Migrate_Empty_Threads;

Просмотреть файл

@@ -58,8 +58,23 @@ PREPARE alterIfExists FROM @preparedStatement;
EXECUTE alterIfExists; EXECUTE alterIfExists;
DEALLOCATE PREPARE alterIfExists; DEALLOCATE PREPARE alterIfExists;
CREATE PROCEDURE Migrate_If_Version_Below_350 ()
BEGIN
DECLARE
CURRENT_DB_VERSION TEXT;
SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('3.5.0')) THEN
UPDATE Users SET Roles = 'system_user' WHERE Roles = ''; UPDATE Users SET Roles = 'system_user' WHERE Roles = '';
UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'; UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin';
END IF;
END;
CALL Migrate_If_Version_Below_350 ();
DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_350;
SET @preparedStatement = (SELECT IF( SET @preparedStatement = (SELECT IF(
( (
@@ -106,7 +121,22 @@ PREPARE alterIfExists FROM @preparedStatement;
EXECUTE alterIfExists; EXECUTE alterIfExists;
DEALLOCATE PREPARE alterIfExists; DEALLOCATE PREPARE alterIfExists;
CREATE PROCEDURE Migrate_If_Version_Below_4100 ()
BEGIN
DECLARE
CURRENT_DB_VERSION TEXT;
SELECT
Value
FROM
Systems
WHERE
Name = 'Version' INTO CURRENT_DB_VERSION;
IF(INET_ATON(CURRENT_DB_VERSION) < INET_ATON('4.10.0')) THEN
UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'; UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml';
END IF;
END;
CALL Migrate_If_Version_Below_4100 ();
DROP PROCEDURE IF EXISTS Migrate_If_Version_Below_4100;
SET @preparedStatement = (SELECT IF( SET @preparedStatement = (SELECT IF(
( (

Просмотреть файл

@@ -14,8 +14,8 @@ SET @tmp_count_root := 0;
IF(MentionCountRoot_EXIST = 1) THEN IF(MentionCountRoot_EXIST = 1) THEN
SELECT @tmp_count_root := COUNT(*) SELECT @tmp_count_root := COUNT(*)
FROM ChannelMembers FROM ChannelMembers
WHERE MsgCountRoot = NULL WHERE MsgCountRoot IS NULL
OR MentionCountRoot = NULL; OR MentionCountRoot IS NULL;
END IF; END IF;
SET @preparedStatement = SET @preparedStatement =

Просмотреть файл

@@ -36,9 +36,10 @@ SET @preparedStatement = (SELECT IF(
WHERE table_name = 'Users' WHERE table_name = 'Users'
AND table_schema = DATABASE() AND table_schema = DATABASE()
AND column_name = 'Timezone' AND column_name = 'Timezone'
AND column_default = NULL AND column_type = 'varchar(256)'
AND column_default IS NULL
) > 0, ) > 0,
'ALTER TABLE Users ALTER Timezone SET DEFAULT `{"automaticTimezone":"","manualTimezone":"","useAutomaticTimezone":"true"}`;', 'ALTER TABLE Users ALTER Timezone SET DEFAULT \'{"automaticTimezone":"","manualTimezone":"","useAutomaticTimezone":"true"}\';',
'SELECT 1' 'SELECT 1'
)); ));

Просмотреть файл

@@ -36,7 +36,7 @@ SET @preparedStatement = (SELECT IF(
WHERE table_name = 'Users' WHERE table_name = 'Users'
AND table_schema = DATABASE() AND table_schema = DATABASE()
AND column_name = 'Timezone' AND column_name = 'Timezone'
AND column_default != NULL AND column_default IS NOT NULL
) > 0, ) > 0,
'ALTER TABLE Users ALTER Timezone DROP DEFAULT;', 'ALTER TABLE Users ALTER Timezone DROP DEFAULT;',
'SELECT 1' 'SELECT 1'

Просмотреть файл

@@ -1,15 +1,30 @@
CREATE PROCEDURE MigrateRootId_Posts () BEGIN DECLARE ParentId_EXIST INT; CREATE PROCEDURE MigrateRootId_Posts ()
SELECT COUNT(*) BEGIN
FROM INFORMATION_SCHEMA.COLUMNS DECLARE ParentId_EXIST INT;
DECLARE Alter_FileIds INT;
DECLARE Alter_Props INT;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Posts' WHERE TABLE_NAME = 'Posts'
AND table_schema = DATABASE() AND table_schema = DATABASE()
AND COLUMN_NAME = 'ParentId' INTO ParentId_EXIST; AND COLUMN_NAME = 'ParentId' INTO ParentId_EXIST;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Posts'
AND table_schema = DATABASE()
AND column_name = 'FileIds'
AND column_type != 'text' INTO Alter_FileIds;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Posts'
AND table_schema = DATABASE()
AND column_name = 'Props'
AND column_type != 'JSON' INTO Alter_Props;
IF (Alter_Props OR Alter_FileIds) THEN
IF(ParentId_EXIST > 0) THEN IF(ParentId_EXIST > 0) THEN
UPDATE Posts SET RootId = ParentId WHERE RootId = '' AND RootId != ParentId; UPDATE Posts SET RootId = ParentId WHERE RootId = '' AND RootId != ParentId;
ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON, DROP COLUMN ParentId; ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON, DROP COLUMN ParentId;
ELSE ELSE
ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON; ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;
END IF; END IF;
END IF;
END; END;
CALL MigrateRootId_Posts (); CALL MigrateRootId_Posts ();

Просмотреть файл

@@ -14,18 +14,21 @@ CREATE TABLE IF NOT EXISTS roles (
ALTER TABLE roles ADD COLUMN IF NOT EXISTS builtin boolean; ALTER TABLE roles ADD COLUMN IF NOT EXISTS builtin boolean;
DO $$ DO $$
<< migrate_roles >> << migrate_if_version_below_500 >>
DECLARE
current_db_version VARCHAR(100) := '';
BEGIN BEGIN
IF((
SELECT SELECT
value value INTO current_db_version
FROM systems FROM
systems
WHERE WHERE
Name = 'Version') = '4.10.0') THEN name = 'Version';
IF (string_to_array(current_db_version, '.') < string_to_array('5.0.0', '.')) THEN
UPDATE Roles SET SchemeManaged = false UPDATE Roles SET SchemeManaged = false
WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin'); WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin');
END IF; END IF;
END migrate_roles END migrate_if_version_below_500
$$; $$;
ALTER TABLE roles ALTER COLUMN permissions TYPE TEXT; ALTER TABLE roles ALTER COLUMN permissions TYPE TEXT;

Просмотреть файл

@@ -19,4 +19,19 @@ CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions (expiresat);
CREATE INDEX IF NOT EXISTS idx_sessions_create_at ON sessions (createat); CREATE INDEX IF NOT EXISTS idx_sessions_create_at ON sessions (createat);
CREATE INDEX IF NOT EXISTS idx_sessions_last_activity_at ON sessions (lastactivityat); CREATE INDEX IF NOT EXISTS idx_sessions_last_activity_at ON sessions (lastactivityat);
DO $$
<< migrate_if_version_below_5120 >>
DECLARE
current_db_version VARCHAR(100) := '';
BEGIN
SELECT
value INTO current_db_version
FROM
systems
WHERE
name = 'Version';
IF (string_to_array(current_db_version, '.') < string_to_array('5.12.0', '.')) THEN
DELETE FROM sessions where expiresat > 3000000000000; DELETE FROM sessions where expiresat > 3000000000000;
END IF;
END migrate_if_version_below_5120
$$;

Просмотреть файл

@@ -18,15 +18,18 @@ ALTER TABLE uploadsessions ADD COLUMN IF NOT EXISTS remoteid VARCHAR(26);
ALTER TABLE uploadsessions ADD COLUMN IF NOT EXISTS reqfileid VARCHAR(26); ALTER TABLE uploadsessions ADD COLUMN IF NOT EXISTS reqfileid VARCHAR(26);
DO $$ DO $$
<< shared_channel_support >> << migrate_if_version_below_5350 >>
DECLARE
current_db_version VARCHAR(100) := '';
BEGIN BEGIN
IF((
SELECT SELECT
value value INTO current_db_version
FROM systems FROM
systems
WHERE WHERE
Name = 'Version') = '5.34.0') THEN name = 'Version';
IF (string_to_array(current_db_version, '.') < string_to_array('5.35.0', '.')) THEN
UPDATE UploadSessions SET RemoteId='', ReqFileId='' WHERE RemoteId IS NULL; UPDATE UploadSessions SET RemoteId='', ReqFileId='' WHERE RemoteId IS NULL;
END IF; END IF;
END shared_channel_support END migrate_if_version_below_5350
$$; $$;

Просмотреть файл

@@ -9,8 +9,27 @@ ALTER TABLE threads ADD COLUMN IF NOT EXISTS channelid VARCHAR(26);
CREATE INDEX IF NOT EXISTS idx_threads_channel_id ON threads (channelid); CREATE INDEX IF NOT EXISTS idx_threads_channel_id ON threads (channelid);
UPDATE threads DO $$
SET channelId=posts.channelid << migrate_empty_threads >>
FROM posts DECLARE
WHERE posts.id=threads.postid empty_threads_exist boolean := FALSE;
BEGIN
SELECT
count(*) != 0 INTO empty_threads_exist
FROM
threads
WHERE
channelid IS NULL;
IF empty_threads_exist THEN
UPDATE
threads
SET
channelId = posts.channelid
FROM
posts
WHERE
posts.id = threads.postid
AND threads.channelid IS NULL; AND threads.channelid IS NULL;
END IF;
END migrate_empty_threads
$$;

Просмотреть файл

@@ -29,8 +29,37 @@ ALTER TABLE users DROP COLUMN IF EXISTS lastpingat;
ALTER TABLE users ADD COLUMN IF NOT EXISTS position VARCHAR(128); ALTER TABLE users ADD COLUMN IF NOT EXISTS position VARCHAR(128);
ALTER TABLE users ADD COLUMN IF NOT EXISTS timezone VARCHAR(256) DEFAULT '{"automaticTimezone":"","manualTimezone":"","useAutomaticTimezone":"true"}'; ALTER TABLE users ADD COLUMN IF NOT EXISTS timezone VARCHAR(256) DEFAULT '{"automaticTimezone":"","manualTimezone":"","useAutomaticTimezone":"true"}';
ALTER TABLE users ALTER COLUMN position TYPE VARCHAR(128); ALTER TABLE users ALTER COLUMN position TYPE VARCHAR(128);
DO $$
<< migrate_if_version_below_4100 >>
DECLARE
current_db_version VARCHAR(100) := '';
BEGIN
SELECT
value INTO current_db_version
FROM
systems
WHERE
name = 'Version';
IF (string_to_array(current_db_version, '.') < string_to_array('4.10.0', '.')) THEN
UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'; UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml';
ALTER TABLE users ALTER COLUMN roles TYPE VARCHAR(256); END IF;
END migrate_if_version_below_4100
$$;
DO $$
DECLARE
column_exist boolean := false;
BEGIN
SELECT count(*) != 0 INTO column_exist
FROM information_schema.columns
WHERE table_name = 'users'
AND column_name = 'roles'
AND NOT data_type = 'varchar(256)';
IF column_exist THEN
ALTER TABLE users ALTER COLUMN roles TYPE varchar(256);
END IF;
END $$;
CREATE INDEX IF NOT EXISTS idx_users_update_at ON users (updateat); CREATE INDEX IF NOT EXISTS idx_users_update_at ON users (updateat);
CREATE INDEX IF NOT EXISTS idx_users_create_at ON users (createat); CREATE INDEX IF NOT EXISTS idx_users_create_at ON users (createat);

Просмотреть файл

@@ -18,7 +18,7 @@ SELECT count(*) != 0 INTO msg_count_root_exist
AND column_name = 'mentioncountroot'; AND column_name = 'mentioncountroot';
IF mention_count_root_exist THEN IF mention_count_root_exist THEN
tmp_count_root := (SELECT count(*) FROM channelmembers WHERE msgcountroot = NULL OR mentioncountroot = NULL); tmp_count_root := (SELECT count(*) FROM channelmembers WHERE msgcountroot IS NULL OR mentioncountroot IS NULL);
END IF; END IF;
ALTER TABLE channelmembers ADD COLUMN IF NOT EXISTS mentioncountroot bigint; ALTER TABLE channelmembers ADD COLUMN IF NOT EXISTS mentioncountroot bigint;

Просмотреть файл

@@ -2,17 +2,31 @@ DO $$
<<migrate_root_id>> <<migrate_root_id>>
DECLARE DECLARE
parentid_exist boolean := false; parentid_exist boolean := false;
alter_fileids boolean := false;
alter_props boolean := false;
BEGIN BEGIN
SELECT count(*) != 0 INTO parentid_exist SELECT count(*) != 0 INTO parentid_exist
FROM information_schema.columns FROM information_schema.columns
WHERE table_name = 'posts' WHERE table_name = 'posts'
AND column_name = 'parentid'; AND column_name = 'parentid';
SELECT count(*) != 0 INTO alter_fileids
FROM information_schema.columns
WHERE table_name = 'posts'
AND column_name = 'fileids'
AND data_type = 'character varying'
AND character_maximum_length != 300;
SELECT count(*) != 0 INTO alter_props
FROM information_schema.columns
WHERE table_name = 'posts'
AND column_name = 'props'
AND data_type != 'jsonb';
IF alter_fileids OR alter_props THEN
IF parentid_exist THEN IF parentid_exist THEN
UPDATE posts SET rootid = parentid WHERE rootid = '' AND rootid != parentid; UPDATE posts SET rootid = parentid WHERE rootid = '' AND rootid != parentid;
ALTER TABLE posts ALTER COLUMN fileids TYPE varchar(300), ALTER COLUMN props TYPE jsonb USING props::jsonb, DROP COLUMN ParentId; ALTER TABLE posts ALTER COLUMN fileids TYPE varchar(300), ALTER COLUMN props TYPE jsonb USING props::jsonb, DROP COLUMN ParentId;
ELSE ELSE
ALTER TABLE posts ALTER COLUMN fileids TYPE varchar(300), ALTER COLUMN props TYPE jsonb USING props::jsonb; ALTER TABLE posts ALTER COLUMN fileids TYPE varchar(300), ALTER COLUMN props TYPE jsonb USING props::jsonb;
END IF;
END IF; END IF;
END migrate_root_id $$; END migrate_root_id $$;