summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <brian@zim.(none)>2006-09-15 10:28:00 -0700
committerunknown <brian@zim.(none)>2006-09-15 10:28:00 -0700
commitd79485a9be6b2f638fd268aae9c4d0b4056a85d5 (patch)
tree23dd89b8830f721d6e87266e1e75109a0c51996d /sql
parente7a27b6a5812c87fc4e3064f3bdc4f92ff67a5e2 (diff)
downloadmariadb-git-d79485a9be6b2f638fd268aae9c4d0b4056a85d5.tar.gz
This changes the order of the universe, black is now the new white.
In practice this means that handlerton is now created by the server and is passed to the engine. Plugin startups can now also control how plugins are inited (and can optionally pass values). Bit more flexibility to those who want to write plugin interfaces to the database. include/mysql/plugin.h: Optional to pass parameter now to init and deinit functions sql/ha_ndbcluster.cc: Cleanup, handlerton is now a pointer. sql/ha_ndbcluster_binlog.cc: Cleanup (handlerton is now a pointer) sql/ha_ndbcluster_binlog.h: Cleanup (handlerton is now a pointer) sql/ha_partition.cc: Cleaned up handlerton change sql/handler.cc: Cheanup of handlerton change sql/item_sum.cc: Cleanedup of handlerton change sql/log.cc: Cleanup of handlerton change sql/mysql_priv.h: Reverted patch for variables (what would have happen previously if a have_ would have been called that was dynamically loaded? boom!) sql/mysqld.cc: Cleanup of handlerton changes and reverted have variable patch sql/partition_info.cc: Cleanup of handlerton (we need to clean this up a bit more). sql/set_var.cc: Cleanup related to handlerton changes sql/sql_cache.cc: Handlerton changes cleanup sql/sql_insert.cc: Handlerton changes cleanup. sql/sql_partition.cc: Handlerton cleanup changes sql/sql_plugin.cc: Handlerton changes. init() can now be controlled by a plugin specific startup. There was also an issue with how we deinited the status variables. It should have been occuring before we shut down the engines. sql/sql_select.cc: Handlerton cleanup changes sql/sql_show.cc: Handlerton cleanup changes sql/sql_table.cc: Handlerton cleanup changes sql/table.cc: Cleanup storage/archive/ha_archive.cc: Cleanup storage/archive/ha_archive.h: Cleanup storage/blackhole/ha_blackhole.cc: Cleanup storage/csv/ha_tina.cc: Cleanup storage/example/ha_example.cc: Cleanup storage/federated/ha_federated.cc: Cleanup storage/heap/ha_heap.cc: Cleanup storage/innobase/handler/ha_innodb.cc: Cleanup storage/myisam/ha_myisam.cc: Cleanup storage/myisammrg/ha_myisammrg.cc: Cleanup
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_ndbcluster.cc61
-rw-r--r--sql/ha_ndbcluster_binlog.cc8
-rw-r--r--sql/ha_ndbcluster_binlog.h6
-rw-r--r--sql/ha_partition.cc30
-rw-r--r--sql/handler.cc35
-rw-r--r--sql/item_sum.cc2
-rw-r--r--sql/log.cc62
-rw-r--r--sql/mysql_priv.h46
-rw-r--r--sql/mysqld.cc51
-rw-r--r--sql/partition_info.cc6
-rw-r--r--sql/set_var.cc2
-rw-r--r--sql/sql_cache.cc4
-rw-r--r--sql/sql_insert.cc4
-rw-r--r--sql/sql_partition.cc4
-rw-r--r--sql/sql_plugin.cc58
-rw-r--r--sql/sql_select.cc16
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/sql_table.cc8
-rw-r--r--sql/table.cc2
19 files changed, 249 insertions, 158 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index f73d83f6030..d049c6cd091 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -74,13 +74,13 @@ static const int max_transactions= 3; // should really be 2 but there is a trans
static uint ndbcluster_partition_flags();
static uint ndbcluster_alter_table_flags(uint flags);
-static int ndbcluster_init(void);
+static int ndbcluster_init(void *);
static int ndbcluster_end(ha_panic_function flag);
static bool ndbcluster_show_status(THD*,stat_print_fn *,enum ha_stat_type);
static int ndbcluster_alter_tablespace(THD* thd, st_alter_tablespace *info);
static int ndbcluster_fill_files_table(THD *thd, TABLE_LIST *tables, COND *cond);
-handlerton ndbcluster_hton;
+handlerton *ndbcluster_hton;
static handler *ndbcluster_create_handler(TABLE_SHARE *table,
MEM_ROOT *mem_root)
@@ -4005,7 +4005,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
thd_ndb->init_open_tables();
thd_ndb->stmt= trans;
thd_ndb->query_state&= NDB_QUERY_NORMAL;
- trans_register_ha(thd, FALSE, &ndbcluster_hton);
+ trans_register_ha(thd, FALSE, ndbcluster_hton);
}
else
{
@@ -4021,7 +4021,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
thd_ndb->init_open_tables();
thd_ndb->all= trans;
thd_ndb->query_state&= NDB_QUERY_NORMAL;
- trans_register_ha(thd, TRUE, &ndbcluster_hton);
+ trans_register_ha(thd, TRUE, ndbcluster_hton);
/*
If this is the start of a LOCK TABLE, a table look
@@ -4175,7 +4175,7 @@ int ha_ndbcluster::start_stmt(THD *thd, thr_lock_type lock_type)
ERR_RETURN(ndb->getNdbError());
no_uncommitted_rows_reset(thd);
thd_ndb->stmt= trans;
- trans_register_ha(thd, FALSE, &ndbcluster_hton);
+ trans_register_ha(thd, FALSE, ndbcluster_hton);
}
thd_ndb->query_state&= NDB_QUERY_NORMAL;
m_active_trans= trans;
@@ -5544,7 +5544,7 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment,
HA_HAS_RECORDS
ha_ndbcluster::ha_ndbcluster(TABLE_SHARE *table_arg):
- handler(&ndbcluster_hton, table_arg),
+ handler(ndbcluster_hton, table_arg),
m_active_trans(NULL),
m_active_cursor(NULL),
m_table(NULL),
@@ -6372,35 +6372,36 @@ static int connect_callback()
extern int ndb_dictionary_is_mysqld;
-static int ndbcluster_init()
+static int ndbcluster_init(void *p)
{
int res;
DBUG_ENTER("ndbcluster_init");
ndb_dictionary_is_mysqld= 1;
-
- {
- handlerton &h= ndbcluster_hton;
- h.state= have_ndbcluster;
- h.db_type= DB_TYPE_NDBCLUSTER;
- h.close_connection= ndbcluster_close_connection;
- h.commit= ndbcluster_commit;
- h.rollback= ndbcluster_rollback;
- h.create= ndbcluster_create_handler; /* Create a new handler */
- h.drop_database= ndbcluster_drop_database; /* Drop a database */
- h.panic= ndbcluster_end; /* Panic call */
- h.show_status= ndbcluster_show_status; /* Show status */
- h.alter_tablespace= ndbcluster_alter_tablespace; /* Show status */
- h.partition_flags= ndbcluster_partition_flags; /* Partition flags */
- h.alter_table_flags=ndbcluster_alter_table_flags; /* Alter table flags */
- h.fill_files_table= ndbcluster_fill_files_table;
+ ndbcluster_hton= (handlerton *)p;
+
+ {
+ handlerton *h= ndbcluster_hton;
+ h->state= have_ndbcluster;
+ h->db_type= DB_TYPE_NDBCLUSTER;
+ h->close_connection= ndbcluster_close_connection;
+ h->commit= ndbcluster_commit;
+ h->rollback= ndbcluster_rollback;
+ h->create= ndbcluster_create_handler; /* Create a new handler */
+ h->drop_database= ndbcluster_drop_database; /* Drop a database */
+ h->panic= ndbcluster_end; /* Panic call */
+ h->show_status= ndbcluster_show_status; /* Show status */
+ h->alter_tablespace= ndbcluster_alter_tablespace; /* Show status */
+ h->partition_flags= ndbcluster_partition_flags; /* Partition flags */
+ h->alter_table_flags=ndbcluster_alter_table_flags; /* Alter table flags */
+ h->fill_files_table= ndbcluster_fill_files_table;
#ifdef HAVE_NDB_BINLOG
ndbcluster_binlog_init_handlerton();
#endif
- h.flags= HTON_CAN_RECREATE | HTON_TEMPORARY_NOT_SUPPORTED;
- h.discover= ndbcluster_discover;
- h.find_files= ndbcluster_find_files;
- h.table_exists_in_engine= ndbcluster_table_exists_in_engine;
+ h->flags= HTON_CAN_RECREATE | HTON_TEMPORARY_NOT_SUPPORTED;
+ h->discover= ndbcluster_discover;
+ h->find_files= ndbcluster_find_files;
+ h->table_exists_in_engine= ndbcluster_table_exists_in_engine;
}
if (have_ndbcluster != SHOW_OPTION_YES)
@@ -6509,6 +6510,8 @@ ndbcluster_init_error:
delete g_ndb_cluster_connection;
g_ndb_cluster_connection= NULL;
have_ndbcluster= SHOW_OPTION_DISABLED; // If we couldn't use handler
+ ndbcluster_hton->state= SHOW_OPTION_DISABLED; // If we couldn't use handler
+
DBUG_RETURN(TRUE);
}
@@ -8113,7 +8116,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
Wait for cluster to start
*/
pthread_mutex_lock(&LOCK_ndb_util_thread);
- while (!ndb_cluster_node_id && (ndbcluster_hton.slot != ~(uint)0))
+ while (!ndb_cluster_node_id && (ndbcluster_hton->slot != ~(uint)0))
{
/* ndb not connected yet */
set_timespec(abstime, 1);
@@ -10604,7 +10607,7 @@ SHOW_VAR ndb_status_variables_export[]= {
};
struct st_mysql_storage_engine ndbcluster_storage_engine=
-{ MYSQL_HANDLERTON_INTERFACE_VERSION, &ndbcluster_hton };
+{ MYSQL_HANDLERTON_INTERFACE_VERSION, ndbcluster_hton };
mysql_declare_plugin(ndbcluster)
{
diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc
index 4e59e0ef22a..e699dd22899 100644
--- a/sql/ha_ndbcluster_binlog.cc
+++ b/sql/ha_ndbcluster_binlog.cc
@@ -662,9 +662,9 @@ static int ndbcluster_binlog_func(THD *thd, enum_binlog_func fn, void *arg)
void ndbcluster_binlog_init_handlerton()
{
- handlerton &h= ndbcluster_hton;
- h.binlog_func= ndbcluster_binlog_func;
- h.binlog_log_query= ndbcluster_binlog_log_query;
+ handlerton *h= ndbcluster_hton;
+ h->binlog_func= ndbcluster_binlog_func;
+ h->binlog_log_query= ndbcluster_binlog_log_query;
}
@@ -3431,7 +3431,7 @@ restart:
if (thd_ndb == NULL)
{
- DBUG_ASSERT(ndbcluster_hton.slot != ~(uint)0);
+ DBUG_ASSERT(ndbcluster_hton->slot != ~(uint)0);
if (!(thd_ndb= ha_ndbcluster::seize_thd_ndb()))
{
sql_print_error("Could not allocate Thd_ndb object");
diff --git a/sql/ha_ndbcluster_binlog.h b/sql/ha_ndbcluster_binlog.h
index 4c3cd105d1d..c34d70cf69a 100644
--- a/sql/ha_ndbcluster_binlog.h
+++ b/sql/ha_ndbcluster_binlog.h
@@ -103,7 +103,7 @@ extern pthread_mutex_t injector_mutex;
extern pthread_cond_t injector_cond;
extern unsigned char g_node_id_map[max_ndb_nodes];
-extern handlerton ndbcluster_hton;
+extern handlerton *ndbcluster_hton;
extern pthread_t ndb_util_thread;
extern pthread_mutex_t LOCK_ndb_util_thread;
extern pthread_cond_t COND_ndb_util_thread;
@@ -212,10 +212,10 @@ inline void real_free_share(NDB_SHARE **share)
inline
Thd_ndb *
-get_thd_ndb(THD *thd) { return (Thd_ndb *) thd->ha_data[ndbcluster_hton.slot]; }
+get_thd_ndb(THD *thd) { return (Thd_ndb *) thd->ha_data[ndbcluster_hton->slot]; }
inline
void
-set_thd_ndb(THD *thd, Thd_ndb *thd_ndb) { thd->ha_data[ndbcluster_hton.slot]= thd_ndb; }
+set_thd_ndb(THD *thd, Thd_ndb *thd_ndb) { thd->ha_data[ndbcluster_hton->slot]= thd_ndb; }
Ndb* check_ndb_in_thd(THD* thd);
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index bd8d604ef0d..e435b356def 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -74,16 +74,20 @@ static handler *partition_create_handler(TABLE_SHARE *share,
static uint partition_flags();
static uint alter_table_flags(uint flags);
-handlerton partition_hton;
+handlerton *partition_hton;
-static int partition_initialize()
+static int partition_initialize(void *p)
{
- partition_hton.state= SHOW_OPTION_YES;
- partition_hton.db_type= DB_TYPE_PARTITION_DB;
- partition_hton.create= partition_create_handler;
- partition_hton.partition_flags= partition_flags;
- partition_hton.alter_table_flags= alter_table_flags;
- partition_hton.flags= HTON_NOT_USER_SELECTABLE | HTON_HIDDEN;
+
+ partition_hton= (handlerton *)p;
+
+ partition_hton->state= SHOW_OPTION_YES;
+ partition_hton->db_type= DB_TYPE_PARTITION_DB;
+ partition_hton->create= partition_create_handler;
+ partition_hton->partition_flags= partition_flags;
+ partition_hton->alter_table_flags= alter_table_flags;
+ partition_hton->flags= HTON_NOT_USER_SELECTABLE | HTON_HIDDEN;
+
return 0;
}
@@ -152,7 +156,7 @@ static uint alter_table_flags(uint flags __attribute__((unused)))
*/
ha_partition::ha_partition(TABLE_SHARE *share)
- :handler(&partition_hton, share), m_part_info(NULL), m_create_handler(FALSE),
+ :handler(partition_hton, share), m_part_info(NULL), m_create_handler(FALSE),
m_is_sub_partitioned(0)
{
DBUG_ENTER("ha_partition::ha_partition(table)");
@@ -173,7 +177,7 @@ ha_partition::ha_partition(TABLE_SHARE *share)
*/
ha_partition::ha_partition(partition_info *part_info)
- :handler(&partition_hton, NULL), m_part_info(part_info),
+ :handler(partition_hton, NULL), m_part_info(part_info),
m_create_handler(TRUE),
m_is_sub_partitioned(m_part_info->is_sub_partitioned())
@@ -2016,7 +2020,7 @@ bool ha_partition::create_handlers(MEM_ROOT *mem_root)
DBUG_PRINT("info", ("engine_type: %u", m_engine_array[i]));
}
/* For the moment we only support partition over the same table engine */
- if (m_engine_array[0] == &myisam_hton)
+ if (m_engine_array[0] == myisam_hton)
{
DBUG_PRINT("info", ("MyISAM"));
m_myisam= TRUE;
@@ -2089,7 +2093,7 @@ bool ha_partition::new_handlers_from_part_info(MEM_ROOT *mem_root)
(uint) ha_legacy_type(part_elem->engine_type)));
}
} while (++i < m_part_info->no_parts);
- if (part_elem->engine_type == &myisam_hton)
+ if (part_elem->engine_type == myisam_hton)
{
DBUG_PRINT("info", ("MyISAM"));
m_myisam= TRUE;
@@ -5628,7 +5632,7 @@ static int free_share(PARTITION_SHARE *share)
#endif /* NOT_USED */
struct st_mysql_storage_engine partition_storage_engine=
-{ MYSQL_HANDLERTON_INTERFACE_VERSION, &partition_hton };
+{ MYSQL_HANDLERTON_INTERFACE_VERSION, partition_hton };
mysql_declare_plugin(partition)
{
diff --git a/sql/handler.cc b/sql/handler.cc
index cf080a843c7..d9ccb20fefc 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -97,7 +97,7 @@ handlerton *ha_default_handlerton(THD *thd)
return (thd->variables.table_type != NULL) ?
thd->variables.table_type :
(global_system_variables.table_type != NULL ?
- global_system_variables.table_type : &myisam_hton);
+ global_system_variables.table_type : myisam_hton);
}
@@ -378,16 +378,45 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
DBUG_RETURN(1);
break;
};
+
+ if (plugin->plugin->deinit)
+ {
+ /*
+ Today we have no defined/special behavior for uninstalling
+ engine plugins.
+ */
+ DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
+ if (plugin->plugin->deinit(NULL))
+ {
+ DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
+ plugin->name.str));
+ }
+ }
+
+ my_free((gptr)hton, MYF(0));
+
DBUG_RETURN(0);
}
int ha_initialize_handlerton(st_plugin_int *plugin)
{
- handlerton *hton= ((st_mysql_storage_engine *)plugin->plugin->info)->handlerton;
+ handlerton *hton;
DBUG_ENTER("ha_initialize_handlerton");
+ hton= (handlerton *)my_malloc(sizeof(handlerton),
+ MYF(MY_WME | MY_ZEROFILL));
+ /* Historical Requirement */
plugin->data= hton; // shortcut for the future
+ if (plugin->plugin->init)
+ {
+ if (plugin->plugin->init(hton))
+ {
+ sql_print_error("Plugin '%s' init function returned error.",
+ plugin->name.str);
+ goto err;
+ }
+ }
/*
the switch below and hton->state should be removed when
@@ -435,6 +464,8 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
break;
}
DBUG_RETURN(0);
+err:
+ DBUG_RETURN(1);
}
int ha_init()
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 58935337aa0..5cecc2e31f1 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -2547,7 +2547,7 @@ bool Item_sum_count_distinct::setup(THD *thd)
table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
table->no_rows=1;
- if (table->s->db_type == &heap_hton)
+ if (table->s->db_type == heap_hton)
{
/*
No blobs, otherwise it would have been MyISAM: set up a compare
diff --git a/sql/log.cc b/sql/log.cc
index 8a8262c174d..37f145bbecd 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -90,7 +90,7 @@ struct binlog_trx_data {
#endif
};
-handlerton binlog_hton;
+handlerton *binlog_hton;
/*
Open log table of a given type (general or slow log)
@@ -1155,30 +1155,30 @@ void Log_to_csv_event_handler::
should be moved here.
*/
-int binlog_init()
+int binlog_init(void *p)
{
-
- binlog_hton.state=opt_bin_log ? SHOW_OPTION_YES : SHOW_OPTION_NO;
- binlog_hton.db_type=DB_TYPE_BINLOG;
- binlog_hton.savepoint_offset= sizeof(my_off_t);
- binlog_hton.close_connection= binlog_close_connection;
- binlog_hton.savepoint_set= binlog_savepoint_set;
- binlog_hton.savepoint_rollback= binlog_savepoint_rollback;
- binlog_hton.commit= binlog_commit;
- binlog_hton.rollback= binlog_rollback;
- binlog_hton.prepare= binlog_prepare;
- binlog_hton.flags= HTON_NOT_USER_SELECTABLE | HTON_HIDDEN;
+ binlog_hton= (handlerton *)p;
+ binlog_hton->state=opt_bin_log ? SHOW_OPTION_YES : SHOW_OPTION_NO;
+ binlog_hton->db_type=DB_TYPE_BINLOG;
+ binlog_hton->savepoint_offset= sizeof(my_off_t);
+ binlog_hton->close_connection= binlog_close_connection;
+ binlog_hton->savepoint_set= binlog_savepoint_set;
+ binlog_hton->savepoint_rollback= binlog_savepoint_rollback;
+ binlog_hton->commit= binlog_commit;
+ binlog_hton->rollback= binlog_rollback;
+ binlog_hton->prepare= binlog_prepare;
+ binlog_hton->flags= HTON_NOT_USER_SELECTABLE | HTON_HIDDEN;
return 0;
}
static int binlog_close_connection(THD *thd)
{
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
IO_CACHE *trans_log= &trx_data->trans_log;
DBUG_ASSERT(mysql_bin_log.is_open() && trx_data->empty());
close_cached_file(trans_log);
- thd->ha_data[binlog_hton.slot]= 0;
+ thd->ha_data[binlog_hton->slot]= 0;
my_free((gptr)trx_data, MYF(0));
return 0;
}
@@ -1253,7 +1253,7 @@ static int binlog_commit(THD *thd, bool all)
{
DBUG_ENTER("binlog_commit");
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
IO_CACHE *trans_log= &trx_data->trans_log;
DBUG_ASSERT(mysql_bin_log.is_open() &&
(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))));
@@ -1278,7 +1278,7 @@ static int binlog_rollback(THD *thd, bool all)
DBUG_ENTER("binlog_rollback");
int error=0;
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
IO_CACHE *trans_log= &trx_data->trans_log;
/*
First assert is guaranteed - see trans_register_ha() call below.
@@ -1330,7 +1330,7 @@ static int binlog_savepoint_set(THD *thd, void *sv)
{
DBUG_ENTER("binlog_savepoint_set");
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
DBUG_ASSERT(mysql_bin_log.is_open() && my_b_tell(&trx_data->trans_log));
*(my_off_t *)sv= my_b_tell(&trx_data->trans_log);
@@ -1346,7 +1346,7 @@ static int binlog_savepoint_rollback(THD *thd, void *sv)
{
DBUG_ENTER("binlog_savepoint_rollback");
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
IO_CACHE *trans_log= &trx_data->trans_log;
DBUG_ASSERT(mysql_bin_log.is_open() && my_b_tell(trans_log));
@@ -3076,19 +3076,19 @@ int THD::binlog_setup_trx_data()
{
DBUG_ENTER("THD::binlog_setup_trx_data");
binlog_trx_data *trx_data=
- (binlog_trx_data*) ha_data[binlog_hton.slot];
+ (binlog_trx_data*) ha_data[binlog_hton->slot];
if (trx_data)
DBUG_RETURN(0); // Already set up
- ha_data[binlog_hton.slot]= trx_data=
+ ha_data[binlog_hton->slot]= trx_data=
(binlog_trx_data*) my_malloc(sizeof(binlog_trx_data), MYF(MY_ZEROFILL));
if (!trx_data ||
open_cached_file(&trx_data->trans_log, mysql_tmpdir,
LOG_PREFIX, binlog_cache_size, MYF(MY_WME)))
{
my_free((gptr)trx_data, MYF(MY_ALLOW_ZERO_PTR));
- ha_data[binlog_hton.slot]= 0;
+ ha_data[binlog_hton->slot]= 0;
DBUG_RETURN(1); // Didn't manage to set it up
}
trx_data->trans_log.end_of_file= max_binlog_cache_size;
@@ -3124,7 +3124,7 @@ int THD::binlog_write_table_map(TABLE *table, bool is_trans)
if (is_trans)
trans_register_ha(this,
(options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) != 0,
- &binlog_hton);
+ binlog_hton);
if ((error= mysql_bin_log.write(&the_event)))
DBUG_RETURN(error);
@@ -3138,7 +3138,7 @@ Rows_log_event*
THD::binlog_get_pending_rows_event() const
{
binlog_trx_data *const trx_data=
- (binlog_trx_data*) ha_data[binlog_hton.slot];
+ (binlog_trx_data*) ha_data[binlog_hton->slot];
/*
This is less than ideal, but here's the story: If there is no
trx_data, prepare_pending_rows_event() has never been called
@@ -3151,11 +3151,11 @@ THD::binlog_get_pending_rows_event() const
void
THD::binlog_set_pending_rows_event(Rows_log_event* ev)
{
- if (ha_data[binlog_hton.slot] == NULL)
+ if (ha_data[binlog_hton->slot] == NULL)
binlog_setup_trx_data();
binlog_trx_data *const trx_data=
- (binlog_trx_data*) ha_data[binlog_hton.slot];
+ (binlog_trx_data*) ha_data[binlog_hton->slot];
DBUG_ASSERT(trx_data);
trx_data->pending= ev;
@@ -3177,7 +3177,7 @@ int MYSQL_BIN_LOG::
int error= 0;
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
DBUG_ASSERT(trx_data);
@@ -3331,14 +3331,14 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info)
goto err;
binlog_trx_data *const trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
IO_CACHE *trans_log= &trx_data->trans_log;
bool trans_log_in_use= my_b_tell(trans_log) != 0;
if (event_info->get_cache_stmt() && !trans_log_in_use)
trans_register_ha(thd,
(thd->options &
(OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) != 0,
- &binlog_hton);
+ binlog_hton);
if (event_info->get_cache_stmt() || trans_log_in_use)
{
DBUG_PRINT("info", ("Using trans_log"));
@@ -4620,7 +4620,7 @@ int TC_LOG_BINLOG::log(THD *thd, my_xid xid)
DBUG_ENTER("TC_LOG_BINLOG::log");
Xid_log_event xle(thd, xid);
binlog_trx_data *trx_data=
- (binlog_trx_data*) thd->ha_data[binlog_hton.slot];
+ (binlog_trx_data*) thd->ha_data[binlog_hton->slot];
DBUG_RETURN(!binlog_end_trans(thd, trx_data, &xle)); // invert return value
}
@@ -4681,7 +4681,7 @@ err1:
}
struct st_mysql_storage_engine binlog_storage_engine=
-{ MYSQL_HANDLERTON_INTERFACE_VERSION, &binlog_hton };
+{ MYSQL_HANDLERTON_INTERFACE_VERSION, binlog_hton };
mysql_declare_plugin(binlog)
{
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 473de1951e5..8178d16dc54 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1624,61 +1624,63 @@ extern TYPELIB log_output_typelib;
/* optional things, have_* variables */
#ifdef WITH_INNOBASE_STORAGE_ENGINE
-extern handlerton innobase_hton;
-#define have_innodb innobase_hton.state
+extern handlerton *innobase_hton;
+extern SHOW_COMP_OPTION have_innodb;
#else
extern SHOW_COMP_OPTION have_innodb;
#endif
#ifdef WITH_EXAMPLE_STORAGE_ENGINE
-extern handlerton example_hton;
-#define have_example_db example_hton.state
+extern handlerton *example_hton;
+extern SHOW_COMP_OPTION have_example_db;
#else
extern SHOW_COMP_OPTION have_example_db;
#endif
#ifdef WITH_ARCHIVE_STORAGE_ENGINE
-extern handlerton archive_hton;
-#define have_archive_db archive_hton.state
+extern handlerton *archive_hton;
+extern SHOW_COMP_OPTION have_archive_db;
#else
extern SHOW_COMP_OPTION have_archive_db;
#endif
#ifdef WITH_CSV_STORAGE_ENGINE
-extern handlerton tina_hton;
-#define have_csv_db tina_hton.state
+extern handlerton *tina_hton;
+extern SHOW_COMP_OPTION have_csv_db;
#else
extern SHOW_COMP_OPTION have_csv_db;
#endif
#ifdef WITH_FEDERATED_STORAGE_ENGINE
-extern handlerton federated_hton;
-#define have_federated_db federated_hton.state
+extern handlerton *federated_hton;
+extern SHOW_COMP_OPTION have_federated_db;
#else
extern SHOW_COMP_OPTION have_federated_db;
#endif
#ifdef WITH_BLACKHOLE_STORAGE_ENGINE
-extern handlerton blackhole_hton;
-#define have_blackhole_db blackhole_hton.state
+extern handlerton *blackhole_hton;
+extern SHOW_COMP_OPTION have_blackhole_db;
#else
extern SHOW_COMP_OPTION have_blackhole_db;
#endif
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
-extern handlerton ndbcluster_hton;
-#define have_ndbcluster ndbcluster_hton.state
+extern handlerton *ndbcluster_hton;
+extern SHOW_COMP_OPTION have_ndbcluster;
#else
extern SHOW_COMP_OPTION have_ndbcluster;
#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
-extern handlerton partition_hton;
-#define have_partition_db partition_hton.state
+extern handlerton *partition_hton;
+extern SHOW_COMP_OPTION have_partition_db;
#else
extern SHOW_COMP_OPTION have_partition_db;
#endif
-extern handlerton myisammrg_hton;
-/* MRG_MYISAM handler is always built, but may be skipped */
-#define have_merge_db myisammrg_hton.state
+#ifdef WITH_MYISAMMRG_STORAGE_ENGINE
+extern handlerton *myisammrg_hton;
+extern SHOW_COMP_OPTION have_merge_db;
+#else
+extern SHOW_COMP_OPTION have_merge_db;
+#endif
-extern handlerton myisam_hton;
-extern handlerton myisammrg_hton;
-extern handlerton heap_hton;
+extern handlerton *myisam_hton;
+extern handlerton *heap_hton;
extern SHOW_COMP_OPTION have_row_based_replication;
extern SHOW_COMP_OPTION have_raid, have_openssl, have_symlink, have_dlopen;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 445027fa368..fe981e924b4 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3247,7 +3247,7 @@ server.");
default_storage_engine_str);
unireg_abort(1);
}
- hton= &myisam_hton;
+ hton= myisam_hton;
}
global_system_variables.table_type= hton;
}
@@ -6963,7 +6963,7 @@ static void mysql_init_variables(void)
/* Set default values for some option variables */
default_storage_engine_str= (char*) "MyISAM";
- global_system_variables.table_type= &myisam_hton;
+ global_system_variables.table_type= myisam_hton;
global_system_variables.tx_isolation= ISO_REPEATABLE_READ;
global_system_variables.select_limit= (ulonglong) HA_POS_ERROR;
max_system_variables.select_limit= (ulonglong) HA_POS_ERROR;
@@ -6984,6 +6984,51 @@ static void mysql_init_variables(void)
"d:t:i:o,/tmp/mysqld.trace");
#endif
opt_error_log= IF_WIN(1,0);
+#ifdef WITH_MYISAMMRG_STORAGE_ENGINE
+ have_merge_db= SHOW_OPTION_YES;
+#else
+ have_merge_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_INNOBASE_STORAGE_ENGINE
+ have_innodb= SHOW_OPTION_YES;
+#else
+ have_innodb= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_EXAMPLE_STORAGE_ENGINE
+ have_example_db= SHOW_OPTION_YES;
+#else
+ have_example_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_ARCHIVE_STORAGE_ENGINE
+ have_archive_db= SHOW_OPTION_YES;
+#else
+ have_archive_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_BLACKHOLE_STORAGE_ENGINE
+ have_blackhole_db= SHOW_OPTION_YES;
+#else
+ have_blackhole_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_FEDERATED_STORAGE_ENGINE
+ have_federated_db= SHOW_OPTION_YES;
+#else
+ have_federated_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_CSV_STORAGE_ENGINE
+ have_csv_db= SHOW_OPTION_YES;
+#else
+ have_csv_db= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
+ have_ndbcluster= SHOW_OPTION_DISABLED;
+#else
+ have_ndbcluster= SHOW_OPTION_NO;
+#endif
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ have_partition_db= SHOW_OPTION_YES;
+#else
+ have_partition_db= SHOW_OPTION_NO;
+#endif
#ifdef HAVE_ROW_BASED_REPLICATION
have_row_based_replication= SHOW_OPTION_YES;
#else
@@ -8050,6 +8095,7 @@ void refresh_status(THD *thd)
#undef have_federated_db
#undef have_partition_db
#undef have_blackhole_db
+#undef have_merge_db
SHOW_COMP_OPTION have_innodb= SHOW_OPTION_NO;
SHOW_COMP_OPTION have_ndbcluster= SHOW_OPTION_NO;
@@ -8059,6 +8105,7 @@ SHOW_COMP_OPTION have_csv_db= SHOW_OPTION_NO;
SHOW_COMP_OPTION have_federated_db= SHOW_OPTION_NO;
SHOW_COMP_OPTION have_partition_db= SHOW_OPTION_NO;
SHOW_COMP_OPTION have_blackhole_db= SHOW_OPTION_NO;
+SHOW_COMP_OPTION have_merge_db= SHOW_OPTION_NO;
#ifndef WITH_INNOBASE_STORAGE_ENGINE
uint innobase_flush_log_at_trx_commit;
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 286637bd9aa..3e8ad9bb78b 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -443,11 +443,11 @@ bool partition_info::check_engine_mix(handlerton **engine_array, uint no_parts)
DBUG_RETURN(TRUE);
}
} while (++i < no_parts);
- if (engine_array[0] == &myisammrg_hton ||
- engine_array[0] == &tina_hton)
+ if (engine_array[0] == myisammrg_hton ||
+ engine_array[0] == tina_hton)
{
my_error(ER_PARTITION_MERGE_ERROR, MYF(0),
- engine_array[0] == &myisammrg_hton ? "MyISAM Merge" : "CSV");
+ engine_array[0] == myisammrg_hton ? "MyISAM Merge" : "CSV");
DBUG_RETURN(TRUE);
}
DBUG_RETURN(FALSE);
diff --git a/sql/set_var.cc b/sql/set_var.cc
index bc2f0e0d823..f1348149d08 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -3591,7 +3591,7 @@ byte *sys_var_thd_storage_engine::value_ptr(THD *thd, enum_var_type type,
void sys_var_thd_storage_engine::set_default(THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
- global_system_variables.*offset= &myisam_hton;
+ global_system_variables.*offset= myisam_hton;
else
thd->variables.*offset= global_system_variables.*offset;
}
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 75c2422edf9..e0831b0f8ee 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -2389,7 +2389,7 @@ Query_cache::register_tables_from_list(TABLE_LIST *tables_used,
tables_used->engine_data))
DBUG_RETURN(0);
- if (tables_used->table->s->db_type == &myisammrg_hton)
+ if (tables_used->table->s->db_type == myisammrg_hton)
{
ha_myisammrg *handler = (ha_myisammrg *) tables_used->table->file;
MYRG_INFO *file = handler->myrg_info();
@@ -3013,7 +3013,7 @@ static TABLE_COUNTER_TYPE process_and_count_tables(TABLE_LIST *tables_used,
"other non-cacheable table(s)"));
DBUG_RETURN(0);
}
- if (tables_used->table->s->db_type == &myisammrg_hton)
+ if (tables_used->table->s->db_type == myisammrg_hton)
{
ha_myisammrg *handler = (ha_myisammrg *)tables_used->table->file;
MYRG_INFO *file = handler->myrg_info();
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index d561fb19953..ce237899b3a 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2767,8 +2767,8 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
tmp_table.s->db_create_options=0;
tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
tmp_table.s->db_low_byte_first=
- test(create_info->db_type == &myisam_hton ||
- create_info->db_type == &heap_hton);
+ test(create_info->db_type == myisam_hton ||
+ create_info->db_type == heap_hton);
tmp_table.null_row=tmp_table.maybe_null=0;
while ((item=it++))
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index af69c16c7e5..a5dc0ab0d15 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -4677,7 +4677,7 @@ the generated partition syntax in a correct manner.
DBUG_PRINT("info", ("partition changed"));
*partition_changed= TRUE;
}
- if (create_info->db_type == &partition_hton)
+ if (create_info->db_type == partition_hton)
part_info->default_engine_type= table->part_info->default_engine_type;
else
part_info->default_engine_type= create_info->db_type;
@@ -4689,7 +4689,7 @@ the generated partition syntax in a correct manner.
if (!is_native_partitioned)
{
DBUG_ASSERT(create_info->db_type);
- create_info->db_type= &partition_hton;
+ create_info->db_type= partition_hton;
}
}
}
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 84810fb3324..97c28dd1fa5 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -477,13 +477,6 @@ err:
void plugin_deinitialize(struct st_plugin_int *plugin)
{
- if (plugin_type_deinitialize[plugin->plugin->type] &&
- (*plugin_type_deinitialize[plugin->plugin->type])(plugin))
- {
- sql_print_error("Plugin '%s' of type %s failed deinitialization",
- plugin->name.str, plugin_type_names[plugin->plugin->type]);
- }
-
if (plugin->plugin->status_vars)
{
#ifdef FIX_LATER
@@ -504,10 +497,18 @@ void plugin_deinitialize(struct st_plugin_int *plugin)
#endif /* FIX_LATER */
}
- if (plugin->plugin->deinit)
+ if (plugin_type_deinitialize[plugin->plugin->type])
+ {
+ if ((*plugin_type_deinitialize[plugin->plugin->type])(plugin))
+ {
+ sql_print_error("Plugin '%s' of type %s failed deinitialization",
+ plugin->name.str, plugin_type_names[plugin->plugin->type]);
+ }
+ }
+ else if (plugin->plugin->deinit)
{
DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
- if (plugin->plugin->deinit())
+ if (plugin->plugin->deinit(NULL))
{
DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
plugin->name.str));
@@ -556,6 +557,27 @@ static int plugin_initialize(struct st_plugin_int *plugin)
{
DBUG_ENTER("plugin_initialize");
+ if (plugin_type_initialize[plugin->plugin->type])
+ {
+ if ((*plugin_type_initialize[plugin->plugin->type])(plugin))
+ {
+ sql_print_error("Plugin '%s' registration as a %s failed.",
+ plugin->name.str, plugin_type_names[plugin->plugin->type]);
+ goto err;
+ }
+ }
+ else if (plugin->plugin->init)
+ {
+ if (plugin->plugin->init(NULL))
+ {
+ sql_print_error("Plugin '%s' init function returned error.",
+ plugin->name.str);
+ goto err;
+ }
+ }
+
+ plugin->state= PLUGIN_IS_READY;
+
if (plugin->plugin->status_vars)
{
#ifdef FIX_LATER
@@ -576,24 +598,6 @@ static int plugin_initialize(struct st_plugin_int *plugin)
add_status_vars(plugin->plugin->status_vars); // add_status_vars makes a copy
#endif /* FIX_LATER */
}
- if (plugin->plugin->init)
- {
- if (plugin->plugin->init())
- {
- sql_print_error("Plugin '%s' init function returned error.",
- plugin->name.str);
- goto err;
- }
- }
- if (plugin_type_initialize[plugin->plugin->type] &&
- (*plugin_type_initialize[plugin->plugin->type])(plugin))
- {
- sql_print_error("Plugin '%s' registration as a %s failed.",
- plugin->name.str, plugin_type_names[plugin->plugin->type]);
- goto err;
- }
-
- plugin->state= PLUGIN_IS_READY;
DBUG_RETURN(0);
err:
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 39eebd25814..f4f0219139a 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8857,7 +8857,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
OPTION_BIG_TABLES || (select_options & TMP_TABLE_FORCE_MYISAM))
{
table->file= get_new_handler(share, &table->mem_root,
- share->db_type= &myisam_hton);
+ share->db_type= myisam_hton);
if (group &&
(param->group_parts > table->file->max_key_parts() ||
param->group_length > table->file->max_key_length()))
@@ -8866,7 +8866,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
else
{
table->file= get_new_handler(share, &table->mem_root,
- share->db_type= &heap_hton);
+ share->db_type= heap_hton);
}
if (!table->file)
goto err;
@@ -9027,7 +9027,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
if (thd->variables.tmp_table_size == ~(ulong) 0) // No limit
share->max_rows= ~(ha_rows) 0;
else
- share->max_rows= (((share->db_type == &heap_hton) ?
+ share->max_rows= (((share->db_type == heap_hton) ?
min(thd->variables.tmp_table_size,
thd->variables.max_heap_table_size) :
thd->variables.tmp_table_size)/ share->reclength);
@@ -9172,7 +9172,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
if (thd->is_fatal_error) // If end of memory
goto err; /* purecov: inspected */
share->db_record_offset= 1;
- if (share->db_type == &myisam_hton)
+ if (share->db_type == myisam_hton)
{
if (create_myisam_tmp_table(table,param,select_options))
goto err;
@@ -9498,7 +9498,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
int write_err;
DBUG_ENTER("create_myisam_from_heap");
- if (table->s->db_type != &heap_hton ||
+ if (table->s->db_type != heap_hton ||
error != HA_ERR_RECORD_FILE_FULL)
{
table->file->print_error(error,MYF(0));
@@ -9507,9 +9507,9 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
new_table= *table;
share= *table->s;
new_table.s= &share;
- new_table.s->db_type= &myisam_hton;
+ new_table.s->db_type= myisam_hton;
if (!(new_table.file= get_new_handler(&share, &new_table.mem_root,
- &myisam_hton)))
+ myisam_hton)))
DBUG_RETURN(1); // End of memory
save_proc_info=thd->proc_info;
@@ -12120,7 +12120,7 @@ remove_duplicates(JOIN *join, TABLE *entry,List<Item> &fields, Item *having)
free_io_cache(entry); // Safety
entry->file->info(HA_STATUS_VARIABLE);
- if (entry->s->db_type == &heap_hton ||
+ if (entry->s->db_type == heap_hton ||
(!entry->s->blob_fields &&
((ALIGN_SIZE(reclength) + HASH_OVERHEAD) * entry->file->stats.records <
thd->variables.sortbuff_size)))
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 9a41c139f4e..c46deacbaeb 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2925,7 +2925,7 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables,
ha_row_type[(uint) share->row_type],
NullS);
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if (show_table->s->db_type == &partition_hton &&
+ if (show_table->s->db_type == partition_hton &&
show_table->part_info != NULL &&
show_table->part_info->no_parts > 0)
ptr= strmov(ptr, " partitioned");
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 02de7abb674..610771724e1 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3276,7 +3276,7 @@ bool mysql_create_table_internal(THD *thd,
goto err;
}
}
- if ((part_engine_type == &partition_hton) &&
+ if ((part_engine_type == partition_hton) &&
part_info->default_engine_type)
{
/*
@@ -3319,7 +3319,7 @@ bool mysql_create_table_internal(THD *thd,
part_info->part_info_len= syntax_len;
if ((!(engine_type->partition_flags &&
engine_type->partition_flags() & HA_CAN_PARTITION)) ||
- create_info->db_type == &partition_hton)
+ create_info->db_type == partition_hton)
{
/*
The handler assigned to the table cannot handle partitioning.
@@ -3328,7 +3328,7 @@ bool mysql_create_table_internal(THD *thd,
DBUG_PRINT("info", ("db_type: %d",
ha_legacy_type(create_info->db_type)));
delete file;
- create_info->db_type= &partition_hton;
+ create_info->db_type= partition_hton;
if (!(file= get_ha_partition(part_info)))
{
DBUG_RETURN(TRUE);
@@ -6779,7 +6779,7 @@ static bool check_engine(THD *thd, const char *table_name,
*new_engine= 0;
return TRUE;
}
- *new_engine= &myisam_hton;
+ *new_engine= myisam_hton;
}
return FALSE;
}
diff --git a/sql/table.cc b/sql/table.cc
index fe83398115d..9f52a8c0346 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -632,7 +632,7 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
if (!strncmp(next_chunk + 2, "partition", str_db_type_length))
{
/* Use partition handler */
- share->db_type= &partition_hton;
+ share->db_type= partition_hton;
DBUG_PRINT("info", ("setting dbtype to '%.*s' (%d)",
str_db_type_length, next_chunk + 2,
ha_legacy_type(share->db_type)));