diff options
-rw-r--r-- | mysql-test/r/query_cache.result | 146 | ||||
-rw-r--r-- | mysql-test/t/query_cache.test | 92 | ||||
-rw-r--r-- | sql/sp_head.cc | 8 | ||||
-rw-r--r-- | sql/sql_cache.cc | 6 | ||||
-rw-r--r-- | sql/sql_parse.cc | 5 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 6 |
6 files changed, 261 insertions, 2 deletions
diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index 2dd89d0e4bb..862e7e0d8df 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -1932,6 +1932,152 @@ set local query_cache_type= on; select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; @@query_cache_size @@global.query_cache_type @@local.query_cache_type 20971520 ON ON +# +# MDEV-4981: Account for queries handled by query-cache in +# USER_STATISTICS (and in HOST_STATISTICS) +# +SET GLOBAL userstat=1; +set GLOBAL query_cache_size=1355776; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +reset query cache; +flush status; +create table t1 (a int); +insert into t1 values (1); +select * from t1; +a +1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 1 0 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 2 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from t1; +a +1 +select * from t1; +a +1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 5 0 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 6 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +drop table t1; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +create table t1 (a int); +select * from t1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from t1; +a +select * from t1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +create procedure p1() +select * from t1; +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +call p1; +a +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +SET GLOBAL query_cache_size= 0; +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +call p1; +a +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +drop procedure p1; +drop table t1; +set GLOBAL query_cache_size=1355776; +SET GLOBAL userstat=default; +End of 5.5 tests restore defaults SET GLOBAL query_cache_type= default; SET GLOBAL query_cache_size= default; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index c8371ea31f1..47fa628190a 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -1617,6 +1617,98 @@ select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; set local query_cache_type= on; select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; +--echo # +--echo # MDEV-4981: Account for queries handled by query-cache in +--echo # USER_STATISTICS (and in HOST_STATISTICS) +--echo # + +SET GLOBAL userstat=1; +set GLOBAL query_cache_size=1355776; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +reset query cache; +flush status; + +create table t1 (a int); +insert into t1 values (1); +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +select * from t1; +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +drop table t1; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +create table t1 (a int); +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +select * from t1; +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +create procedure p1() + select * from t1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +call p1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +SET GLOBAL query_cache_size= 0; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +call p1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +drop procedure p1; +drop table t1; +set GLOBAL query_cache_size=1355776; +SET GLOBAL userstat=default; + +--echo End of 5.5 tests --echo restore defaults SET GLOBAL query_cache_type= default; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 4cf4a0731a8..0c887c5e157 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -3170,7 +3170,15 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) log_slow_statement(thd); } else + { + /* change statistics */ + enum_sql_command save_sql_command= thd->lex->sql_command; + thd->lex->sql_command= SQLCOM_SELECT; + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); + thd->lex->sql_command= save_sql_command; *nextp= m_ip+1; + } thd->set_query(query_backup); thd->query_name_consts= 0; diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index bcc18d316c8..debd06db455 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2074,9 +2074,13 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d", } #endif /*!EMBEDDED_LIBRARY*/ - thd->limit_found_rows = query->found_rows(); + thd->sent_row_count= thd->limit_found_rows = query->found_rows(); thd->status_var.last_query_cost= 0.0; thd->query_plan_flags= (thd->query_plan_flags & ~QPLAN_QC_NO) | QPLAN_QC; + if (!thd->sent_row_count) + status_var_increment(thd->status_var.empty_queries); + else + status_var_add(thd->status_var.rows_sent, thd->sent_row_count); /* End the statement transaction potentially started by an diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 36c70daae72..17503e08307 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4899,7 +4899,8 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables) /* Count number of empty select queries */ if (!thd->sent_row_count) status_var_increment(thd->status_var.empty_queries); - status_var_add(thd->status_var.rows_sent, thd->sent_row_count); + else + status_var_add(thd->status_var.rows_sent, thd->sent_row_count); return res; } @@ -6038,6 +6039,8 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, { /* Update statistics for getting the query from the cache */ thd->lex->sql_command= SQLCOM_SELECT; + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); } DBUG_VOID_RETURN; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 7a6ed21ec33..f4371624d6c 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -3913,6 +3913,12 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) error= mysql_execute_command(thd); MYSQL_QUERY_EXEC_DONE(error); } + else + { + thd->lex->sql_command= SQLCOM_SELECT; + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); + } } /* |