diff --git a/mysql-test/suite/sys_vars/r/log_error_func.result b/mysql-test/suite/sys_vars/r/log_error_func.result new file mode 100644 index 00000000000..c787c5ceb4f --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_error_func.result @@ -0,0 +1,6 @@ +select (@err_log:=variable_value)*0 from information_schema.global_variables where variable_name="log_error"; +(@err_log:=variable_value)*0 +0 +select instr(@err_log, "some_random_name5435413.err")>0; +instr(@err_log, "some_random_name5435413.err")>0 +1 diff --git a/mysql-test/suite/sys_vars/r/log_error_func2.result b/mysql-test/suite/sys_vars/r/log_error_func2.result new file mode 100644 index 00000000000..82720035886 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_error_func2.result @@ -0,0 +1,6 @@ +select (@err_log:=variable_value)*0 from information_schema.global_variables where variable_name="log_error"; +(@err_log:=variable_value)*0 +0 +select instr(@err_log, ".err")>0; +instr(@err_log, ".err")>0 +1 diff --git a/mysql-test/suite/sys_vars/r/log_error_func3.result b/mysql-test/suite/sys_vars/r/log_error_func3.result new file mode 100644 index 00000000000..ff1908defd1 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/log_error_func3.result @@ -0,0 +1,3 @@ +select variable_value from information_schema.global_variables where variable_name="log_error"; +variable_value + diff --git a/mysql-test/suite/sys_vars/t/log_error_func.cnf b/mysql-test/suite/sys_vars/t/log_error_func.cnf new file mode 100644 index 00000000000..7a030b5518d --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_error_func.cnf @@ -0,0 +1,5 @@ +# Use default setting for mysqld processes +!include include/default_mysqld.cnf + +[mysqld.1] +log-error=some_random_name5435413 diff --git a/mysql-test/suite/sys_vars/t/log_error_func.test b/mysql-test/suite/sys_vars/t/log_error_func.test new file mode 100644 index 00000000000..1cd45a54ff7 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_error_func.test @@ -0,0 +1,20 @@ +# Test for BUG#51215 "log-error partially works with version 5.5" +# when --log-error is used without argument + +# check displayed value. We can check only the base name, the rest +# depends on paths, symbolic links, --vardir, etc... +select (@err_log:=variable_value)*0 from information_schema.global_variables where variable_name="log_error"; +select instr(@err_log, "some_random_name5435413.err")>0; + +# Check file's existence. The displayed value may be relative or not. +let $err_log=`select @err_log`; +let $err_log_relative=`select instr(@err_log, ".")=1`; +if ($err_log_relative) +{ + let $MYSQLD_DATADIR= `SELECT @@datadir`; + file_exists $MYSQLD_DATADIR/$err_log; +} +if (!$err_log_relative) +{ + file_exists $err_log; +} diff --git a/mysql-test/suite/sys_vars/t/log_error_func2.cnf b/mysql-test/suite/sys_vars/t/log_error_func2.cnf new file mode 100644 index 00000000000..ff7e8f7a101 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_error_func2.cnf @@ -0,0 +1,5 @@ +# Use default setting for mysqld processes +!include include/default_mysqld.cnf + +[mysqld.1] +log-error diff --git a/mysql-test/suite/sys_vars/t/log_error_func2.test b/mysql-test/suite/sys_vars/t/log_error_func2.test new file mode 100644 index 00000000000..e9f91e9c032 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_error_func2.test @@ -0,0 +1,20 @@ +# Test for BUG#51215 "log-error partially works with version 5.5" +# when --log-error is used without argument + +# check displayed value. We can check only the suffix, because +# the rest depends on paths, symbolic links, --vardir, etc... +select (@err_log:=variable_value)*0 from information_schema.global_variables where variable_name="log_error"; +select instr(@err_log, ".err")>0; + +# Check file's existence. The displayed value may be relative or not. +let $err_log=`select @err_log`; +let $err_log_relative=`select instr(@err_log, ".")=1`; +if ($err_log_relative) +{ + let $MYSQLD_DATADIR= `SELECT @@datadir`; + file_exists $MYSQLD_DATADIR/$err_log; +} +if (!$err_log_relative) +{ + file_exists $err_log; +} diff --git a/mysql-test/suite/sys_vars/t/log_error_func3.test b/mysql-test/suite/sys_vars/t/log_error_func3.test new file mode 100644 index 00000000000..c6b076f39fb --- /dev/null +++ b/mysql-test/suite/sys_vars/t/log_error_func3.test @@ -0,0 +1,5 @@ +# Test for BUG#51215 "log-error partially works with version 5.5" +# when --log-error is not used + +# check displayed value. Should be empty. +select variable_value from information_schema.global_variables where variable_name="log_error"; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 3e1929a6565..4e672f1d6c7 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -2687,7 +2687,8 @@ enum options_mysqld OPT_SSL_CIPHER, OPT_SSL_KEY, OPT_WANT_CORE, - OPT_ENGINE_CONDITION_PUSHDOWN + OPT_ENGINE_CONDITION_PUSHDOWN, + OPT_LOG_ERROR }; #endif /* MYSQL_SERVER */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 2e908eb3366..37713992a90 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3962,6 +3962,11 @@ static int init_server_components() else fn_format(log_error_file, log_error_file_ptr, mysql_data_home, ".err", MY_UNPACK_FILENAME | MY_SAFE_PATH); + /* + _ptr may have been set to my_disabled_option or "" if no argument was + passed, but we need to show the real name in SHOW VARIABLES: + */ + log_error_file_ptr= log_error_file; if (!log_error_file[0]) opt_error_log= 0; // Too long file name else @@ -7357,6 +7362,14 @@ mysqld_get_one_option(int optid, global_system_variables.optimizer_switch&= ~OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN; break; + case OPT_LOG_ERROR: + /* + "No --log-error" == "write errors to stderr", + "--log-error without argument" == "write errors to a file". + */ + if (argument == NULL) /* no argument */ + log_error_file_ptr= const_cast(""); + break; } return 0; } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index d500d772b80..2e239a9161c 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -895,7 +895,8 @@ static Sys_var_mybool Sys_trust_function_creators( static Sys_var_charptr Sys_log_error( "log_error", "Error log file", - READ_ONLY GLOBAL_VAR(log_error_file_ptr), CMD_LINE(OPT_ARG), + READ_ONLY GLOBAL_VAR(log_error_file_ptr), + CMD_LINE(OPT_ARG, OPT_LOG_ERROR), IN_FS_CHARSET, DEFAULT(disabled_my_option)); static Sys_var_mybool Sys_log_queries_not_using_indexes(