From 474dbe46dd4e5cf2eb0ab7e70f479e5549b9a11c Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Tue, 12 Jul 2022 15:11:35 +0530 Subject: [PATCH] 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 ``` --- db/migrations/migrations.list | 4 ++ .../mysql/000090_create_enums.down.sql | 47 +++++++++++++++++++ .../mysql/000090_create_enums.up.sql | 47 +++++++++++++++++++ .../postgres/000090_create_enums.down.sql | 44 +++++++++++++++++ .../postgres/000090_create_enums.up.sql | 44 +++++++++++++++++ 5 files changed, 186 insertions(+) create mode 100644 db/migrations/mysql/000090_create_enums.down.sql create mode 100644 db/migrations/mysql/000090_create_enums.up.sql create mode 100644 db/migrations/postgres/000090_create_enums.down.sql create mode 100644 db/migrations/postgres/000090_create_enums.up.sql diff --git a/db/migrations/migrations.list b/db/migrations/migrations.list index b5b1349f2f..6f8dd5ac80 100644 --- a/db/migrations/migrations.list +++ b/db/migrations/migrations.list @@ -178,6 +178,8 @@ db/migrations/mysql/000088_remaining_migrations.down.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.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.up.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/000089_add-channelid-to-reaction.down.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 diff --git a/db/migrations/mysql/000090_create_enums.down.sql b/db/migrations/mysql/000090_create_enums.down.sql new file mode 100644 index 0000000000..2fa58b3e6e --- /dev/null +++ b/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; \ No newline at end of file diff --git a/db/migrations/mysql/000090_create_enums.up.sql b/db/migrations/mysql/000090_create_enums.up.sql new file mode 100644 index 0000000000..3181aa953c --- /dev/null +++ b/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; \ No newline at end of file diff --git a/db/migrations/postgres/000090_create_enums.down.sql b/db/migrations/postgres/000090_create_enums.down.sql new file mode 100644 index 0000000000..d36e9bc359 --- /dev/null +++ b/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; diff --git a/db/migrations/postgres/000090_create_enums.up.sql b/db/migrations/postgres/000090_create_enums.up.sql new file mode 100644 index 0000000000..4c5af5ebfc --- /dev/null +++ b/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;