List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:December 17 2008 1:23pm
Subject:bzr commit into mysql-5.1-bugteam branch (Sergey.Glukhov:2739)
Bug#24289
View as plain text  
#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#24289Sergey Glukhov17 Dec