From d4557934ec1d00d5c36f8e7b1b127a4dafee4e39 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 18 May 2015 22:03:01 +1000 Subject: [PATCH] plugin - qc_info - add Query Cache flags --- mysql-test/suite/plugins/r/qc_info.result | Bin 1283 -> 3508 bytes .../suite/plugins/r/qc_info_priv.result | Bin 646 -> 2593 bytes mysql-test/suite/plugins/t/qc_info_init.inc | 17 ++++ plugin/qc_info/qc_info.cc | 87 ++++++++++++++++-- 4 files changed, 98 insertions(+), 6 deletions(-) diff --git a/mysql-test/suite/plugins/r/qc_info.result b/mysql-test/suite/plugins/r/qc_info.result index 0924b5bd12dc4bb4e1456909fdbe5459871b4975..ec70a42cb98d7058b6f1eb78747bfa5533d3851e 100644 GIT binary patch literal 3508 zcmeGfTT`n>*w@Xk*td8(^fV+|+d9kyaaBex7B;P(mz|ZYhLNxySiGEH-*183IK=5= z+vzy0;k)1WqZA51X7ZkA_-iGKcb4#EA((o97FHOX4objhGWiJI!(OJ}gk?^Sk55j1 zJ{=^5;7VY{?=v_}e8_Q{E1XMssx13-I!Nj?HvB7Y|&!_$tH`YwT~SdoWvk$$}R=QKDdwZ_GQ9Ty2dWKrd6RwyR2GU#6eW*2O02a4&xp-~7 zsFPop|MDGz^?6+pO#6qkRNDfLp?h|Xv!*-zMo%GFM@CJx|^WuHj!M2IChLw7l zi~%dNtmzYQGlwRHT(w9B5{AYqvDPrAk?T-qdmf|qnMdNGu_wjWiLsL?Ysd>0pAU^q zl&z70`(kJvn-c?f5@(qsvkpyniVO}84orQF^`WQ9cJT0~%?#WZI^5TD2JVd~p7w$F zM7K-aMjfVF+cg%Ru6}}P{jC5rdoTvx4KLp93j=S(8BaGadqR$=*eoXJ$a8&{ zBHzAcaTrnNk>HYEq01iXnM7!Y($E^KY;pM+eqi!kzSiq73X*iA$nHwIGX22ND_isIir=7;A5c@EP8SYZ1k zMvX@1g~27e@a)SK;3f)b2rAi;iPpdA-3>v07!lUk6f<(`#xzE5z-VL#F|ucx%hwUO zv7KvhDVX_ZB>L!*Lgp{Oq90A9dkikE32Fuhss}`K>Pdh|Rmf-YlP}9ezM>;^0*UJk z1XQ;<+Wl_4o+%!=YzUZtnhL<*S&d<$@(Citl159*}*6f{h*CKMV_P&0eIB3)PC%JXI-hE_i{5-3@(+K|_|p&TI}IvZ`GCCp`HJ5RS9Q delta 21 dcmdlY-ORONA>(En&SpkNt_k9s-*O*k1OQRg2T%Y2 diff --git a/mysql-test/suite/plugins/r/qc_info_priv.result b/mysql-test/suite/plugins/r/qc_info_priv.result index f7b538f46e4eba8c984e6b820718cb90b2cd0cc5..692195f12c325f478a6c934f2eee314b23b4da82 100644 GIT binary patch literal 2593 zcmb7G>r&HwbYWkEG_fbl}u0{C7b9jS+Nd=@BD ziB!Zj{XiefB154wB~mnHt}J>^RilwiR_K%$WoZQe&`7w>!q_QJvG!`V@m7+nOX$%c)d6Z#2HRWaO&<3(u z^c||AtRWToQ~lgYkEjFrXk8a^k!4Bm&XzEcdMbWXJaQANODb_~QLytST zT)ehXG|6wuKYK&4K5i-kWPCJDq%YVQvS&9u-PqArCkjDds#96kXZJ}Sm2a~Vw@aix zTi1_^IdY3MZTken%&|!^R~-{@hndg`s|;EmS&6oUR>f4K(8^q8uC?XmXj$MNX3;cy!xlDxHFkPW7BhC-J1l z6nPK2W8n^UoN8Uy=+x+6(Y5JTK$$%pmF~hzcl$!61DvU`{n!IJHKsE0YZj<6%FCwU zyTSgS#%{<>&Rphk2(4@8nq*7h?2eOwg)4`{x#L?mAz1#(8`DDjGaHFX60AaYK^)t) zIdRQ92>pPA!@MhgO|Aleb&H#MmdQafJGymk2ByVX03qXGIX3!5c8RS&#PS`-&(}?UbJhT?19UP(8l&ZhtwE(A~j diff --git a/mysql-test/suite/plugins/t/qc_info_init.inc b/mysql-test/suite/plugins/t/qc_info_init.inc index 1de99cc9029..2f898e09165 100644 --- a/mysql-test/suite/plugins/t/qc_info_init.inc +++ b/mysql-test/suite/plugins/t/qc_info_init.inc @@ -12,3 +12,20 @@ insert into t1 values (1),(2),(3); select * from t1; select statement_schema, statement_text, result_blocks_count, result_blocks_size from information_schema.query_cache_info; +select @@time_zone into @time_zone; +select @@default_week_format into @default_week_format; +select @@character_set_client into @character_set_client; +select @@character_set_results into @character_set_results; +select @@sql_mode into @sql_mode; +select @@div_precision_increment into @div_precision_increment; +select @@lc_time_names into @lc_time_names; +select @@max_sort_length into @max_sort_length; +select @@autocommit into @autocommit; +select @@group_concat_max_len into @group_concat_max_len; +select Name into @new_time_zone from mysql.time_zone_name limit 1; +set time_zone=@new_time_zone,default_week_format=4,character_set_client='binary',character_set_results='utf32',collation_connection='utf32_bin',sql_mode='STRICT_ALL_TABLES',div_precision_increment=7,lc_time_names='ar_SD',autocommit=0, group_concat_max_len=513, max_sort_length=1011; +select * from t1; +set time_zone= @time_zone, default_week_format= @default_week_format, character_set_client= @character_set_client,character_set_results= @character_set_results, sql_mode= @sql_mode, div_precision_increment= @div_precision_increment, lc_time_names= @lc_time_names, autocommit= @autocommit, group_concat_max_len= @group_concat_max_len, max_sort_length= @max_sort_length; + +select * from information_schema.query_cache_info; + diff --git a/plugin/qc_info/qc_info.cc b/plugin/qc_info/qc_info.cc index 796fa0fbd9a..998076dadf7 100644 --- a/plugin/qc_info/qc_info.cc +++ b/plugin/qc_info/qc_info.cc @@ -28,9 +28,6 @@ */ -/* - * TODO: report query cache flags - */ #ifndef MYSQL_SERVER #define MYSQL_SERVER #endif @@ -40,6 +37,8 @@ #include // PROCESS_ACL #include // THD #include // ST_SCHEMA_TABLE +#include // sql_mode_string_representation +#include #include class Accessible_Query_Cache : public Query_cache { @@ -58,6 +57,25 @@ bool schema_table_store_record(THD *thd, TABLE *table); #define COLUMN_RESULT_BLOCKS_COUNT 2 #define COLUMN_RESULT_BLOCKS_SIZE 3 #define COLUMN_RESULT_BLOCKS_SIZE_USED 4 +#define COLUMN_LIMIT 5 +#define COLUMN_MAX_SORT_LENGTH 6 +#define COLUMN_GROUP_CONCAT_MAX_LENGTH 7 +#define COLUMN_CHARACTER_SET_CLIENT 8 +#define COLUMN_CHARACTER_SET_RESULT 9 +#define COLUMN_COLLATION 10 +#define COLUMN_TIMEZONE 11 +#define COLUMN_DEFAULT_WEEK_FORMAT 12 +#define COLUMN_DIV_PRECISION_INCREMENT 13 +#define COLUMN_SQL_MODE 14 +#define COLUMN_LC_TIME_NAMES 15 + +#define COLUMN_CLIENT_LONG_FLAG 16 +#define COLUMN_CLIENT_PROTOCOL_41 17 +#define COLUMN_PROTOCOL_TYPE 18 +#define COLUMN_MORE_RESULTS_EXISTS 19 +#define COLUMN_IN_TRANS 20 +#define COLUMN_AUTOCOMMIT 21 +#define COLUMN_PKT_NR 22 /* ST_FIELD_INFO is defined in table.h */ static ST_FIELD_INFO qc_info_fields[]= @@ -67,6 +85,24 @@ static ST_FIELD_INFO qc_info_fields[]= {"RESULT_BLOCKS_COUNT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, 0, 0}, {"RESULT_BLOCKS_SIZE", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, 0, 0}, {"RESULT_BLOCKS_SIZE_USED", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, 0, 0}, + {"LIMIT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, 0, 0}, + {"MAX_SORT_LENGTH", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, 0, 0}, + {"GROUP_CONCAT_MAX_LENGTH", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, 0, 0}, + {"CHARACTER_SET_CLIENT", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"CHARACTER_SET_RESULT", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"COLLATION", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"TIMEZONE", 50, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"DEFAULT_WEEK_FORMAT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, 0, 0}, + {"DIV_PRECISION_INCREMENT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, 0, 0}, + {"SQL_MODE", 250, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"LC_TIME_NAMES", 100, MYSQL_TYPE_STRING, 0, 0, 0, 0}, + {"CLIENT_LONG_FLAG", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"CLIENT_PROTOCOL_41", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"PROTOCOL_TYPE", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"MORE_RESULTS_EXISTS", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"IN_TRANS", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"AUTOCOMMIT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, + {"PACKET_NUMBER", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_TINY, 0, 0, 0, 0}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} }; @@ -91,6 +127,7 @@ static int qc_info_fill_table(THD *thd, TABLE_LIST *tables, const uchar *query_cache_block_raw; Query_cache_block* query_cache_block; Query_cache_query* query_cache_query; + Query_cache_query_flags flags; uint result_blocks_count; ulonglong result_blocks_size; ulonglong result_blocks_size_used; @@ -98,8 +135,14 @@ static int qc_info_fill_table(THD *thd, TABLE_LIST *tables, Query_cache_block *result_block; const char *statement_text; size_t statement_text_length; + size_t flags_length; const char *key, *db; size_t key_length, db_length; + LEX_STRING sql_mode_str; + const String *tz; + CHARSET_INFO *cs_client; + CHARSET_INFO *cs_result; + CHARSET_INFO *collation; query_cache_block_raw = my_hash_element(queries, i); query_cache_block = (Query_cache_block*)query_cache_block_raw; @@ -118,6 +161,38 @@ static int qc_info_fill_table(THD *thd, TABLE_LIST *tables, /* get the entire key that identifies this query cache query */ key = (const char*)query_cache_query_get_key(query_cache_block_raw, &key_length, 0); + /* get and store the flags */ + flags_length= key_length - QUERY_CACHE_FLAGS_SIZE; + memcpy(&flags, key+flags_length, QUERY_CACHE_FLAGS_SIZE); + table->field[COLUMN_LIMIT]->store(flags.limit, 0); + table->field[COLUMN_MAX_SORT_LENGTH]->store(flags.max_sort_length, 0); + table->field[COLUMN_GROUP_CONCAT_MAX_LENGTH]->store(flags.group_concat_max_len, 0); + + cs_client= get_charset(flags.character_set_client_num, MYF(MY_WME)); + table->field[COLUMN_CHARACTER_SET_CLIENT]->store(cs_client->csname, strlen(cs_client->csname), scs); + cs_result= get_charset(flags.character_set_results_num, MYF(MY_WME)); + table->field[COLUMN_CHARACTER_SET_RESULT]->store(cs_result->csname, strlen(cs_result->csname), scs); + collation= get_charset(flags.collation_connection_num, MYF(MY_WME)); + table->field[COLUMN_COLLATION]->store(collation->name, strlen(collation->name), scs); + + tz= flags.time_zone->get_name(); + table->field[COLUMN_TIMEZONE]->store(tz->ptr(), tz->length(), scs); + table->field[COLUMN_DEFAULT_WEEK_FORMAT]->store(flags.default_week_format, 0); + table->field[COLUMN_DIV_PRECISION_INCREMENT]->store(flags.div_precision_increment, 0); + + sql_mode_string_representation(thd, flags.sql_mode, &sql_mode_str); + table->field[COLUMN_SQL_MODE]->store(sql_mode_str.str, sql_mode_str.length, scs); + + table->field[COLUMN_LC_TIME_NAMES]->store(flags.lc_time_names->name,strlen(flags.lc_time_names->name), scs); + + table->field[COLUMN_CLIENT_LONG_FLAG]->store(flags.client_long_flag, 0); + table->field[COLUMN_CLIENT_PROTOCOL_41]->store(flags.client_protocol_41, 0); + table->field[COLUMN_PROTOCOL_TYPE]->store(flags.protocol_type, 0); + table->field[COLUMN_MORE_RESULTS_EXISTS]->store(flags.more_results_exists, 0); + table->field[COLUMN_IN_TRANS]->store(flags.in_trans, 0); + table->field[COLUMN_AUTOCOMMIT]->store(flags.autocommit, 0); + table->field[COLUMN_PKT_NR]->store(flags.pkt_nr, 0); + /* The database against which the statement is executed is part of the query cache query key */ @@ -198,15 +273,15 @@ maria_declare_plugin(query_cache_info) MYSQL_INFORMATION_SCHEMA_PLUGIN, &qc_info_plugin, "QUERY_CACHE_INFO", - "Roland Bouman", + "Roland Bouman, Daniel Black", "Lists all queries in the query cache.", PLUGIN_LICENSE_BSD, qc_info_plugin_init, /* Plugin Init */ 0, /* Plugin Deinit */ - 0x0100, /* version, hex */ + 0x0101, /* version, hex */ NULL, /* status variables */ NULL, /* system variables */ - "1.0", /* version as a string */ + "1.1", /* version as a string */ MariaDB_PLUGIN_MATURITY_GAMMA } maria_declare_plugin_end;