MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Kristofer Pettersson Date:October 15 2008 9:59am
Subject:bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2702)
View as plain text  
#At file:///home/thek/Development/cpp/mysqlbzr/mysql-5.0-bugteam/

 2702 Kristofer Pettersson	2008-10-15 [merge]
      automerge
added:
  mysql-test/r/status2.result
  mysql-test/t/status2.test
modified:
  sql/mysqld.cc
  sql/sql_class.h
  sql/sql_parse.cc
  sql/sql_show.cc
  sql/structs.h

=== 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-10-09 07:26:42 +0000
@@ -0,0 +1,64 @@
+#
+# Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines
+#
+FLUSH STATUS;
+DROP TABLE IF EXISTS t1,t2;
+DROP PROCEDURE IF EXISTS p1;
+DROP FUNCTION IF EXISTS f1;
+CREATE FUNCTION f1() RETURNS INTEGER
+BEGIN
+DECLARE foo INTEGER;
+DECLARE bar INTEGER;
+SET foo=1;
+SET bar=2;
+RETURN foo;
+END $$
+CREATE PROCEDURE p1()
+BEGIN
+SELECT 1;
+END $$
+CREATE TABLE t1 (c1 INT);
+CREATE TABLE t2 (c1 INT);
+INSERT INTO t1 VALUES (1);
+Assert Questions == 9
+SHOW STATUS LIKE 'Questions';
+Variable_name	Value
+Questions	9
+SELECT f1();
+f1()
+1
+Assert Questions == 11
+SHOW STATUS LIKE 'Questions';
+Variable_name	Value
+Questions	11
+CALL p1();
+1
+1
+Assert Questions == 13
+SHOW STATUS LIKE 'Questions';
+Variable_name	Value
+Questions	13
+SELECT 1;
+1
+1
+Assert Questions == 15
+SHOW STATUS LIKE 'Questions';
+Variable_name	Value
+Questions	15
+FLUSH STATUS;
+SELECT 1;
+1
+1
+Assert Questions == 16
+SHOW STATUS LIKE 'Questions';
+Variable_name	Value
+Questions	16
+Global status updated; Assert diff == 5
+FLUSH STATUS;
+SELECT 5;
+5
+5
+DROP TABLE t1,t2;
+DROP PROCEDURE p1;
+DROP FUNCTION f1;
+End of 6.0 tests

