Commit f0ce188d authored by Guilhem Bichot's avatar Guilhem Bichot

Fix for BUG#51215 "log-error partially works with version 5.5": WL 4738...

Fix for BUG#51215 "log-error partially works with version 5.5": WL 4738 (reengineering of server variables)
had broken the 5.1 behaviour of --log-error: --log-error without argument sent to stderr instead of writing
to a file with an autogenerated name.

mysql-test/suite/sys_vars/t/log_error_func.test:
  test that error log is created and shown in SHOW VARIABLES.
  Interestingly the error log's path is apparently relative if --log-error=argument is used, but
  may be absolute or relative if --log-error(no argument) is used (because then the path is derived from
  that of pidfile_name, which can be absolute or relative, depending on if autogenerated or not).
mysql-test/suite/sys_vars/t/log_error_func2.test:
  test that error log is created and shown in SHOW VARIABLES
mysql-test/suite/sys_vars/t/log_error_func3.test:
  test that error log is empty in SHOW VARIABLES
sql/mysql_priv.h:
  id for option --log-error
sql/mysqld.cc:
  No --log-error means "write errors to stderr", whereas --log-error
  without argument means "write errors to a file". So we cannot use the default logic
  of class sys_var_charptr, which treats "option not used" the same as "option used
  without argument" and uses the same default for both. We need to catch "option used",
  in mysqld_get_one_option(), and then "without argument". Setting to "" makes sure
  that init_server_components() will create the log, with an autogenerated name.
sql/sys_vars.cc:
  need to give the option a numeric id so that we can catch it in mysqld_get_one_option()
parent 0f9ff76a
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
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
select variable_value from information_schema.global_variables where variable_name="log_error";
variable_value
# Use default setting for mysqld processes
!include include/default_mysqld.cnf
[mysqld.1]
log-error=some_random_name5435413
# 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;
}
# Use default setting for mysqld processes
!include include/default_mysqld.cnf
[mysqld.1]
log-error
# 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;
}
# 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";
......@@ -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 */
......
......@@ -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<char*>("");
break;
}
return 0;
}
......
......@@ -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(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment