summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/mysqld.cc12
-rw-r--r--sql/set_var.cc19
-rw-r--r--sql/set_var.h3
-rw-r--r--sql/sys_vars.ic6
4 files changed, 28 insertions, 12 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index e43b074a018..09c9c5c681e 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4923,11 +4923,19 @@ init_gtid_pos_auto_engines(void)
{
plugin_ref *plugins;
+ /*
+ For the command-line option --gtid_pos_auto_engines, we allow (and ignore)
+ engines that are unknown. This is convenient, since it allows to set
+ default auto-create engines that might not be used by particular users.
+ The option sets a list of storage engines that will have gtid position
+ table auto-created for them if needed. And if the engine is not available,
+ then it will certainly not be needed.
+ */
if (gtid_pos_auto_engines)
plugins= resolve_engine_list(gtid_pos_auto_engines,
- strlen(gtid_pos_auto_engines));
+ strlen(gtid_pos_auto_engines), false);
else
- plugins= resolve_engine_list("", 0);
+ plugins= resolve_engine_list("", 0, false);
if (!plugins)
return 1;
mysql_mutex_lock(&LOCK_global_system_variables);
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 7b190f6244e..78904f75661 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -1302,7 +1302,8 @@ engine_list_next_item(const char **pos, const char *end_pos,
static bool
resolve_engine_list_item(plugin_ref *list, uint32 *idx,
- const char *pos, const char *pos_end)
+ const char *pos, const char *pos_end,
+ bool error_on_unknown_engine)
{
LEX_STRING item_str;
plugin_ref ref;
@@ -1313,9 +1314,13 @@ resolve_engine_list_item(plugin_ref *list, uint32 *idx,
ref= ha_resolve_by_name(NULL, &item_str, false);
if (!ref)
{
- ErrConvString err(pos, pos_end-pos, system_charset_info);
- my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), err.ptr());
- return true;
+ if (error_on_unknown_engine)
+ {
+ ErrConvString err(pos, pos_end-pos, system_charset_info);
+ my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), err.ptr());
+ return true;
+ }
+ return false;
}
/* Ignore duplicates, like --plugin-load does. */
for (i= 0; i < *idx; ++i)
@@ -1338,7 +1343,8 @@ resolve_engine_list_item(plugin_ref *list, uint32 *idx,
array of plugin_ref.
*/
plugin_ref *
-resolve_engine_list(const char *str_arg, size_t str_arg_len)
+resolve_engine_list(const char *str_arg, size_t str_arg_len,
+ bool error_on_unknown_engine)
{
uint32 count, idx;
const char *pos, *item_start, *item_end;
@@ -1370,7 +1376,8 @@ resolve_engine_list(const char *str_arg, size_t str_arg_len)
DBUG_ASSERT(idx < count);
if (idx >= count)
break;
- if (resolve_engine_list_item(res, &idx, item_start, item_end))
+ if (resolve_engine_list_item(res, &idx, item_start, item_end,
+ error_on_unknown_engine))
goto err;
}
diff --git a/sql/set_var.h b/sql/set_var.h
index a6f0cb02fe8..cdd0f7da1ba 100644
--- a/sql/set_var.h
+++ b/sql/set_var.h
@@ -423,7 +423,8 @@ int sys_var_init();
uint sys_var_elements();
int sys_var_add_options(DYNAMIC_ARRAY *long_options, int parse_flags);
void sys_var_end(void);
-plugin_ref *resolve_engine_list(const char *str_arg, size_t str_arg_len);
+plugin_ref *resolve_engine_list(const char *str_arg, size_t str_arg_len,
+ bool error_on_unknown_engine);
void free_engine_list(plugin_ref *list);
plugin_ref *copy_engine_list(plugin_ref *list);
char *pretty_print_engine_list(THD *thd, plugin_ref *list);
diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic
index e76f60b56b0..c5fe8c0af2c 100644
--- a/sql/sys_vars.ic
+++ b/sql/sys_vars.ic
@@ -1575,9 +1575,9 @@ public:
plugin_ref *plugins;
if (!(res=var->value->val_str(&str)))
- plugins= resolve_engine_list("", 0);
+ plugins= resolve_engine_list("", 0, true);
else
- plugins= resolve_engine_list(res->ptr(), res->length());
+ plugins= resolve_engine_list(res->ptr(), res->length(), true);
if (!plugins)
return true;
var->save_result.plugins= plugins;
@@ -1611,7 +1611,7 @@ public:
char *default_value= *reinterpret_cast<char**>(option.def_value);
if (!default_value)
return 0;
- return resolve_engine_list(default_value, strlen(default_value));
+ return resolve_engine_list(default_value, strlen(default_value), false);
}
void global_save_default(THD *thd, set_var *var)