Description:
Changing default encryption for a schema will reset default collation.
How to repeat:
mysql> create schema s default character set ascii;
mysql> show create schema s;
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------------------------+
| s | CREATE DATABASE `s` /*!40100 DEFAULT CHARACTER SET ascii */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------+
mysql> alter schema s default encryption = 'y';
mysql> show create schema s;
+----------+-----------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------------------------------------------------------------------+
| s | CREATE DATABASE `s` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */ |
+----------+-----------------------------------------------------------------------------------------------------------------------------+
Suggested fix:
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 582fc081eb1..39499760e6f 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -436,8 +436,6 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) {
if (lock_schema_name(thd, db)) return true;
- set_db_default_charset(thd, create_info);
-
dd::cache::Dictionary_client::Auto_releaser releaser(thd->dd_client());
dd::Schema *schema = nullptr;
if (thd->dd_client()->acquire_for_modification(db, &schema)) return true;
@@ -447,8 +445,12 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) {
return true;
}
- // Set new collation ID.
- schema->set_default_collation_id(create_info->default_table_charset->number);
+ // Set new collation ID if submitted in the statement.
+ if (create_info->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) {
+ set_db_default_charset(thd, create_info);
+ schema->set_default_collation_id(
+ create_info->default_table_charset->number);
+ }
Description: Changing default encryption for a schema will reset default collation. How to repeat: mysql> create schema s default character set ascii; mysql> show create schema s; +----------+------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------------------------------------+ | s | CREATE DATABASE `s` /*!40100 DEFAULT CHARACTER SET ascii */ /*!80016 DEFAULT ENCRYPTION='N' */ | +----------+------------------------------------------------------------------------------------------------+ mysql> alter schema s default encryption = 'y'; mysql> show create schema s; +----------+-----------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------------------------------------------------------------------+ | s | CREATE DATABASE `s` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */ | +----------+-----------------------------------------------------------------------------------------------------------------------------+ Suggested fix: diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 582fc081eb1..39499760e6f 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -436,8 +436,6 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) { if (lock_schema_name(thd, db)) return true; - set_db_default_charset(thd, create_info); - dd::cache::Dictionary_client::Auto_releaser releaser(thd->dd_client()); dd::Schema *schema = nullptr; if (thd->dd_client()->acquire_for_modification(db, &schema)) return true; @@ -447,8 +445,12 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) { return true; } - // Set new collation ID. - schema->set_default_collation_id(create_info->default_table_charset->number); + // Set new collation ID if submitted in the statement. + if (create_info->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) { + set_db_default_charset(thd, create_info); + schema->set_default_collation_id( + create_info->default_table_charset->number); + }