Add DB enums (#20601)
* Add DB enums
```release-note
Upgrade note:
Several schema changes are made which imposes additional
DB constraints to make the data more strict.
Here are the times taken:
Postgres (131869 channels, 2 teams):
[bigdb] # CREATE TYPE channel_type AS ENUM ('P', 'G', 'O', 'D');
CREATE TYPE
Time: 14.114 ms
[bigdb] # ALTER TABLE channels alter column type type channel_type using type::channel_type;
ALTER TABLE
Time: 3856.790 ms (00:03.857)
[bigdb] # CREATE TYPE team_type AS ENUM ('I', 'O');
CREATE TYPE
Time: 4.191 ms
[bigdb] # ALTER TABLE teams alter column type type team_type using type::team_type;
ALTER TABLE
Time: 116.205 ms
[bigdb] # CREATE TYPE upload_session_type AS ENUM ('attachment', 'import');
CREATE TYPE
Time: 4.266 ms
[bigdb] # ALTER TABLE uploadsessions alter column type type upload_session_type using type::upload_session_type;
ALTER TABLE
Time: 37.099 ms
MySQL (270959 channels, 2 teams):
mysql> ALTER TABLE Channels MODIFY COLUMN Type ENUM("D", "O", "G", "P");
Query OK, 270959 rows affected (13.24 sec)
Records: 270959 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE Teams MODIFY COLUMN Type ENUM("I", "O");
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE UploadSessions MODIFY COLUMN Type ENUM("attachment", "import");
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
All the commands were tested on a 8 core, 16GB RAM machine.
```
https://mattermost.atlassian.net/browse/MM-45508
```release-note
NONE
```
* Added migration list
```release-note
NONE
```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
7ee7523729
Коммит
474dbe46dd
@@ -178,6 +178,8 @@ db/migrations/mysql/000088_remaining_migrations.down.sql
|
|||||||
db/migrations/mysql/000088_remaining_migrations.up.sql
|
db/migrations/mysql/000088_remaining_migrations.up.sql
|
||||||
db/migrations/mysql/000089_add-channelid-to-reaction.down.sql
|
db/migrations/mysql/000089_add-channelid-to-reaction.down.sql
|
||||||
db/migrations/mysql/000089_add-channelid-to-reaction.up.sql
|
db/migrations/mysql/000089_add-channelid-to-reaction.up.sql
|
||||||
|
db/migrations/mysql/000090_create_enums.down.sql
|
||||||
|
db/migrations/mysql/000090_create_enums.up.sql
|
||||||
db/migrations/postgres/000001_create_teams.down.sql
|
db/migrations/postgres/000001_create_teams.down.sql
|
||||||
db/migrations/postgres/000001_create_teams.up.sql
|
db/migrations/postgres/000001_create_teams.up.sql
|
||||||
db/migrations/postgres/000002_create_team_members.down.sql
|
db/migrations/postgres/000002_create_team_members.down.sql
|
||||||
@@ -356,3 +358,5 @@ db/migrations/postgres/000088_remaining_migrations.down.sql
|
|||||||
db/migrations/postgres/000088_remaining_migrations.up.sql
|
db/migrations/postgres/000088_remaining_migrations.up.sql
|
||||||
db/migrations/postgres/000089_add-channelid-to-reaction.down.sql
|
db/migrations/postgres/000089_add-channelid-to-reaction.down.sql
|
||||||
db/migrations/postgres/000089_add-channelid-to-reaction.up.sql
|
db/migrations/postgres/000089_add-channelid-to-reaction.up.sql
|
||||||
|
db/migrations/postgres/000090_create_enums.down.sql
|
||||||
|
db/migrations/postgres/000090_create_enums.up.sql
|
||||||
|
|||||||
47
db/migrations/mysql/000090_create_enums.down.sql
Обычный файл
47
db/migrations/mysql/000090_create_enums.down.sql
Обычный файл
@@ -0,0 +1,47 @@
|
|||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Channels'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'varchar(1)'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE Channels MODIFY COLUMN Type varchar(1);',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
|
|
||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Teams'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'varchar(255)'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE Teams MODIFY COLUMN Type varchar(255);',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
|
|
||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'UploadSessions'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'varchar(32)'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE UploadSessions MODIFY COLUMN Type varchar(32);',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
47
db/migrations/mysql/000090_create_enums.up.sql
Обычный файл
47
db/migrations/mysql/000090_create_enums.up.sql
Обычный файл
@@ -0,0 +1,47 @@
|
|||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Channels'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'ENUM("D", "O", "G", "P")'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE Channels MODIFY COLUMN Type ENUM("D", "O", "G", "P");',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
|
|
||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Teams'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'ENUM("I", "O")'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE Teams MODIFY COLUMN Type ENUM("I", "O");',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
|
|
||||||
|
SET @preparedStatement = (SELECT IF(
|
||||||
|
(
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'UploadSessions'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'Type'
|
||||||
|
AND column_type != 'ENUM("attachment", "import")'
|
||||||
|
) > 0,
|
||||||
|
'ALTER TABLE UploadSessions MODIFY COLUMN Type ENUM("attachment", "import");',
|
||||||
|
'SELECT 1'
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE alterIfExists FROM @preparedStatement;
|
||||||
|
EXECUTE alterIfExists;
|
||||||
|
DEALLOCATE PREPARE alterIfExists;
|
||||||
44
db/migrations/postgres/000090_create_enums.down.sql
Обычный файл
44
db/migrations/postgres/000090_create_enums.down.sql
Обычный файл
@@ -0,0 +1,44 @@
|
|||||||
|
ALTER TABLE channels alter column type type varchar(1);
|
||||||
|
|
||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'channel_type') THEN
|
||||||
|
DROP TYPE channel_type;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
ALTER TABLE teams alter column type type varchar(255);
|
||||||
|
|
||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'team_type') THEN
|
||||||
|
DROP TYPE team_type;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
ALTER TABLE uploadsessions alter column type type varchar(32);
|
||||||
|
|
||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'upload_session_type') THEN
|
||||||
|
DROP TYPE upload_session_type;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
44
db/migrations/postgres/000090_create_enums.up.sql
Обычный файл
44
db/migrations/postgres/000090_create_enums.up.sql
Обычный файл
@@ -0,0 +1,44 @@
|
|||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'channel_type') THEN
|
||||||
|
CREATE TYPE channel_type AS ENUM ('P', 'G', 'O', 'D');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
ALTER TABLE channels alter column type type channel_type using type::channel_type;
|
||||||
|
|
||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'team_type') THEN
|
||||||
|
CREATE TYPE team_type AS ENUM ('I', 'O');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
ALTER TABLE teams alter column type type team_type using type::team_type;
|
||||||
|
|
||||||
|
DO
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT * FROM pg_type typ
|
||||||
|
INNER JOIN pg_namespace nsp ON nsp.oid = typ.typnamespace
|
||||||
|
WHERE nsp.nspname = current_schema()
|
||||||
|
AND typ.typname = 'upload_session_type') THEN
|
||||||
|
CREATE TYPE upload_session_type AS ENUM ('attachment', 'import');
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
ALTER TABLE uploadsessions alter column type type upload_session_type using type::upload_session_type;
|
||||||
Ссылка в новой задаче
Block a user