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.
This commit is contained in:
Nayuta Yanagisawa 2022-02-15 16:18:55 +09:00
parent 5b237e5965
commit 66f55a018b
5 changed files with 19 additions and 5 deletions

View File

@ -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; \

View File

@ -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

View File

@ -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%';

View File

@ -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);

View File

@ -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
};