From 66f55a018bb3a6cc3e68dd4578f487c18a2fa639 Mon Sep 17 00:00:00 2001 From: Nayuta Yanagisawa Date: Tue, 15 Feb 2022 16:18:55 +0900 Subject: [PATCH] MDEV-27730 Add PLUGIN_VAR_DEPRECATED flag to plugin variables The sys_var class has the deprecation_substitute member to mark the deprecated variables. As it's set, the server produces warnings when these variables are used. However, the plugin has no means to utilize that functionality. So, the PLUGIN_VAR_DEPRECATED flag is introduced to set the deprecation_substitute with the empty string. A non-empty string can make the warning more informative, but there's no nice way seen to specify it, and not that needed at the moment. --- include/mysql/plugin.h | 4 +++- mysql-test/main/plugin.result | 4 ++++ mysql-test/main/plugin.test | 1 + sql/sql_plugin.cc | 10 ++++++---- storage/example/ha_example.cc | 5 +++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index e084b6becec..360f633b7dd 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -229,6 +229,7 @@ typedef int (*mysql_show_var_func)(MYSQL_THD, struct st_mysql_show_var*, void *, #define PLUGIN_VAR_NOCMDARG 0x1000 /* No argument for cmd line */ #define PLUGIN_VAR_RQCMDARG 0x0000 /* Argument required for cmd line */ #define PLUGIN_VAR_OPCMDARG 0x2000 /* Argument optional for cmd line */ +#define PLUGIN_VAR_DEPRECATED 0x4000 /* Server variable is deprecated */ #define PLUGIN_VAR_MEMALLOC 0x8000 /* String needs memory allocated */ struct st_mysql_sys_var; @@ -282,7 +283,8 @@ typedef void (*mysql_var_update_func)(MYSQL_THD thd, #define PLUGIN_VAR_MASK \ (PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \ PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \ - PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC) + PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | \ + PLUGIN_VAR_DEPRECATED | PLUGIN_VAR_MEMALLOC) #define MYSQL_PLUGIN_VAR_HEADER \ int flags; \ diff --git a/mysql-test/main/plugin.result b/mysql-test/main/plugin.result index a4fb475981c..c1e7739be37 100644 --- a/mysql-test/main/plugin.result +++ b/mysql-test/main/plugin.result @@ -40,11 +40,15 @@ a set global example_ulong_var=500; set global example_enum_var= e1; set session example_int_var= -1; +set global example_deprecated_var=1; +Warnings: +Warning 1287 '@@example_deprecated_var' is deprecated and will be removed in a future release show status like 'example%'; Variable_name Value Example_func_example enum_var is 0, ulong_var is 500, int_var is -1, double_var is 8.500000, really show variables like 'example%'; Variable_name Value +example_deprecated_var 0 example_double_thdvar 8.500000 example_double_var 8.500000 example_enum_var e1 diff --git a/mysql-test/main/plugin.test b/mysql-test/main/plugin.test index d2e828b2589..61b5f9b87c6 100644 --- a/mysql-test/main/plugin.test +++ b/mysql-test/main/plugin.test @@ -27,6 +27,7 @@ SELECT * FROM t1; set global example_ulong_var=500; set global example_enum_var= e1; set session example_int_var= -1; +set global example_deprecated_var=1; show status like 'example%'; show variables like 'example%'; diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 33b43bdd85d..cee028b7b05 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -291,7 +291,8 @@ public: struct st_mysql_sys_var *plugin_var; sys_var_pluginvar(sys_var_chain *chain, const char *name_arg, - st_plugin_int *p, st_mysql_sys_var *plugin_var_arg); + st_plugin_int *p, st_mysql_sys_var *plugin_var_arg, + const char *substitute); sys_var_pluginvar *cast_pluginvar() { return this; } uchar* real_value_ptr(THD *thd, enum_var_type type) const; TYPELIB* plugin_var_typelib(void) const; @@ -3338,11 +3339,11 @@ static int pluginvar_sysvar_flags(const st_mysql_sys_var *p) } sys_var_pluginvar::sys_var_pluginvar(sys_var_chain *chain, const char *name_arg, - st_plugin_int *p, st_mysql_sys_var *pv) + st_plugin_int *p, st_mysql_sys_var *pv, const char *substitute) : sys_var(chain, name_arg, pv->comment, pluginvar_sysvar_flags(pv), 0, pv->flags & PLUGIN_VAR_NOCMDOPT ? -1 : 0, NO_ARG, pluginvar_show_type(pv), 0, - NULL, VARIABLE_NOT_IN_BINLOG, NULL, NULL, NULL), + NULL, VARIABLE_NOT_IN_BINLOG, NULL, NULL, substitute), plugin(p), plugin_var(pv) { plugin_var->name= name_arg; @@ -4076,7 +4077,8 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, my_casedn_str(&my_charset_latin1, varname); convert_dash_to_underscore(varname, len-1); } - v= new (mem_root) sys_var_pluginvar(&chain, varname, tmp, o); + const char *s= o->flags & PLUGIN_VAR_DEPRECATED ? "" : NULL; + v= new (mem_root) sys_var_pluginvar(&chain, varname, tmp, o, s); v->test_load= (var ? &var->loaded : &static_unload); DBUG_ASSERT(static_unload == FALSE); diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc index ab402c636d1..8785281c242 100644 --- a/storage/example/ha_example.cc +++ b/storage/example/ha_example.cc @@ -1054,12 +1054,17 @@ static MYSQL_THDVAR_DOUBLE( 1000.5, 0); +static MYSQL_THDVAR_INT( + deprecated_var, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, "-1..1", + NULL, NULL, 0, -1, 1, 0); + static struct st_mysql_sys_var* example_system_variables[]= { MYSQL_SYSVAR(enum_var), MYSQL_SYSVAR(ulong_var), MYSQL_SYSVAR(int_var), MYSQL_SYSVAR(double_var), MYSQL_SYSVAR(double_thdvar), + MYSQL_SYSVAR(deprecated_var), MYSQL_SYSVAR(varopt_default), NULL };