summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@skysql.com>2014-06-17 11:33:50 +0300
committerJan Lindström <jan.lindstrom@skysql.com>2014-06-17 11:33:50 +0300
commit5f02051f071180dc53bf9b40dd385eae7606a537 (patch)
treeb3a52feceeb305bc2c0fda3afbbec226138176aa
parent89e0514150433eeb9737e3bb6272b88dd82b8443 (diff)
parentcf1a09e42f695bcd24dd8a4a928cd1f560c3c00a (diff)
downloadmariadb-git-5f02051f071180dc53bf9b40dd385eae7606a537.tar.gz
Merge branch '10.1' of github.com:MariaDB/server into 10.1
-rw-r--r--.gitignore2
-rw-r--r--mysql-test/lib/mtr_cases.pm1
-rw-r--r--mysql-test/r/mysqld--help.result4
-rw-r--r--mysql-test/suite/sys_vars/r/default_tmp_storage_engine_basic.result181
-rw-r--r--mysql-test/suite/sys_vars/t/default_tmp_storage_engine_basic.test193
-rw-r--r--sql/datadict.cc2
-rw-r--r--sql/handler.cc25
-rw-r--r--sql/handler.h10
-rw-r--r--sql/mysqld.cc101
-rw-r--r--sql/mysqld.h2
-rw-r--r--sql/sql_class.h1
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_plugin.cc12
-rw-r--r--sql/sql_table.cc2
-rw-r--r--sql/sql_yacc.yy15
-rw-r--r--sql/sys_vars.cc6
-rw-r--r--sql/sys_vars.h31
-rw-r--r--sql/table.cc4
18 files changed, 522 insertions, 72 deletions
diff --git a/.gitignore b/.gitignore
index 6e1c180d168..e283abf39f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,8 @@
*.spec
*~
.*.swp
+*.ninja
+.ninja_*
.gdb_history
CMakeCache.txt
CMakeFiles/
diff --git a/mysql-test/lib/mtr_cases.pm b/mysql-test/lib/mtr_cases.pm
index b95fcb3825c..441fd6e6559 100644
--- a/mysql-test/lib/mtr_cases.pm
+++ b/mysql-test/lib/mtr_cases.pm
@@ -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 {
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index 32d58304bd4..6641f359553 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -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
diff --git a/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_basic.result b/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_basic.result
new file mode 100644
index 00000000000..22056efc934
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_basic.result
@@ -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
diff --git a/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_basic.test b/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_basic.test
new file mode 100644
index 00000000000..26512cc3938
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_basic.test
@@ -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 #
+#############################################################
+
diff --git a/sql/datadict.cc b/sql/datadict.cc
index deeedcd512d..15e64c11bc2 100644
--- a/sql/datadict.cc
+++ b/sql/datadict.cc
@@ -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
diff --git a/sql/handler.cc b/sql/handler.cc
index ac2512431ad..56e7da6430d 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -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);
}
diff --git a/sql/handler.h b/sql/handler.h
index 5bba570f8ec..5cff169b295 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -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,
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 63f392f438d..fca084ad54e 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -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 },
diff --git a/sql/mysqld.h b/sql/mysqld.h
index e7eea3dfa1a..6bd111bd3f6 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -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;
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 5898d9e2cf8..09b92e454de 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -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;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index d7fdb4d0473..c0c44cf4ec7 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -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).
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index e70b9e51772..2828567fbc3 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -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;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index d8d2043ab0b..56a3a1861c5 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -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);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index d6b3fa41c78..b4d02612c15 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1833,7 +1833,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
opt_attribute opt_attribute_list attribute column_list column_list_id
opt_column_list grant_privileges grant_ident grant_list grant_option
object_privilege object_privilege_list user_list user_and_role_list
- rename_list
+ rename_list table_or_tables
clear_privileges flush_options flush_option
opt_flush_lock flush_lock flush_options_list
equal optional_braces
@@ -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
{
@@ -12839,7 +12840,7 @@ flush_lock:
MYSQL_YYABORT;
}
Lex->type|= REFRESH_FOR_EXPORT;
- } EXPORT_SYM
+ } EXPORT_SYM {}
;
flush_options_list:
@@ -14899,8 +14900,8 @@ lock:
;
table_or_tables:
- TABLE_SYM
- | TABLES
+ TABLE_SYM {}
+ | TABLES {}
;
table_lock_list:
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 5fcc33c0e79..cf92a5e6197 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -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.
diff --git a/sql/sys_vars.h b/sql/sys_vars.h
index 495099b9c59..cbf924ee036 100644
--- a/sql/sys_vars.h
+++ b/sql/sys_vars.h
@@ -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);
+
+ 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);
+ var->save_result.plugin= my_plugin_lock(thd, plugin);
+ }
}
bool check_update_type(Item_result type)
{ return type != STRING_RESULT; }
diff --git a/sql/table.cc b/sql/table.cc
index 23761e02831..d720a16f6e5 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -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)