Commit c849b7df authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-11785 Remove INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO

The INFORMATION_SCHEMA view INNODB_TEMP_TABLE_INFO was added to
MySQL 5.7 as part of the work to implement temporary tables
without any redo logging.

The only use case of this view was SELECT COUNT(*) in some tests,
to see how many temporary tables exist in InnoDB. The columns do
not report much useful information. For example, the table name
would not be the user-specified table name, but a generated #sql
name. Also, the session that created the table is not identified.
parent bb109aee
......@@ -23396,7 +23396,6 @@ i_s_innodb_cmp_per_index_reset,
i_s_innodb_buffer_page,
i_s_innodb_buffer_page_lru,
i_s_innodb_buffer_stats,
i_s_innodb_temp_table_info,
i_s_innodb_metrics,
i_s_innodb_ft_default_stopword,
i_s_innodb_ft_deleted,
......
/*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
Copyrigth (c) 2014, 2016, MariaDB Corporation
Copyrigth (c) 2014, 2017, MariaDB Corporation
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
......@@ -4097,287 +4097,6 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_ft_config =
STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE),
};
/* Fields of the dynamic table INNODB_TEMP_TABLE_INFO. */
static ST_FIELD_INFO i_s_innodb_temp_table_info_fields_info[] =
{
#define IDX_TEMP_TABLE_ID 0
{STRUCT_FLD(field_name, "TABLE_ID"),
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
#define IDX_TEMP_TABLE_NAME 1
{STRUCT_FLD(field_name, "NAME"),
STRUCT_FLD(field_length, MAX_TABLE_UTF8_LEN),
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
#define IDX_TEMP_TABLE_N_COLS 2
{STRUCT_FLD(field_name, "N_COLS"),
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
#define IDX_TEMP_TABLE_SPACE_ID 3
{STRUCT_FLD(field_name, "SPACE"),
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
#define IDX_TEMP_TABLE_PTT 4
{STRUCT_FLD(field_name, "PER_TABLE_TABLESPACE"),
STRUCT_FLD(field_length, 64),
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
#define IDX_TEMP_TABLE_IS_COMPRESSED 5
{STRUCT_FLD(field_name, "IS_COMPRESSED"),
STRUCT_FLD(field_length, 64),
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
STRUCT_FLD(value, 0),
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
STRUCT_FLD(old_name, ""),
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
END_OF_ST_FIELD_INFO
};
struct temp_table_info_t{
table_id_t m_table_id;
char m_table_name[MAX_TABLE_UTF8_LEN];
unsigned m_n_cols;
unsigned m_space_id;
char m_per_table_tablespace[64];
char m_is_compressed[64];
};
typedef std::vector<temp_table_info_t, ut_allocator<temp_table_info_t> >
temp_table_info_cache_t;
/*******************************************************************//**
Fill Information Schema table INNODB_TEMP_TABLE_INFO for a particular
temp-table
@return 0 on success, 1 on failure */
static
int
i_s_innodb_temp_table_info_fill(
/*=============================*/
THD* thd, /*!< in: thread */
TABLE_LIST* tables, /*!< in/out: tables
to fill */
const temp_table_info_t* info) /*!< in: temp-table
information */
{
TABLE* table;
Field** fields;
DBUG_ENTER("i_s_innodb_temp_table_info_fill");
table = tables->table;
fields = table->field;
OK(fields[IDX_TEMP_TABLE_ID]->store(info->m_table_id, true));
OK(field_store_string(
fields[IDX_TEMP_TABLE_NAME], info->m_table_name));
OK(fields[IDX_TEMP_TABLE_N_COLS]->store(info->m_n_cols));
OK(fields[IDX_TEMP_TABLE_SPACE_ID]->store(info->m_space_id));
OK(field_store_string(
fields[IDX_TEMP_TABLE_PTT], info->m_per_table_tablespace));
OK(field_store_string(
fields[IDX_TEMP_TABLE_IS_COMPRESSED], info->m_is_compressed));
DBUG_RETURN(schema_table_store_record(thd, table));
}
/*******************************************************************//**
Populate current table information to cache */
static
void
innodb_temp_table_populate_cache(
/*=============================*/
const dict_table_t* table, /*! in: table */
temp_table_info_t* cache) /*! in/out: populate data in this
cache */
{
cache->m_table_id = table->id;
char db_utf8[MAX_DB_UTF8_LEN];
char table_utf8[MAX_TABLE_UTF8_LEN];
dict_fs2utf8(table->name.m_name,
db_utf8, sizeof(db_utf8),
table_utf8, sizeof(table_utf8));
strcpy(cache->m_table_name, table_utf8);
cache->m_n_cols = table->n_cols;
cache->m_space_id = table->space;
if (fsp_is_system_temporary(table->space)) {
strcpy(cache->m_per_table_tablespace, "FALSE");
} else {
strcpy(cache->m_per_table_tablespace, "TRUE");
}
if (dict_table_page_size(table).is_compressed()) {
strcpy(cache->m_is_compressed, "TRUE");
} else {
strcpy(cache->m_is_compressed, "FALSE");
}
}
/*******************************************************************//**
This function will iterate over all available table and will fill
stats for temp-tables to INNODB_TEMP_TABLE_INFO.
@return 0 on success, 1 on failure */
static
int
i_s_innodb_temp_table_info_fill_table(
/*===================================*/
THD* thd, /*!< in: thread */
TABLE_LIST* tables, /*!< in/out: tables to fill */
Item* ) /*!< in: condition (ignored) */
{
int status = 0;
dict_table_t* table = NULL;
DBUG_ENTER("i_s_innodb_temp_table_info_fill_table");
/* Only allow the PROCESS privilege holder to access the stats */
if (check_global_access(thd, PROCESS_ACL)) {
DBUG_RETURN(0);
}
/* First populate all temp-table info by acquiring dict_sys->mutex.
Note: Scan is being done on NON-LRU list which mainly has system
table entries and temp-table entries. This means 2 things: list
is smaller so processing would be faster and most of the data
is relevant */
temp_table_info_cache_t all_temp_info_cache;
all_temp_info_cache.reserve(UT_LIST_GET_LEN(dict_sys->table_non_LRU));
mutex_enter(&dict_sys->mutex);
for (table = UT_LIST_GET_FIRST(dict_sys->table_non_LRU);
table != NULL;
table = UT_LIST_GET_NEXT(table_LRU, table)) {
if (!dict_table_is_temporary(table)) {
continue;
}
temp_table_info_t current_temp_table_info;
innodb_temp_table_populate_cache(
table, &current_temp_table_info);
all_temp_info_cache.push_back(current_temp_table_info);
}
mutex_exit(&dict_sys->mutex);
/* Now populate the info to MySQL table */
temp_table_info_cache_t::const_iterator end = all_temp_info_cache.end();
for (temp_table_info_cache_t::const_iterator it
= all_temp_info_cache.begin();
it != end;
it++) {
status = i_s_innodb_temp_table_info_fill(thd, tables, &(*it));
if (status) {
break;
}
}
DBUG_RETURN(status);
}
/*******************************************************************//**
Bind the dynamic table INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO.
@return 0 on success, 1 on failure */
static
int
i_s_innodb_temp_table_info_init(
/*=============================*/
void* p) /*!< in/out: table schema object */
{
ST_SCHEMA_TABLE* schema;
DBUG_ENTER("i_s_innodb_temp_table_info_init");
schema = reinterpret_cast<ST_SCHEMA_TABLE*>(p);
schema->fields_info = i_s_innodb_temp_table_info_fields_info;
schema->fill_table = i_s_innodb_temp_table_info_fill_table;
DBUG_RETURN(0);
}
struct st_maria_plugin i_s_innodb_temp_table_info =
{
/* the plugin type (a MYSQL_XXX_PLUGIN value) */
/* int */
STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN),
/* pointer to type-specific plugin descriptor */
/* void* */
STRUCT_FLD(info, &i_s_info),
/* plugin name */
/* const char* */
STRUCT_FLD(name, "INNODB_TEMP_TABLE_INFO"),
/* plugin author (for SHOW PLUGINS) */
/* const char* */
STRUCT_FLD(author, plugin_author),
/* general descriptive text (for SHOW PLUGINS) */
/* const char* */
STRUCT_FLD(descr, "InnoDB Temp Table Stats"),
/* the plugin license (PLUGIN_LICENSE_XXX) */
/* int */
STRUCT_FLD(license, PLUGIN_LICENSE_GPL),
/* the function to invoke when plugin is loaded */
/* int (*)(void*); */
STRUCT_FLD(init, i_s_innodb_temp_table_info_init),
/* the function to invoke when plugin is unloaded */
/* int (*)(void*); */
STRUCT_FLD(deinit, i_s_common_deinit),
/* plugin version (for SHOW PLUGINS) */
/* unsigned int */
STRUCT_FLD(version, INNODB_VERSION_SHORT),
/* struct st_mysql_show_var* */
STRUCT_FLD(status_vars, NULL),
/* struct st_mysql_sys_var** */
STRUCT_FLD(system_vars, NULL),
STRUCT_FLD(version_info, INNODB_VERSION_STR),
STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_GAMMA)
};
/* Fields of the dynamic table INNODB_BUFFER_POOL_STATS. */
static ST_FIELD_INFO i_s_innodb_buffer_stats_fields_info[] =
{
......
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyrigth (c) 2014, 2016, MariaDB Corporation
Copyrigth (c) 2014, 2017, MariaDB Corporation
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
......@@ -50,7 +50,6 @@ extern struct st_maria_plugin i_s_innodb_ft_config;
extern struct st_maria_plugin i_s_innodb_buffer_page;
extern struct st_maria_plugin i_s_innodb_buffer_page_lru;
extern struct st_maria_plugin i_s_innodb_buffer_stats;
extern struct st_maria_plugin i_s_innodb_temp_table_info;
extern struct st_maria_plugin i_s_innodb_sys_tables;
extern struct st_maria_plugin i_s_innodb_sys_tablestats;
extern struct st_maria_plugin i_s_innodb_sys_indexes;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment