diff options
author | Sergei Golubchik <sergii@pisem.net> | 2011-07-18 23:04:24 +0200 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2011-07-18 23:04:24 +0200 |
commit | 4e46d8e5bff140f2549841167dc4b65a3c0a645d (patch) | |
tree | c6612dcc1d0fbd801c084e6c36307d9e5913a293 /storage/xtradb/handler/i_s.cc | |
parent | 9a02c69f5c6766eaf552284a2a4dd0f1d26ecd2c (diff) | |
parent | d4d7a8fa62c406be73f6c0f6d75e795293db548b (diff) | |
download | mariadb-git-4e46d8e5bff140f2549841167dc4b65a3c0a645d.tar.gz |
merge with xtradb-5.5.15
fix test cases
Diffstat (limited to 'storage/xtradb/handler/i_s.cc')
-rw-r--r-- | storage/xtradb/handler/i_s.cc | 4847 |
1 files changed, 2855 insertions, 1992 deletions
diff --git a/storage/xtradb/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 17c22212ab5..6154ddb3cb4 100644 --- a/storage/xtradb/handler/i_s.cc +++ b/storage/xtradb/handler/i_s.cc @@ -32,26 +32,28 @@ Created July 18, 2007 Vasil Dimov #include <mysys_err.h> #include <my_sys.h> #include "i_s.h" -#include "innodb_patch_info.h" -#include <mysql/plugin.h> +#include <sql_plugin.h> +#include <mysql/innodb_priv.h> extern "C" { -#include "trx0i_s.h" -#include "trx0trx.h" /* for TRX_QUE_STATE_STR_MAX_LEN */ +#include "btr0pcur.h" /* for file sys_tables related info. */ +#include "btr0types.h" #include "buf0buddy.h" /* for i_s_cmpmem */ #include "buf0buf.h" /* for buf_pool and PAGE_ZIP_MIN_SIZE */ +#include "dict0load.h" /* for file sys_tables related info. */ +#include "dict0mem.h" +#include "dict0types.h" #include "ha_prototypes.h" /* for innobase_convert_name() */ #include "srv0start.h" /* for srv_was_started */ -#include "btr0btr.h" /* for btr_page_get_index_id */ +#include "trx0i_s.h" +#include "trx0trx.h" /* for TRX_QUE_STATE_STR_MAX_LEN */ #include "trx0rseg.h" /* for trx_rseg_struct */ #include "trx0sys.h" /* for trx_sys */ #include "dict0dict.h" /* for dict_sys */ -#include "btr0pcur.h" #include "buf0lru.h" /* for XTRA_LRU_[DUMP/RESTORE] */ +#include "btr0btr.h" /* for btr_page_get_index_id */ } -static const char plugin_author[] = "Innobase Oy"; - #define OK(expr) \ if ((expr) != 0) { \ DBUG_RETURN(1); \ @@ -115,11 +117,6 @@ time_t MYSQL_TYPE_DATETIME --------------------------------- */ -/* XXX these are defined in mysql_priv.h inside #ifdef MYSQL_SERVER */ -bool schema_table_store_record(THD *thd, TABLE *table); -void localtime_to_TIME(MYSQL_TIME *to, struct tm *from); -bool check_global_access(THD *thd, ulong want_access); - /*******************************************************************//** Common function to fill any of the dynamic tables: INFORMATION_SCHEMA.innodb_trx @@ -142,7 +139,6 @@ int i_s_common_deinit( /*==============*/ void* p); /*!< in/out: table schema object */ - /*******************************************************************//** Auxiliary function to store time_t value in MYSQL_TYPE_DATETIME field. @@ -224,357 +220,56 @@ field_store_ulint( return(ret); } -/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_patches */ -static ST_FIELD_INFO innodb_patches_fields_info[] = +/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_trx */ +static ST_FIELD_INFO innodb_trx_fields_info[] = { -#define IDX_PATCH_NAME 0 - {STRUCT_FLD(field_name, "name"), - STRUCT_FLD(field_length, 255), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), - STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, 0), - STRUCT_FLD(old_name, ""), - STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - -#define IDX_PATCH_DESCR 1 - {STRUCT_FLD(field_name, "description"), - STRUCT_FLD(field_length, 255), +#define IDX_TRX_ID 0 + {STRUCT_FLD(field_name, "trx_id"), + STRUCT_FLD(field_length, TRX_ID_MAX_LEN + 1), STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_PATCH_COMMENT 2 - {STRUCT_FLD(field_name, "comment"), - STRUCT_FLD(field_length, 100), +#define IDX_TRX_STATE 1 + {STRUCT_FLD(field_name, "trx_state"), + STRUCT_FLD(field_length, TRX_QUE_STATE_STR_MAX_LEN + 1), STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_PATCH_LINK 3 - {STRUCT_FLD(field_name, "link"), - STRUCT_FLD(field_length, 255), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), +#define IDX_TRX_STARTED 2 + {STRUCT_FLD(field_name, "trx_started"), + STRUCT_FLD(field_length, 0), + STRUCT_FLD(field_type, MYSQL_TYPE_DATETIME), STRUCT_FLD(value, 0), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - END_OF_ST_FIELD_INFO -}; - -static struct st_mysql_information_schema i_s_info = -{ - MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION -}; - -/*********************************************************************** -Fill the dynamic table information_schema.innodb_patches */ -static -int -innodb_patches_fill( -/*=============*/ - /* out: 0 on success, 1 on failure */ - THD* thd, /* in: thread */ - TABLE_LIST* tables, /* in/out: tables to fill */ - COND* cond) /* in: condition (ignored) */ -{ - TABLE* table = (TABLE *) tables->table; - int status = 0; - int i; - Field** fields; - - - DBUG_ENTER("innodb_patches_fill"); - fields = table->field; - - /* deny access to non-superusers */ - if (check_global_access(thd, PROCESS_ACL)) { - - DBUG_RETURN(0); - } - - RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); - - for (i = 0; innodb_enhancements[i].file; i++) { - - field_store_string(fields[0],innodb_enhancements[i].file); - field_store_string(fields[1],innodb_enhancements[i].name); - field_store_string(fields[2],innodb_enhancements[i].comment); - field_store_string(fields[3],innodb_enhancements[i].link); - - if (schema_table_store_record(thd, table)) { - status = 1; - break; - } - - } - - - DBUG_RETURN(status); -} - -/*********************************************************************** -Bind the dynamic table information_schema.innodb_patches. */ -static -int -innodb_patches_init( -/*=========*/ - /* out: 0 on success */ - void* p) /* in/out: table schema object */ -{ - DBUG_ENTER("innodb_patches_init"); - ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - - schema->fields_info = innodb_patches_fields_info; - schema->fill_table = innodb_patches_fill; - - DBUG_RETURN(0); -} - - -UNIV_INTERN struct st_mysql_plugin i_s_innodb_patches = -{ - /* 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, "XTRADB_ENHANCEMENTS"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, "Percona"), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Enhancements applied to InnoDB plugin"), - - /* 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, innodb_patches_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), - - /* reserved for dependency checking */ - /* void* */ - STRUCT_FLD(__reserved1, NULL) -}; - -UNIV_INTERN struct st_maria_plugin i_s_innodb_patches_maria = -{ - /* 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, "XTRADB_ENHANCEMENTS"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, "Percona"), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Enhancements applied to InnoDB plugin"), - - /* 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, innodb_patches_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - - -static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_fields_info[] = -{ - {STRUCT_FLD(field_name, "page_type"), - STRUCT_FLD(field_length, 64), +#define IDX_TRX_REQUESTED_LOCK_ID 3 + {STRUCT_FLD(field_name, "trx_requested_lock_id"), + STRUCT_FLD(field_length, TRX_I_S_LOCK_ID_MAX_LEN + 1), 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)}, - {STRUCT_FLD(field_name, "space_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)}, - - {STRUCT_FLD(field_name, "page_no"), - 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)}, - - {STRUCT_FLD(field_name, "lru_position"), - 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)}, - - {STRUCT_FLD(field_name, "fix_count"), - 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)}, - - {STRUCT_FLD(field_name, "flush_type"), - 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)}, - - END_OF_ST_FIELD_INFO -}; - -static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_index_fields_info[] = -{ - {STRUCT_FLD(field_name, "index_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)}, - - {STRUCT_FLD(field_name, "space_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)}, - - {STRUCT_FLD(field_name, "page_no"), - 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)}, - - {STRUCT_FLD(field_name, "n_recs"), - 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)}, - - {STRUCT_FLD(field_name, "data_size"), - 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)}, - - {STRUCT_FLD(field_name, "hashed"), - 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)}, - - {STRUCT_FLD(field_name, "access_time"), - 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)}, - - {STRUCT_FLD(field_name, "modified"), - 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)}, - - {STRUCT_FLD(field_name, "dirty"), - 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)}, - - {STRUCT_FLD(field_name, "old"), - STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), - STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), +#define IDX_TRX_WAIT_STARTED 4 + {STRUCT_FLD(field_name, "trx_wait_started"), + STRUCT_FLD(field_length, 0), + STRUCT_FLD(field_type, MYSQL_TYPE_DATETIME), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), + STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "lru_position"), +#define IDX_TRX_WEIGHT 5 + {STRUCT_FLD(field_name, "trx_weight"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -582,7 +277,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_index_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "fix_count"), +#define IDX_TRX_MYSQL_THREAD_ID 6 + {STRUCT_FLD(field_name, "trx_mysql_thread_id"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -590,28 +286,26 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_index_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "flush_type"), - STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), - STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), +#define IDX_TRX_QUERY 7 + {STRUCT_FLD(field_name, "trx_query"), + STRUCT_FLD(field_length, TRX_I_S_TRX_QUERY_MAX_LEN), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), + 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 -}; - -static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = -{ - {STRUCT_FLD(field_name, "space_id"), - STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), - STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), +#define IDX_TRX_OPERATION_STATE 8 + {STRUCT_FLD(field_name, "trx_operation_state"), + STRUCT_FLD(field_length, TRX_I_S_TRX_OP_STATE_MAX_LEN), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), + STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "page_no"), +#define IDX_TRX_TABLES_IN_USE 9 + {STRUCT_FLD(field_name, "trx_tables_in_use"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -619,7 +313,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "compressed"), +#define IDX_TRX_TABLES_LOCKED 10 + {STRUCT_FLD(field_name, "trx_tables_locked"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -627,7 +322,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "part_len"), +#define IDX_TRX_LOCK_STRUCTS 11 + {STRUCT_FLD(field_name, "trx_lock_structs"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -635,7 +331,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "next_page_no"), +#define IDX_TRX_LOCK_MEMORY_BYTES 12 + {STRUCT_FLD(field_name, "trx_lock_memory_bytes"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -643,7 +340,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "lru_position"), +#define IDX_TRX_ROWS_LOCKED 13 + {STRUCT_FLD(field_name, "trx_rows_locked"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -651,7 +349,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "fix_count"), +#define IDX_TRX_ROWS_MODIFIED 14 + {STRUCT_FLD(field_name, "trx_rows_modified"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -659,7 +358,8 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "flush_type"), +#define IDX_TRX_CONNCURRENCY_TICKETS 15 + {STRUCT_FLD(field_name, "trx_concurrency_tickets"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -667,695 +367,53 @@ static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - END_OF_ST_FIELD_INFO -}; - -/*********************************************************************** -Fill the dynamic table information_schema.innodb_buffer_pool_pages. */ -static -int -i_s_innodb_buffer_pool_pages_fill( -/*================*/ - /* out: 0 on success, 1 on failure */ - THD* thd, /* in: thread */ - TABLE_LIST* tables, /* in/out: tables to fill */ - COND* cond) /* in: condition (ignored) */ -{ - TABLE* table = (TABLE *) tables->table; - int status = 0; - - ulint n_chunks, n_blocks; - - buf_chunk_t* chunk; - - DBUG_ENTER("i_s_innodb_buffer_pool_pages_fill"); - - /* deny access to non-superusers */ - if (check_global_access(thd, PROCESS_ACL)) { - - DBUG_RETURN(0); - } - - RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); - - buf_pool_mutex_enter(); - - chunk = buf_pool->chunks; - - for (n_chunks = buf_pool->n_chunks; n_chunks--; chunk++) { - buf_block_t* block = chunk->blocks; - - for (n_blocks = chunk->size; n_blocks--; block++) { - const buf_frame_t* frame = block->frame; - - char page_type[64]; - - switch(fil_page_get_type(frame)) - { - case FIL_PAGE_INDEX: - strcpy(page_type, "index"); - break; - case FIL_PAGE_UNDO_LOG: - strcpy(page_type, "undo_log"); - break; - case FIL_PAGE_INODE: - strcpy(page_type, "inode"); - break; - case FIL_PAGE_IBUF_FREE_LIST: - strcpy(page_type, "ibuf_free_list"); - break; - case FIL_PAGE_TYPE_ALLOCATED: - strcpy(page_type, "allocated"); - break; - case FIL_PAGE_IBUF_BITMAP: - strcpy(page_type, "bitmap"); - break; - case FIL_PAGE_TYPE_SYS: - strcpy(page_type, "sys"); - break; - case FIL_PAGE_TYPE_TRX_SYS: - strcpy(page_type, "trx_sys"); - break; - case FIL_PAGE_TYPE_FSP_HDR: - strcpy(page_type, "fsp_hdr"); - break; - case FIL_PAGE_TYPE_XDES: - strcpy(page_type, "xdes"); - break; - case FIL_PAGE_TYPE_BLOB: - strcpy(page_type, "blob"); - break; - case FIL_PAGE_TYPE_ZBLOB: - strcpy(page_type, "zblob"); - break; - case FIL_PAGE_TYPE_ZBLOB2: - strcpy(page_type, "zblob2"); - break; - default: - sprintf(page_type, "unknown (type=%li)", fil_page_get_type(frame)); - } - - field_store_string(table->field[0], page_type); - table->field[1]->store(block->page.space); - table->field[2]->store(block->page.offset); - table->field[3]->store(0); - table->field[4]->store(block->page.buf_fix_count); - table->field[5]->store(block->page.flush_type); - - if (schema_table_store_record(thd, table)) { - status = 1; - break; - } - - } - } - - buf_pool_mutex_exit(); - - DBUG_RETURN(status); -} - -/*********************************************************************** -Fill the dynamic table information_schema.innodb_buffer_pool_pages_index. */ -static -int -i_s_innodb_buffer_pool_pages_index_fill( -/*================*/ - /* out: 0 on success, 1 on failure */ - THD* thd, /* in: thread */ - TABLE_LIST* tables, /* in/out: tables to fill */ - COND* cond) /* in: condition (ignored) */ -{ - TABLE* table = (TABLE *) tables->table; - int status = 0; - - ulint n_chunks, n_blocks; - dulint index_id; - - buf_chunk_t* chunk; - - DBUG_ENTER("i_s_innodb_buffer_pool_pages_index_fill"); - - /* deny access to non-superusers */ - if (check_global_access(thd, PROCESS_ACL)) { - - DBUG_RETURN(0); - } - - RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); - - buf_pool_mutex_enter(); - - chunk = buf_pool->chunks; - - for (n_chunks = buf_pool->n_chunks; n_chunks--; chunk++) { - buf_block_t* block = chunk->blocks; - - for (n_blocks = chunk->size; n_blocks--; block++) { - const buf_frame_t* frame = block->frame; - - if (fil_page_get_type(frame) == FIL_PAGE_INDEX) { - index_id = btr_page_get_index_id(frame); - table->field[0]->store(ut_conv_dulint_to_longlong(index_id)); - table->field[1]->store(block->page.space); - table->field[2]->store(block->page.offset); - table->field[3]->store(page_get_n_recs(frame)); - table->field[4]->store(page_get_data_size(frame)); - table->field[5]->store(block->is_hashed); - table->field[6]->store(block->page.access_time); - table->field[7]->store(block->page.newest_modification != 0); - table->field[8]->store(block->page.oldest_modification != 0); - table->field[9]->store(block->page.old); - table->field[10]->store(0); - table->field[11]->store(block->page.buf_fix_count); - table->field[12]->store(block->page.flush_type); - - if (schema_table_store_record(thd, table)) { - status = 1; - break; - } - } - } - } - - buf_pool_mutex_exit(); - - DBUG_RETURN(status); -} - -/*********************************************************************** -Fill the dynamic table information_schema.innodb_buffer_pool_pages_index. */ -static -int -i_s_innodb_buffer_pool_pages_blob_fill( -/*================*/ - /* out: 0 on success, 1 on failure */ - THD* thd, /* in: thread */ - TABLE_LIST* tables, /* in/out: tables to fill */ - COND* cond) /* in: condition (ignored) */ -{ - TABLE* table = (TABLE *) tables->table; - int status = 0; - - ulint n_chunks, n_blocks; - buf_chunk_t* chunk; - page_zip_des_t* block_page_zip; - - ulint part_len; - ulint next_page_no; - - DBUG_ENTER("i_s_innodb_buffer_pool_pages_blob_fill"); - - /* deny access to non-superusers */ - if (check_global_access(thd, PROCESS_ACL)) { - - DBUG_RETURN(0); - } - - RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); - - buf_pool_mutex_enter(); - - chunk = buf_pool->chunks; - - for (n_chunks = buf_pool->n_chunks; n_chunks--; chunk++) { - buf_block_t* block = chunk->blocks; - block_page_zip = buf_block_get_page_zip(block); - - for (n_blocks = chunk->size; n_blocks--; block++) { - const buf_frame_t* frame = block->frame; - - if (fil_page_get_type(frame) == FIL_PAGE_TYPE_BLOB) { - - if (UNIV_LIKELY_NULL(block_page_zip)) { - part_len = 0; /* hmm, can't figure it out */ - - next_page_no = mach_read_from_4( - buf_block_get_frame(block) - + FIL_PAGE_NEXT); - } else { - part_len = mach_read_from_4( - buf_block_get_frame(block) - + FIL_PAGE_DATA - + 0 /*BTR_BLOB_HDR_PART_LEN*/); - - next_page_no = mach_read_from_4( - buf_block_get_frame(block) - + FIL_PAGE_DATA - + 4 /*BTR_BLOB_HDR_NEXT_PAGE_NO*/); - } - - table->field[0]->store(block->page.space); - table->field[1]->store(block->page.offset); - table->field[2]->store(block_page_zip != NULL); - table->field[3]->store(part_len); - - if(next_page_no == FIL_NULL) - { - table->field[4]->store(0); - } else { - table->field[4]->store(block->page.offset); - } - - table->field[5]->store(0); - table->field[6]->store(block->page.buf_fix_count); - table->field[7]->store(block->page.flush_type); - - if (schema_table_store_record(thd, table)) { - status = 1; - break; - } - - } - } - } - - buf_pool_mutex_exit(); - - DBUG_RETURN(status); -} - -/*********************************************************************** -Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ -static -int -i_s_innodb_buffer_pool_pages_init( -/*=========*/ - /* out: 0 on success */ - void* p) /* in/out: table schema object */ -{ - DBUG_ENTER("i_s_innodb_buffer_pool_pages_init"); - ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - - schema->fields_info = i_s_innodb_buffer_pool_pages_fields_info; - schema->fill_table = i_s_innodb_buffer_pool_pages_fill; - - DBUG_RETURN(0); -} - -/*********************************************************************** -Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ -static -int -i_s_innodb_buffer_pool_pages_index_init( -/*=========*/ - /* out: 0 on success */ - void* p) /* in/out: table schema object */ -{ - DBUG_ENTER("i_s_innodb_buffer_pool_pages_index_init"); - ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - - schema->fields_info = i_s_innodb_buffer_pool_pages_index_fields_info; - schema->fill_table = i_s_innodb_buffer_pool_pages_index_fill; - - DBUG_RETURN(0); -} - -/*********************************************************************** -Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ -static -int -i_s_innodb_buffer_pool_pages_blob_init( -/*=========*/ - /* out: 0 on success */ - void* p) /* in/out: table schema object */ -{ - DBUG_ENTER("i_s_innodb_buffer_pool_pages_blob_init"); - ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - - schema->fields_info = i_s_innodb_buffer_pool_pages_blob_fields_info; - schema->fill_table = i_s_innodb_buffer_pool_pages_blob_fill; - - DBUG_RETURN(0); -} - - -UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages = -{ - /* 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_BUFFER_POOL_PAGES"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool pages"), - - /* 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_buffer_pool_pages_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* reserved for dependency checking */ - /* void* */ - STRUCT_FLD(__reserved1, NULL) -}; - -UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_maria = -{ - /* 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_BUFFER_POOL_PAGES"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool pages"), - - /* 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_buffer_pool_pages_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - -UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages_index = -{ - /* 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_BUFFER_POOL_PAGES_INDEX"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool index pages"), - - /* 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_buffer_pool_pages_index_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* reserved for dependency checking */ - /* void* */ - STRUCT_FLD(__reserved1, NULL) -}; - -UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_index_maria = -{ - /* 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_BUFFER_POOL_PAGES_INDEX"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool index pages"), - - /* 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_buffer_pool_pages_index_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - -UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages_blob = -{ - /* 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_BUFFER_POOL_PAGES_BLOB"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool blob pages"), - - /* 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_buffer_pool_pages_blob_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* reserved for dependency checking */ - /* void* */ - STRUCT_FLD(__reserved1, NULL) -}; - -UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_blob_maria = -{ - /* 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_BUFFER_POOL_PAGES_BLOB"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB buffer pool blob pages"), - - /* 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_buffer_pool_pages_blob_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - - -/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_trx */ -static ST_FIELD_INFO innodb_trx_fields_info[] = -{ -#define IDX_TRX_ID 0 - {STRUCT_FLD(field_name, "trx_id"), - STRUCT_FLD(field_length, TRX_ID_MAX_LEN + 1), +#define IDX_TRX_ISOLATION_LEVEL 16 + {STRUCT_FLD(field_name, "trx_isolation_level"), + STRUCT_FLD(field_length, TRX_I_S_TRX_ISOLATION_LEVEL_MAX_LEN), STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_TRX_STATE 1 - {STRUCT_FLD(field_name, "trx_state"), - STRUCT_FLD(field_length, TRX_QUE_STATE_STR_MAX_LEN + 1), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), - STRUCT_FLD(value, 0), +#define IDX_TRX_UNIQUE_CHECKS 17 + {STRUCT_FLD(field_name, "trx_unique_checks"), + STRUCT_FLD(field_length, 1), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 1), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_TRX_STARTED 2 - {STRUCT_FLD(field_name, "trx_started"), - STRUCT_FLD(field_length, 0), - STRUCT_FLD(field_type, MYSQL_TYPE_DATETIME), - STRUCT_FLD(value, 0), +#define IDX_TRX_FOREIGN_KEY_CHECKS 18 + {STRUCT_FLD(field_name, "trx_foreign_key_checks"), + STRUCT_FLD(field_length, 1), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 1), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_TRX_REQUESTED_LOCK_ID 3 - {STRUCT_FLD(field_name, "trx_requested_lock_id"), - STRUCT_FLD(field_length, TRX_I_S_LOCK_ID_MAX_LEN + 1), +#define IDX_TRX_LAST_FOREIGN_KEY_ERROR 19 + {STRUCT_FLD(field_name, "trx_last_foreign_key_error"), + STRUCT_FLD(field_length, TRX_I_S_TRX_FK_ERROR_MAX_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_TRX_WAIT_STARTED 4 - {STRUCT_FLD(field_name, "trx_wait_started"), - STRUCT_FLD(field_length, 0), - STRUCT_FLD(field_type, MYSQL_TYPE_DATETIME), - 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_TRX_WEIGHT 5 - {STRUCT_FLD(field_name, "trx_weight"), - STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), - STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), +#define IDX_TRX_ADAPTIVE_HASH_LATCHED 20 + {STRUCT_FLD(field_name, "trx_adaptive_hash_latched"), + STRUCT_FLD(field_length, 1), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), + STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_TRX_MYSQL_THREAD_ID 6 - {STRUCT_FLD(field_name, "trx_mysql_thread_id"), +#define IDX_TRX_ADAPTIVE_HASH_TIMEOUT 21 + {STRUCT_FLD(field_name, "trx_adaptive_hash_timeout"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -1363,15 +421,6 @@ static ST_FIELD_INFO innodb_trx_fields_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, -#define IDX_TRX_QUERY 7 - {STRUCT_FLD(field_name, "trx_query"), - STRUCT_FLD(field_length, TRX_I_S_TRX_QUERY_MAX_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)}, - END_OF_ST_FIELD_INFO }; @@ -1451,8 +500,72 @@ fill_innodb_trx_from_cache( row->trx_mysql_thread_id)); /* trx_query */ - OK(field_store_string(fields[IDX_TRX_QUERY], - row->trx_query)); + if (row->trx_query) { + /* store will do appropriate character set + conversion check */ + fields[IDX_TRX_QUERY]->store( + row->trx_query, strlen(row->trx_query), + row->trx_query_cs); + fields[IDX_TRX_QUERY]->set_notnull(); + } else { + fields[IDX_TRX_QUERY]->set_null(); + } + + /* trx_operation_state */ + OK(field_store_string(fields[IDX_TRX_OPERATION_STATE], + row->trx_operation_state)); + + /* trx_tables_in_use */ + OK(fields[IDX_TRX_TABLES_IN_USE]->store( + (longlong) row->trx_tables_in_use, true)); + + /* trx_tables_locked */ + OK(fields[IDX_TRX_TABLES_LOCKED]->store( + (longlong) row->trx_tables_locked, true)); + + /* trx_lock_structs */ + OK(fields[IDX_TRX_LOCK_STRUCTS]->store( + (longlong) row->trx_lock_structs, true)); + + /* trx_lock_memory_bytes */ + OK(fields[IDX_TRX_LOCK_MEMORY_BYTES]->store( + (longlong) row->trx_lock_memory_bytes, true)); + + /* trx_rows_locked */ + OK(fields[IDX_TRX_ROWS_LOCKED]->store( + (longlong) row->trx_rows_locked, true)); + + /* trx_rows_modified */ + OK(fields[IDX_TRX_ROWS_MODIFIED]->store( + (longlong) row->trx_rows_modified, true)); + + /* trx_concurrency_tickets */ + OK(fields[IDX_TRX_CONNCURRENCY_TICKETS]->store( + (longlong) row->trx_concurrency_tickets, true)); + + /* trx_isolation_level */ + OK(field_store_string(fields[IDX_TRX_ISOLATION_LEVEL], + row->trx_isolation_level)); + + /* trx_unique_checks */ + OK(fields[IDX_TRX_UNIQUE_CHECKS]->store( + row->trx_unique_checks)); + + /* trx_foreign_key_checks */ + OK(fields[IDX_TRX_FOREIGN_KEY_CHECKS]->store( + row->trx_foreign_key_checks)); + + /* trx_last_foreign_key_error */ + OK(field_store_string(fields[IDX_TRX_LAST_FOREIGN_KEY_ERROR], + row->trx_foreign_key_error)); + + /* trx_adaptive_hash_latched */ + OK(fields[IDX_TRX_ADAPTIVE_HASH_LATCHED]->store( + row->trx_has_search_latch)); + + /* trx_adaptive_hash_timeout */ + OK(fields[IDX_TRX_ADAPTIVE_HASH_TIMEOUT]->store( + (longlong) row->trx_search_latch_timeout, true)); OK(schema_table_store_record(thd, table)); } @@ -1481,6 +594,10 @@ innodb_trx_init( DBUG_RETURN(0); } +static struct st_mysql_information_schema i_s_info = +{ + MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION +}; UNIV_INTERN struct st_mysql_plugin i_s_innodb_trx = { @@ -1532,59 +649,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_trx = }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_trx_maria = -{ - /* 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_TRX"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB transactions"), - - /* 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, innodb_trx_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - /* Fields of the dynamic table INFORMATION_SCHEMA.innodb_locks */ static ST_FIELD_INFO innodb_locks_fields_info[] = { @@ -1709,16 +773,7 @@ fill_innodb_locks_from_cache( for (i = 0; i < rows_num; i++) { i_s_locks_row_t* row; - - /* note that the decoded database or table name is - never expected to be longer than NAME_LEN; - NAME_LEN for database name - 2 for surrounding quotes around database name - NAME_LEN for table name - 2 for surrounding quotes around table name - 1 for the separating dot (.) - 9 for the #mysql50# prefix */ - char buf[2 * NAME_LEN + 14]; + char buf[MAX_FULL_NAME_LEN + 1]; const char* bufend; char lock_trx_id[TRX_ID_MAX_LEN + 1]; @@ -1860,59 +915,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_locks = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_locks_maria = -{ - /* 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_LOCKS"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB conflicting locks"), - - /* 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, innodb_locks_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - /* Fields of the dynamic table INFORMATION_SCHEMA.innodb_lock_waits */ static ST_FIELD_INFO innodb_lock_waits_fields_info[] = { @@ -2063,7 +1065,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_lock_waits = /* plugin author (for SHOW PLUGINS) */ /* const char* */ - STRUCT_FLD(author, "Innobase Oy"), + STRUCT_FLD(author, plugin_author), /* general descriptive text (for SHOW PLUGINS) */ /* const char* */ @@ -2096,59 +1098,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_lock_waits = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_lock_waits_maria = -{ - /* 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_LOCK_WAITS"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, "Innobase Oy"), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB which lock is blocking which"), - - /* 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, innodb_lock_waits_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - /*******************************************************************//** Common function to fill any of the dynamic tables: INFORMATION_SCHEMA.innodb_trx @@ -2248,6 +1197,7 @@ trx_i_s_common_fill_table( deadlock occurs between the mysqld server and mysql client, see http://bugs.mysql.com/29900 ; when that bug is resolved we can enable the DBUG_RETURN(ret) above */ + ret++; // silence a gcc46 warning DBUG_RETURN(0); #endif } @@ -2481,59 +1431,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_maria = -{ - /* 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_CMP"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Statistics for the InnoDB compression"), - - /* 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_cmp_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp_reset = { /* the plugin type (a MYSQL_XXX_PLUGIN value) */ @@ -2584,59 +1481,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmp_reset = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset_maria = -{ - /* 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_CMP_RESET"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Statistics for the InnoDB compression;" - " reset cumulated counts"), - - /* 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_cmp_reset_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), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; /* Fields of the dynamic table information_schema.innodb_cmpmem. */ static ST_FIELD_INFO i_s_cmpmem_fields_info[] = { @@ -2648,6 +1492,14 @@ static ST_FIELD_INFO i_s_cmpmem_fields_info[] = STRUCT_FLD(old_name, "Buddy Block Size"), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + {STRUCT_FLD(field_name, "buffer_pool_instance"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, "Buffer Pool Id"), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + {STRUCT_FLD(field_name, "pages_used"), STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONG), @@ -2678,7 +1530,7 @@ static ST_FIELD_INFO i_s_cmpmem_fields_info[] = STRUCT_FLD(value, 0), STRUCT_FLD(field_flags, 0), STRUCT_FLD(old_name, "Total Duration of Relocations," - " in Seconds"), + " in Seconds"), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, END_OF_ST_FIELD_INFO @@ -2697,8 +1549,8 @@ i_s_cmpmem_fill_low( COND* cond, /*!< in: condition (ignored) */ ibool reset) /*!< in: TRUE=reset cumulated counts */ { + int status = 0; TABLE* table = (TABLE *) tables->table; - int status = 0; DBUG_ENTER("i_s_cmpmem_fill_low"); @@ -2710,35 +1562,52 @@ i_s_cmpmem_fill_low( RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); - //buf_pool_mutex_enter(); - mutex_enter(&zip_free_mutex); + for (ulint i = 0; i < srv_buf_pool_instances; i++) { + buf_pool_t* buf_pool; - for (uint x = 0; x <= BUF_BUDDY_SIZES; x++) { - buf_buddy_stat_t* buddy_stat = &buf_buddy_stat[x]; + status = 0; - table->field[0]->store(BUF_BUDDY_LOW << x); - table->field[1]->store(buddy_stat->used); - table->field[2]->store(UNIV_LIKELY(x < BUF_BUDDY_SIZES) - ? UT_LIST_GET_LEN(buf_pool->zip_free[x]) - : 0); - table->field[3]->store((longlong) buddy_stat->relocated, true); - table->field[4]->store( - (ulong) (buddy_stat->relocated_usec / 1000000)); + buf_pool = buf_pool_from_array(i); - if (reset) { - /* This is protected by buf_pool_mutex. */ - buddy_stat->relocated = 0; - buddy_stat->relocated_usec = 0; + //buf_pool_mutex_enter(buf_pool); + mutex_enter(&buf_pool->zip_free_mutex); + + for (uint x = 0; x <= BUF_BUDDY_SIZES; x++) { + buf_buddy_stat_t* buddy_stat; + + buddy_stat = &buf_pool->buddy_stat[x]; + + table->field[0]->store(BUF_BUDDY_LOW << x); + table->field[1]->store(i); + table->field[2]->store(buddy_stat->used); + table->field[3]->store(UNIV_LIKELY(x < BUF_BUDDY_SIZES) + ? UT_LIST_GET_LEN(buf_pool->zip_free[x]) + : 0); + table->field[4]->store((longlong) + buddy_stat->relocated, true); + table->field[5]->store( + (ulong) (buddy_stat->relocated_usec / 1000000)); + + if (reset) { + /* This is protected by buf_pool->mutex. */ + buddy_stat->relocated = 0; + buddy_stat->relocated_usec = 0; + } + + if (schema_table_store_record(thd, table)) { + status = 1; + break; + } } - if (schema_table_store_record(thd, table)) { - status = 1; + //buf_pool_mutex_exit(buf_pool); + mutex_exit(&buf_pool->zip_free_mutex); + + if (status) { break; } } - //buf_pool_mutex_exit(); - mutex_exit(&zip_free_mutex); DBUG_RETURN(status); } @@ -2855,60 +1724,273 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_maria = +UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem_reset = { - /* the plugin type (a MYSQL_XXX_PLUGIN value) */ - /* int */ - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), + /* 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_CMPMEM_RESET"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, plugin_author), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "Statistics for the InnoDB compressed buffer pool;" + " reset cumulated counts"), + + /* 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_cmpmem_reset_init), + + /* the function to invoke when plugin is unloaded */ + /* int (*)(void*); */ + STRUCT_FLD(deinit, i_s_common_deinit), - /* pointer to type-specific plugin descriptor */ - /* void* */ - STRUCT_FLD(info, &i_s_info), + /* plugin version (for SHOW PLUGINS) */ + /* unsigned int */ + STRUCT_FLD(version, INNODB_VERSION_SHORT), - /* plugin name */ - /* const char* */ - STRUCT_FLD(name, "INNODB_CMPMEM"), + /* struct st_mysql_show_var* */ + STRUCT_FLD(status_vars, NULL), - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), + /* struct st_mysql_sys_var** */ + STRUCT_FLD(system_vars, NULL), - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Statistics for the InnoDB compressed buffer pool"), + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; - /* 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_cmpmem_init), +/*******************************************************************//** +Unbind a dynamic INFORMATION_SCHEMA table. +@return 0 on success */ +static +int +i_s_common_deinit( +/*==============*/ + void* p) /*!< in/out: table schema object */ +{ + DBUG_ENTER("i_s_common_deinit"); + + /* Do nothing */ + + DBUG_RETURN(0); +} + +/* Fields of the dynamic table INFORMATION_SCHEMA.SYS_TABLES */ +static ST_FIELD_INFO innodb_sys_tables_fields_info[] = +{ +#define SYS_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)}, - /* the function to invoke when plugin is unloaded */ - /* int (*)(void*); */ - STRUCT_FLD(deinit, i_s_common_deinit), +#define SYS_TABLE_SCHEMA 1 + {STRUCT_FLD(field_name, "SCHEMA"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* plugin version (for SHOW PLUGINS) */ - /* unsigned int */ - STRUCT_FLD(version, INNODB_VERSION_SHORT), +#define SYS_TABLE_NAME 2 + {STRUCT_FLD(field_name, "NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), +#define SYS_TABLE_FLAG 3 + {STRUCT_FLD(field_name, "FLAG"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), +#define SYS_TABLE_NUM_COLUMN 4 + {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, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), +#define SYS_TABLE_SPACE 5 + {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, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) + END_OF_ST_FIELD_INFO }; -UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem_reset = +/**********************************************************************//** +Populate information_schema.innodb_sys_tables table with information +from SYS_TABLES. +@return 0 on success */ +static +int +i_s_dict_fill_sys_tables( +/*=====================*/ + THD* thd, /*!< in: thread */ + dict_table_t* table, /*!< in: table */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + char buf[NAME_LEN * 2 + 2]; + char* ptr; + + DBUG_ENTER("i_s_dict_fill_sys_tables"); + + fields = table_to_fill->field; + + OK(fields[SYS_TABLE_ID]->store(longlong(table->id), TRUE)); + + strncpy(buf, table->name, NAME_LEN * 2 + 2); + ptr = strchr(buf, '/'); + if (ptr) { + *ptr = '\0'; + ++ptr; + + OK(field_store_string(fields[SYS_TABLE_SCHEMA], buf)); + OK(field_store_string(fields[SYS_TABLE_NAME], ptr)); + } else { + fields[SYS_TABLE_SCHEMA]->set_null(); + OK(field_store_string(fields[SYS_TABLE_NAME], buf)); + } + + OK(fields[SYS_TABLE_FLAG]->store(table->flags)); + + OK(fields[SYS_TABLE_NUM_COLUMN]->store(table->n_cols)); + + OK(fields[SYS_TABLE_SPACE]->store(table->space)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to go through each record in SYS_TABLES table, and fill the +information_schema.innodb_sys_tables table with related table information +@return 0 on success */ +static +int +i_s_sys_tables_fill_table( +/*======================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_tables_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&(dict_sys->mutex)); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES); + + while (rec) { + const char* err_msg; + dict_table_t* table_rec; + + /* Create and populate a dict_table_t structure with + information from SYS_TABLES row */ + err_msg = dict_process_sys_tables_rec( + heap, rec, &table_rec, DICT_TABLE_LOAD_FROM_RECORD); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_tables(thd, table_rec, tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + /* Since dict_process_sys_tables_rec() is called with + DICT_TABLE_LOAD_FROM_RECORD, the table_rec is created in + dict_process_sys_tables_rec(), we will need to free it */ + if (table_rec) { + dict_mem_table_free(table_rec); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} + +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_tables +@return 0 on success */ +static +int +innodb_sys_tables_init( +/*===================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_tables_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_tables_fields_info; + schema->fill_table = i_s_sys_tables_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_tables = { /* the plugin type (a MYSQL_XXX_PLUGIN value) */ /* int */ @@ -2920,16 +2002,15 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem_reset = /* plugin name */ /* const char* */ - STRUCT_FLD(name, "INNODB_CMPMEM_RESET"), + STRUCT_FLD(name, "INNODB_SYS_TABLES"), /* plugin author (for SHOW PLUGINS) */ /* const char* */ - STRUCT_FLD(author, plugin_author), + STRUCT_FLD(author, "Percona"), /* general descriptive text (for SHOW PLUGINS) */ /* const char* */ - STRUCT_FLD(descr, "Statistics for the InnoDB compressed buffer pool;" - " reset cumulated counts"), + STRUCT_FLD(descr, "InnoDB SYS_TABLES"), /* the plugin license (PLUGIN_LICENSE_XXX) */ /* int */ @@ -2937,7 +2018,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem_reset = /* the function to invoke when plugin is loaded */ /* int (*)(void*); */ - STRUCT_FLD(init, i_s_cmpmem_reset_init), + STRUCT_FLD(init, innodb_sys_tables_init), /* the function to invoke when plugin is unloaded */ /* int (*)(void*); */ @@ -2958,75 +2039,1641 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_cmpmem_reset = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset_maria = +/* Fields of the dynamic table INFORMATION_SCHEMA.SYS_TABLESTATS */ +static ST_FIELD_INFO innodb_sys_tablestats_fields_info[] = { - /* the plugin type (a MYSQL_XXX_PLUGIN value) */ - /* int */ - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), +#define SYS_TABLESTATS_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)}, - /* pointer to type-specific plugin descriptor */ - /* void* */ - STRUCT_FLD(info, &i_s_info), +#define SYS_TABLESTATS_SCHEMA 1 + {STRUCT_FLD(field_name, "SCHEMA"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* plugin name */ - /* const char* */ - STRUCT_FLD(name, "INNODB_CMPMEM_RESET"), +#define SYS_TABLESTATS_NAME 2 + {STRUCT_FLD(field_name, "NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), +#define SYS_TABLESTATS_INIT 3 + {STRUCT_FLD(field_name, "STATS_INITIALIZED"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "Statistics for the InnoDB compressed buffer pool;" - " reset cumulated counts"), +#define SYS_TABLESTATS_NROW 4 + {STRUCT_FLD(field_name, "NUM_ROWS"), + 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)}, - /* the plugin license (PLUGIN_LICENSE_XXX) */ - /* int */ - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), +#define SYS_TABLESTATS_CLUST_SIZE 5 + {STRUCT_FLD(field_name, "CLUST_INDEX_SIZE"), + 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)}, - /* the function to invoke when plugin is loaded */ - /* int (*)(void*); */ - STRUCT_FLD(init, i_s_cmpmem_reset_init), +#define SYS_TABLESTATS_INDEX_SIZE 6 + {STRUCT_FLD(field_name, "OTHER_INDEX_SIZE"), + 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)}, - /* the function to invoke when plugin is unloaded */ - /* int (*)(void*); */ - STRUCT_FLD(deinit, i_s_common_deinit), +#define SYS_TABLESTATS_MODIFIED 7 + {STRUCT_FLD(field_name, "MODIFIED_COUNTER"), + 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)}, - /* plugin version (for SHOW PLUGINS) */ - /* unsigned int */ - STRUCT_FLD(version, INNODB_VERSION_SHORT), +#define SYS_TABLESTATS_AUTONINC 8 + {STRUCT_FLD(field_name, "AUTOINC"), + 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)}, - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), +#define SYS_TABLESTATS_MYSQL_OPEN_HANDLE 9 + {STRUCT_FLD(field_name, "MYSQL_HANDLES_OPENED"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + + END_OF_ST_FIELD_INFO +}; + +/**********************************************************************//** +Populate information_schema.innodb_sys_tablestats table with information +from SYS_TABLES. +@return 0 on success */ +static +int +i_s_dict_fill_sys_tablestats( +/*=========================*/ + THD* thd, /*!< in: thread */ + dict_table_t* table, /*!< in: table */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + char buf[NAME_LEN * 2 + 2]; + char* ptr; + + DBUG_ENTER("i_s_dict_fill_sys_tablestats"); + + fields = table_to_fill->field; + + OK(fields[SYS_TABLESTATS_ID]->store(longlong(table->id), TRUE)); + + strncpy(buf, table->name, NAME_LEN * 2 + 2); + ptr = strchr(buf, '/'); + if (ptr) { + *ptr = '\0'; + ++ptr; + + OK(field_store_string(fields[SYS_TABLESTATS_SCHEMA], buf)); + OK(field_store_string(fields[SYS_TABLESTATS_NAME], ptr)); + } else { + fields[SYS_TABLESTATS_SCHEMA]->set_null(); + OK(field_store_string(fields[SYS_TABLESTATS_NAME], buf)); + } + + if (table->stat_initialized) { + OK(field_store_string(fields[SYS_TABLESTATS_INIT], + "Initialized")); + } else { + OK(field_store_string(fields[SYS_TABLESTATS_INIT], + "Uninitialized")); + } + + OK(fields[SYS_TABLESTATS_NROW]->store(table->stat_n_rows, TRUE)); + + OK(fields[SYS_TABLESTATS_CLUST_SIZE]->store( + table->stat_clustered_index_size)); + + OK(fields[SYS_TABLESTATS_INDEX_SIZE]->store( + table->stat_sum_of_other_index_sizes)); + + OK(fields[SYS_TABLESTATS_MODIFIED]->store( + table->stat_modified_counter)); + + OK(fields[SYS_TABLESTATS_AUTONINC]->store(table->autoinc, TRUE)); + + OK(fields[SYS_TABLESTATS_MYSQL_OPEN_HANDLE]->store( + table->n_mysql_handles_opened)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to go through each record in SYS_TABLES table, and fill the +information_schema.innodb_sys_tablestats table with table statistics +related information +@return 0 on success */ +static +int +i_s_sys_tables_fill_table_stats( +/*============================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_tables_fill_table_stats"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES); - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), + while (rec) { + const char* err_msg; + dict_table_t* table_rec; + + /* Fetch the dict_table_t structure corresponding to + this SYS_TABLES record */ + err_msg = dict_process_sys_tables_rec( + heap, rec, &table_rec, DICT_TABLE_LOAD_FROM_CACHE); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_tablestats(thd, table_rec, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} + +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_tablestats +@return 0 on success */ +static +int +innodb_sys_tablestats_init( +/*=======================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_tablestats_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_tablestats_fields_info; + schema->fill_table = i_s_sys_tables_fill_table_stats; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_tablestats = +{ + /* the plugin type (a MYSQL_XXX_PLUGIN value) */ + /* int */ + STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) + /* pointer to type-specific plugin descriptor */ + /* void* */ + STRUCT_FLD(info, &i_s_info), + + /* plugin name */ + /* const char* */ + STRUCT_FLD(name, "INNODB_SYS_TABLESTATS"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_TABLESTATS"), + + /* 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, innodb_sys_tablestats_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; + +/* Fields of the dynamic table INFORMATION_SCHEMA.SYS_INDEXES */ +static ST_FIELD_INFO innodb_sysindex_fields_info[] = +{ +#define SYS_INDEX_ID 0 + {STRUCT_FLD(field_name, "INDEX_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 SYS_INDEX_NAME 1 + {STRUCT_FLD(field_name, "NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_INDEX_TABLE_ID 2 + {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 SYS_INDEX_TYPE 3 + {STRUCT_FLD(field_name, "TYPE"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_INDEX_NUM_FIELDS 4 + {STRUCT_FLD(field_name, "N_FIELDS"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_INDEX_PAGE_NO 5 + {STRUCT_FLD(field_name, "PAGE_NO"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_INDEX_SPACE 6 + {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, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + + END_OF_ST_FIELD_INFO }; +/**********************************************************************//** +Function to populate the information_schema.innodb_sys_indexes table with +collected index information +@return 0 on success */ +static +int +i_s_dict_fill_sys_indexes( +/*======================*/ + THD* thd, /*!< in: thread */ + table_id_t table_id, /*!< in: table id */ + dict_index_t* index, /*!< in: populated dict_index_t + struct with index info */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_indexes"); + + fields = table_to_fill->field; + + OK(fields[SYS_INDEX_ID]->store(longlong(index->id), TRUE)); + + OK(field_store_string(fields[SYS_INDEX_NAME], index->name)); + + OK(fields[SYS_INDEX_TABLE_ID]->store(longlong(table_id), TRUE)); + + OK(fields[SYS_INDEX_TYPE]->store(index->type)); + + OK(fields[SYS_INDEX_NUM_FIELDS]->store(index->n_fields)); + + OK(fields[SYS_INDEX_PAGE_NO]->store(index->page)); + + OK(fields[SYS_INDEX_SPACE]->store(index->space)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} /*******************************************************************//** -Unbind a dynamic INFORMATION_SCHEMA table. -@return 0 on success */ +Function to go through each record in SYS_INDEXES table, and fill the +information_schema.innodb_sys_indexes table with related index information +@return 0 on success */ static int -i_s_common_deinit( -/*==============*/ - void* p) /*!< in/out: table schema object */ +i_s_sys_indexes_fill_table( +/*=======================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ { - DBUG_ENTER("i_s_common_deinit"); + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; - /* Do nothing */ + DBUG_ENTER("i_s_sys_indexes_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + /* Start scan the SYS_INDEXES table */ + rec = dict_startscan_system(&pcur, &mtr, SYS_INDEXES); + + /* Process each record in the table */ + while (rec) { + const char* err_msg;; + table_id_t table_id; + dict_index_t index_rec; + + /* Populate a dict_index_t structure with information from + a SYS_INDEXES row */ + err_msg = dict_process_sys_indexes_rec(heap, rec, &index_rec, + &table_id); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_indexes(thd, table_id, &index_rec, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); DBUG_RETURN(0); } +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_indexes +@return 0 on success */ +static +int +innodb_sys_indexes_init( +/*====================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_index_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sysindex_fields_info; + schema->fill_table = i_s_sys_indexes_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_indexes = +{ + /* 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_SYS_INDEXES"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_INDEXES"), + + /* 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, innodb_sys_indexes_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; + +/* Fields of the dynamic table INFORMATION_SCHEMA.SYS_COLUMNS */ +static ST_FIELD_INFO innodb_sys_columns_fields_info[] = +{ +#define SYS_COLUMN_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 SYS_COLUMN_NAME 1 + {STRUCT_FLD(field_name, "NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_COLUMN_POSITION 2 + {STRUCT_FLD(field_name, "POS"), + 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 SYS_COLUMN_MTYPE 3 + {STRUCT_FLD(field_name, "MTYPE"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_COLUMN__PRTYPE 4 + {STRUCT_FLD(field_name, "PRTYPE"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_COLUMN_COLUMN_LEN 5 + {STRUCT_FLD(field_name, "LEN"), + STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONG), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + + END_OF_ST_FIELD_INFO +}; + +/**********************************************************************//** +Function to populate the information_schema.innodb_sys_columns with +related column information +@return 0 on success */ +static +int +i_s_dict_fill_sys_columns( +/*======================*/ + THD* thd, /*!< in: thread */ + table_id_t table_id, /*!< in: table ID */ + const char* col_name, /*!< in: column name */ + dict_col_t* column, /*!< in: dict_col_t struct holding + more column information */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_columns"); + + fields = table_to_fill->field; + + OK(fields[SYS_COLUMN_TABLE_ID]->store(longlong(table_id), TRUE)); + + OK(field_store_string(fields[SYS_COLUMN_NAME], col_name)); + + OK(fields[SYS_COLUMN_POSITION]->store(column->ind)); + + OK(fields[SYS_COLUMN_MTYPE]->store(column->mtype)); + + OK(fields[SYS_COLUMN__PRTYPE]->store(column->prtype)); + + OK(fields[SYS_COLUMN_COLUMN_LEN]->store(column->len)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to fill information_schema.innodb_sys_columns with information +collected by scanning SYS_COLUMNS table. +@return 0 on success */ +static +int +i_s_sys_columns_fill_table( +/*=======================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + const char* col_name; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_columns_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_COLUMNS); + + while (rec) { + const char* err_msg; + dict_col_t column_rec; + table_id_t table_id; + + /* populate a dict_col_t structure with information from + a SYS_COLUMNS row */ + err_msg = dict_process_sys_columns_rec(heap, rec, &column_rec, + &table_id, &col_name); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_columns(thd, table_id, col_name, + &column_rec, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_columns +@return 0 on success */ +static +int +innodb_sys_columns_init( +/*====================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_columns_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_columns_fields_info; + schema->fill_table = i_s_sys_columns_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_columns = +{ + /* 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_SYS_COLUMNS"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_COLUMNS"), + + /* 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, innodb_sys_columns_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; +/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_sys_fields */ +static ST_FIELD_INFO innodb_sys_fields_fields_info[] = +{ +#define SYS_FIELD_INDEX_ID 0 + {STRUCT_FLD(field_name, "INDEX_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 SYS_FIELD_NAME 1 + {STRUCT_FLD(field_name, "NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FIELD_POS 2 + {STRUCT_FLD(field_name, "POS"), + 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)}, + + END_OF_ST_FIELD_INFO +}; + +/**********************************************************************//** +Function to fill information_schema.innodb_sys_fields with information +collected by scanning SYS_FIELDS table. +@return 0 on success */ +static +int +i_s_dict_fill_sys_fields( +/*=====================*/ + THD* thd, /*!< in: thread */ + index_id_t index_id, /*!< in: index id for the field */ + dict_field_t* field, /*!< in: table */ + ulint pos, /*!< in: Field position */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_fields"); + + fields = table_to_fill->field; + + OK(fields[SYS_FIELD_INDEX_ID]->store(longlong(index_id), TRUE)); + + OK(field_store_string(fields[SYS_FIELD_NAME], field->name)); + + OK(fields[SYS_FIELD_POS]->store(pos)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to go through each record in SYS_FIELDS table, and fill the +information_schema.innodb_sys_fields table with related index field +information +@return 0 on success */ +static +int +i_s_sys_fields_fill_table( +/*======================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + index_id_t last_id; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_fields_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + /* will save last index id so that we know whether we move to + the next index. This is used to calculate prefix length */ + last_id = 0; + + rec = dict_startscan_system(&pcur, &mtr, SYS_FIELDS); + + while (rec) { + ulint pos; + const char* err_msg; + index_id_t index_id; + dict_field_t field_rec; + + /* Populate a dict_field_t structure with information from + a SYS_FIELDS row */ + err_msg = dict_process_sys_fields_rec(heap, rec, &field_rec, + &pos, &index_id, last_id); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_fields(thd, index_id, &field_rec, + pos, tables->table); + last_id = index_id; + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_fields +@return 0 on success */ +static +int +innodb_sys_fields_init( +/*===================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_field_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_fields_fields_info; + schema->fill_table = i_s_sys_fields_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_fields = +{ + /* 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_SYS_FIELDS"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_FIELDS"), + + /* 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, innodb_sys_fields_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; + +/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_sys_foreign */ +static ST_FIELD_INFO innodb_sys_foreign_fields_info[] = +{ +#define SYS_FOREIGN_ID 0 + {STRUCT_FLD(field_name, "ID"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_FOR_NAME 1 + {STRUCT_FLD(field_name, "FOR_NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_REF_NAME 2 + {STRUCT_FLD(field_name, "REF_NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_NUM_COL 3 + {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 SYS_FOREIGN_TYPE 4 + {STRUCT_FLD(field_name, "TYPE"), + 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)}, + + END_OF_ST_FIELD_INFO +}; + +/**********************************************************************//** +Function to fill information_schema.innodb_sys_foreign with information +collected by scanning SYS_FOREIGN table. +@return 0 on success */ +static +int +i_s_dict_fill_sys_foreign( +/*======================*/ + THD* thd, /*!< in: thread */ + dict_foreign_t* foreign, /*!< in: table */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_foreign"); + + fields = table_to_fill->field; + + OK(field_store_string(fields[SYS_FOREIGN_ID], foreign->id)); + + OK(field_store_string(fields[SYS_FOREIGN_FOR_NAME], + foreign->foreign_table_name)); + + OK(field_store_string(fields[SYS_FOREIGN_REF_NAME], + foreign->referenced_table_name)); + + OK(fields[SYS_FOREIGN_NUM_COL]->store(foreign->n_fields)); + + OK(fields[SYS_FOREIGN_TYPE]->store(foreign->type)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to populate INFORMATION_SCHEMA.innodb_sys_foreign table. Loop +through each record in SYS_FOREIGN, and extract the foreign key +information. +@return 0 on success */ +static +int +i_s_sys_foreign_fill_table( +/*=======================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_foreign_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN); + + while (rec) { + const char* err_msg; + dict_foreign_t foreign_rec; + + /* Populate a dict_foreign_t structure with information from + a SYS_FOREIGN row */ + err_msg = dict_process_sys_foreign_rec(heap, rec, &foreign_rec); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_foreign(thd, &foreign_rec, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mtr_start(&mtr); + mutex_enter(&dict_sys->mutex); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_foreign +@return 0 on success */ +static +int +innodb_sys_foreign_init( +/*====================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_foreign_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_foreign_fields_info; + schema->fill_table = i_s_sys_foreign_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_foreign = +{ + /* 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_SYS_FOREIGN"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_FOREIGN"), + + /* 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, innodb_sys_foreign_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; +/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_sys_foreign_cols */ +static ST_FIELD_INFO innodb_sys_foreign_cols_fields_info[] = +{ +#define SYS_FOREIGN_COL_ID 0 + {STRUCT_FLD(field_name, "ID"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_COL_FOR_NAME 1 + {STRUCT_FLD(field_name, "FOR_COL_NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_COL_REF_NAME 2 + {STRUCT_FLD(field_name, "REF_COL_NAME"), + STRUCT_FLD(field_length, NAME_LEN + 1), + STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + STRUCT_FLD(value, 0), + STRUCT_FLD(field_flags, 0), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + +#define SYS_FOREIGN_COL_POS 3 + {STRUCT_FLD(field_name, "POS"), + 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)}, + + END_OF_ST_FIELD_INFO +}; + +/**********************************************************************//** +Function to fill information_schema.innodb_sys_foreign_cols with information +collected by scanning SYS_FOREIGN_COLS table. +@return 0 on success */ +static +int +i_s_dict_fill_sys_foreign_cols( +/*==========================*/ + THD* thd, /*!< in: thread */ + const char* name, /*!< in: foreign key constraint name */ + const char* for_col_name, /*!< in: referencing column name*/ + const char* ref_col_name, /*!< in: referenced column + name */ + ulint pos, /*!< in: column position */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_foreign_cols"); + + fields = table_to_fill->field; + + OK(field_store_string(fields[SYS_FOREIGN_COL_ID], name)); + + OK(field_store_string(fields[SYS_FOREIGN_COL_FOR_NAME], for_col_name)); + + OK(field_store_string(fields[SYS_FOREIGN_COL_REF_NAME], ref_col_name)); + + OK(fields[SYS_FOREIGN_COL_POS]->store(pos)); + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to populate INFORMATION_SCHEMA.innodb_sys_foreign_cols table. Loop +through each record in SYS_FOREIGN_COLS, and extract the foreign key column +information and fill the INFORMATION_SCHEMA.innodb_sys_foreign_cols table. +@return 0 on success */ +static +int +i_s_sys_foreign_cols_fill_table( +/*============================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_foreign_cols_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN_COLS); + + while (rec) { + const char* err_msg; + const char* name; + const char* for_col_name; + const char* ref_col_name; + ulint pos; + + /* Extract necessary information from a SYS_FOREIGN_COLS row */ + err_msg = dict_process_sys_foreign_col_rec( + heap, rec, &name, &for_col_name, &ref_col_name, &pos); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_foreign_cols( + thd, name, for_col_name, ref_col_name, pos, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_foreign_cols +@return 0 on success */ +static +int +innodb_sys_foreign_cols_init( +/*========================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_foreign_cols_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_foreign_cols_fields_info; + schema->fill_table = i_s_sys_foreign_cols_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_foreign_cols = +{ + /* 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_SYS_FOREIGN_COLS"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB SYS_FOREIGN_COLS"), + + /* 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, innodb_sys_foreign_cols_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; + +/* Fields of the dynamic table INFORMATION_SCHEMA.innodb_sys_stats */ +static ST_FIELD_INFO innodb_sys_stats_fields_info[] = +{ +#define SYS_STATS_INDEX_ID 0 + {STRUCT_FLD(field_name, "INDEX_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 SYS_STATS_KEY_COLS 1 + {STRUCT_FLD(field_name, "KEY_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 SYS_STATS_DIFF_VALS 2 + {STRUCT_FLD(field_name, "DIFF_VALS"), + 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 SYS_STATS_NON_NULL_VALS 3 + {STRUCT_FLD(field_name, "NON_NULL_VALS"), + 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 | MY_I_S_MAYBE_NULL), + STRUCT_FLD(old_name, ""), + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, + + END_OF_ST_FIELD_INFO +}; +/**********************************************************************//** +Function to fill information_schema.innodb_sys_stats +@return 0 on success */ +static +int +i_s_dict_fill_sys_stats( +/*====================*/ + THD* thd, /*!< in: thread */ + index_id_t index_id, /*!< in: INDEX_ID */ + ulint key_cols, /*!< in: KEY_COLS */ + ib_uint64_t diff_vals, /*!< in: DIFF_VALS */ + ib_uint64_t non_null_vals, /*!< in: NON_NULL_VALS */ + TABLE* table_to_fill) /*!< in/out: fill this table */ +{ + Field** fields; + + DBUG_ENTER("i_s_dict_fill_sys_stats"); + + fields = table_to_fill->field; + + OK(fields[SYS_STATS_INDEX_ID]->store(longlong(index_id), TRUE)); + + OK(fields[SYS_STATS_KEY_COLS]->store(key_cols)); + + OK(fields[SYS_STATS_DIFF_VALS]->store(longlong(diff_vals), TRUE)); + + if (non_null_vals == ((ib_uint64_t)(-1))) { + fields[SYS_STATS_NON_NULL_VALS]->set_null(); + } else { + OK(fields[SYS_STATS_NON_NULL_VALS]->store(longlong(non_null_vals), TRUE)); + fields[SYS_STATS_NON_NULL_VALS]->set_notnull(); + } + + OK(schema_table_store_record(thd, table_to_fill)); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Function to populate INFORMATION_SCHEMA.innodb_sys_stats table. +@return 0 on success */ +static +int +i_s_sys_stats_fill_table( +/*=====================*/ + THD* thd, /*!< in: thread */ + TABLE_LIST* tables, /*!< in/out: tables to fill */ + COND* cond) /*!< in: condition (not used) */ +{ + btr_pcur_t pcur; + const rec_t* rec; + mem_heap_t* heap; + mtr_t mtr; + + DBUG_ENTER("i_s_sys_stats_fill_table"); + + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + DBUG_RETURN(0); + } + + heap = mem_heap_create(1000); + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + + rec = dict_startscan_system(&pcur, &mtr, SYS_STATS); + + while (rec) { + const char* err_msg; + index_id_t index_id; + ulint key_cols; + ib_uint64_t diff_vals; + ib_uint64_t non_null_vals; + + /* Extract necessary information from a SYS_FOREIGN_COLS row */ + err_msg = dict_process_sys_stats_rec( + heap, rec, &index_id, &key_cols, &diff_vals, &non_null_vals); + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + + if (!err_msg) { + i_s_dict_fill_sys_stats( + thd, index_id, key_cols, diff_vals, non_null_vals, + tables->table); + } else { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_CANT_FIND_SYSTEM_REC, + err_msg); + } + + mem_heap_empty(heap); + + /* Get the next record */ + mutex_enter(&dict_sys->mutex); + mtr_start(&mtr); + rec = dict_getnext_system(&pcur, &mtr); + } + + mtr_commit(&mtr); + mutex_exit(&dict_sys->mutex); + mem_heap_free(heap); + + DBUG_RETURN(0); +} +/*******************************************************************//** +Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_stats +@return 0 on success */ +static +int +innodb_sys_stats_init( +/*========================*/ + void* p) /*!< in/out: table schema object */ +{ + ST_SCHEMA_TABLE* schema; + + DBUG_ENTER("innodb_sys_stats_init"); + + schema = (ST_SCHEMA_TABLE*) p; + + schema->fields_info = innodb_sys_stats_fields_info; + schema->fill_table = i_s_sys_stats_fill_table; + + DBUG_RETURN(0); +} + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_stats = +{ + /* 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_SYS_STATS"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "XtraDB SYS_STATS table"), + + /* 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, innodb_sys_stats_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), + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) +}; /*********************************************************************** */ @@ -3158,7 +3805,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_rseg = /* plugin author (for SHOW PLUGINS) */ /* const char* */ - STRUCT_FLD(author, plugin_author), + STRUCT_FLD(author, "Percona"), /* general descriptive text (for SHOW PLUGINS) */ /* const char* */ @@ -3191,59 +3838,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_rseg = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_rseg_maria = -{ - /* 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_RSEG"), - - /* plugin author (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(author, plugin_author), - - /* general descriptive text (for SHOW PLUGINS) */ - /* const char* */ - STRUCT_FLD(descr, "InnoDB rollback segment information"), - - /* 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_rseg_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, 0x0100 /* 1.0 */), - - /* struct st_mysql_show_var* */ - STRUCT_FLD(status_vars, NULL), - - /* struct st_mysql_sys_var** */ - STRUCT_FLD(system_vars, NULL), - - /* string version */ - /* const char * */ - STRUCT_FLD(version_info, "1.0"), - - /* Maturity */ - /* int */ - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - /*********************************************************************** */ static ST_FIELD_INFO i_s_innodb_table_stats_info[] = @@ -3333,7 +3927,7 @@ static ST_FIELD_INFO i_s_innodb_index_stats_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "row_per_keys"), + {STRUCT_FLD(field_name, "rows_per_key"), STRUCT_FLD(field_length, 256), STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), @@ -3341,7 +3935,7 @@ static ST_FIELD_INFO i_s_innodb_index_stats_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "index_size"), + {STRUCT_FLD(field_name, "index_total_pages"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3349,7 +3943,7 @@ static ST_FIELD_INFO i_s_innodb_index_stats_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "leaf_pages"), + {STRUCT_FLD(field_name, "index_leaf_pages"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3561,7 +4155,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_table_stats = STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), STRUCT_FLD(info, &i_s_info), STRUCT_FLD(name, "INNODB_TABLE_STATS"), - STRUCT_FLD(author, plugin_author), + STRUCT_FLD(author, "Percona"), STRUCT_FLD(descr, "InnoDB table statistics in memory"), STRUCT_FLD(license, PLUGIN_LICENSE_GPL), STRUCT_FLD(init, i_s_innodb_table_stats_init), @@ -3572,29 +4166,12 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_table_stats = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_table_stats_maria = -{ - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "INNODB_TABLE_STATS"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB table statistics in memory"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_table_stats_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - UNIV_INTERN struct st_mysql_plugin i_s_innodb_index_stats = { STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), STRUCT_FLD(info, &i_s_info), STRUCT_FLD(name, "INNODB_INDEX_STATS"), - STRUCT_FLD(author, plugin_author), + STRUCT_FLD(author, "Percona"), STRUCT_FLD(descr, "InnoDB index statistics in memory"), STRUCT_FLD(license, PLUGIN_LICENSE_GPL), STRUCT_FLD(init, i_s_innodb_index_stats_init), @@ -3605,23 +4182,6 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_index_stats = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_index_stats_maria = -{ - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "INNODB_INDEX_STATS"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB index statistics in memory"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_index_stats_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - /*********************************************************************** */ static ST_FIELD_INFO i_s_innodb_admin_command_info[] = @@ -3716,7 +4276,7 @@ nomatch: } else if (!strncasecmp("XTRA_LRU_DUMP", ptr, 13)) { ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: administration command 'XTRA_LRU_DUMP'" + fprintf(stderr, " InnoDB: Administrative command 'XTRA_LRU_DUMP'" " was detected.\n"); if (buf_LRU_file_dump()) { @@ -3731,7 +4291,7 @@ nomatch: } else if (!strncasecmp("XTRA_LRU_RESTORE", ptr, 16)) { ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: administration command 'XTRA_LRU_RESTORE'" + fprintf(stderr, " InnoDB: Administrative command 'XTRA_LRU_RESTORE'" " was detected.\n"); if (buf_LRU_file_restore()) { @@ -3777,7 +4337,7 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_admin_command = STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), STRUCT_FLD(info, &i_s_info), STRUCT_FLD(name, "XTRADB_ADMIN_COMMAND"), - STRUCT_FLD(author, plugin_author), + STRUCT_FLD(author, "Percona"), STRUCT_FLD(descr, "XtraDB specific command acceptor"), STRUCT_FLD(license, PLUGIN_LICENSE_GPL), STRUCT_FLD(init, i_s_innodb_admin_command_init), @@ -3788,42 +4348,27 @@ UNIV_INTERN struct st_mysql_plugin i_s_innodb_admin_command = STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_admin_command_maria = -{ - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "XTRADB_ADMIN_COMMAND"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "XtraDB specific command acceptor"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_admin_command_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE) -}; - -static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = +/*********************************************************************** +*/ +static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_fields_info[] = { - {STRUCT_FLD(field_name, "SCHEMA"), - STRUCT_FLD(field_length, NAME_LEN), + {STRUCT_FLD(field_name, "page_type"), + STRUCT_FLD(field_length, 64), STRUCT_FLD(field_type, MYSQL_TYPE_STRING), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, 0), + STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "NAME"), - STRUCT_FLD(field_length, NAME_LEN), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + {STRUCT_FLD(field_name, "space_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, 0), + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "ID"), + {STRUCT_FLD(field_name, "page_no"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3831,7 +4376,7 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "N_COLS"), + {STRUCT_FLD(field_name, "lru_position"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3839,7 +4384,7 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "TYPE"), + {STRUCT_FLD(field_name, "fix_count"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3847,7 +4392,7 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "MIX_ID"), + {STRUCT_FLD(field_name, "flush_type"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3855,7 +4400,12 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "MIX_LEN"), + END_OF_ST_FIELD_INFO +}; + +static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_index_fields_info[] = +{ + {STRUCT_FLD(field_name, "index_id"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3863,15 +4413,15 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "CLUSTER_NAME"), - STRUCT_FLD(field_length, NAME_LEN), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + {STRUCT_FLD(field_name, "space_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, 0), + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "SPACE"), + {STRUCT_FLD(field_name, "page_no"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3879,12 +4429,7 @@ static ST_FIELD_INFO i_s_innodb_sys_tables_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - END_OF_ST_FIELD_INFO -}; - -static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = -{ - {STRUCT_FLD(field_name, "TABLE_ID"), + {STRUCT_FLD(field_name, "n_recs"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3892,7 +4437,7 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "ID"), + {STRUCT_FLD(field_name, "data_size"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3900,15 +4445,15 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "NAME"), - STRUCT_FLD(field_length, NAME_LEN), - STRUCT_FLD(field_type, MYSQL_TYPE_STRING), + {STRUCT_FLD(field_name, "hashed"), + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), - STRUCT_FLD(field_flags, 0), + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED), STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "N_FIELDS"), + {STRUCT_FLD(field_name, "access_time"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3916,7 +4461,7 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "TYPE"), + {STRUCT_FLD(field_name, "modified"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3924,7 +4469,7 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "SPACE"), + {STRUCT_FLD(field_name, "dirty"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3932,7 +4477,7 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "PAGE_NO"), + {STRUCT_FLD(field_name, "old"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3940,12 +4485,7 @@ static ST_FIELD_INFO i_s_innodb_sys_indexes_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - END_OF_ST_FIELD_INFO -}; - -static ST_FIELD_INFO i_s_innodb_sys_stats_info[] = -{ - {STRUCT_FLD(field_name, "INDEX_ID"), + {STRUCT_FLD(field_name, "lru_position"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3953,7 +4493,7 @@ static ST_FIELD_INFO i_s_innodb_sys_stats_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "KEY_COLS"), + {STRUCT_FLD(field_name, "fix_count"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3961,7 +4501,7 @@ static ST_FIELD_INFO i_s_innodb_sys_stats_info[] = STRUCT_FLD(old_name, ""), STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}, - {STRUCT_FLD(field_name, "DIFF_VALS"), + {STRUCT_FLD(field_name, "flush_type"), STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS), STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG), STRUCT_FLD(value, 0), @@ -3972,545 +4512,868 @@ static ST_FIELD_INFO i_s_innodb_sys_stats_info[] = END_OF_ST_FIELD_INFO }; -static -int -copy_string_field( -/*==============*/ - TABLE* table, - int table_field, - const rec_t* rec, - int rec_field) +static ST_FIELD_INFO i_s_innodb_buffer_pool_pages_blob_fields_info[] = { - int status; - const byte* data; - ulint len; + {STRUCT_FLD(field_name, "space_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)}, - /*fprintf(stderr, "copy_string_field %d %d\n", table_field, rec_field);*/ + {STRUCT_FLD(field_name, "page_no"), + 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)}, - data = rec_get_nth_field_old(rec, rec_field, &len); - if (len == UNIV_SQL_NULL) { - table->field[table_field]->set_null(); - status = 0; /* success */ - } else { - table->field[table_field]->set_notnull(); - status = table->field[table_field]->store( - (char *) data, len, system_charset_info); - } + {STRUCT_FLD(field_name, "compressed"), + 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)}, - return status; -} + {STRUCT_FLD(field_name, "part_len"), + 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)}, -static -int -copy_name_fields( -/*=============*/ - TABLE* table, - int table_field_1, - const rec_t* rec, - int rec_field) -{ - int status; - const byte* data; - ulint len; - - data = rec_get_nth_field_old(rec, rec_field, &len); - if (len == UNIV_SQL_NULL) { - table->field[table_field_1]->set_null(); - table->field[table_field_1 + 1]->set_null(); - status = 0; /* success */ - } else { - char buf[NAME_LEN * 2 + 2]; - char* ptr; + {STRUCT_FLD(field_name, "next_page_no"), + 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)}, - if (len > NAME_LEN * 2 + 1) { - table->field[table_field_1]->set_null(); - status = field_store_string(table->field[table_field_1 + 1], - "###TOO LONG NAME###"); - goto end_func; - } + {STRUCT_FLD(field_name, "lru_position"), + 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)}, - strncpy(buf, (char*)data, len); - buf[len] = '\0'; - ptr = strchr(buf, '/'); - if (ptr) { - *ptr = '\0'; - ++ptr; + {STRUCT_FLD(field_name, "fix_count"), + 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)}, - status = field_store_string(table->field[table_field_1], buf); - status |= field_store_string(table->field[table_field_1 + 1], ptr); - } else { - table->field[table_field_1]->set_null(); - status = field_store_string(table->field[table_field_1 + 1], buf); - } - } + {STRUCT_FLD(field_name, "flush_type"), + 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)}, -end_func: - return status; -} + END_OF_ST_FIELD_INFO +}; +/*********************************************************************** +Fill the dynamic table information_schema.innodb_buffer_pool_pages. */ static int -copy_int_field( -/*===========*/ - TABLE* table, - int table_field, - const rec_t* rec, - int rec_field) +i_s_innodb_buffer_pool_pages_fill( +/*================*/ + /* out: 0 on success, 1 on failure */ + THD* thd, /* in: thread */ + TABLE_LIST* tables, /* in/out: tables to fill */ + COND* cond) /* in: condition (ignored) */ { - int status; - const byte* data; - ulint len; + TABLE* table = (TABLE *) tables->table; + int status = 0; + ulint i; - /*fprintf(stderr, "copy_int_field %d %d\n", table_field, rec_field);*/ + DBUG_ENTER("i_s_innodb_buffer_pool_pages_fill"); - data = rec_get_nth_field_old(rec, rec_field, &len); - if (len == UNIV_SQL_NULL) { - table->field[table_field]->set_null(); - status = 0; /* success */ - } else { - table->field[table_field]->set_notnull(); - status = table->field[table_field]->store( - mach_read_from_4(data), true); + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); } - return status; -} + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); -static -int -copy_id_field( -/*==========*/ - TABLE* table, - int table_field, - const rec_t* rec, - int rec_field) -{ - int status; - const byte* data; - ulint len; + for (i = 0; i < srv_buf_pool_instances; i++) { + ulint n_block; + buf_pool_t* buf_pool; + + buf_pool = buf_pool_from_array(i); + + buf_pool_mutex_enter(buf_pool); + + for (n_block = 0; n_block < buf_pool->curr_size; n_block++) { + buf_block_t* block = buf_page_from_array(buf_pool, n_block); + const buf_frame_t* frame = block->frame; + + char page_type[64]; + + switch(fil_page_get_type(frame)) + { + case FIL_PAGE_INDEX: + strcpy(page_type, "index"); + break; + case FIL_PAGE_UNDO_LOG: + strcpy(page_type, "undo_log"); + break; + case FIL_PAGE_INODE: + strcpy(page_type, "inode"); + break; + case FIL_PAGE_IBUF_FREE_LIST: + strcpy(page_type, "ibuf_free_list"); + break; + case FIL_PAGE_TYPE_ALLOCATED: + strcpy(page_type, "allocated"); + break; + case FIL_PAGE_IBUF_BITMAP: + strcpy(page_type, "bitmap"); + break; + case FIL_PAGE_TYPE_SYS: + strcpy(page_type, "sys"); + break; + case FIL_PAGE_TYPE_TRX_SYS: + strcpy(page_type, "trx_sys"); + break; + case FIL_PAGE_TYPE_FSP_HDR: + strcpy(page_type, "fsp_hdr"); + break; + case FIL_PAGE_TYPE_XDES: + strcpy(page_type, "xdes"); + break; + case FIL_PAGE_TYPE_BLOB: + strcpy(page_type, "blob"); + break; + case FIL_PAGE_TYPE_ZBLOB: + strcpy(page_type, "zblob"); + break; + case FIL_PAGE_TYPE_ZBLOB2: + strcpy(page_type, "zblob2"); + break; + default: + sprintf(page_type, "unknown (type=%li)", fil_page_get_type(frame)); + } - /*fprintf(stderr, "copy_id_field %d %d\n", table_field, rec_field);*/ + field_store_string(table->field[0], page_type); + table->field[1]->store(block->page.space); + table->field[2]->store(block->page.offset); + table->field[3]->store(0); + table->field[4]->store(block->page.buf_fix_count); + table->field[5]->store(block->page.flush_type); - data = rec_get_nth_field_old(rec, rec_field, &len); - if (len == UNIV_SQL_NULL) { - table->field[table_field]->set_null(); - status = 0; /* success */ - } else { - table->field[table_field]->set_notnull(); - status = table->field[table_field]->store( - ut_conv_dulint_to_longlong(mach_read_from_8(data)), true); + if (schema_table_store_record(thd, table)) { + status = 1; + break; + } + + } + + buf_pool_mutex_exit(buf_pool); } - return status; + DBUG_RETURN(status); } +/*********************************************************************** +Fill the dynamic table information_schema.innodb_buffer_pool_pages_index. */ static int -copy_sys_tables_rec( +i_s_innodb_buffer_pool_pages_index_fill( /*================*/ - TABLE* table, - const dict_index_t* index, - const rec_t* rec -) + /* out: 0 on success, 1 on failure */ + THD* thd, /* in: thread */ + TABLE_LIST* tables, /* in/out: tables to fill */ + COND* cond) /* in: condition (ignored) */ { - int status; - int field; - - /* NAME */ - field = dict_index_get_nth_col_pos(index, 0); - status = copy_name_fields(table, 0, rec, field); - if (status) { - return status; - } - /* ID */ - field = dict_index_get_nth_col_pos(index, 1); - status = copy_id_field(table, 2, rec, field); - if (status) { - return status; - } - /* N_COLS */ - field = dict_index_get_nth_col_pos(index, 2); - status = copy_int_field(table, 3, rec, field); - if (status) { - return status; - } - /* TYPE */ - field = dict_index_get_nth_col_pos(index, 3); - status = copy_int_field(table, 4, rec, field); - if (status) { - return status; - } - /* MIX_ID */ - field = dict_index_get_nth_col_pos(index, 4); - status = copy_id_field(table, 5, rec, field); - if (status) { - return status; - } - /* MIX_LEN */ - field = dict_index_get_nth_col_pos(index, 5); - status = copy_int_field(table, 6, rec, field); - if (status) { - return status; - } - /* CLUSTER_NAME */ - field = dict_index_get_nth_col_pos(index, 6); - status = copy_string_field(table, 7, rec, field); - if (status) { - return status; - } - /* SPACE */ - field = dict_index_get_nth_col_pos(index, 7); - status = copy_int_field(table, 8, rec, field); - if (status) { - return status; - } + TABLE* table = (TABLE *) tables->table; + int status = 0; + ulint i; + index_id_t index_id; - return 0; -} + DBUG_ENTER("i_s_innodb_buffer_pool_pages_index_fill"); -static -int -copy_sys_indexes_rec( -/*=================*/ - TABLE* table, - const dict_index_t* index, - const rec_t* rec -) -{ - int status; - int field; - - /* TABLE_ID */ - field = dict_index_get_nth_col_pos(index, 0); - status = copy_id_field(table, 0, rec, field); - if (status) { - return status; - } - /* ID */ - field = dict_index_get_nth_col_pos(index, 1); - status = copy_id_field(table, 1, rec, field); - if (status) { - return status; - } - /* NAME */ - field = dict_index_get_nth_col_pos(index, 2); - status = copy_string_field(table, 2, rec, field); - if (status) { - return status; - } - /* N_FIELDS */ - field = dict_index_get_nth_col_pos(index, 3); - status = copy_int_field(table, 3, rec, field); - if (status) { - return status; - } - /* TYPE */ - field = dict_index_get_nth_col_pos(index, 4); - status = copy_int_field(table, 4, rec, field); - if (status) { - return status; - } - /* SPACE */ - field = dict_index_get_nth_col_pos(index, 5); - status = copy_int_field(table, 5, rec, field); - if (status) { - return status; - } - /* PAGE_NO */ - field = dict_index_get_nth_col_pos(index, 6); - status = copy_int_field(table, 6, rec, field); - if (status) { - return status; + /* deny access to non-superusers */ + if (check_global_access(thd, PROCESS_ACL)) { + + DBUG_RETURN(0); } - return 0; -} + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); -static -int -copy_sys_stats_rec( -/*===============*/ - TABLE* table, - const dict_index_t* index, - const rec_t* rec -) -{ - int status; - int field; - - /* INDEX_ID */ - field = dict_index_get_nth_col_pos(index, 0); - status = copy_id_field(table, 0, rec, field); - if (status) { - return status; - } - /* KEY_COLS */ - field = dict_index_get_nth_col_pos(index, 1); - status = copy_int_field(table, 1, rec, field); - if (status) { - return status; - } - /* DIFF_VALS */ - field = dict_index_get_nth_col_pos(index, 2); - status = copy_id_field(table, 2, rec, field); - if (status) { - return status; + for (i = 0; i < srv_buf_pool_instances; i++) { + ulint n_block; + buf_pool_t* buf_pool; + + buf_pool = buf_pool_from_array(i); + + buf_pool_mutex_enter(buf_pool); + + for (n_block = 0; n_block < buf_pool->curr_size; n_block++) { + buf_block_t* block = buf_page_from_array(buf_pool, n_block); + const buf_frame_t* frame = block->frame; + + if (fil_page_get_type(frame) == FIL_PAGE_INDEX) { + index_id = btr_page_get_index_id(frame); + table->field[0]->store(index_id); + table->field[1]->store(block->page.space); + table->field[2]->store(block->page.offset); + table->field[3]->store(page_get_n_recs(frame)); + table->field[4]->store(page_get_data_size(frame)); + table->field[5]->store(block->is_hashed); + table->field[6]->store(block->page.access_time); + table->field[7]->store(block->page.newest_modification != 0); + table->field[8]->store(block->page.oldest_modification != 0); + table->field[9]->store(block->page.old); + table->field[10]->store(0); + table->field[11]->store(block->page.buf_fix_count); + table->field[12]->store(block->page.flush_type); + + if (schema_table_store_record(thd, table)) { + status = 1; + break; + } + } + } + + buf_pool_mutex_exit(buf_pool); } - return 0; + DBUG_RETURN(status); } +/*********************************************************************** +Fill the dynamic table information_schema.innodb_buffer_pool_pages_index. */ static int -i_s_innodb_schema_table_fill( -/*=========================*/ - THD* thd, - TABLE_LIST* tables, - COND* cond) +i_s_innodb_buffer_pool_pages_blob_fill( +/*================*/ + /* out: 0 on success, 1 on failure */ + THD* thd, /* in: thread */ + TABLE_LIST* tables, /* in/out: tables to fill */ + COND* cond) /* in: condition (ignored) */ { - int status = 0; - TABLE* table = (TABLE *) tables->table; - const char* table_name = tables->schema_table_name; - dict_table_t* innodb_table; - dict_index_t* index; - btr_pcur_t pcur; - const rec_t* rec; - mtr_t mtr; - int id; + TABLE* table = (TABLE *) tables->table; + int status = 0; + ulint i; - DBUG_ENTER("i_s_innodb_schema_table_fill"); + ulint part_len; + ulint next_page_no; + + DBUG_ENTER("i_s_innodb_buffer_pool_pages_blob_fill"); /* deny access to non-superusers */ if (check_global_access(thd, PROCESS_ACL)) { + DBUG_RETURN(0); } - if (innobase_strcasecmp(table_name, "innodb_sys_tables") == 0) { - id = 0; - } else if (innobase_strcasecmp(table_name, "innodb_sys_indexes") == 0) { - id = 1; - } else if (innobase_strcasecmp(table_name, "innodb_sys_stats") == 0) { - id = 2; - } else { - DBUG_RETURN(1); - } + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); + for (i = 0; i < srv_buf_pool_instances; i++) { + ulint n_block; + buf_pool_t* buf_pool; - RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name); + buf_pool = buf_pool_from_array(i); - mutex_enter(&(dict_sys->mutex)); + buf_pool_mutex_enter(buf_pool); + + for (n_block = 0; n_block < buf_pool->curr_size; n_block++) { + buf_block_t* block = buf_page_from_array(buf_pool, n_block); + page_zip_des_t* block_page_zip = buf_block_get_page_zip(block); + const buf_frame_t* frame = block->frame; - mtr_start(&mtr); + if (fil_page_get_type(frame) == FIL_PAGE_TYPE_BLOB) { - if (id == 0) { - innodb_table = dict_table_get_low("SYS_TABLES"); - } else if (id == 1) { - innodb_table = dict_table_get_low("SYS_INDEXES"); - } else { - innodb_table = dict_table_get_low("SYS_STATS"); - } - index = UT_LIST_GET_FIRST(innodb_table->indexes); - - btr_pcur_open_at_index_side(TRUE, index, BTR_SEARCH_LEAF, &pcur, - TRUE, &mtr); - for (;;) { - btr_pcur_move_to_next_user_rec(&pcur, &mtr); - - rec = btr_pcur_get_rec(&pcur); - if (!btr_pcur_is_on_user_rec(&pcur)) { - /* end of index */ - btr_pcur_close(&pcur); - mtr_commit(&mtr); - break; - } - if (rec_get_deleted_flag(rec, 0)) { - /* record marked as deleted */ - btr_pcur_close(&pcur); - mtr_commit(&mtr); - continue; - } + if (UNIV_LIKELY_NULL(block_page_zip)) { + part_len = 0; /* hmm, can't figure it out */ - if (id == 0) { - status = copy_sys_tables_rec(table, index, rec); - } else if (id == 1) { - status = copy_sys_indexes_rec(table, index, rec); - } else { - status = copy_sys_stats_rec(table, index, rec); - } - if (status) { - btr_pcur_close(&pcur); - mtr_commit(&mtr); - break; - } + next_page_no = mach_read_from_4( + buf_block_get_frame(block) + + FIL_PAGE_NEXT); + } else { + part_len = mach_read_from_4( + buf_block_get_frame(block) + + FIL_PAGE_DATA + + 0 /*BTR_BLOB_HDR_PART_LEN*/); -#if 0 - btr_pcur_store_position(&pcur, &mtr); - mtr_commit(&mtr); + next_page_no = mach_read_from_4( + buf_block_get_frame(block) + + FIL_PAGE_DATA + + 4 /*BTR_BLOB_HDR_NEXT_PAGE_NO*/); + } - status = schema_table_store_record(thd, table); - if (status) { - btr_pcur_close(&pcur); - break; - } + table->field[0]->store(block->page.space); + table->field[1]->store(block->page.offset); + table->field[2]->store(block_page_zip != NULL); + table->field[3]->store(part_len); - mtr_start(&mtr); - btr_pcur_restore_position(BTR_SEARCH_LEAF, &pcur, &mtr); -#else - status = schema_table_store_record(thd, table); - if (status) { - btr_pcur_close(&pcur); - mtr_commit(&mtr); - break; - } -#endif - } + if(next_page_no == FIL_NULL) + { + table->field[4]->store(0); + } else { + table->field[4]->store(block->page.offset); + } - mutex_exit(&(dict_sys->mutex)); + table->field[5]->store(0); + table->field[6]->store(block->page.buf_fix_count); + table->field[7]->store(block->page.flush_type); + + if (schema_table_store_record(thd, table)) { + status = 1; + break; + } + + } + } + + buf_pool_mutex_exit(buf_pool); + } DBUG_RETURN(status); } +/*********************************************************************** +Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ static int -i_s_innodb_sys_tables_init( -/*=======================*/ - void* p) +i_s_innodb_buffer_pool_pages_init( +/*=========*/ + /* out: 0 on success */ + void* p) /* in/out: table schema object */ { - DBUG_ENTER("i_s_innodb_sys_tables_init"); + DBUG_ENTER("i_s_innodb_buffer_pool_pages_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - schema->fields_info = i_s_innodb_sys_tables_info; - schema->fill_table = i_s_innodb_schema_table_fill; + schema->fields_info = i_s_innodb_buffer_pool_pages_fields_info; + schema->fill_table = i_s_innodb_buffer_pool_pages_fill; DBUG_RETURN(0); } +/*********************************************************************** +Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ static int -i_s_innodb_sys_indexes_init( -/*========================*/ - void* p) +i_s_innodb_buffer_pool_pages_index_init( +/*=========*/ + /* out: 0 on success */ + void* p) /* in/out: table schema object */ { - DBUG_ENTER("i_s_innodb_sys_indexes_init"); + DBUG_ENTER("i_s_innodb_buffer_pool_pages_index_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - schema->fields_info = i_s_innodb_sys_indexes_info; - schema->fill_table = i_s_innodb_schema_table_fill; + schema->fields_info = i_s_innodb_buffer_pool_pages_index_fields_info; + schema->fill_table = i_s_innodb_buffer_pool_pages_index_fill; DBUG_RETURN(0); } +/*********************************************************************** +Bind the dynamic table information_schema.innodb_buffer_pool_pages. */ static int -i_s_innodb_sys_stats_init( -/*======================*/ - void* p) +i_s_innodb_buffer_pool_pages_blob_init( +/*=========*/ + /* out: 0 on success */ + void* p) /* in/out: table schema object */ { - DBUG_ENTER("i_s_innodb_sys_stats_init"); + DBUG_ENTER("i_s_innodb_buffer_pool_pages_blob_init"); ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p; - schema->fields_info = i_s_innodb_sys_stats_info; - schema->fill_table = i_s_innodb_schema_table_fill; + schema->fields_info = i_s_innodb_buffer_pool_pages_blob_fields_info; + schema->fill_table = i_s_innodb_buffer_pool_pages_blob_fill; DBUG_RETURN(0); } -UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_tables = + +UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages = { + /* 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), - STRUCT_FLD(name, "INNODB_SYS_TABLES"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_TABLES table"), + + /* plugin name */ + /* const char* */ + STRUCT_FLD(name, "INNODB_BUFFER_POOL_PAGES"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB buffer pool pages"), + + /* the plugin license (PLUGIN_LICENSE_XXX) */ + /* int */ STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_tables_init), + + /* the function to invoke when plugin is loaded */ + /* int (*)(void*); */ + STRUCT_FLD(init, i_s_innodb_buffer_pool_pages_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, 0x0100 /* 1.0 */), + + /* struct st_mysql_show_var* */ STRUCT_FLD(status_vars, NULL), + + /* struct st_mysql_sys_var** */ STRUCT_FLD(system_vars, NULL), + + /* reserved for dependency checking */ + /* void* */ STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tables_maria = +UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages_index = { + /* 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), - STRUCT_FLD(name, "INNODB_SYS_TABLES"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_TABLES table"), + + /* plugin name */ + /* const char* */ + STRUCT_FLD(name, "INNODB_BUFFER_POOL_PAGES_INDEX"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB buffer pool index pages"), + + /* the plugin license (PLUGIN_LICENSE_XXX) */ + /* int */ STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_tables_init), + + /* the function to invoke when plugin is loaded */ + /* int (*)(void*); */ + STRUCT_FLD(init, i_s_innodb_buffer_pool_pages_index_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, 0x0100 /* 1.0 */), + + /* struct st_mysql_show_var* */ STRUCT_FLD(status_vars, NULL), + + /* struct st_mysql_sys_var** */ STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA) + + /* reserved for dependency checking */ + /* void* */ + STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_indexes = +UNIV_INTERN struct st_mysql_plugin i_s_innodb_buffer_pool_pages_blob = { + /* 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), - STRUCT_FLD(name, "INNODB_SYS_INDEXES"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_INDEXES table"), + + /* plugin name */ + /* const char* */ + STRUCT_FLD(name, "INNODB_BUFFER_POOL_PAGES_BLOB"), + + /* plugin author (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(author, "Percona"), + + /* general descriptive text (for SHOW PLUGINS) */ + /* const char* */ + STRUCT_FLD(descr, "InnoDB buffer pool blob pages"), + + /* the plugin license (PLUGIN_LICENSE_XXX) */ + /* int */ STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_indexes_init), + + /* the function to invoke when plugin is loaded */ + /* int (*)(void*); */ + STRUCT_FLD(init, i_s_innodb_buffer_pool_pages_blob_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, 0x0100 /* 1.0 */), + + /* struct st_mysql_show_var* */ STRUCT_FLD(status_vars, NULL), + + /* struct st_mysql_sys_var** */ STRUCT_FLD(system_vars, NULL), + + /* reserved for dependency checking */ + /* void* */ STRUCT_FLD(__reserved1, NULL) }; -UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_indexes_maria = +/* MariaDB structures of I_S plugins above */ + +UNIV_INTERN struct st_maria_plugin i_s_innodb_trx_maria = { - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "INNODB_SYS_INDEXES"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_INDEXES table"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_indexes_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA) + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_TRX", + plugin_author, + "InnoDB transactions", + PLUGIN_LICENSE_GPL, + innodb_trx_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE }; - -UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_stats = +UNIV_INTERN struct st_maria_plugin i_s_innodb_locks_maria = { - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "INNODB_SYS_STATS"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_STATS table"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_stats_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(__reserved1, NULL) + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_LOCKS", + plugin_author, + "InnoDB conflicting locks", + PLUGIN_LICENSE_GPL, + innodb_locks_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE }; - -UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_stats_maria = +UNIV_INTERN struct st_maria_plugin i_s_innodb_lock_waits_maria = { - STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN), - STRUCT_FLD(info, &i_s_info), - STRUCT_FLD(name, "INNODB_SYS_STATS"), - STRUCT_FLD(author, plugin_author), - STRUCT_FLD(descr, "InnoDB SYS_STATS table"), - STRUCT_FLD(license, PLUGIN_LICENSE_GPL), - STRUCT_FLD(init, i_s_innodb_sys_stats_init), - STRUCT_FLD(deinit, i_s_common_deinit), - STRUCT_FLD(version, 0x0100 /* 1.0 */), - STRUCT_FLD(status_vars, NULL), - STRUCT_FLD(system_vars, NULL), - STRUCT_FLD(version_info, "1.0"), - STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_BETA) + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_LOCK_WAITS", + plugin_author, + "InnoDB which lock is blocking which", + PLUGIN_LICENSE_GPL, + innodb_lock_waits_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_CMP", + plugin_author, + "Statistics for the InnoDB compression", + PLUGIN_LICENSE_GPL, + i_s_cmp_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_cmp_reset_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_CMP_RESET", + plugin_author, + "Statistics for the InnoDB compression; reset cumulated counts", + PLUGIN_LICENSE_GPL, + i_s_cmp_reset_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_CMPMEM", + plugin_author, + "Statistics for the InnoDB compressed buffer pool", + PLUGIN_LICENSE_GPL, + i_s_cmpmem_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_cmpmem_reset_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_CMPMEM_RESET", + plugin_author, + "Statistics for the InnoDB compressed buffer pool; reset cumulated counts", + PLUGIN_LICENSE_GPL, + i_s_cmpmem_reset_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tables_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_TABLES", + "Percona", + "InnoDB SYS_TABLES", + PLUGIN_LICENSE_GPL, + innodb_sys_tables_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_tablestats_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_TABLESTATS", + "Percona", + "InnoDB SYS_TABLESTATS", + PLUGIN_LICENSE_GPL, + innodb_sys_tablestats_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_indexes_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_INDEXES", + "Percona", + "InnoDB SYS_INDEXES", + PLUGIN_LICENSE_GPL, + innodb_sys_indexes_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_columns_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_COLUMNS", + "Percona", + "InnoDB SYS_COLUMNS", + PLUGIN_LICENSE_GPL, + innodb_sys_columns_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_fields_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_FIELDS", + "Percona", + "InnoDB SYS_FIELDS", + PLUGIN_LICENSE_GPL, + innodb_sys_fields_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_FOREIGN", + "Percona", + "InnoDB SYS_FOREIGN", + PLUGIN_LICENSE_GPL, + innodb_sys_foreign_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_foreign_cols_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_FOREIGN_COLS", + "Percona", + "InnoDB SYS_FOREIGN_COLS", + PLUGIN_LICENSE_GPL, + innodb_sys_foreign_cols_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_sys_stats_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_SYS_STATS", + "Percona", + "XtraDB SYS_STATS table", + PLUGIN_LICENSE_GPL, + innodb_sys_stats_init, + i_s_common_deinit, + INNODB_VERSION_SHORT, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_rseg_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_RSEG", + "Percona", + "InnoDB rollback segment information", + PLUGIN_LICENSE_GPL, + i_s_innodb_rseg_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_table_stats_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_TABLE_STATS", + "Percona", + "InnoDB table statistics in memory", + PLUGIN_LICENSE_GPL, + i_s_innodb_table_stats_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_index_stats_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_INDEX_STATS", + "Percona", + "InnoDB index statistics in memory", + PLUGIN_LICENSE_GPL, + i_s_innodb_index_stats_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_admin_command_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "XTRADB_ADMIN_COMMAND", + "Percona", + "XtraDB specific command acceptor", + PLUGIN_LICENSE_GPL, + i_s_innodb_admin_command_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_BUFFER_POOL_PAGES", + "Percona", + "InnoDB buffer pool pages", + PLUGIN_LICENSE_GPL, + i_s_innodb_buffer_pool_pages_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_index_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_BUFFER_POOL_PAGES_INDEX", + "Percona", + "InnoDB buffer pool index pages", + PLUGIN_LICENSE_GPL, + i_s_innodb_buffer_pool_pages_index_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE +}; +UNIV_INTERN struct st_maria_plugin i_s_innodb_buffer_pool_pages_blob_maria = +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &i_s_info, + "INNODB_BUFFER_POOL_PAGES_BLOB", + "Percona", + "InnoDB buffer pool blob pages", + PLUGIN_LICENSE_GPL, + i_s_innodb_buffer_pool_pages_blob_init, + i_s_common_deinit, + 0x0100, + NULL, + NULL, + INNODB_VERSION_STR, MariaDB_PLUGIN_MATURITY_STABLE }; - |