Commit bb85d92d authored by Daniel Black's avatar Daniel Black Committed by Sergei Golubchik

MDEV-16294: INSTALL PLUGIN IF NOT EXISTS / UNINSTALL PLUGIN IF EXISTS

Add INSTALL SONAME IF NOT EXISTS; syntax only, installing
duplicate SONAMES doesn't currently cause any errors or warnings.

UNINSTALL SONAME IF EXISTS was added.

Allow the installation / uninstallation of plugins without
doing checks for existence first.
parent 4272eec0
...@@ -331,3 +331,34 @@ UNINSTALL PLUGIN example; ...@@ -331,3 +331,34 @@ UNINSTALL PLUGIN example;
RENAME TABLE t1 TO t2; RENAME TABLE t1 TO t2;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
DROP TABLE t1; DROP TABLE t1;
#
# INSTALL IF NOT EXISTS [PLUGIN name] SONAME library /
# UNINSTALL IF EXISTS PLUGIN|SONAME name
#
#
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
plugin_name
INSTALL PLUGIN IF NOT EXISTS example SONAME 'ha_example';
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
plugin_name
EXAMPLE
INSTALL PLUGIN IF NOT EXISTS EXAMPLE SONAME 'ha_example';
SHOW WARNINGS;
Level Code Message
Note 1968 Plugin 'EXAMPLE' already installed
INSTALL SONAME IF NOT EXISTS 'ha_example';
SHOW WARNINGS;
Level Code Message
Note 1968 Plugin 'EXAMPLE' already installed
UNINSTALL PLUGIN IF EXISTS example;
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
plugin_name
UNUSABLE
UNINSTALL SONAME IF EXISTS 'ha_example';
Warnings:
Note 1305 PLUGIN EXAMPLE does not exist
SHOW WARNINGS;
Level Code Message
Note 1305 PLUGIN EXAMPLE does not exist
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
plugin_name
...@@ -265,3 +265,22 @@ UNINSTALL PLUGIN example; ...@@ -265,3 +265,22 @@ UNINSTALL PLUGIN example;
--error ER_NO_SUCH_TABLE --error ER_NO_SUCH_TABLE
RENAME TABLE t1 TO t2; RENAME TABLE t1 TO t2;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # INSTALL IF NOT EXISTS [PLUGIN name] SONAME library /
--echo # UNINSTALL IF EXISTS PLUGIN|SONAME name
--echo #
--echo #
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
INSTALL PLUGIN IF NOT EXISTS example SONAME 'ha_example';
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
INSTALL PLUGIN IF NOT EXISTS EXAMPLE SONAME 'ha_example';
SHOW WARNINGS;
INSTALL SONAME IF NOT EXISTS 'ha_example';
SHOW WARNINGS;
UNINSTALL PLUGIN IF EXISTS example;
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
UNINSTALL SONAME IF EXISTS 'ha_example';
SHOW WARNINGS;
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
...@@ -1077,7 +1077,7 @@ static st_plugin_int *plugin_insert_or_reuse(struct st_plugin_int *plugin) ...@@ -1077,7 +1077,7 @@ static st_plugin_int *plugin_insert_or_reuse(struct st_plugin_int *plugin)
NOTE NOTE
Requires that a write-lock is held on LOCK_system_variables_hash Requires that a write-lock is held on LOCK_system_variables_hash
*/ */
static bool plugin_add(MEM_ROOT *tmp_root, static bool plugin_add(MEM_ROOT *tmp_root, THD *thd,
const LEX_CSTRING *name, LEX_CSTRING *dl, myf MyFlags) const LEX_CSTRING *name, LEX_CSTRING *dl, myf MyFlags)
{ {
struct st_plugin_int tmp, *maybe_dupe; struct st_plugin_int tmp, *maybe_dupe;
...@@ -1088,7 +1088,14 @@ static bool plugin_add(MEM_ROOT *tmp_root, ...@@ -1088,7 +1088,14 @@ static bool plugin_add(MEM_ROOT *tmp_root,
if (name->str && plugin_find_internal(name, MYSQL_ANY_PLUGIN)) if (name->str && plugin_find_internal(name, MYSQL_ANY_PLUGIN))
{ {
my_error(ER_PLUGIN_INSTALLED, MyFlags, name->str); if (thd && thd->lex->create_info.if_not_exists())
{
my_error(ER_PLUGIN_INSTALLED, MyFlags & ME_WARNING, name->str);
}
else
{
my_error(ER_PLUGIN_INSTALLED, MyFlags, name->str);
}
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
/* Clear the whole struct to catch future extensions. */ /* Clear the whole struct to catch future extensions. */
...@@ -1847,7 +1854,7 @@ static void plugin_load(MEM_ROOT *tmp_root) ...@@ -1847,7 +1854,7 @@ static void plugin_load(MEM_ROOT *tmp_root)
the mutex here to satisfy the assert the mutex here to satisfy the assert
*/ */
mysql_mutex_lock(&LOCK_plugin); mysql_mutex_lock(&LOCK_plugin);
plugin_add(tmp_root, &name, &dl, MYF(ME_ERROR_LOG)); plugin_add(tmp_root, NULL, &name, &dl, MYF(ME_ERROR_LOG));
free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE)); free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
mysql_mutex_unlock(&LOCK_plugin); mysql_mutex_unlock(&LOCK_plugin);
} }
...@@ -1902,7 +1909,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list) ...@@ -1902,7 +1909,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list)
mysql_mutex_lock(&LOCK_plugin); mysql_mutex_lock(&LOCK_plugin);
free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE)); free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
name.str= 0; // load everything name.str= 0; // load everything
if (plugin_add(tmp_root, (LEX_CSTRING*) &name, (LEX_CSTRING*) &dl, if (plugin_add(tmp_root, NULL, (LEX_CSTRING*) &name, (LEX_CSTRING*) &dl,
MYF(ME_ERROR_LOG))) MYF(ME_ERROR_LOG)))
goto error; goto error;
} }
...@@ -1910,7 +1917,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list) ...@@ -1910,7 +1917,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list)
{ {
free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE)); free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
mysql_mutex_lock(&LOCK_plugin); mysql_mutex_lock(&LOCK_plugin);
if (plugin_add(tmp_root, (LEX_CSTRING*) &name, (LEX_CSTRING*) &dl, if (plugin_add(tmp_root, NULL, (LEX_CSTRING*) &name, (LEX_CSTRING*) &dl,
MYF(ME_ERROR_LOG))) MYF(ME_ERROR_LOG)))
goto error; goto error;
} }
...@@ -2194,7 +2201,7 @@ bool mysql_install_plugin(THD *thd, const LEX_CSTRING *name, ...@@ -2194,7 +2201,7 @@ bool mysql_install_plugin(THD *thd, const LEX_CSTRING *name,
mysql_audit_acquire_plugins(thd, event_class_mask); mysql_audit_acquire_plugins(thd, event_class_mask);
mysql_mutex_lock(&LOCK_plugin); mysql_mutex_lock(&LOCK_plugin);
error= plugin_add(thd->mem_root, name, &dl, MYF(0)); error= plugin_add(thd->mem_root, thd, name, &dl, MYF(0));
if (unlikely(error)) if (unlikely(error))
goto err; goto err;
...@@ -2236,8 +2243,17 @@ static bool do_uninstall(THD *thd, TABLE *table, const LEX_CSTRING *name) ...@@ -2236,8 +2243,17 @@ static bool do_uninstall(THD *thd, TABLE *table, const LEX_CSTRING *name)
if (!(plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)) || if (!(plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)) ||
plugin->state & (PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_DYING)) plugin->state & (PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_DYING))
{ {
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str); if (thd->lex->if_exists())
return 1; {
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, ER_SP_DOES_NOT_EXIST,
ER_THD(thd, ER_SP_DOES_NOT_EXIST), "PLUGIN", name->str);
return 0;
}
else
{
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str);
return 1;
}
} }
if (!plugin->plugin_dl) if (!plugin->plugin_dl)
{ {
......
...@@ -17490,35 +17490,45 @@ opt_migrate: ...@@ -17490,35 +17490,45 @@ opt_migrate:
; ;
install: install:
INSTALL_SYM PLUGIN_SYM ident SONAME_SYM TEXT_STRING_sys INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->create_info.init();
if (lex->add_create_options_with_check($3))
MYSQL_YYABORT;
lex->sql_command= SQLCOM_INSTALL_PLUGIN; lex->sql_command= SQLCOM_INSTALL_PLUGIN;
lex->comment= $3; lex->comment= $4;
lex->ident= $5; lex->ident= $6;
} }
| INSTALL_SYM SONAME_SYM TEXT_STRING_sys | INSTALL_SYM SONAME_SYM opt_if_not_exists TEXT_STRING_sys
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->create_info.init();
if (lex->add_create_options_with_check($3))
MYSQL_YYABORT;
lex->sql_command= SQLCOM_INSTALL_PLUGIN; lex->sql_command= SQLCOM_INSTALL_PLUGIN;
lex->comment= null_clex_str; lex->comment= null_clex_str;
lex->ident= $3; lex->ident= $4;
} }
; ;
uninstall: uninstall:
UNINSTALL_SYM PLUGIN_SYM ident UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->add_create_options_with_check($3))
MYSQL_YYABORT;
lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN;
lex->comment= $3; lex->comment= $4;
} }
| UNINSTALL_SYM SONAME_SYM TEXT_STRING_sys | UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->add_create_options_with_check($3))
MYSQL_YYABORT;
lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN;
lex->comment= null_clex_str; lex->comment= null_clex_str;
lex->ident= $3; lex->ident= $4;
} }
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment