MDEV-28366 GLOBAL debug_dbug setting affected by collation_connection=utf16...
When the system variables @@debug_dbug was assigned to some expression, Sys_debug_dbug::do_check() did not properly convert the value from the expression character set to utf8. So the value was erroneously re-interpretted as utf8 without conversion. In case of a tricky expression character set (e.g. utf16le), this led to unexpected results. Fix: Re-using Sys_var_charptr::do_string_check() in Sys_debug_dbug::do_check().
This commit is contained in:
parent
952ab9a596
commit
9fb8881ef8
31
mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result
Normal file
31
mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#
|
||||||
|
# Start of 10.5 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28366 GLOBAL debug_dbug setting affected by collation_connection=utf16...
|
||||||
|
#
|
||||||
|
SET NAMES utf8;
|
||||||
|
SET collation_connection=utf16le_general_ci;
|
||||||
|
SET debug_dbug='d,any_random_string';
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
@@debug_dbug
|
||||||
|
d,any_random_string
|
||||||
|
SET debug_dbug=CONCAT('d,', _latin1 0xDF);
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
@@debug_dbug
|
||||||
|
d,ß
|
||||||
|
SELECT HEX(@@debug_dbug);
|
||||||
|
HEX(@@debug_dbug)
|
||||||
|
642CC39F
|
||||||
|
SET @@debug_dbug=NULL;
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
@@debug_dbug
|
||||||
|
|
||||||
|
SET @@debug_dbug=DEFAULT;
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
@@debug_dbug
|
||||||
|
|
||||||
|
SET NAMES latin1;
|
||||||
|
#
|
||||||
|
# End of 10.5 tests
|
||||||
|
#
|
29
mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test
Normal file
29
mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_utf16.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.5 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28366 GLOBAL debug_dbug setting affected by collation_connection=utf16...
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8;
|
||||||
|
SET collation_connection=utf16le_general_ci;
|
||||||
|
SET debug_dbug='d,any_random_string';
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
SET debug_dbug=CONCAT('d,', _latin1 0xDF);
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
SELECT HEX(@@debug_dbug);
|
||||||
|
|
||||||
|
SET @@debug_dbug=NULL;
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
|
||||||
|
SET @@debug_dbug=DEFAULT;
|
||||||
|
SELECT @@debug_dbug;
|
||||||
|
SET NAMES latin1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.5 tests
|
||||||
|
--echo #
|
@ -947,21 +947,10 @@ public:
|
|||||||
{ option.var_type|= GET_STR; }
|
{ option.var_type|= GET_STR; }
|
||||||
bool do_check(THD *thd, set_var *var)
|
bool do_check(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
char buff[STRING_BUFFER_USUAL_SIZE];
|
bool rc= Sys_var_charptr::do_string_check(thd, var, charset(thd));
|
||||||
String str(buff, sizeof(buff), system_charset_info), *res;
|
if (var->save_result.string_value.str == nullptr)
|
||||||
|
|
||||||
if (!(res=var->value->val_str(&str)))
|
|
||||||
{
|
|
||||||
var->save_result.string_value.str= const_cast<char*>("");
|
var->save_result.string_value.str= const_cast<char*>("");
|
||||||
var->save_result.string_value.length= 0;
|
return rc;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t len= res->length();
|
|
||||||
var->save_result.string_value.str= thd->strmake(res->ptr(), len);
|
|
||||||
var->save_result.string_value.length= len;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
bool session_update(THD *thd, set_var *var)
|
bool session_update(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user