Merge WL#5496 and WL#5341 to 5.5-bugteam.
This commit is contained in:
commit
818e848dcf
7
mysql-test/r/plugin_load_option.result
Normal file
7
mysql-test/r/plugin_load_option.result
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
UNINSTALL PLUGIN example;
|
||||||
|
ERROR HY000: Plugin 'example' is force_plus_permanent and can not be unloaded
|
||||||
|
SELECT PLUGIN_NAME, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS
|
||||||
|
WHERE PLUGIN_NAME IN ('MyISAM', 'EXAMPLE');
|
||||||
|
PLUGIN_NAME PLUGIN_STATUS LOAD_OPTION
|
||||||
|
MyISAM ACTIVE FORCE
|
||||||
|
EXAMPLE ACTIVE FORCE_PLUS_PERMANENT
|
@ -165,6 +165,7 @@ def information_schema PARTITIONS TABLE_NAME 3 NO varchar 64 192 NULL NULL utf8
|
|||||||
def information_schema PARTITIONS TABLE_ROWS 13 0 NO bigint NULL NULL 20 0 NULL NULL bigint(21) unsigned select
|
def information_schema PARTITIONS TABLE_ROWS 13 0 NO bigint NULL NULL 20 0 NULL NULL bigint(21) unsigned select
|
||||||
def information_schema PARTITIONS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
def information_schema PARTITIONS TABLE_SCHEMA 2 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
def information_schema PARTITIONS UPDATE_TIME 20 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select
|
def information_schema PARTITIONS UPDATE_TIME 20 NULL YES datetime NULL NULL NULL NULL NULL NULL datetime select
|
||||||
|
def information_schema PLUGINS LOAD_OPTION 11 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
def information_schema PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
def information_schema PLUGINS PLUGIN_AUTHOR 8 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
def information_schema PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select
|
def information_schema PLUGINS PLUGIN_DESCRIPTION 9 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select
|
||||||
def information_schema PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
def information_schema PLUGINS PLUGIN_LIBRARY 6 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
@ -562,6 +563,7 @@ NULL information_schema PARTITIONS CHECKSUM bigint NULL NULL NULL NULL bigint(21
|
|||||||
3.0000 information_schema PLUGINS PLUGIN_AUTHOR varchar 64 192 utf8 utf8_general_ci varchar(64)
|
3.0000 information_schema PLUGINS PLUGIN_AUTHOR varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
1.0000 information_schema PLUGINS PLUGIN_DESCRIPTION longtext 4294967295 4294967295 utf8 utf8_general_ci longtext
|
1.0000 information_schema PLUGINS PLUGIN_DESCRIPTION longtext 4294967295 4294967295 utf8 utf8_general_ci longtext
|
||||||
3.0000 information_schema PLUGINS PLUGIN_LICENSE varchar 80 240 utf8 utf8_general_ci varchar(80)
|
3.0000 information_schema PLUGINS PLUGIN_LICENSE varchar 80 240 utf8 utf8_general_ci varchar(80)
|
||||||
|
3.0000 information_schema PLUGINS LOAD_OPTION varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
NULL information_schema PROCESSLIST ID bigint NULL NULL NULL NULL bigint(4)
|
NULL information_schema PROCESSLIST ID bigint NULL NULL NULL NULL bigint(4)
|
||||||
3.0000 information_schema PROCESSLIST USER varchar 16 48 utf8 utf8_general_ci varchar(16)
|
3.0000 information_schema PROCESSLIST USER varchar 16 48 utf8 utf8_general_ci varchar(16)
|
||||||
3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64)
|
3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
|
3
mysql-test/t/plugin_load_option-master.opt
Normal file
3
mysql-test/t/plugin_load_option-master.opt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
$EXAMPLE_PLUGIN_OPT
|
||||||
|
$EXAMPLE_PLUGIN_LOAD
|
||||||
|
--plugin-example=FORCE_PLUS_PERMANENT
|
8
mysql-test/t/plugin_load_option.test
Normal file
8
mysql-test/t/plugin_load_option.test
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
--source include/not_windows_embedded.inc
|
||||||
|
--source include/have_example_plugin.inc
|
||||||
|
|
||||||
|
--error ER_PLUGIN_IS_PERMANENT
|
||||||
|
UNINSTALL PLUGIN example;
|
||||||
|
|
||||||
|
SELECT PLUGIN_NAME, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS
|
||||||
|
WHERE PLUGIN_NAME IN ('MyISAM', 'EXAMPLE');
|
@ -6382,3 +6382,6 @@ ER_GRANT_PLUGIN_USER_EXISTS
|
|||||||
|
|
||||||
ER_TRUNCATE_ILLEGAL_FK 42000
|
ER_TRUNCATE_ILLEGAL_FK 42000
|
||||||
eng "Cannot truncate a table referenced in a foreign key constraint (%.192s)"
|
eng "Cannot truncate a table referenced in a foreign key constraint (%.192s)"
|
||||||
|
|
||||||
|
ER_PLUGIN_IS_PERMANENT
|
||||||
|
eng "Plugin '%s' is force_plus_permanent and can not be unloaded"
|
||||||
|
@ -42,9 +42,8 @@ extern struct st_mysql_plugin *mysql_mandatory_plugins[];
|
|||||||
@note The order of the enumeration is critical.
|
@note The order of the enumeration is critical.
|
||||||
@see construct_options
|
@see construct_options
|
||||||
*/
|
*/
|
||||||
static const char *global_plugin_typelib_names[]=
|
const char *global_plugin_typelib_names[]=
|
||||||
{ "OFF", "ON", "FORCE", NULL };
|
{ "OFF", "ON", "FORCE", "FORCE_PLUS_PERMANENT", NULL };
|
||||||
enum enum_plugin_load_policy {PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE};
|
|
||||||
static TYPELIB global_plugin_typelib=
|
static TYPELIB global_plugin_typelib=
|
||||||
{ array_elements(global_plugin_typelib_names)-1,
|
{ array_elements(global_plugin_typelib_names)-1,
|
||||||
"", global_plugin_typelib_names, NULL };
|
"", global_plugin_typelib_names, NULL };
|
||||||
@ -800,6 +799,7 @@ static bool plugin_add(MEM_ROOT *tmp_root,
|
|||||||
tmp.name.length= name_len;
|
tmp.name.length= name_len;
|
||||||
tmp.ref_count= 0;
|
tmp.ref_count= 0;
|
||||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||||
|
tmp.load_option= PLUGIN_ON;
|
||||||
if (test_plugin_options(tmp_root, &tmp, argc, argv))
|
if (test_plugin_options(tmp_root, &tmp, argc, argv))
|
||||||
tmp.state= PLUGIN_IS_DISABLED;
|
tmp.state= PLUGIN_IS_DISABLED;
|
||||||
|
|
||||||
@ -1241,7 +1241,7 @@ int plugin_init(int *argc, char **argv, int flags)
|
|||||||
tmp.name.str= (char *)plugin->name;
|
tmp.name.str= (char *)plugin->name;
|
||||||
tmp.name.length= strlen(plugin->name);
|
tmp.name.length= strlen(plugin->name);
|
||||||
tmp.state= 0;
|
tmp.state= 0;
|
||||||
tmp.is_mandatory= mandatory;
|
tmp.load_option= mandatory ? PLUGIN_FORCE : PLUGIN_ON;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If the performance schema is compiled in,
|
If the performance schema is compiled in,
|
||||||
@ -1260,7 +1260,7 @@ int plugin_init(int *argc, char **argv, int flags)
|
|||||||
to work, by using '--skip-performance-schema' (the plugin)
|
to work, by using '--skip-performance-schema' (the plugin)
|
||||||
*/
|
*/
|
||||||
if (!my_strcasecmp(&my_charset_latin1, plugin->name, "PERFORMANCE_SCHEMA"))
|
if (!my_strcasecmp(&my_charset_latin1, plugin->name, "PERFORMANCE_SCHEMA"))
|
||||||
tmp.is_mandatory= true;
|
tmp.load_option= PLUGIN_FORCE;
|
||||||
|
|
||||||
free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE));
|
free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE));
|
||||||
if (test_plugin_options(&tmp_root, &tmp, argc, argv))
|
if (test_plugin_options(&tmp_root, &tmp, argc, argv))
|
||||||
@ -1338,7 +1338,8 @@ int plugin_init(int *argc, char **argv, int flags)
|
|||||||
while ((plugin_ptr= *(--reap)))
|
while ((plugin_ptr= *(--reap)))
|
||||||
{
|
{
|
||||||
mysql_mutex_unlock(&LOCK_plugin);
|
mysql_mutex_unlock(&LOCK_plugin);
|
||||||
if (plugin_ptr->is_mandatory)
|
if (plugin_ptr->load_option == PLUGIN_FORCE ||
|
||||||
|
plugin_ptr->load_option == PLUGIN_FORCE_PLUS_PERMANENT)
|
||||||
reaped_mandatory_plugin= TRUE;
|
reaped_mandatory_plugin= TRUE;
|
||||||
plugin_deinitialize(plugin_ptr, true);
|
plugin_deinitialize(plugin_ptr, true);
|
||||||
mysql_mutex_lock(&LOCK_plugin);
|
mysql_mutex_lock(&LOCK_plugin);
|
||||||
@ -1848,6 +1849,11 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
|
|||||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str);
|
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT)
|
||||||
|
{
|
||||||
|
my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
plugin->state= PLUGIN_IS_DELETED;
|
plugin->state= PLUGIN_IS_DELETED;
|
||||||
if (plugin->ref_count)
|
if (plugin->ref_count)
|
||||||
@ -3058,7 +3064,8 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
|||||||
plugin_dash.length + 1);
|
plugin_dash.length + 1);
|
||||||
strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS);
|
strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, plugin_name_ptr, NullS);
|
||||||
|
|
||||||
if (!tmp->is_mandatory)
|
if (tmp->load_option != PLUGIN_FORCE &&
|
||||||
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||||
{
|
{
|
||||||
/* support --skip-plugin-foo syntax */
|
/* support --skip-plugin-foo syntax */
|
||||||
options[0].name= plugin_name_ptr;
|
options[0].name= plugin_name_ptr;
|
||||||
@ -3318,7 +3325,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
|||||||
{
|
{
|
||||||
struct sys_var_chain chain= { NULL, NULL };
|
struct sys_var_chain chain= { NULL, NULL };
|
||||||
bool disable_plugin;
|
bool disable_plugin;
|
||||||
enum_plugin_load_policy plugin_load_policy= tmp->is_mandatory ? PLUGIN_FORCE : PLUGIN_ON;
|
enum_plugin_load_option plugin_load_option= tmp->load_option;
|
||||||
|
|
||||||
MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ?
|
MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ?
|
||||||
&tmp->mem_root : &plugin_mem_root;
|
&tmp->mem_root : &plugin_mem_root;
|
||||||
@ -3339,7 +3346,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
|||||||
*/
|
*/
|
||||||
if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") &&
|
if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") &&
|
||||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster")))
|
my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster")))
|
||||||
plugin_load_policy= PLUGIN_OFF;
|
plugin_load_option= PLUGIN_OFF;
|
||||||
|
|
||||||
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
||||||
count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */
|
count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */
|
||||||
@ -3363,8 +3370,9 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
|||||||
We adjust the default value to account for the hardcoded exceptions
|
We adjust the default value to account for the hardcoded exceptions
|
||||||
we have set for the federated and ndbcluster storage engines.
|
we have set for the federated and ndbcluster storage engines.
|
||||||
*/
|
*/
|
||||||
if (!tmp->is_mandatory)
|
if (tmp->load_option != PLUGIN_FORCE &&
|
||||||
opts[0].def_value= opts[1].def_value= plugin_load_policy;
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||||
|
opts[0].def_value= opts[1].def_value= plugin_load_option;
|
||||||
|
|
||||||
error= handle_options(argc, &argv, opts, NULL);
|
error= handle_options(argc, &argv, opts, NULL);
|
||||||
(*argc)++; /* add back one for the program name */
|
(*argc)++; /* add back one for the program name */
|
||||||
@ -3379,12 +3387,13 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
|||||||
Set plugin loading policy from option value. First element in the option
|
Set plugin loading policy from option value. First element in the option
|
||||||
list is always the <plugin name> option value.
|
list is always the <plugin name> option value.
|
||||||
*/
|
*/
|
||||||
if (!tmp->is_mandatory)
|
if (tmp->load_option != PLUGIN_FORCE &&
|
||||||
plugin_load_policy= (enum_plugin_load_policy)*(ulong*)opts[0].value;
|
tmp->load_option != PLUGIN_FORCE_PLUS_PERMANENT)
|
||||||
|
plugin_load_option= (enum_plugin_load_option) *(ulong*) opts[0].value;
|
||||||
}
|
}
|
||||||
|
|
||||||
disable_plugin= (plugin_load_policy == PLUGIN_OFF);
|
disable_plugin= (plugin_load_option == PLUGIN_OFF);
|
||||||
tmp->is_mandatory= (plugin_load_policy == PLUGIN_FORCE);
|
tmp->load_option= plugin_load_option;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If the plugin is disabled it should not be initialized.
|
If the plugin is disabled it should not be initialized.
|
||||||
|
@ -32,6 +32,9 @@
|
|||||||
|
|
||||||
class sys_var;
|
class sys_var;
|
||||||
enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED};
|
enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED};
|
||||||
|
enum enum_plugin_load_option { PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE,
|
||||||
|
PLUGIN_FORCE_PLUS_PERMANENT };
|
||||||
|
extern const char *global_plugin_typelib_names[];
|
||||||
|
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
|
|
||||||
@ -95,7 +98,7 @@ struct st_plugin_int
|
|||||||
void *data; /* plugin type specific, e.g. handlerton */
|
void *data; /* plugin type specific, e.g. handlerton */
|
||||||
MEM_ROOT mem_root; /* memory for dynamic plugin structures */
|
MEM_ROOT mem_root; /* memory for dynamic plugin structures */
|
||||||
sys_var *system_vars; /* server variables for this plugin */
|
sys_var *system_vars; /* server variables for this plugin */
|
||||||
bool is_mandatory; /* If true then plugin must not fail to load */
|
enum enum_plugin_load_option load_option; /* OFF, ON, FORCE, F+PERMANENT */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -110,6 +113,7 @@ typedef struct st_plugin_int *plugin_ref;
|
|||||||
#define plugin_data(pi,cast) ((cast)((pi)->data))
|
#define plugin_data(pi,cast) ((cast)((pi)->data))
|
||||||
#define plugin_name(pi) (&((pi)->name))
|
#define plugin_name(pi) (&((pi)->name))
|
||||||
#define plugin_state(pi) ((pi)->state)
|
#define plugin_state(pi) ((pi)->state)
|
||||||
|
#define plugin_load_option(pi) ((pi)->load_option)
|
||||||
#define plugin_equals(p1,p2) ((p1) == (p2))
|
#define plugin_equals(p1,p2) ((p1) == (p2))
|
||||||
#else
|
#else
|
||||||
typedef struct st_plugin_int **plugin_ref;
|
typedef struct st_plugin_int **plugin_ref;
|
||||||
@ -118,6 +122,7 @@ typedef struct st_plugin_int **plugin_ref;
|
|||||||
#define plugin_data(pi,cast) ((cast)((pi)[0]->data))
|
#define plugin_data(pi,cast) ((cast)((pi)[0]->data))
|
||||||
#define plugin_name(pi) (&((pi)[0]->name))
|
#define plugin_name(pi) (&((pi)[0]->name))
|
||||||
#define plugin_state(pi) ((pi)[0]->state)
|
#define plugin_state(pi) ((pi)[0]->state)
|
||||||
|
#define plugin_load_option(pi) ((pi)[0]->load_option)
|
||||||
#define plugin_equals(p1,p2) ((p1) && (p2) && (p1)[0] == (p2)[0])
|
#define plugin_equals(p1,p2) ((p1) && (p2) && (p1)[0] == (p2)[0])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -211,6 +211,11 @@ static my_bool show_plugins(THD *thd, plugin_ref plugin,
|
|||||||
}
|
}
|
||||||
table->field[9]->set_notnull();
|
table->field[9]->set_notnull();
|
||||||
|
|
||||||
|
table->field[10]->store(
|
||||||
|
global_plugin_typelib_names[plugin_load_option(plugin)],
|
||||||
|
strlen(global_plugin_typelib_names[plugin_load_option(plugin)]),
|
||||||
|
cs);
|
||||||
|
|
||||||
return schema_table_store_record(thd, table);
|
return schema_table_store_record(thd, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7214,6 +7219,7 @@ ST_FIELD_INFO plugin_fields_info[]=
|
|||||||
{"PLUGIN_AUTHOR", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
|
{"PLUGIN_AUTHOR", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
|
||||||
{"PLUGIN_DESCRIPTION", 65535, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
|
{"PLUGIN_DESCRIPTION", 65535, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE},
|
||||||
{"PLUGIN_LICENSE", 80, MYSQL_TYPE_STRING, 0, 1, "License", SKIP_OPEN_TABLE},
|
{"PLUGIN_LICENSE", 80, MYSQL_TYPE_STRING, 0, 1, "License", SKIP_OPEN_TABLE},
|
||||||
|
{"LOAD_OPTION", 64, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE},
|
||||||
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
|
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user