=== added file 'mysql-test/r/enforce_storage_engine.result'
--- mysql-test/r/enforce_storage_engine.result	1970-01-01 00:00:00 +0000
+++ mysql-test/r/enforce_storage_engine.result	2015-01-19 11:33:46 +0000
@@ -0,0 +1,33 @@
+drop table if exists t1;
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  `c2` varchar(10) DEFAULT NULL,
+  PRIMARY KEY (`c1`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+DROP TABLE t1;
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
+Warnings:
+Note	1266	Using storage engine InnoDB for table 't1'
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  `c2` varchar(10) DEFAULT NULL,
+  PRIMARY KEY (`c1`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+DROP TABLE t1;
+SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL AUTO_INCREMENT,
+  `c2` varchar(10) DEFAULT NULL,
+  PRIMARY KEY (`c1`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+DROP TABLE t1;
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
+ERROR 42000: Unknown storage engine 'MyISAM'

=== modified file 'mysql-test/r/mysqld--help.result'
--- mysql-test/r/mysqld--help.result	2014-08-07 16:06:56 +0000
+++ mysql-test/r/mysqld--help.result	2015-01-19 11:33:46 +0000
@@ -164,6 +164,8 @@
  --div-precision-increment=# 
  Precision of the result of '/' operator will be increased
  on that value
+ --enforce-storage-engine=name 
+ Force the use of a storage engine for new tables
  --event-scheduler[=name] 
  Enable the event scheduler. Possible values are ON, OFF,
  and DISABLED (keep the event scheduler completely
@@ -1096,6 +1098,7 @@
 delayed-insert-timeout 300
 delayed-queue-size 1000
 div-precision-increment 4
+enforce-storage-engine (No default value)
 event-scheduler OFF
 expensive-subquery-limit 100
 expire-logs-days 0

=== added file 'mysql-test/suite/sys_vars/r/enforce_storage_engine_basic.result'
--- mysql-test/suite/sys_vars/r/enforce_storage_engine_basic.result	1970-01-01 00:00:00 +0000
+++ mysql-test/suite/sys_vars/r/enforce_storage_engine_basic.result	2015-01-19 11:33:46 +0000
@@ -0,0 +1,3 @@
+SELECT @@global.enforce_storage_engine;
+@@global.enforce_storage_engine
+NULL

=== added file 'mysql-test/suite/sys_vars/t/enforce_storage_engine_basic.test'
--- mysql-test/suite/sys_vars/t/enforce_storage_engine_basic.test	1970-01-01 00:00:00 +0000
+++ mysql-test/suite/sys_vars/t/enforce_storage_engine_basic.test	2015-01-19 11:33:46 +0000
@@ -0,0 +1,1 @@
+SELECT @@global.enforce_storage_engine;

=== added file 'mysql-test/t/enforce_storage_engine-master.opt'
--- mysql-test/t/enforce_storage_engine-master.opt	1970-01-01 00:00:00 +0000
+++ mysql-test/t/enforce_storage_engine-master.opt	2015-01-19 11:33:46 +0000
@@ -0,0 +1,2 @@
+--enforce_storage_engine=innodb
+--default-storage-engine=innodb

=== added file 'mysql-test/t/enforce_storage_engine.test'
--- mysql-test/t/enforce_storage_engine.test	1970-01-01 00:00:00 +0000
+++ mysql-test/t/enforce_storage_engine.test	2015-01-19 11:33:46 +0000
@@ -0,0 +1,22 @@
+-- source include/have_innodb.inc
+# embedded server ignores 'delayed', so skip this
+-- source include/not_embedded.inc
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+--error ER_UNKNOWN_STORAGE_ENGINE
+CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
+

=== modified file 'sql/handler.cc'
--- sql/handler.cc	2014-11-13 10:01:31 +0000
+++ sql/handler.cc	2015-01-19 11:33:46 +0000
@@ -128,6 +128,37 @@
   return hton;
 }
 
+/** @brief
+  Return the enforced storage engine handlerton for thread
+
+  SYNOPSIS
+    ha_enforce_handlerton(thd)
+    thd         current thread
+    
+  RETURN
+    pointer to handlerton
+*/
+handlerton *ha_enforce_handlerton(THD* thd)
+{
+  if (enforce_storage_engine)
+  {
+    LEX_STRING name= { enforce_storage_engine,
+      strlen(enforce_storage_engine) };
+    plugin_ref plugin= ha_resolve_by_name(thd, &name);
+    if (plugin)
+    {
+      handlerton *hton= plugin_data(plugin, handlerton*);
+      DBUG_ASSERT(hton);
+      return hton;
+    }
+    else
+    {
+      my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), enforce_storage_engine,
+        enforce_storage_engine);
+    }
+  }
+  return NULL;
+}
 
 /** @brief
   Return the storage engine handlerton for the supplied name

=== modified file 'sql/handler.h'
--- sql/handler.h	2014-05-13 09:53:30 +0000
+++ sql/handler.h	2015-01-19 11:33:46 +0000
@@ -3962,6 +3962,7 @@
 
 /* lookups */
 handlerton *ha_default_handlerton(THD *thd);
+handlerton *ha_enforce_handlerton(THD *thd);
 plugin_ref ha_resolve_by_name(THD *thd, const LEX_STRING *name);
 plugin_ref ha_lock_engine(THD *thd, const handlerton *hton);
 handlerton *ha_resolve_by_legacy_type(THD *thd, enum legacy_db_type db_type);

=== modified file 'sql/mysqld.cc'
--- sql/mysqld.cc	2015-01-18 11:39:59 +0000
+++ sql/mysqld.cc	2015-01-19 11:33:46 +0000
@@ -696,6 +696,8 @@
 SHOW_COMP_OPTION have_profiling;
 SHOW_COMP_OPTION have_openssl;
 
+char* enforce_storage_engine= NULL;
+
 /* Thread specific variables */
 
 pthread_key(MEM_ROOT**,THR_MALLOC);
@@ -4952,6 +4954,43 @@
   internal_tmp_table_max_key_segments= myisam_max_key_segments();
 #endif
 
+  /*
+    Validate any enforced storage engine
+  */
+  if (enforce_storage_engine && !opt_bootstrap && !opt_noacl)
+  {
+    LEX_STRING name= { enforce_storage_engine,
+      strlen(enforce_storage_engine) };
+    plugin_ref plugin;
+    if ((plugin= ha_resolve_by_name(0, &name)))
+    {
+      handlerton *hton = plugin_data(plugin, handlerton*);
+      LEX_STRING defname= { default_storage_engine,
+        strlen(default_storage_engine) };
+      plugin_ref defplugin;
+      handlerton* defhton;
+      if ((defplugin= ha_resolve_by_name(0, &defname)))
+      {
+        defhton = plugin_data(defplugin, handlerton*);
+        if (defhton != hton)
+        {
+          sql_print_warning("Default storage engine (%s)"
+            " is not the same as enforced storage engine (%s)",
+            default_storage_engine,
+            enforce_storage_engine);
+        }
+      }
+      plugin_unlock(0, defplugin);
+      plugin_unlock(0, plugin);
+    }
+    else
+    {
+      sql_print_error("Unknown/unsupported storage engine: %s",
+                    enforce_storage_engine);
+      unireg_abort(1);
+    }
+  }
+
   tc_log= get_tc_log_implementation();
 
   if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file))

