Bug #105966 Contribution by Tencent:missing session track info when set names with collation
Submitted: 23 Dec 2021 3:41 Modified: 13 Jan 2022 7:33
Reporter: yuxiang jiang (OCA) Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Charsets Severity:S4 (Feature request)
Version:all OS:Any
Assigned to: CPU Architecture:Any
Tags: collation, Contribution, session track

[23 Dec 2021 3:41] yuxiang jiang
Description:
After execute 'set names' statement with collation, session track do not return the newly specified collation. 

From code below we know that character_set_connection and collation_connection use the same CHARSET_INFO variables.

---
static Sys_var_struct Sys_character_set_connection(
       "character_set_connection", "The character set used for "
       "literals that do not have a character set introducer and for "
       "number-to-string conversion",
       SESSION_VAR(collation_connection), NO_CMD_LINE,
       offsetof(CHARSET_INFO, csname), DEFAULT(&default_charset_info),
       NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(check_charset_not_null),
       ON_UPDATE(fix_thd_charset));

static Sys_var_struct Sys_collation_connection(
       "collation_connection", "The collation of the connection "
       "character set",
       SESSION_VAR(collation_connection), NO_CMD_LINE,
       offsetof(CHARSET_INFO, name), DEFAULT(&default_charset_info),
       NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(check_collation_not_null),
       ON_UPDATE(fix_thd_charset));
---

But as we show variables like collation_connection and character_set_connection, they have different value returned. So when execute set names with collation, although  we know charset changed, but the detailed collation info is missing.

How to repeat:
set session_track_system_variables='time_zone,autocommit,character_set_client,character_set_results,character_set_connection,collation_connection';

set names 'utf8mb4' collate 'utf8mb4_unicode_ci';

then check session tracker return

Suggested fix:
Add collation_connection when set names.

diff --git a/sql/set_var.cc b/sql/set_var.cc
index 35fb210..5c7fcf7 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -1174,6 +1174,9 @@ int set_var_collation_client::update(THD *thd)
     LEX_CSTRING cs_connection= {"character_set_connection",
                                 sizeof("character_set_connection") - 1};
     thd->session_tracker.get_tracker(SESSION_SYSVARS_TRACKER)->mark_as_changed(thd, &cs_c
+    LEX_CSTRING cs_collation= {"collation_connection",
+                               sizeof("collation_connection") - 1};
+    thd->session_tracker.get_tracker(SESSION_SYSVARS_TRACKER)->mark_as_changed(thd, &cs_c
   }
   if (thd->session_tracker.get_tracker(SESSION_STATE_CHANGE_TRACKER)->is_enabled())
     thd->session_tracker.get_tracker(SESSION_STATE_CHANGE_TRACKER)->mark_as_changed(thd,
[23 Dec 2021 3:47] yuxiang jiang
set names with more info added

(*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.

Contribution: 0001-feature-Return-more-infomation-when-set-names.patch (application/octet-stream, text), 2.46 KiB.

[23 Dec 2021 5:08] MySQL Verification Team
Hello yuxiang jiang,

Thank you for the report and contribution.

regards,
Umesh
[13 Jan 2022 7:33] yuxiang jiang
Contribution by Tencent
[26 Jan 2022 8:40] Frederic Descamps
This contribution has been processed by our development team and has been accepted.

It will be included into a future release.

Thank you again.