summaryrefslogtreecommitdiff
path: root/sql/sys_vars.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sys_vars.cc')
-rw-r--r--sql/sys_vars.cc22
1 files changed, 18 insertions, 4 deletions
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index b1d2b4919f2..47138046ab4 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -792,12 +792,26 @@ static bool check_charset(sys_var *self, THD *thd, set_var *var)
{
int csno= (int)var->value->val_int();
CHARSET_INFO *cs;
- if (!(var->save_result.ptr= cs= get_charset(csno, MYF(0))) ||
- !(cs->state & MY_CS_PRIMARY))
+ if ((var->save_result.ptr= cs= get_charset(csno, MYF(0))))
{
- my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), llstr(csno, buff));
- return true;
+ /*
+ Backward compatibility: pre MDEV-30824 servers
+ can write non-default collation IDs to binary log:
+ SET character_set_client=83; -- utf8mb3_bin
+ Convert a non-default collation to the compiled default collation,
+ e.g. utf8mb3_bin to utf8mb3_general_ci, but only if
+ - THD is a slave thread or
+ - is processing a mysqlbinlog output.
+ */
+ if ((cs->state & MY_CS_PRIMARY) ||
+ ((thd->variables.pseudo_slave_mode || thd->slave_thread) &&
+ (var->save_result.ptr=
+ Lex_exact_charset_opt_extended_collate(cs, true).
+ find_default_collation())))
+ return false;
}
+ my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), llstr(csno, buff));
+ return true;
}
return false;
}