=== 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-10-09 07:26:42 +0000
@@ -0,0 +1,64 @@
+--echo #
+--echo # Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines
+--echo #
+# The bogus connection below is needed to make the gobal statement count
+# deterministic when the test is run for the first time. 
+connect (con1,localhost,root,,);
+connection con1;
+connection default;
+disconnect con1;
+FLUSH STATUS;
+--disable_warnings
+DROP TABLE IF EXISTS t1,t2;
+DROP PROCEDURE IF EXISTS p1;
+DROP FUNCTION IF EXISTS f1;
+--enable_warnings
+DELIMITER $$;
+CREATE FUNCTION f1() RETURNS INTEGER
+BEGIN
+  DECLARE foo INTEGER;
+  DECLARE bar INTEGER;
+  SET foo=1;
+  SET bar=2;
+  RETURN foo;
+END $$
+CREATE PROCEDURE p1()
+BEGIN
+  SELECT 1;
+END $$
+DELIMITER ;$$
+CREATE TABLE t1 (c1 INT);
+CREATE TABLE t2 (c1 INT);
+INSERT INTO t1 VALUES (1);
+--echo Assert Questions == 9
+SHOW STATUS LIKE 'Questions';
+SELECT f1();
+--echo Assert Questions == 11
+SHOW STATUS LIKE 'Questions';
+CALL p1();
+--echo Assert Questions == 13
+SHOW STATUS LIKE 'Questions';
+SELECT 1;
+--echo Assert Questions == 15
+SHOW STATUS LIKE 'Questions';
+connect (con1,localhost,root,,);
+connection con1;
+FLUSH STATUS;
+let $org_questions= `SHOW GLOBAL STATUS LIKE 'questions'`;
+SELECT 1;
+connection default;
+disconnect con1;
+--echo Assert Questions == 16
+SHOW STATUS LIKE 'Questions';
+--echo Global status updated; Assert diff == 5
+FLUSH STATUS;
+let $new_questions= `SHOW GLOBAL STATUS LIKE 'questions'`;
+--disable_log
+let $diff= `SELECT SUBSTRING('$new_questions',10)-SUBSTRING('$org_questions',10)`;
+--enable_log
+eval SELECT $diff;
+DROP TABLE t1,t2;
+DROP PROCEDURE p1;
+DROP FUNCTION f1;
+--echo End of 6.0 tests
+

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2008-08-26 08:32:43 +0000
+++ b/sql/mysqld.cc	2008-10-09 07:26:42 +0000
@@ -6573,7 +6573,9 @@ struct show_var_st status_vars[]= {
   {"Qcache_queries_in_cache",  (char*) &query_cache.queries_in_cache, SHOW_LONG_CONST},
   {"Qcache_total_blocks",      (char*) &query_cache.total_blocks, SHOW_LONG_CONST},
 #endif /*HAVE_QUERY_CACHE*/
-  {"Questions",                (char*) 0,                       SHOW_QUESTION},
+  {"Questions",                (char*) offsetof(STATUS_VAR, questions),
+   SHOW_LONG_STATUS},
+
   {"Rpl_status",               (char*) 0,                 SHOW_RPL_STATUS},
   {"Select_full_join",         (char*) offsetof(STATUS_VAR, select_full_join_count), SHOW_LONG_STATUS},
   {"Select_full_range_join",   (char*) offsetof(STATUS_VAR, select_full_range_join_count), SHOW_LONG_STATUS},

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2008-09-17 06:34:00 +0000
+++ b/sql/sql_class.h	2008-10-09 07:26:42 +0000
@@ -664,10 +664,17 @@ 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;
 
   /*
-    Status variables which it does not make sense to add to
-    global status variable counter
+    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.
   */
   double last_query_cost;
 } STATUS_VAR;
@@ -678,7 +685,7 @@ typedef struct system_status_var
   counter
 */
 
-#define last_system_status_var com_stmt_close
+#define last_system_status_var questions
 
 
 void free_tmp_table(THD *thd, TABLE *entry);

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2008-10-02 11:57:52 +0000
+++ b/sql/sql_parse.cc	2008-10-15 10:06:44 +0000
@@ -1690,8 +1690,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));
@@ -1896,6 +1912,11 @@ bool dispatch_command(enum enum_server_c
       VOID(pthread_mutex_lock(&LOCK_thread_count));
       thd->query_length= length;
       thd->query= next_packet;
+      /*
+        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 */

=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc	2008-10-02 09:37:07 +0000
+++ b/sql/sql_show.cc	2008-10-15 10:06:44 +0000
@@ -1520,9 +1520,6 @@ static bool show_status_array(THD *thd, 
           nr= (long) (thd->query_start() - server_start_time);
           end= int10_to_str(nr, buff, 10);
           break;
-        case SHOW_QUESTION:
-          end= int10_to_str((long) thd->query_id, buff, 10);
-          break;
 #ifdef HAVE_REPLICATION
         case SHOW_RPL_STATUS:
           end= strmov(buff, rpl_status_type[(int)rpl_status]);

=== modified file 'sql/structs.h'
--- a/sql/structs.h	2007-10-26 10:37:38 +0000
+++ b/sql/structs.h	2008-10-09 07:26:42 +0000
@@ -170,7 +170,7 @@ enum SHOW_TYPE
   SHOW_UNDEF,
   SHOW_LONG, SHOW_LONGLONG, SHOW_INT, SHOW_CHAR, SHOW_CHAR_PTR, 
   SHOW_DOUBLE_STATUS,
-  SHOW_BOOL, SHOW_MY_BOOL, SHOW_OPENTABLES, SHOW_STARTTIME, SHOW_QUESTION,
+  SHOW_BOOL, SHOW_MY_BOOL, SHOW_OPENTABLES, SHOW_STARTTIME, 
   SHOW_LONG_CONST, SHOW_INT_CONST, SHOW_HAVE, SHOW_SYS, SHOW_HA_ROWS,
   SHOW_VARS,
 #ifdef HAVE_OPENSSL

Thread
bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2702)Kristofer Pettersson15 Oct