#At file:///home/gluh/MySQL/mysql-5.1-bugteam/ based on revid:mattias.jonsson@stripped
2739 Sergey Glukhov 2008-12-17
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
added:
mysql-test/r/status2.result
mysql-test/t/status2.test
modified:
mysql-test/r/myisampack.result
mysql-test/t/myisampack.test
sql/mysqld.cc
sql/sql_class.h
sql/sql_parse.cc
per-file messages:
mysql-test/r/myisampack.result
result fix
mysql-test/r/status2.result
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
mysql-test/t/myisampack.test
test case fix
mysql-test/t/status2.test
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
sql/mysqld.cc
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
sql/sql_class.h
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
sql/sql_parse.cc
Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines(for 5.1)
=== modified file 'mysql-test/r/myisampack.result'
--- a/mysql-test/r/myisampack.result 2008-12-09 09:04:28 +0000
+++ b/mysql-test/r/myisampack.result 2008-12-17 13:23:21 +0000
@@ -28,7 +28,7 @@ Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
drop table if exists t1;
-create table t1(f1 int, f2 varchar(255));
+create table t1(f1 int, f2 char(255));
insert into t1 values(1, 'foo'), (2, 'bar');
insert into t1 select * from t1;
insert into t1 select * from t1;
=== added file 'mysql-test/r/status2.result'
--- a/mysql-test/r/status2.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/status2.result 2008-12-17 13:23:21 +0000
@@ -0,0 +1,73 @@
+#
+# Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines
+#
+FLUSH STATUS;
+CREATE FUNCTION testQuestion() RETURNS INTEGER
+BEGIN
+DECLARE foo INTEGER;
+DECLARE bar INTEGER;
+SET foo=1;
+SET bar=2;
+RETURN foo;
+END $$
+CREATE PROCEDURE testQuestion2()
+BEGIN
+SELECT 1;
+END $$
+DROP TABLE IF EXISTS t1,t2;
+CREATE TABLE t1 (c1 INT);
+CREATE TABLE t2 (c1 INT);
+CREATE EVENT ev1 ON SCHEDULE EVERY 1 SECOND
+DO INSERT INTO t1 VALUES(1);
+Assert Questions == 7
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 7
+SELECT testQuestion();
+testQuestion()
+1
+Assert Questions == 9
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 9
+CALL testQuestion2();
+1
+1
+Assert Questions == 11
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 11
+SELECT 1;
+1
+1
+Assert Questions == 13
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 13
+SELECT 1;
+1
+1
+Assert Questions == 14
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 14
+CREATE TRIGGER trigg1 AFTER INSERT ON t1
+FOR EACH ROW BEGIN
+INSERT INTO t2 VALUES (1);
+END;
+$$
+Assert Questions == 16
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 16
+INSERT INTO t1 VALUES (1);
+Assert Questions == 18
+SHOW STATUS LIKE 'Questions';
+Variable_name Value
+Questions 18
+DROP PROCEDURE testQuestion2;
+DROP TRIGGER trigg1;
+DROP FUNCTION testQuestion;
+DROP EVENT ev1;
+DROP TABLE t1,t2;
+End of 6.0 tests
=== modified file 'mysql-test/t/myisampack.test'
--- a/mysql-test/t/myisampack.test 2008-12-09 09:04:28 +0000
+++ b/mysql-test/t/myisampack.test 2008-12-17 13:23:21 +0000
@@ -38,7 +38,7 @@ DROP TABLE t1;
--disable_warnings
drop table if exists t1;
--enable_warnings
-create table t1(f1 int, f2 varchar(255));
+create table t1(f1 int, f2 char(255));
insert into t1 values(1, 'foo'), (2, 'bar');
insert into t1 select * from t1;
insert into t1 select * from t1;
=== added file 'mysql-test/t/status2.test'
--- a/mysql-test/t/status2.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/status2.test 2008-12-17 13:23:21 +0000
@@ -0,0 +1,68 @@
+--source include/not_embedded.inc
+
+--echo #
+--echo # Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines
+--echo #
+FLUSH STATUS;
+DELIMITER $$;
+CREATE FUNCTION testQuestion() RETURNS INTEGER
+BEGIN
+ DECLARE foo INTEGER;
+ DECLARE bar INTEGER;
+ SET foo=1;
+ SET bar=2;
+ RETURN foo;
+END $$
+CREATE PROCEDURE testQuestion2()
+BEGIN
+ SELECT 1;
+END $$
+DELIMITER ;$$
+--disable_warnings
+DROP TABLE IF EXISTS t1,t2;
+--enable_warnings
+CREATE TABLE t1 (c1 INT);
+CREATE TABLE t2 (c1 INT);
+CREATE EVENT ev1 ON SCHEDULE EVERY 1 SECOND
+ DO INSERT INTO t1 VALUES(1);
+
+--echo Assert Questions == 7
+SHOW STATUS LIKE 'Questions';
+SELECT testQuestion();
+--echo Assert Questions == 9
+SHOW STATUS LIKE 'Questions';
+CALL testQuestion2();
+--echo Assert Questions == 11
+SHOW STATUS LIKE 'Questions';
+SELECT 1;
+--echo Assert Questions == 13
+SHOW STATUS LIKE 'Questions';
+connect (con1,localhost,root,,);
+connection con1;
+SELECT 1;
+connection default;
+disconnect con1;
+--echo Assert Questions == 14
+SHOW STATUS LIKE 'Questions';
+DELIMITER $$;
+CREATE TRIGGER trigg1 AFTER INSERT ON t1
+ FOR EACH ROW BEGIN
+ INSERT INTO t2 VALUES (1);
+ END;
+$$
+DELIMITER ;$$
+--echo Assert Questions == 16
+SHOW STATUS LIKE 'Questions';
+INSERT INTO t1 VALUES (1);
+--echo Assert Questions == 18
+SHOW STATUS LIKE 'Questions';
+# TODO: Uncomment the lines below when FLUSH GLOBAL STATUS is implemented.
+# FLUSH STATUS;
+# SHOW GLOBAL STATUS LIKE 'Questions';
+DROP PROCEDURE testQuestion2;
+DROP TRIGGER trigg1;
+DROP FUNCTION testQuestion;
+DROP EVENT ev1;
+DROP TABLE t1,t2;
+--echo End of 6.0 tests
+
=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc 2008-12-05 18:20:05 +0000
+++ b/sql/mysqld.cc 2008-12-17 13:23:21 +0000
@@ -6867,12 +6867,6 @@ The minimum value for this variable is 4
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
};
-static int show_question(THD *thd, SHOW_VAR *var, char *buff)
-{
- var->type= SHOW_LONGLONG;
- var->value= (char *)&thd->query_id;
- return 0;
-}
static int show_net_compression(THD *thd, SHOW_VAR *var, char *buff)
{
@@ -7289,7 +7283,7 @@ SHOW_VAR status_vars[]= {
{"Qcache_queries_in_cache", (char*) &query_cache.queries_in_cache, SHOW_LONG_NOFLUSH},
{"Qcache_total_blocks", (char*) &query_cache.total_blocks, SHOW_LONG_NOFLUSH},
#endif /*HAVE_QUERY_CACHE*/
- {"Questions", (char*) &show_question, SHOW_FUNC},
+ {"Questions", (char*) offsetof(STATUS_VAR, questions), SHOW_LONG_STATUS},
#ifdef HAVE_REPLICATION
{"Rpl_status", (char*) &show_rpl_status, SHOW_FUNC},
#endif
=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h 2008-12-04 14:07:56 +0000
+++ b/sql/sql_class.h 2008-12-17 13:23:21 +0000
@@ -456,8 +456,15 @@ typedef struct system_status_var
ulong com_stmt_fetch;
ulong com_stmt_reset;
ulong com_stmt_close;
-
/*
+ Number of statements sent from the client
+ */
+ ulong questions;
+ /*
+ IMPORTANT!
+ SEE last_system_status_var DEFINITION BELOW.
+ Below 'last_system_status_var' are all variables which doesn't make any
+ sense to add to the /global/ status variable counter.
Status variables which it does not make sense to add to
global status variable counter
*/
@@ -470,7 +477,7 @@ typedef struct system_status_var
counter
*/
-#define last_system_status_var com_stmt_close
+#define last_system_status_var questions
void mark_transaction_to_rollback(THD *thd, bool all);
=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc 2008-10-24 12:50:59 +0000
+++ b/sql/sql_parse.cc 2008-12-17 13:23:21 +0000
@@ -971,8 +971,24 @@ bool dispatch_command(enum enum_server_c
thd->set_time();
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query_id= global_query_id;
- if (command != COM_STATISTICS && command != COM_PING)
+
+ switch( command ) {
+ /* Ignore these statements. */
+ case COM_STATISTICS:
+ case COM_PING:
+ break;
+ /* Only increase id on these statements but don't count them. */
+ case COM_STMT_PREPARE:
+ case COM_STMT_CLOSE:
+ case COM_STMT_RESET:
next_query_id();
+ break;
+ /* Increase id and count all other statements. */
+ default:
+ statistic_increment(thd->status_var.questions, &LOCK_status);
+ next_query_id();
+ }
+
thread_running++;
/* TODO: set thd->lex->sql_command to SQLCOM_END here */
VOID(pthread_mutex_unlock(&LOCK_thread_count));
@@ -1229,6 +1245,10 @@ bool dispatch_command(enum enum_server_c
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query_length= length;
thd->query= beginning_of_next_stmt;
+ /*
+ Count each statement from the client.
+ */
+ statistic_increment(thd->status_var.questions, &LOCK_status);
thd->query_id= next_query_id();
thd->set_time(); /* Reset the query start time. */
/* TODO: set thd->lex->sql_command to SQLCOM_END here */
| Thread |
|---|
| • bzr commit into mysql-5.1-bugteam branch (Sergey.Glukhov:2739)Bug#24289 | Sergey Glukhov | 17 Dec |