MDEV-6107 merge default_tmp_storage_engine

Adapt default_tmp_storage_engine implementation from mysql-5.6
New feature (as compared to 5.6), default_tmp_storage_engine=NULL
means that temporary tables will use default_storage_engine value.
This makes the behavior backward compatible.
This commit is contained in:
Sergei Golubchik 2014-06-14 22:15:52 +02:00
parent 2edcf8f9ff
commit cf1a09e42f
17 changed files with 516 additions and 68 deletions

View File

@ -36,7 +36,6 @@ our $do_test;
our $skip_test;
our $binlog_format;
our $enable_disabled;
our $default_storage_engine;
our $opt_with_ndbcluster_only;
sub collect_option {

View File

@ -144,6 +144,9 @@ The following options may be given as the first argument:
The default storage engine for new tables
--default-time-zone=name
Set the default time zone.
--default-tmp-storage-engine=name
The default storage engine for user-created temporary
tables
--default-week-format=#
The default week format used by WEEK() functions
--delay-key-write[=name]
@ -1085,6 +1088,7 @@ deadlock-timeout-short 10000
default-regex-flags
default-storage-engine myisam
default-time-zone (No default value)
default-tmp-storage-engine (No default value)
default-week-format 0
delay-key-write ON
delayed-insert-limit 100

View File

@ -0,0 +1,181 @@
SET @start_global_value = @@global.default_tmp_storage_engine;
SELECT @start_global_value;
@start_global_value
NULL
SET @start_session_value = @@session.default_tmp_storage_engine;
SELECT @start_session_value;
@start_session_value
NULL
'#--------------------FN_DYNVARS_005_01-------------------------#'
SET @@global.default_tmp_storage_engine = MEMORY;
SET @@global.default_tmp_storage_engine = DEFAULT;
SELECT @@global.default_tmp_storage_engine;
@@global.default_tmp_storage_engine
NULL
SET @@session.default_tmp_storage_engine = MEMORY;
SET @@session.default_tmp_storage_engine = DEFAULT;
SELECT @@session.default_tmp_storage_engine;
@@session.default_tmp_storage_engine
NULL
'#--------------------FN_DYNVARS_005_02-------------------------#'
SET @@global.default_tmp_storage_engine = MYISAM;
SELECT @@global.default_tmp_storage_engine;
@@global.default_tmp_storage_engine
MyISAM
SET @@global.default_tmp_storage_engine = MERGE;
SELECT @@global.default_tmp_storage_engine;
@@global.default_tmp_storage_engine
MRG_MyISAM
SET @@global.default_tmp_storage_engine = MEMORY;
SELECT @@global.default_tmp_storage_engine;
@@global.default_tmp_storage_engine
MEMORY
'#--------------------FN_DYNVARS_005_03-------------------------#'
SET @@session.default_tmp_storage_engine = MYISAM;
SELECT @@session.default_tmp_storage_engine;
@@session.default_tmp_storage_engine
MyISAM
SET @@session.default_tmp_storage_engine = MERGE;
SELECT @@session.default_tmp_storage_engine;
@@session.default_tmp_storage_engine
MRG_MyISAM
SET @@session.default_tmp_storage_engine = MEMORY;
SELECT @@session.default_tmp_storage_engine;
@@session.default_tmp_storage_engine
MEMORY
'#------------------FN_DYNVARS_005_04-----------------------#'
SET @@global.default_tmp_storage_engine = 8199;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@global.default_tmp_storage_engine = -1024;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@global.default_tmp_storage_engine = 65530.34;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@global.default_tmp_storage_engine = FILE;
ERROR 42000: Unknown storage engine 'FILE'
SET @@session.default_tmp_storage_engine = 8199;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@session.default_tmp_storage_engine = 65530.34;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@session.default_tmp_storage_engine = RECORD;
ERROR 42000: Unknown storage engine 'RECORD'
'#------------------FN_DYNVARS_005_05-----------------------#'
SELECT @@global.default_tmp_storage_engine =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='default_tmp_storage_engine';
@@global.default_tmp_storage_engine =
VARIABLE_VALUE
1
'#------------------FN_DYNVARS_005_06-----------------------#'
SELECT @@session.default_tmp_storage_engine =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES
WHERE VARIABLE_NAME='default_tmp_storage_engine';
@@session.default_tmp_storage_engine =
VARIABLE_VALUE
1
'#------------------FN_DYNVARS_005_07-----------------------#'
SET @@global.default_tmp_storage_engine = TRUE;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
SET @@global.default_tmp_storage_engine = FALSE;
ERROR 42000: Incorrect argument type to variable 'default_tmp_storage_engine'
'#---------------------FN_DYNVARS_001_8----------------------#'
SET @@default_tmp_storage_engine = MYISAM;
SELECT @@default_tmp_storage_engine = @@local.default_tmp_storage_engine;
@@default_tmp_storage_engine = @@local.default_tmp_storage_engine
1
SELECT @@local.default_tmp_storage_engine = @@session.default_tmp_storage_engine;
@@local.default_tmp_storage_engine = @@session.default_tmp_storage_engine
1
'#---------------------FN_DYNVARS_001_9----------------------#'
SET default_tmp_storage_engine = MEMORY;
SELECT @@default_tmp_storage_engine;
@@default_tmp_storage_engine
MEMORY
SELECT local.default_tmp_storage_engine;
ERROR 42S02: Unknown table 'local' in field list
SELECT session.default_tmp_storage_engine;
ERROR 42S02: Unknown table 'session' in field list
SELECT default_tmp_storage_engine = @@session.default_tmp_storage_engine;
ERROR 42S22: Unknown column 'default_tmp_storage_engine' in 'field list'
SET @@default_tmp_storage_engine = @start_global_value;
SET default_tmp_storage_engine = MyISAM;
SET default_storage_engine = MyISAM;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TEMPORARY TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET default_storage_engine = MEMORY;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TEMPORARY TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET @@global.default_tmp_storage_engine = NULL;
SET @@session.default_tmp_storage_engine = NULL;
SET default_storage_engine = MEMORY;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TEMPORARY TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET default_storage_engine = MYISAM;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TEMPORARY TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET default_tmp_storage_engine = DEFAULT;
SET default_storage_engine = DEFAULT;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TEMPORARY TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, t2;
SET @@global.default_tmp_storage_engine = @start_global_value;
SELECT @@global.default_tmp_storage_engine;
@@global.default_tmp_storage_engine
NULL
SET @@session.default_tmp_storage_engine = @start_session_value;
SELECT @@session.default_tmp_storage_engine;
@@session.default_tmp_storage_engine
NULL

View File

@ -0,0 +1,193 @@
######################################################################
# START OF default_tmp_storage_engine TESTS #
######################################################################
#############################################################
# Save initial value #
#############################################################
SET @start_global_value = @@global.default_tmp_storage_engine;
SELECT @start_global_value;
SET @start_session_value = @@session.default_tmp_storage_engine;
SELECT @start_session_value;
--echo '#--------------------FN_DYNVARS_005_01-------------------------#'
######################################################################
# Display the DEFAULT value of default_tmp_storage_engine #
######################################################################
SET @@global.default_tmp_storage_engine = MEMORY;
SET @@global.default_tmp_storage_engine = DEFAULT;
SELECT @@global.default_tmp_storage_engine;
SET @@session.default_tmp_storage_engine = MEMORY;
SET @@session.default_tmp_storage_engine = DEFAULT;
SELECT @@session.default_tmp_storage_engine;
--echo '#--------------------FN_DYNVARS_005_02-------------------------#'
########################################################################
# Change the value of default_tmp_storage_engine to a valid value for GLOBAL Scope #
########################################################################
SET @@global.default_tmp_storage_engine = MYISAM;
SELECT @@global.default_tmp_storage_engine;
SET @@global.default_tmp_storage_engine = MERGE;
SELECT @@global.default_tmp_storage_engine;
SET @@global.default_tmp_storage_engine = MEMORY;
SELECT @@global.default_tmp_storage_engine;
--echo '#--------------------FN_DYNVARS_005_03-------------------------#'
#########################################################################
# Change the value of default_tmp_storage_engine to a valid value for SESSION Scope #
#########################################################################
SET @@session.default_tmp_storage_engine = MYISAM;
SELECT @@session.default_tmp_storage_engine;
SET @@session.default_tmp_storage_engine = MERGE;
SELECT @@session.default_tmp_storage_engine;
SET @@session.default_tmp_storage_engine = MEMORY;
SELECT @@session.default_tmp_storage_engine;
--echo '#------------------FN_DYNVARS_005_04-----------------------#'
##################################################################
# Change the value of default_tmp_storage_engine to an invalid value #
##################################################################
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.default_tmp_storage_engine = 8199;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.default_tmp_storage_engine = -1024;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.default_tmp_storage_engine = 65530.34;
--Error ER_UNKNOWN_STORAGE_ENGINE
SET @@global.default_tmp_storage_engine = FILE;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@session.default_tmp_storage_engine = 8199;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@session.default_tmp_storage_engine = 65530.34;
--Error ER_UNKNOWN_STORAGE_ENGINE
SET @@session.default_tmp_storage_engine = RECORD;
--echo '#------------------FN_DYNVARS_005_05-----------------------#'
####################################################################
# Check if the value in GLOBAL Table matches value in variable #
####################################################################
SELECT @@global.default_tmp_storage_engine =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='default_tmp_storage_engine';
--echo '#------------------FN_DYNVARS_005_06-----------------------#'
####################################################################
# Check if the value in SESSION Table matches value in variable #
####################################################################
SELECT @@session.default_tmp_storage_engine =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES
WHERE VARIABLE_NAME='default_tmp_storage_engine';
--echo '#------------------FN_DYNVARS_005_07-----------------------#'
####################################################################
# Check if TRUE and FALSE values can be used on variable #
####################################################################
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.default_tmp_storage_engine = TRUE;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.default_tmp_storage_engine = FALSE;
--echo '#---------------------FN_DYNVARS_001_8----------------------#'
###############################################################
# Check if accessing variable with SESSION,LOCAL and without #
# SCOPE points to same session variable #
###############################################################
SET @@default_tmp_storage_engine = MYISAM;
SELECT @@default_tmp_storage_engine = @@local.default_tmp_storage_engine;
SELECT @@local.default_tmp_storage_engine = @@session.default_tmp_storage_engine;
--echo '#---------------------FN_DYNVARS_001_9----------------------#'
#########################################################################
# Check if default_tmp_storage_engine can be accessed with and without @@ sign #
#########################################################################
SET default_tmp_storage_engine = MEMORY;
SELECT @@default_tmp_storage_engine;
--Error ER_UNKNOWN_TABLE
SELECT local.default_tmp_storage_engine;
--Error ER_UNKNOWN_TABLE
SELECT session.default_tmp_storage_engine;
--Error ER_BAD_FIELD_ERROR
SELECT default_tmp_storage_engine = @@session.default_tmp_storage_engine;
# check the old obsolete name
SET @@default_tmp_storage_engine = @start_global_value;
SET default_tmp_storage_engine = MyISAM;
SET default_storage_engine = MyISAM;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
SET default_storage_engine = MEMORY;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
# test default_tmp_storage_engine = NULL
SET @@global.default_tmp_storage_engine = NULL;
SET @@session.default_tmp_storage_engine = NULL;
SET default_storage_engine = MEMORY;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
SET default_storage_engine = MYISAM;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
SET default_tmp_storage_engine = DEFAULT;
SET default_storage_engine = DEFAULT;
CREATE TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 (b INT);
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t2;
DROP TABLE t1, t2;
####################################
# Restore initial value #
####################################
SET @@global.default_tmp_storage_engine = @start_global_value;
SELECT @@global.default_tmp_storage_engine;
SET @@session.default_tmp_storage_engine = @start_session_value;
SELECT @@session.default_tmp_storage_engine;
#############################################################
# END OF default_tmp_storage_engine TESTS #
#############################################################

View File

@ -113,7 +113,7 @@ frm_type_enum dd_frm_type(THD *thd, char *path, enum legacy_db_type *dbt)
LEX_STRING name;
name.str= (char*) next_chunk + 2;
name.length= str_db_type_length;
plugin_ref tmp_plugin= ha_resolve_by_name(thd, &name);
plugin_ref tmp_plugin= ha_resolve_by_name(thd, &name, false);
if (tmp_plugin)
*dbt= plugin_data(tmp_plugin, handlerton *)->db_type;
else

View File

@ -107,6 +107,14 @@ static plugin_ref ha_default_plugin(THD *thd)
return my_plugin_lock(thd, global_system_variables.table_plugin);
}
static plugin_ref ha_default_tmp_plugin(THD *thd)
{
if (thd->variables.tmp_table_plugin)
return thd->variables.tmp_table_plugin;
if (global_system_variables.tmp_table_plugin)
return my_plugin_lock(thd, global_system_variables.tmp_table_plugin);
return ha_default_plugin(thd);
}
/** @brief
Return the default storage engine handlerton for thread
@ -128,6 +136,16 @@ handlerton *ha_default_handlerton(THD *thd)
}
handlerton *ha_default_tmp_handlerton(THD *thd)
{
plugin_ref plugin= ha_default_tmp_plugin(thd);
DBUG_ASSERT(plugin);
handlerton *hton= plugin_hton(plugin);
DBUG_ASSERT(hton);
return hton;
}
/** @brief
Return the storage engine handlerton for the supplied name
@ -139,7 +157,7 @@ handlerton *ha_default_handlerton(THD *thd)
RETURN
pointer to storage engine plugin handle
*/
plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name)
plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name, bool tmp_table)
{
const LEX_STRING *table_alias;
plugin_ref plugin;
@ -149,7 +167,7 @@ redo:
if (thd && !my_charset_latin1.coll->strnncoll(&my_charset_latin1,
(const uchar *)name->str, name->length,
(const uchar *)STRING_WITH_LEN("DEFAULT"), 0))
return ha_default_plugin(thd);
return tmp_table ? ha_default_tmp_plugin(thd) : ha_default_plugin(thd);
if ((plugin= my_plugin_lock_by_name(thd, name, MYSQL_STORAGE_ENGINE_PLUGIN)))
{
@ -253,7 +271,8 @@ handler *get_new_handler(TABLE_SHARE *share, MEM_ROOT *alloc,
Here the call to current_thd() is ok as we call this function a lot of
times but we enter this branch very seldom.
*/
DBUG_RETURN(get_new_handler(share, alloc, ha_default_handlerton(current_thd)));
file= get_new_handler(share, alloc, ha_default_handlerton(current_thd));
DBUG_RETURN(file);
}

View File

@ -1360,6 +1360,8 @@ static inline sys_var *find_hton_sysvar(handlerton *hton, st_mysql_sys_var *var)
return find_plugin_sysvar(hton2plugin[hton->slot], var);
}
handlerton *ha_default_handlerton(THD *thd);
handlerton *ha_default_tmp_handlerton(THD *thd);
/* Possible flags of a handlerton (there can be 32 of them) */
#define HTON_NO_FLAGS 0
@ -1632,6 +1634,11 @@ struct HA_CREATE_INFO
bool table_was_deleted;
bool tmp_table() { return options & HA_LEX_CREATE_TMP_TABLE; }
void use_default_db_type(THD *thd)
{
db_type= tmp_table() ? ha_default_tmp_handlerton(thd)
: ha_default_handlerton(thd);
}
};
@ -3961,8 +3968,7 @@ extern const char *myisam_stats_method_names[];
extern ulong total_ha, total_ha_2pc;
/* lookups */
handlerton *ha_default_handlerton(THD *thd);
plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name);
plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name, bool tmp_table);
plugin_ref ha_lock_engine(THD *thd, const handlerton *hton);
handlerton *ha_resolve_by_legacy_type(THD *thd, enum legacy_db_type db_type);
handler *get_new_handler(TABLE_SHARE *share, MEM_ROOT *alloc,

View File

@ -362,7 +362,7 @@ static char *lc_messages;
static char *lc_time_names_name;
static char *my_bind_addr_str;
static char *default_collation_name;
char *default_storage_engine;
char *default_storage_engine, *default_tmp_storage_engine;
static char compiled_default_collation_name[]= MYSQL_DEFAULT_COLLATION_NAME;
static I_List<THD> thread_cache;
static bool binlog_format_used= false;
@ -4001,6 +4001,7 @@ static int init_common_variables()
#else
default_storage_engine= const_cast<char *>("MyISAM");
#endif
default_tmp_storage_engine= NULL;
/*
Add server status variables to the dynamic list of
@ -4576,6 +4577,52 @@ static void add_file_to_crash_report(char *file)
}
#endif
#define init_default_storage_engine(X,Y) \
init_default_storage_engine_impl(#X, X, &global_system_variables.Y)
static int init_default_storage_engine_impl(const char *opt_name,
char *engine_name, plugin_ref *res)
{
if (!engine_name)
{
*res= 0;
return 0;
}
LEX_STRING name= { engine_name, strlen(engine_name) };
plugin_ref plugin;
handlerton *hton;
if ((plugin= ha_resolve_by_name(0, &name, false)))
hton= plugin_hton(plugin);
else
{
sql_print_error("Unknown/unsupported storage engine: %s", engine_name);
return 1;
}
if (!ha_storage_engine_is_enabled(hton))
{
if (!opt_bootstrap)
{
sql_print_error("%s (%s) is not available", opt_name, engine_name);
return 1;
}
DBUG_ASSERT(*res);
}
else
{
/*
Need to unlock as global_system_variables.table_plugin
was acquired during plugin_init()
*/
mysql_mutex_lock(&LOCK_global_system_variables);
if (*res)
plugin_unlock(0, *res);
*res= plugin;
mysql_mutex_unlock(&LOCK_global_system_variables);
}
return 0;
}
static int init_server_components()
{
DBUG_ENTER("init_server_components");
@ -4863,41 +4910,15 @@ a file name for --log-bin-index option", opt_binlog_index_name);
opt_log ? log_output_options:LOG_NONE);
}
/*
Set the default storage engine
*/
LEX_STRING name= { default_storage_engine, strlen(default_storage_engine) };
plugin_ref plugin;
handlerton *hton;
if ((plugin= ha_resolve_by_name(0, &name)))
hton= plugin_hton(plugin);
else
{
sql_print_error("Unknown/unsupported storage engine: %s",
default_storage_engine);
if (init_default_storage_engine(default_storage_engine, table_plugin))
unireg_abort(1);
}
if (!ha_storage_engine_is_enabled(hton))
{
if (!opt_bootstrap)
{
sql_print_error("Default storage engine (%s) is not available",
default_storage_engine);
unireg_abort(1);
}
DBUG_ASSERT(global_system_variables.table_plugin);
}
else
{
/*
Need to unlock as global_system_variables.table_plugin
was acquired during plugin_init()
*/
mysql_mutex_lock(&LOCK_global_system_variables);
plugin_unlock(0, global_system_variables.table_plugin);
global_system_variables.table_plugin= plugin;
mysql_mutex_unlock(&LOCK_global_system_variables);
}
if (default_tmp_storage_engine && !*default_tmp_storage_engine)
default_tmp_storage_engine= NULL;
if (init_default_storage_engine(default_tmp_storage_engine, tmp_table_plugin))
unireg_abort(1);
#ifdef USE_ARIA_FOR_TMP_TABLES
if (!ha_storage_engine_is_enabled(maria_hton) && !opt_bootstrap)
{
@ -6770,9 +6791,6 @@ struct my_option my_long_options[]=
0, 0, 0},
{"core-file", OPT_WANT_CORE, "Write core on errors.", 0, 0, 0, GET_NO_ARG,
NO_ARG, 0, 0, 0, 0, 0, 0},
/* default-storage-engine should have "MyISAM" as def_value. Instead
of initializing it here it is done in init_common_variables() due
to a compiler bug in Sun Studio compiler. */
#ifdef DBUG_OFF
{"debug", '#', "Built in DBUG debugger. Disabled in this build.",
&current_dbug_option, &current_dbug_option, 0, GET_STR, OPT_ARG,
@ -6829,9 +6847,16 @@ struct my_option my_long_options[]=
&opt_sporadic_binlog_dump_fail, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
0},
#endif /* HAVE_REPLICATION */
/* default-storage-engine should have "MyISAM" as def_value. Instead
of initializing it here it is done in init_common_variables() due
to a compiler bug in Sun Studio compiler. */
{"default-storage-engine", 0, "The default storage engine for new tables",
&default_storage_engine, 0, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0 },
{"default-tmp-storage-engine", 0,
"The default storage engine for user-created temporary tables",
&default_tmp_storage_engine, 0, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0 },
{"default-time-zone", 0, "Set the default time zone.",
&default_tz_name, &default_tz_name,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },

