Hi Sergei,

Sorry for duplicate message - I forgot to cc the list...

Thanks for the comments, please see below my reply and the JIRA ticket
for the updated commits.
On Fri 2023-09-08 20:48:43 +0200, Sergei Golubchik wrote:

> Hi, Yuchen,

> [... 19 lines elided]

>> diff --git a/sql/sql_class.cc b/sql/sql_class.cc
>> index 18e796655bd..52fa6c27112 100644
>> --- a/sql/sql_class.cc
>> +++ b/sql/sql_class.cc
>> @@ -1233,10 +1233,12 @@ void THD::init()
>>      avoid temporary tables replication failure.
>>    */
>>    variables.pseudo_thread_id= thread_id;
>> -  variables.default_master_connection.str= default_master_connection_buff;
>> -  ::strmake(default_master_connection_buff,
>> -            global_system_variables.default_master_connection.str,
>> -            variables.default_master_connection.length);
>> +  variables.default_master_connection.str=
>> +    my_strndup(PSI_INSTRUMENT_ME,

> may be key_memory_Sys_var_charptr_value instead of PSI_INSTRUMENT_ME?

Done. What is the difference btw?

> [... 6 lines elided]

>>    user_time.val= start_time= start_time_sec_part= 0;
>> diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
>> index d39589ed1ab..4724e2200e6 100644
>> --- a/sql/sql_plugin.cc
>> +++ b/sql/sql_plugin.cc
>> @@ -3279,6 +3279,9 @@ void plugin_thdvar_init(THD *thd)
>>  #ifndef EMBEDDED_LIBRARY
>>    thd->session_tracker.sysvars.deinit(thd);
>>  #endif
>> +  my_free((char*) thd->variables.default_master_connection.str);
>> +  thd->variables.default_master_connection.str= 0;
>> +  thd->variables.default_master_connection.length= 0;

> shouldn't this go inside cleanup_variables() ?

I don't think so. AFAICT cleanup_variables() is meant to clean up actual
plugin variables, and apart from plugin_thdvar_init() is also called in
plugin_thdvar_init() and plugin_shutdown(), but
default_master_connection is not a plugin variable. Ideally it should
not be in plugin_thdvar_init() either, but instead there should be a say
session_cleanup() method in the sys_var interface called at ~THD
destructor. In the absense of this method plugin_thdvar_init() seems to
be the best place, which is also where session_track_system_variables is
cleaned up.

> [... 10 lines elided]

>> -static Sys_var_session_lexstring Sys_default_master_connection(
>> +static Sys_var_lexstring Sys_default_master_connection(
>>         "default_master_connection",
>>         "Master connection to use for all slave variables and slave 
>> commands",
>> -       SESSION_ONLY(default_master_connection),
>> -       NO_CMD_LINE,
>> -       DEFAULT(""), MAX_CONNECTION_NAME, ON_CHECK(check_master_connection));
>> +       SESSION_ONLY(default_master_connection), NO_CMD_LINE, DEFAULT(""),
>> +       NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_master_connection));

> some length limit would still be nice, I'd say.
> Doesn't have to be per variable, may be all Sys_var_lexstring
> could have some common limit, like, arbitrarily, 1K or 10K.

Done. Also added a test. How about Sys_var_charptr?

>>  #endif

>>  static Sys_var_charptr_fscs Sys_init_file(
>> diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl
>> index 31ebbae01ca..0f2a07d92fc 100644
>> --- a/sql/sys_vars.inl
>> +++ b/sql/sys_vars.inl
>> @@ -576,6 +571,21 @@ class Sys_var_charptr_base: public sys_var
>>        new_val= 0;
>>      return new_val;
>>    }
>> +  char *session_update_prepare(set_var *var)

> do you need this session_update_prepare method?

> global_update_prepare() and global_update_finish() are
> used by Sys_var_sesvartrack. Getting rid of them is a task
> for another day :)

Well I do need to call my_memdup() to allocate space for the string. And
it would be good to reuse existing routines that does the same thing,
which is why I reuse existing code from in update_prepare() (formerly
global_update_prepare()).


> [... 39 lines elided]
>> -class Sys_var_charptr: public Sys_var_charptr_base
>> -{

> [... 12 lines elided]
>> +  void session_save_default(THD *, set_var *var) override
>>    {
>> -    SYSVAR_ASSERT(scope() == GLOBAL);
>> -    SYSVAR_ASSERT(size == sizeof(char *));
>> +    return save_default(var);

> no, session's default value is global's value. See any other Sys_var_xxx
> class, e.g. for Sys_var_mybool:

>  void session_save_default(THD *thd, set_var *var)
>  { var->save_result.ulonglong_value= (ulonglong)*(my_bool
> *)global_value_ptr(thd, 0); }

> You cannot have a test for that now, but let's have one in the
> redirect_url commit.

Done.


> [... 18 lines elided]
>> new file mode 100644
>> index 00000000000..d20c2ad2f19
>> --- /dev/null
>> +++ b/mysql-test/suite/sys_vars/r/mdev_15935.result
>> @@ -0,0 +1,12 @@
>> +#
>> +# test that the global/session-only enforcement is still in place
>> despite the merge of string sys_var classes
>> +#
>> +set session init_connect="whatever";
>> +ERROR HY000: Variable 'init_connect' is a GLOBAL variable and
>> should be set with SET GLOBAL
>> +set session wsrep_auto_increment_control="whatever";
>> +ERROR HY000: Variable 'wsrep_auto_increment_control' is a GLOBAL
>> variable and should be set with SET GLOBAL
>> +set global default_master_connection="whatever";
>> +ERROR HY000: Variable 'default_master_connection' is a SESSION
>> variable and can't be used with SET GLOBAL

> not sure you need that, it's checked in the very base class, you
> could've have affected that

> I'd say it's enough if existing tests for Sys_var_session_lexstring
> and Sys_var_sesvartrack variables succeed and ASAN/MSAN are happy

Done. Removed these tests.

> [... 8 lines elided]

Best,
Yuchen
_______________________________________________
developers mailing list -- developers@lists.mariadb.org
To unsubscribe send an email to developers-le...@lists.mariadb.org

Reply via email to