So after I published my patch last night, another of my colleagues – the esteemed Shane Bester – pointed out that there is a related bug – Bug#28405 – which requests that Com_change_user is also split out from Com_admin_commands.
So I extended my patch this morning, to kill two birds with one stone:
=== modified file 'sql/mysqld.cc'
--- sql/mysqld.cc revid:alik@sun.com-20100114090008-3rsdmlp1w2mqgrhg
+++ sql/mysqld.cc 2010-03-03 09:57:40 +0000
@@ -3131,6 +3131,7 @@
{"call_procedure", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CALL]), SHOW_LONG_STATUS},
{"change_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHANGE_DB]), SHOW_LONG_STATUS},
{"change_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHANGE_MASTER]), SHOW_LONG_STATUS},
+ {"change_user", (char*) offsetof(STATUS_VAR, com_change_user), SHOW_LONG_STATUS},
{"check", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHECK]), SHOW_LONG_STATUS},
{"checksum", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHECKSUM]), SHOW_LONG_STATUS},
{"commit", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_COMMIT]), SHOW_LONG_STATUS},
@@ -3174,6 +3175,7 @@
{"load", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOAD]), SHOW_LONG_STATUS},
{"lock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOCK_TABLES]), SHOW_LONG_STATUS},
{"optimize", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_OPTIMIZE]), SHOW_LONG_STATUS},
+ {"ping", (char*) offsetof(STATUS_VAR, com_ping), SHOW_LONG_STATUS},
{"preload_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PRELOAD_KEYS]), SHOW_LONG_STATUS},
{"prepare_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PREPARE]), SHOW_LONG_STATUS},
{"purge", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PURGE]), SHOW_LONG_STATUS},
@@ -3350,11 +3352,13 @@
We have few debug-only commands in com_status_vars, only visible in debug
builds. for simplicity we enable the assert only in debug builds
- There are 8 Com_ variables which don't have corresponding SQLCOM_ values:
+ There are 10 Com_ variables which don't have corresponding SQLCOM_ values:
(TODO strictly speaking they shouldn't be here, should not have Com_ prefix
that is. Perhaps Stmt_ ? Comstmt_ ? Prepstmt_ ?)
Com_admin_commands => com_other
+ Com_change_user => com_change_user
+ Com_ping => com_ping
Com_stmt_close => com_stmt_close
Com_stmt_execute => com_stmt_execute
Com_stmt_fetch => com_stmt_fetch
@@ -3368,7 +3372,7 @@
of SQLCOM_ constants.
*/
compile_time_assert(sizeof(com_status_vars)/sizeof(com_status_vars[0]) - 1 ==
- SQLCOM_END + 8);
+ SQLCOM_END + 10);
#endif
if (get_options(&remaining_argc, &remaining_argv))
=== modified file 'sql/sql_class.h'
--- sql/sql_class.h revid:alik@sun.com-20100114090008-3rsdmlp1w2mqgrhg
+++ sql/sql_class.h 2010-03-03 09:56:18 +0000
@@ -443,6 +443,8 @@
ulong ha_discover_count;
ulong ha_savepoint_count;
ulong ha_savepoint_rollback_count;
+ ulong com_ping;
+ ulong com_change_user;
/* KEY_CACHE parts. These are copies of the original */
ulong key_blocks_changed;
=== modified file 'sql/sql_parse.cc'
--- sql/sql_parse.cc revid:alik@sun.com-20100114090008-3rsdmlp1w2mqgrhg
+++ sql/sql_parse.cc 2010-03-03 09:56:19 +0000
@@ -979,7 +979,7 @@
#endif
case COM_CHANGE_USER:
{
- status_var_increment(thd->status_var.com_other);
+ status_var_increment(thd->status_var.com_change_user);
char *user= (char*) packet, *packet_end= packet + packet_length;
/* Safe because there is always a trailing \0 at the end of the packet */
char *passwd= strend(user)+1;
@@ -1409,7 +1409,7 @@
break;
}
case COM_PING:
- status_var_increment(thd->status_var.com_other);
+ status_var_increment(thd->status_var.com_ping);
my_ok(thd); // Tell client we are alive
break;
case COM_PROCESS_INFO:
Again, a quick test script:
< ?php
$conn = mysqli_connect('127.0.0.1','root','msandbox', 'test', 5550);
if (!mysqli_change_user($conn, 'root', 'msandbox', 'mysql')) {
echo "Change user failed!\n";
} else {
echo "User changed!\n";
}
?>
And test:
Cerberus:msb_5_5_5 mark$ mysql -u root -pmsandbox -h 127.0.0.1 -P5550 -e "show global status like 'com_change_user'"
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Com_change_user | 0 |
+-----------------+-------+
Cerberus:msb_5_5_5 mark$ php ~/Dev/tests/com_change_user.php
User changed!
Cerberus:msb_5_5_5 mark$ mysql -u root -pmsandbox -h 127.0.0.1 -P5550 -e "show global status like 'com_change_user'"
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Com_change_user | 1 |
+-----------------+-------+
Cerberus:msb_5_5_5 mark$ php ~/Dev/tests/com_change_user.php
User changed!
Cerberus:msb_5_5_5 mark$ mysql -u root -pmsandbox -h 127.0.0.1 -P5550 -e "show global status like 'com_change_user'"
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Com_change_user | 2 |
+-----------------+-------+
Yet Another Disclaimer: Not sure if/when/where this might get in! It is a change in behavior with regards to Com_admin_commands