Commit fcba66f1 authored by Sergey Glukhov's avatar Sergey Glukhov

Bug#29263 disabled storage engines omitted in SHOW ENGINES

Static disabled plugins|engines and dynamic plugins which installed but disabled
are not visible in I_S PLUGINS|ENGINES tables because they are not stored into
global plugin array.
The fix: add such plugins|engines to plugin array with PLUGIN_IS_DISABLED status.
I_S.ENGINES 'Transactions', 'XA', 'Savepoints' fields have NULL value in this case.
parent aae00014
create table t1 (id int) engine=NDB; create table t1 (id int) engine=NDB;
Warnings: Warnings:
Warning 1286 Unknown table engine 'NDB'
Warning 1266 Using storage engine MyISAM for table 't1' Warning 1266 Using storage engine MyISAM for table 't1'
alter table t1 engine=NDB; alter table t1 engine=NDB;
Warnings: Warnings:
Warning 1266 Using storage engine MyISAM for table 't1' Warning 1286 Unknown table engine 'NDB'
drop table t1; drop table t1;
SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='ndbcluster';
ENGINE SUPPORT
ndbcluster NO
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE
PLUGIN_NAME='ndbcluster';
PLUGIN_NAME PLUGIN_STATUS
ndbcluster DISABLED
...@@ -43,10 +43,10 @@ NULL information_schema COLUMN_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL N ...@@ -43,10 +43,10 @@ NULL information_schema COLUMN_PRIVILEGES TABLE_NAME 4 NO varchar 64 192 NULL N
NULL information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema COLUMN_PRIVILEGES TABLE_SCHEMA 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
NULL information_schema ENGINES COMMENT 3 NO varchar 80 240 NULL NULL utf8 utf8_general_ci varchar(80) select NULL information_schema ENGINES COMMENT 3 NO varchar 80 240 NULL NULL utf8 utf8_general_ci varchar(80) select
NULL information_schema ENGINES ENGINE 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select NULL information_schema ENGINES ENGINE 1 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
NULL information_schema ENGINES SAVEPOINTS 6 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select NULL information_schema ENGINES SAVEPOINTS 6 NULL YES varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select
NULL information_schema ENGINES SUPPORT 2 NO varchar 8 24 NULL NULL utf8 utf8_general_ci varchar(8) select NULL information_schema ENGINES SUPPORT 2 NO varchar 8 24 NULL NULL utf8 utf8_general_ci varchar(8) select
NULL information_schema ENGINES TRANSACTIONS 4 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select NULL information_schema ENGINES TRANSACTIONS 4 NULL YES varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select
NULL information_schema ENGINES XA 5 NO varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select NULL information_schema ENGINES XA 5 NULL YES varchar 3 9 NULL NULL utf8 utf8_general_ci varchar(3) select
NULL information_schema EVENTS CHARACTER_SET_CLIENT 22 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema EVENTS CHARACTER_SET_CLIENT 22 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select
NULL information_schema EVENTS COLLATION_CONNECTION 23 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select NULL information_schema EVENTS COLLATION_CONNECTION 23 NO varchar 32 96 NULL NULL utf8 utf8_general_ci varchar(32) select
NULL information_schema EVENTS CREATED 17 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select NULL information_schema EVENTS CREATED 17 0000-00-00 00:00:00 NO datetime NULL NULL NULL NULL NULL NULL datetime select
......
...@@ -31,27 +31,27 @@ Field Type Null Key Default Extra ...@@ -31,27 +31,27 @@ Field Type Null Key Default Extra
ENGINE varchar(64) NO ENGINE varchar(64) NO
SUPPORT varchar(8) NO SUPPORT varchar(8) NO
COMMENT varchar(80) NO COMMENT varchar(80) NO
TRANSACTIONS varchar(3) NO TRANSACTIONS varchar(3) YES NULL
XA varchar(3) NO XA varchar(3) YES NULL
SAVEPOINTS varchar(3) NO SAVEPOINTS varchar(3) YES NULL
SHOW CREATE TABLE information_schema.ENGINES; SHOW CREATE TABLE information_schema.ENGINES;
Table Create Table Table Create Table
ENGINES CREATE TEMPORARY TABLE `ENGINES` ( ENGINES CREATE TEMPORARY TABLE `ENGINES` (
`ENGINE` varchar(64) NOT NULL DEFAULT '', `ENGINE` varchar(64) NOT NULL DEFAULT '',
`SUPPORT` varchar(8) NOT NULL DEFAULT '', `SUPPORT` varchar(8) NOT NULL DEFAULT '',
`COMMENT` varchar(80) NOT NULL DEFAULT '', `COMMENT` varchar(80) NOT NULL DEFAULT '',
`TRANSACTIONS` varchar(3) NOT NULL DEFAULT '', `TRANSACTIONS` varchar(3) DEFAULT NULL,
`XA` varchar(3) NOT NULL DEFAULT '', `XA` varchar(3) DEFAULT NULL,
`SAVEPOINTS` varchar(3) NOT NULL DEFAULT '' `SAVEPOINTS` varchar(3) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW COLUMNS FROM information_schema.ENGINES; SHOW COLUMNS FROM information_schema.ENGINES;
Field Type Null Key Default Extra Field Type Null Key Default Extra
ENGINE varchar(64) NO ENGINE varchar(64) NO
SUPPORT varchar(8) NO SUPPORT varchar(8) NO
COMMENT varchar(80) NO COMMENT varchar(80) NO
TRANSACTIONS varchar(3) NO TRANSACTIONS varchar(3) YES NULL
XA varchar(3) NO XA varchar(3) YES NULL
SAVEPOINTS varchar(3) NO SAVEPOINTS varchar(3) YES NULL
######################################################################## ########################################################################
# Testcases 3.2.1.3-3.2.1.5 + 3.2.1.8-3.2.1.12: INSERT/UPDATE/DELETE and # Testcases 3.2.1.3-3.2.1.5 + 3.2.1.8-3.2.1.12: INSERT/UPDATE/DELETE and
# DDL on INFORMATION_SCHEMA tables are not supported # DDL on INFORMATION_SCHEMA tables are not supported
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# #
disable_query_log; disable_query_log;
--require r/true.require --require r/true.require
select support = 'Disabled' as `TRUE` from information_schema.engines where engine = 'ndbcluster'; select support = 'NO' as `TRUE` from information_schema.engines where engine = 'ndbcluster';
enable_query_log; enable_query_log;
...@@ -16,4 +16,9 @@ create table t1 (id int) engine=NDB; ...@@ -16,4 +16,9 @@ create table t1 (id int) engine=NDB;
alter table t1 engine=NDB; alter table t1 engine=NDB;
drop table t1; drop table t1;
#
# Bug#29263 disabled storage engines omitted in SHOW ENGINES
#
SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='ndbcluster';
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE
PLUGIN_NAME='ndbcluster';
...@@ -751,21 +751,22 @@ static bool plugin_add(MEM_ROOT *tmp_root, ...@@ -751,21 +751,22 @@ 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;
if (!test_plugin_options(tmp_root, &tmp, argc, argv, true)) if (test_plugin_options(tmp_root, &tmp, argc, argv, true))
tmp.state= PLUGIN_IS_DISABLED;
if ((tmp_plugin_ptr= plugin_insert_or_reuse(&tmp)))
{ {
if ((tmp_plugin_ptr= plugin_insert_or_reuse(&tmp))) plugin_array_version++;
if (!my_hash_insert(&plugin_hash[plugin->type], (uchar*)tmp_plugin_ptr))
{ {
plugin_array_version++; init_alloc_root(&tmp_plugin_ptr->mem_root, 4096, 4096);
if (!my_hash_insert(&plugin_hash[plugin->type], (uchar*)tmp_plugin_ptr)) DBUG_RETURN(FALSE);
{
init_alloc_root(&tmp_plugin_ptr->mem_root, 4096, 4096);
DBUG_RETURN(FALSE);
}
tmp_plugin_ptr->state= PLUGIN_IS_FREED;
} }
mysql_del_sys_var_chain(tmp.system_vars); tmp_plugin_ptr->state= PLUGIN_IS_FREED;
goto err;
} }
mysql_del_sys_var_chain(tmp.system_vars);
goto err;
/* plugin was disabled */ /* plugin was disabled */
plugin_dl_del(dl); plugin_dl_del(dl);
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -1145,11 +1146,12 @@ int plugin_init(int *argc, char **argv, int flags) ...@@ -1145,11 +1146,12 @@ int plugin_init(int *argc, char **argv, int flags)
tmp.plugin= plugin; tmp.plugin= plugin;
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;
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, def_enabled)) if (test_plugin_options(&tmp_root, &tmp, argc, argv, def_enabled))
continue; tmp.state= PLUGIN_IS_DISABLED;
else
tmp.state= PLUGIN_IS_UNINITIALIZED;
if (register_builtin(plugin, &tmp, &plugin_ptr)) if (register_builtin(plugin, &tmp, &plugin_ptr))
goto err_unlock; goto err_unlock;
...@@ -1159,7 +1161,8 @@ int plugin_init(int *argc, char **argv, int flags) ...@@ -1159,7 +1161,8 @@ int plugin_init(int *argc, char **argv, int flags)
my_strcasecmp(&my_charset_latin1, plugin->name, "CSV")) my_strcasecmp(&my_charset_latin1, plugin->name, "CSV"))
continue; continue;
if (plugin_initialize(plugin_ptr)) if (plugin_ptr->state == PLUGIN_IS_UNINITIALIZED &&
plugin_initialize(plugin_ptr))
goto err_unlock; goto err_unlock;
/* /*
...@@ -1246,8 +1249,6 @@ static bool register_builtin(struct st_mysql_plugin *plugin, ...@@ -1246,8 +1249,6 @@ static bool register_builtin(struct st_mysql_plugin *plugin,
struct st_plugin_int **ptr) struct st_plugin_int **ptr)
{ {
DBUG_ENTER("register_builtin"); DBUG_ENTER("register_builtin");
tmp->state= PLUGIN_IS_UNINITIALIZED;
tmp->ref_count= 0; tmp->ref_count= 0;
tmp->plugin_dl= 0; tmp->plugin_dl= 0;
...@@ -1296,7 +1297,7 @@ bool plugin_register_builtin(THD *thd, struct st_mysql_plugin *plugin) ...@@ -1296,7 +1297,7 @@ bool plugin_register_builtin(THD *thd, struct st_mysql_plugin *plugin)
if (test_plugin_options(thd->mem_root, &tmp, &dummy_argc, NULL, true)) if (test_plugin_options(thd->mem_root, &tmp, &dummy_argc, NULL, true))
goto end; goto end;
tmp.state= PLUGIN_IS_UNINITIALIZED;
if ((result= register_builtin(plugin, &tmp, &ptr))) if ((result= register_builtin(plugin, &tmp, &ptr)))
mysql_del_sys_var_chain(tmp.system_vars); mysql_del_sys_var_chain(tmp.system_vars);
...@@ -1555,7 +1556,8 @@ void plugin_shutdown(void) ...@@ -1555,7 +1556,8 @@ void plugin_shutdown(void)
We loop through all plugins and call deinit() if they have one. We loop through all plugins and call deinit() if they have one.
*/ */
for (i= 0; i < count; i++) for (i= 0; i < count; i++)
if (!(plugins[i]->state & (PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_FREED))) if (!(plugins[i]->state & (PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_FREED |
PLUGIN_IS_DISABLED)))
{ {
sql_print_information("Plugin '%s' will be forced to shutdown", sql_print_information("Plugin '%s' will be forced to shutdown",
plugins[i]->name.str); plugins[i]->name.str);
......
...@@ -54,6 +54,7 @@ typedef struct st_mysql_show_var SHOW_VAR; ...@@ -54,6 +54,7 @@ typedef struct st_mysql_show_var SHOW_VAR;
#define PLUGIN_IS_UNINITIALIZED 4 #define PLUGIN_IS_UNINITIALIZED 4
#define PLUGIN_IS_READY 8 #define PLUGIN_IS_READY 8
#define PLUGIN_IS_DYING 16 #define PLUGIN_IS_DYING 16
#define PLUGIN_IS_DISABLED 32
/* A handle for the dynamic library containing a plugin or plugins. */ /* A handle for the dynamic library containing a plugin or plugins. */
......
...@@ -124,6 +124,9 @@ static my_bool show_plugins(THD *thd, plugin_ref plugin, ...@@ -124,6 +124,9 @@ static my_bool show_plugins(THD *thd, plugin_ref plugin,
case PLUGIN_IS_READY: case PLUGIN_IS_READY:
table->field[2]->store(STRING_WITH_LEN("ACTIVE"), cs); table->field[2]->store(STRING_WITH_LEN("ACTIVE"), cs);
break; break;
case PLUGIN_IS_DISABLED:
table->field[2]->store(STRING_WITH_LEN("DISABLED"), cs);
break;
default: default:
DBUG_ASSERT(0); DBUG_ASSERT(0);
} }
...@@ -3930,6 +3933,25 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin, ...@@ -3930,6 +3933,25 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin,
handlerton *default_type= ha_default_handlerton(thd); handlerton *default_type= ha_default_handlerton(thd);
DBUG_ENTER("iter_schema_engines"); DBUG_ENTER("iter_schema_engines");
/* Disabled plugins */
if (plugin_state(plugin) != PLUGIN_IS_READY)
{
struct st_mysql_plugin *plug= plugin_decl(plugin);
if (!(wild && wild[0] &&
wild_case_compare(scs, plug->name,wild)))
{
restore_record(table, s->default_values);
table->field[0]->store(plug->name, strlen(plug->name), scs);
table->field[1]->store(C_STRING_WITH_LEN("NO"), scs);
table->field[2]->store(plug->descr, strlen(plug->descr), scs);
if (schema_table_store_record(thd, table))
DBUG_RETURN(1);
}
DBUG_RETURN(0);
}
if (!(hton->flags & HTON_HIDDEN)) if (!(hton->flags & HTON_HIDDEN))
{ {
LEX_STRING *name= plugin_name(plugin); LEX_STRING *name= plugin_name(plugin);
...@@ -3950,10 +3972,13 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin, ...@@ -3950,10 +3972,13 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin,
strlen(plugin_decl(plugin)->descr), scs); strlen(plugin_decl(plugin)->descr), scs);
tmp= &yesno[test(hton->commit)]; tmp= &yesno[test(hton->commit)];
table->field[3]->store(tmp->str, tmp->length, scs); table->field[3]->store(tmp->str, tmp->length, scs);
table->field[3]->set_notnull();
tmp= &yesno[test(hton->prepare)]; tmp= &yesno[test(hton->prepare)];
table->field[4]->store(tmp->str, tmp->length, scs); table->field[4]->store(tmp->str, tmp->length, scs);
table->field[4]->set_notnull();
tmp= &yesno[test(hton->savepoint_set)]; tmp= &yesno[test(hton->savepoint_set)];
table->field[5]->store(tmp->str, tmp->length, scs); table->field[5]->store(tmp->str, tmp->length, scs);
table->field[5]->set_notnull();
if (schema_table_store_record(thd, table)) if (schema_table_store_record(thd, table))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -3964,8 +3989,12 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin, ...@@ -3964,8 +3989,12 @@ static my_bool iter_schema_engines(THD *thd, plugin_ref plugin,
int fill_schema_engines(THD *thd, TABLE_LIST *tables, COND *cond) int fill_schema_engines(THD *thd, TABLE_LIST *tables, COND *cond)
{ {
return plugin_foreach(thd, iter_schema_engines, DBUG_ENTER("fill_schema_engines");
MYSQL_STORAGE_ENGINE_PLUGIN, tables->table); if (plugin_foreach_with_mask(thd, iter_schema_engines,
MYSQL_STORAGE_ENGINE_PLUGIN,
~PLUGIN_IS_FREED, tables->table))
DBUG_RETURN(1);
DBUG_RETURN(0);
} }
...@@ -6162,9 +6191,9 @@ ST_FIELD_INFO engines_fields_info[]= ...@@ -6162,9 +6191,9 @@ ST_FIELD_INFO engines_fields_info[]=
{"ENGINE", 64, MYSQL_TYPE_STRING, 0, 0, "Engine", SKIP_OPEN_TABLE}, {"ENGINE", 64, MYSQL_TYPE_STRING, 0, 0, "Engine", SKIP_OPEN_TABLE},
{"SUPPORT", 8, MYSQL_TYPE_STRING, 0, 0, "Support", SKIP_OPEN_TABLE}, {"SUPPORT", 8, MYSQL_TYPE_STRING, 0, 0, "Support", SKIP_OPEN_TABLE},
{"COMMENT", 80, MYSQL_TYPE_STRING, 0, 0, "Comment", SKIP_OPEN_TABLE}, {"COMMENT", 80, MYSQL_TYPE_STRING, 0, 0, "Comment", SKIP_OPEN_TABLE},
{"TRANSACTIONS", 3, MYSQL_TYPE_STRING, 0, 0, "Transactions", SKIP_OPEN_TABLE}, {"TRANSACTIONS", 3, MYSQL_TYPE_STRING, 0, 1, "Transactions", SKIP_OPEN_TABLE},
{"XA", 3, MYSQL_TYPE_STRING, 0, 0, "XA", SKIP_OPEN_TABLE}, {"XA", 3, MYSQL_TYPE_STRING, 0, 1, "XA", SKIP_OPEN_TABLE},
{"SAVEPOINTS", 3 ,MYSQL_TYPE_STRING, 0, 0, "Savepoints", SKIP_OPEN_TABLE}, {"SAVEPOINTS", 3 ,MYSQL_TYPE_STRING, 0, 1, "Savepoints", 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}
}; };
......
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