=== modified file 'sql/mysqld.h'
--- sql/mysqld.h	2015-01-18 11:39:59 +0000
+++ sql/mysqld.h	2015-01-19 11:33:46 +0000
@@ -233,6 +233,8 @@
 extern ulong connection_errors_peer_addr;
 extern ulong log_warnings;
 
+extern char* enforce_storage_engine;
+
 /*
   THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread,
   using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr().

=== modified file 'sql/sql_table.cc'
--- sql/sql_table.cc	2014-11-18 21:25:33 +0000
+++ sql/sql_table.cc	2015-01-19 11:33:46 +0000
@@ -9765,12 +9765,25 @@
   DBUG_ENTER("check_engine");
   handlerton **new_engine= &create_info->db_type;
   handlerton *req_engine= *new_engine;
+  handlerton *enf_engine= ha_enforce_handlerton(thd);
   bool no_substitution=
         MY_TEST(thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION);
+
   if (!(*new_engine= ha_checktype(thd, ha_legacy_type(req_engine),
                                   no_substitution, 1)))
     DBUG_RETURN(true);
 
+  if (enf_engine)
+  {
+    if (enf_engine != *new_engine && no_substitution)
+    {
+      const char *engine_name= ha_resolve_storage_engine_name(req_engine);
+      my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), engine_name, engine_name);
+      DBUG_RETURN(TRUE);
+    }
+    *new_engine= enf_engine;
+  }
+
   if (req_engine && req_engine != *new_engine)
   {
     push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,

=== modified file 'sql/sys_vars.cc'
--- sql/sys_vars.cc	2014-10-09 08:30:11 +0000
+++ sql/sys_vars.cc	2015-01-19 11:33:46 +0000
@@ -3305,6 +3305,14 @@
        MYSQL_STORAGE_ENGINE_PLUGIN, DEFAULT(&default_storage_engine),
        NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_not_null));
 
+static Sys_var_charptr Sys_enforce_storage_engine(
+       "enforce_storage_engine", "Force the use of a storage engine for new "
+       "tables",
+       READ_ONLY GLOBAL_VAR(enforce_storage_engine),
+       CMD_LINE(REQUIRED_ARG), IN_SYSTEM_CHARSET,
+       DEFAULT(0));
+
+
 #if defined(ENABLED_DEBUG_SYNC)
 /*
   Variable can be set for the session only.

