mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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.
This commit is contained in:
@ -1,7 +1,15 @@
|
|||||||
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
|
|||||||
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
|
|||||||
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 @@
|
|||||||
#
|
#
|
||||||
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;
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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[]=
|
|||||||
{"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}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user