View File

@ -121,7 +121,7 @@ extern my_bool opt_enable_shared_memory;
extern ulong opt_replicate_events_marked_for_skip;
extern char *default_tz_name;
extern Time_zone *default_tz;
extern char *default_storage_engine;
extern char *default_storage_engine, *default_tmp_storage_engine;
extern bool opt_endinfo, using_udf_functions;
extern my_bool locked_in_memory;
extern bool opt_using_transactions;

View File

@ -610,6 +610,7 @@ typedef struct system_variables
my_bool query_cache_strip_comments;
plugin_ref table_plugin;
plugin_ref tmp_table_plugin;
/* Only charset part of these variables is sensible */
CHARSET_INFO *character_set_filesystem;

View File

@ -2830,7 +2830,7 @@ case SQLCOM_PREPARE:
rather than at parse-time.
*/
if (!(create_info.used_fields & HA_CREATE_USED_ENGINE))
create_info.db_type= ha_default_handlerton(thd);
create_info.use_default_db_type(thd);
/*
If we are using SET CHARSET without DEFAULT, add an implicit
DEFAULT to not confuse old users. (This may change).

View File

@ -3072,13 +3072,15 @@ static double *mysql_sys_var_double(THD* thd, int offset)
void plugin_thdvar_init(THD *thd)
{
plugin_ref old_table_plugin= thd->variables.table_plugin;
plugin_ref old_tmp_table_plugin= thd->variables.tmp_table_plugin;
DBUG_ENTER("plugin_thdvar_init");
// This function may be called many times per THD (e.g. on COM_CHANGE_USER)
thd->variables.table_plugin= NULL;
thd->variables.tmp_table_plugin= NULL;
cleanup_variables(thd, &thd->variables);
thd->variables= global_system_variables;
thd->variables.table_plugin= NULL;
/* we are going to allocate these lazily */
thd->variables.dynamic_variables_version= 0;
@ -3088,7 +3090,11 @@ void plugin_thdvar_init(THD *thd)
mysql_mutex_lock(&LOCK_plugin);
thd->variables.table_plugin=
intern_plugin_lock(NULL, global_system_variables.table_plugin);
if (global_system_variables.tmp_table_plugin)
thd->variables.tmp_table_plugin=
intern_plugin_lock(NULL, global_system_variables.tmp_table_plugin);
intern_plugin_unlock(NULL, old_table_plugin);
intern_plugin_unlock(NULL, old_tmp_table_plugin);
mysql_mutex_unlock(&LOCK_plugin);
DBUG_VOID_RETURN;
}
@ -3100,7 +3106,8 @@ void plugin_thdvar_init(THD *thd)
static void unlock_variables(THD *thd, struct system_variables *vars)
{
intern_plugin_unlock(NULL, vars->table_plugin);
vars->table_plugin= NULL;
intern_plugin_unlock(NULL, vars->tmp_table_plugin);
vars->table_plugin= vars->tmp_table_plugin= NULL;
}
@ -3136,6 +3143,7 @@ static void cleanup_variables(THD *thd, struct system_variables *vars)
mysql_rwlock_unlock(&LOCK_system_variables_hash);
DBUG_ASSERT(vars->table_plugin == NULL);
DBUG_ASSERT(vars->tmp_table_plugin == NULL);
my_free(vars->dynamic_variables_ptr);
vars->dynamic_variables_ptr= NULL;

