From 9d5c9379a6fd3662d4388cda177a3b1ea7b070cc Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Tue, 24 Nov 2015 19:55:52 +0400 Subject: [PATCH] MDEV-7780 - Support for faking server version Added --version=str (optional argument sets server version string). --- mysql-test/r/mysqld--help.result | 3 ++- mysql-test/suite/sys_vars/r/version.result | 4 ++++ mysql-test/suite/sys_vars/t/version.opt | 1 + mysql-test/suite/sys_vars/t/version.test | 5 +++++ sql/mysqld.cc | 20 +++++++++++++++----- sql/mysqld.h | 1 + sql/sys_vars.cc | 1 - 7 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 mysql-test/suite/sys_vars/r/version.result create mode 100644 mysql-test/suite/sys_vars/t/version.opt create mode 100644 mysql-test/suite/sys_vars/t/version.test diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result index af68b796b81..5e02b92b98c 100644 --- a/mysql-test/r/mysqld--help.result +++ b/mysql-test/r/mysqld--help.result @@ -1124,7 +1124,8 @@ The following options may be given as the first argument: CLIENT_STATISTICS, INDEX_STATISTICS and TABLE_STATISTICS tables in the INFORMATION_SCHEMA -v, --verbose Used with --help option for detailed help. - -V, --version Output version information and exit. + -V, --version[=name] + Output version information and exit. --wait-timeout=# The number of seconds the server waits for activity on a connection before closing it diff --git a/mysql-test/suite/sys_vars/r/version.result b/mysql-test/suite/sys_vars/r/version.result new file mode 100644 index 00000000000..29a2fb8c7e9 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/version.result @@ -0,0 +1,4 @@ +SELECT @@version; +@@version +my_favorite_version +1 diff --git a/mysql-test/suite/sys_vars/t/version.opt b/mysql-test/suite/sys_vars/t/version.opt new file mode 100644 index 00000000000..9b6be9b7eea --- /dev/null +++ b/mysql-test/suite/sys_vars/t/version.opt @@ -0,0 +1 @@ +--version="my_favorite_version" diff --git a/mysql-test/suite/sys_vars/t/version.test b/mysql-test/suite/sys_vars/t/version.test new file mode 100644 index 00000000000..7955bf87c9c --- /dev/null +++ b/mysql-test/suite/sys_vars/t/version.test @@ -0,0 +1,5 @@ +SELECT @@version; +perl; + $cnt= grep /my_favorite_version/, `$ENV{MYSQL} -e status`; + print "$cnt\n"; +EOF diff --git a/sql/mysqld.cc b/sql/mysqld.cc index d22d6d453e2..42657cb8c0b 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -631,7 +631,7 @@ DATE_TIME_FORMAT global_date_format, global_datetime_format, global_time_format; Time_zone *default_tz; const char *mysql_real_data_home_ptr= mysql_real_data_home; -char server_version[SERVER_VERSION_LENGTH]; +char server_version[SERVER_VERSION_LENGTH], *server_version_ptr; char *mysqld_unix_port, *opt_mysql_tmpdir; ulong thread_handling; @@ -7604,8 +7604,8 @@ struct my_option my_long_options[]= 0, 0, 0, 0, 0, 0}, {"verbose", 'v', "Used with --help option for detailed help.", &opt_verbose, &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG, - NO_ARG, 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_STR, + OPT_ARG, 0, 0, 0, 0, 0, 0}, {"plugin-load", OPT_PLUGIN_LOAD, "Semicolon-separated list of plugins to load, where each plugin is " "specified as ether a plugin_name=library_file pair or only a library_file. " @@ -8947,8 +8947,16 @@ mysqld_get_one_option(int optid, const struct my_option *opt, char *argument) #include #ifndef EMBEDDED_LIBRARY case 'V': - print_version(); - opt_abort= 1; // Abort after parsing all options + if (argument) + { + strmake(server_version, argument, sizeof(server_version) - 1); + set_sys_var_value_origin(&server_version_ptr, sys_var::CONFIG); + } + else + { + print_version(); + opt_abort= 1; // Abort after parsing all options + } break; #endif /*EMBEDDED_LIBRARY*/ case 'W': @@ -9641,6 +9649,8 @@ static int get_options(int *argc_ptr, char ***argv_ptr) void set_server_version(void) { + if (!IS_SYSVAR_AUTOSIZE(&server_version_ptr)) + return; char *end= strxmov(server_version, MYSQL_SERVER_VERSION, MYSQL_SERVER_SUFFIX_STR, NullS); #ifdef EMBEDDED_LIBRARY diff --git a/sql/mysqld.h b/sql/mysqld.h index d94a9a2b6a9..5c27f86b654 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -534,6 +534,7 @@ extern uint mysql_real_data_home_len; extern const char *mysql_real_data_home_ptr; extern ulong thread_handling; extern "C" MYSQL_PLUGIN_IMPORT char server_version[SERVER_VERSION_LENGTH]; +extern char *server_version_ptr; extern MYSQL_PLUGIN_IMPORT char mysql_real_data_home[]; extern char mysql_unpacked_real_data_home[]; extern MYSQL_PLUGIN_IMPORT struct system_variables global_system_variables; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index f5c2f6b4fe3..982cce6e0a4 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -3368,7 +3368,6 @@ static Sys_var_mybool Sys_timed_mutexes( NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL), ON_UPDATE(NULL), DEPRECATED("")); -static char *server_version_ptr; static Sys_var_charptr Sys_version( "version", "Server version", READ_ONLY GLOBAL_VAR(server_version_ptr),