From 2daf8121c081e4e65ca5fd971cb7df460b9ca0f2 Mon Sep 17 00:00:00 2001 From: vasil <> Date: Tue, 6 May 2008 10:01:41 +0000 Subject: [PATCH] branches/zip: Allow InnoDB I_S plugins to be installed when InnoDB storage engine is not installed but show empty tables when SELECTing from them in this case. Set srv_was_started to FALSE at the end of innobase_shutdown_for_mysql() so the I_S plugins can detect if InnoDB is uninstalled. This is needed to workaround the MySQL Bug#36399 Double free bug when INFORMATION_SCHEMA plugin init function fails and is more flexible as it allows I_S plugins to be installed before the InnoDB plugin and detects if the latter is uninstalled after this. Approved by: Heikki --- handler/i_s.cc | 40 +++++++++++++++++----------------------- srv/srv0start.c | 2 ++ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/handler/i_s.cc b/handler/i_s.cc index 5eabad7c49a..65503e622ff 100644 --- a/handler/i_s.cc +++ b/handler/i_s.cc @@ -33,15 +33,17 @@ static const char plugin_author[] = "Innobase Oy"; DBUG_RETURN(1); \ } -#define FAIL_IF_INNODB_NOT_STARTED(plugin_name) \ -do { \ - if (!srv_was_started) { \ - sql_print_error("InnoDB: Cannot install the " \ - plugin_name " plugin because " \ - "the InnoDB storage engine is " \ - "not installed."); \ - DBUG_RETURN(1); \ - } \ +#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \ +do { \ + if (!srv_was_started) { \ + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, \ + ER_CANT_FIND_SYSTEM_REC, \ + "InnoDB: SELECTing from " \ + "INFORMATION_SCHEMA.%s but " \ + "the InnoDB storage engine " \ + "is not installed", plugin_name); \ + DBUG_RETURN(0); \ + } \ } while (0) #if !defined __STRICT_ANSI__ && defined __GNUC__ && (__GNUC__) > 2 && !defined __INTEL_COMPILER @@ -372,8 +374,6 @@ innodb_trx_init( DBUG_ENTER("innodb_trx_init"); - FAIL_IF_INNODB_NOT_STARTED("INNODB_TRX"); - schema = (ST_SCHEMA_TABLE*) p; schema->fields_info = innodb_trx_fields_info; @@ -654,8 +654,6 @@ innodb_locks_init( DBUG_ENTER("innodb_locks_init"); - FAIL_IF_INNODB_NOT_STARTED("INNODB_LOCKS"); - schema = (ST_SCHEMA_TABLE*) p; schema->fields_info = innodb_locks_fields_info; @@ -839,8 +837,6 @@ innodb_lock_waits_init( DBUG_ENTER("innodb_lock_waits_init"); - FAIL_IF_INNODB_NOT_STARTED("INNODB_LOCK_WAITS"); - schema = (ST_SCHEMA_TABLE*) p; schema->fields_info = innodb_lock_waits_fields_info; @@ -932,6 +928,8 @@ trx_i_s_common_fill_table( table_name = tables->schema_table_name; /* or table_name = tables->schema_table->table_name; */ + RETURN_IF_INNODB_NOT_STARTED(table_name); + /* update the cache */ trx_i_s_cache_start_write(cache); trx_i_s_possibly_fetch_data_into_cache(cache); @@ -1081,6 +1079,8 @@ i_s_cmp_fill_low( DBUG_RETURN(0); } + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); + for (uint i = 0; i < PAGE_ZIP_NUM_SSIZE - 1; i++) { page_zip_stat_t* zip_stat = &page_zip_stat[i]; @@ -1153,8 +1153,6 @@ i_s_cmp_init( DBUG_ENTER("i_s_cmp_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - FAIL_IF_INNODB_NOT_STARTED("INNODB_CMP"); - schema->fields_info = i_s_cmp_fields_info; schema->fill_table = i_s_cmp_fill; @@ -1173,8 +1171,6 @@ i_s_cmp_reset_init( DBUG_ENTER("i_s_cmp_reset_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - FAIL_IF_INNODB_NOT_STARTED("INNODB_CMP_RESET"); - schema->fields_info = i_s_cmp_fields_info; schema->fill_table = i_s_cmp_reset_fill; @@ -1351,6 +1347,8 @@ i_s_cmpmem_fill_low( DBUG_RETURN(0); } + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); + buf_pool_mutex_enter(); for (uint x = 0; x <= BUF_BUDDY_SIZES; x++) { @@ -1421,8 +1419,6 @@ i_s_cmpmem_init( DBUG_ENTER("i_s_cmpmem_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - FAIL_IF_INNODB_NOT_STARTED("INNODB_CMPMEM"); - schema->fields_info = i_s_cmpmem_fields_info; schema->fill_table = i_s_cmpmem_fill; @@ -1441,8 +1437,6 @@ i_s_cmpmem_reset_init( DBUG_ENTER("i_s_cmpmem_reset_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - FAIL_IF_INNODB_NOT_STARTED("INNODB_CMPMEM_RESET"); - schema->fields_info = i_s_cmpmem_fields_info; schema->fill_table = i_s_cmpmem_reset_fill; diff --git a/srv/srv0start.c b/srv/srv0start.c index 446622d6016..0f3709c8ace 100644 --- a/srv/srv0start.c +++ b/srv/srv0start.c @@ -1930,6 +1930,8 @@ innobase_shutdown_for_mysql(void) srv_shutdown_lsn); } + srv_was_started = FALSE; + return((int) DB_SUCCESS); }