View File

@ -1112,7 +1112,7 @@ static int execute_ddl_log_action(THD *thd, DDL_LOG_ENTRY *ddl_log_entry)
frm_action= TRUE;
else
{
plugin_ref plugin= ha_resolve_by_name(thd, &handler_name);
plugin_ref plugin= ha_resolve_by_name(thd, &handler_name, false);
if (!plugin)
{
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), ddl_log_entry->handler_name);

View File

@ -2382,7 +2382,7 @@ create:
if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
!lex->create_info.db_type)
{
lex->create_info.db_type= ha_default_handlerton(thd);
lex->create_info.use_default_db_type(thd);
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_WARN_USING_OTHER_HANDLER,
ER(ER_WARN_USING_OTHER_HANDLER),
@ -5835,7 +5835,8 @@ default_collation:
storage_engines:
ident_or_text
{
plugin_ref plugin= ha_resolve_by_name(thd, &$1);
plugin_ref plugin= ha_resolve_by_name(thd, &$1,
thd->lex->create_info.tmp_table());
if (plugin)
$$= plugin_hton(plugin);
@ -5859,7 +5860,7 @@ known_storage_engines:
ident_or_text
{
plugin_ref plugin;
if ((plugin= ha_resolve_by_name(thd, &$1)))
if ((plugin= ha_resolve_by_name(thd, &$1, false)))
$$= plugin_hton(plugin);
else
{

View File

@ -3292,6 +3292,12 @@ static Sys_var_plugin Sys_storage_engine(
MYSQL_STORAGE_ENGINE_PLUGIN, DEFAULT(&default_storage_engine),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_not_null));
static Sys_var_plugin Sys_default_tmp_storage_engine(
"default_tmp_storage_engine", "The default storage engine for user-created temporary tables",
SESSION_VAR(tmp_table_plugin), NO_CMD_LINE,
MYSQL_STORAGE_ENGINE_PLUGIN, DEFAULT(&default_tmp_storage_engine),
NO_MUTEX_GUARD, NOT_IN_BINLOG);
#if defined(ENABLED_DEBUG_SYNC)
/*
Variable can be set for the session only.

View File

@ -1344,7 +1344,7 @@ public:
// special code for storage engines (e.g. to handle historical aliases)
if (plugin_type == MYSQL_STORAGE_ENGINE_PLUGIN)
plugin= ha_resolve_by_name(thd, &pname);
plugin= ha_resolve_by_name(thd, &pname, false);
else
plugin= my_plugin_lock_by_name(thd, &pname, plugin_type);
if (!plugin)
@ -1366,7 +1366,7 @@ public:
plugin_ref oldval= *valptr;
if (oldval != newval)
{
*valptr= my_plugin_lock(NULL, newval);
*valptr= newval ? my_plugin_lock(NULL, newval) : 0;
plugin_unlock(NULL, oldval);
}
}
@ -1385,23 +1385,28 @@ public:
void session_save_default(THD *thd, set_var *var)
{
plugin_ref plugin= global_var(plugin_ref);
var->save_result.plugin= my_plugin_lock(thd, plugin);
var->save_result.plugin= plugin ? my_plugin_lock(thd, plugin) : 0;
}
void global_save_default(THD *thd, set_var *var)
{
LEX_STRING pname;
char **default_value= reinterpret_cast<char**>(option.def_value);
pname.str= *default_value;
pname.length= strlen(pname.str);
plugin_ref plugin;
if (plugin_type == MYSQL_STORAGE_ENGINE_PLUGIN)
plugin= ha_resolve_by_name(thd, &pname);
char *default_value= *reinterpret_cast<char**>(option.def_value);
if (!default_value)
var->save_result.plugin= 0;
else
plugin= my_plugin_lock_by_name(thd, &pname, plugin_type);
DBUG_ASSERT(plugin);
{
pname.str= default_value;
pname.length= strlen(pname.str);
var->save_result.plugin= my_plugin_lock(thd, plugin);
plugin_ref plugin;
if (plugin_type == MYSQL_STORAGE_ENGINE_PLUGIN)
plugin= ha_resolve_by_name(thd, &pname, false);
else
plugin= my_plugin_lock_by_name(thd, &pname, plugin_type);
DBUG_ASSERT(plugin);
var->save_result.plugin= my_plugin_lock(thd, plugin);
}
}
bool check_update_type(Item_result type)
{ return type != STRING_RESULT; }

View File

@ -982,7 +982,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
#ifdef WITH_PARTITION_STORAGE_ENGINE
{
LEX_STRING name= { (char*)extra2, length };
share->default_part_plugin= ha_resolve_by_name(NULL, &name);
share->default_part_plugin= ha_resolve_by_name(NULL, &name, false);
if (!share->default_part_plugin)
goto err;
}
@ -1136,7 +1136,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
name.str= (char*) next_chunk + 2;
name.length= str_db_type_length;
plugin_ref tmp_plugin= ha_resolve_by_name(thd, &name);
plugin_ref tmp_plugin= ha_resolve_by_name(thd, &name, false);
if (tmp_plugin != NULL && !plugin_equals(tmp_plugin, se_plugin))
{
if (se_plugin)