Commit d8c9c5ea authored by Monty's avatar Monty

MDEV-34491 Setting log_slow_admin="" at startup should be converted to log_slow_admin=ALL

We have an issue if a user have the following in a configuration file:
log_slow_filter=""                  # Log everything to slow query log
log_queries_not_using_indexes=ON

This set log_slow_filter to 'not_using_index' which disables
slow_query_logging of most queries.
In effect, on should never use log_slow_filter="" in config files but
instead use log_slow_filter=ALL.

Fixed by changing log_slow_filter="" that comes either from a
configuration file or from the command line, when starting to the server,
to log_slow_filter=ALL.
A warning will be printed when this happens.

Other things:
- One can now use =ALL for any 'set' variable to set all options at once.
  (backported from 10.6)
parent 090cecd5
--log-slow-filter= --log_queries_not_using_indexes=0
call mtr.add_suppression("log_slow_filter=\"\" changed to log_slow_filter=ALL");
show variables like "log_slow_filter";
Variable_name Value
log_slow_filter admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
set @@log_slow_filter="all";
show variables like "log_slow_filter";
Variable_name Value
log_slow_filter admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
# Test setting log_slow_filter to empty in config files
call mtr.add_suppression("log_slow_filter=\"\" changed to log_slow_filter=ALL");
show variables like "log_slow_filter";
set @@log_slow_filter="all";
show variables like "log_slow_filter";
...@@ -496,10 +496,10 @@ The following specify which files/extra groups are read (specified before remain ...@@ -496,10 +496,10 @@ The following specify which files/extra groups are read (specified before remain
combination of: admin, call, slave, sp combination of: admin, call, slave, sp
--log-slow-filter=name --log-slow-filter=name
Log only certain types of queries to the slow log. If Log only certain types of queries to the slow log. If
variable empty alll kind of queries are logged. All variable empty all kind of queries are logged. All types
types are bound by slow_query_time, except are bound by slow_query_time, except 'not_using_index'
'not_using_index' which is always logged if enabled. Any which is always logged if enabled. Any combination of:
combination of: admin, filesort, filesort_on_disk, admin, filesort, filesort_on_disk,
filesort_priority_queue, full_join, full_scan, filesort_priority_queue, full_join, full_scan,
not_using_index, query_cache, query_cache_miss, tmp_table, not_using_index, query_cache, query_cache_miss, tmp_table,
tmp_table_on_disk tmp_table_on_disk
......
...@@ -1675,7 +1675,7 @@ COMMAND_LINE_ARGUMENT REQUIRED ...@@ -1675,7 +1675,7 @@ COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME LOG_SLOW_FILTER VARIABLE_NAME LOG_SLOW_FILTER
VARIABLE_SCOPE SESSION VARIABLE_SCOPE SESSION
VARIABLE_TYPE SET VARIABLE_TYPE SET
VARIABLE_COMMENT Log only certain types of queries to the slow log. If variable empty alll kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled VARIABLE_COMMENT Log only certain types of queries to the slow log. If variable empty all kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled
NUMERIC_MIN_VALUE NULL NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL NUMERIC_BLOCK_SIZE NULL
......
...@@ -1815,7 +1815,7 @@ COMMAND_LINE_ARGUMENT REQUIRED ...@@ -1815,7 +1815,7 @@ COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME LOG_SLOW_FILTER VARIABLE_NAME LOG_SLOW_FILTER
VARIABLE_SCOPE SESSION VARIABLE_SCOPE SESSION
VARIABLE_TYPE SET VARIABLE_TYPE SET
VARIABLE_COMMENT Log only certain types of queries to the slow log. If variable empty alll kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled VARIABLE_COMMENT Log only certain types of queries to the slow log. If variable empty all kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled
NUMERIC_MIN_VALUE NULL NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL NUMERIC_BLOCK_SIZE NULL
......
...@@ -802,15 +802,21 @@ static int setval(const struct my_option *opts, void *value, char *argument, ...@@ -802,15 +802,21 @@ static int setval(const struct my_option *opts, void *value, char *argument,
*((ulonglong*)value)= find_typeset(argument, opts->typelib, &err); *((ulonglong*)value)= find_typeset(argument, opts->typelib, &err);
if (err) if (err)
{ {
/* Accept an integer representation of the set */ /* Check if option 'all' is used (to set all bits) */
char *endptr; if (!my_strcasecmp(&my_charset_latin1, argument, "all"))
ulonglong arg= (ulonglong) strtol(argument, &endptr, 10); *(ulonglong*) value= ((1ULL << opts->typelib->count) - 1);
if (*endptr || (arg >> 1) >= (1ULL << (opts->typelib->count-1))) else
{ {
res= EXIT_ARGUMENT_INVALID; /* Accept an integer representation of the set */
goto ret; char *endptr;
}; ulonglong arg= (ulonglong) strtol(argument, &endptr, 10);
*(ulonglong*)value= arg; if (*endptr || (arg >> 1) >= (1ULL << (opts->typelib->count-1)))
{
res= EXIT_ARGUMENT_INVALID;
goto ret;
};
*(ulonglong*)value= arg;
}
err= 0; err= 0;
} }
break; break;
......
...@@ -8294,6 +8294,14 @@ mysqld_get_one_option(const struct my_option *opt, const char *argument, ...@@ -8294,6 +8294,14 @@ mysqld_get_one_option(const struct my_option *opt, const char *argument,
if (argument == NULL) /* no argument */ if (argument == NULL) /* no argument */
log_error_file_ptr= const_cast<char*>(""); log_error_file_ptr= const_cast<char*>("");
break; break;
case OPT_LOG_SLOW_FILTER:
if (argument == NULL || *argument == 0)
{
/* By default log_slow_filter_has all values except QPLAN_NOT_USING_INDEX */
global_system_variables.log_slow_filter= opt->def_value | QPLAN_NOT_USING_INDEX;
sql_print_warning("log_slow_filter=\"\" changed to log_slow_filter=ALL");
}
break;
case OPT_IGNORE_DB_DIRECTORY: case OPT_IGNORE_DB_DIRECTORY:
opt_ignore_db_dirs= NULL; // will be set in ignore_db_dirs_process_additions opt_ignore_db_dirs= NULL; // will be set in ignore_db_dirs_process_additions
if (*argument == 0) if (*argument == 0)
......
...@@ -789,6 +789,7 @@ enum options_mysqld ...@@ -789,6 +789,7 @@ enum options_mysqld
OPT_KEY_CACHE_CHANGED_BLOCKS_HASH_SIZE, OPT_KEY_CACHE_CHANGED_BLOCKS_HASH_SIZE,
OPT_LOG_BASENAME, OPT_LOG_BASENAME,
OPT_LOG_ERROR, OPT_LOG_ERROR,
OPT_LOG_SLOW_FILTER,
OPT_LOWER_CASE_TABLE_NAMES, OPT_LOWER_CASE_TABLE_NAMES,
OPT_PLUGIN_LOAD, OPT_PLUGIN_LOAD,
OPT_PLUGIN_LOAD_ADD, OPT_PLUGIN_LOAD_ADD,
......
...@@ -6280,8 +6280,9 @@ static const char *log_slow_filter_names[]= ...@@ -6280,8 +6280,9 @@ static const char *log_slow_filter_names[]=
static Sys_var_set Sys_log_slow_filter( static Sys_var_set Sys_log_slow_filter(
"log_slow_filter", "log_slow_filter",
"Log only certain types of queries to the slow log. If variable empty alll kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled", "Log only certain types of queries to the slow log. If variable empty all kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled",
SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG), SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG,
OPT_LOG_SLOW_FILTER),
log_slow_filter_names, log_slow_filter_names,
/* by default we log all queries except 'not_using_index' */ /* by default we log all queries except 'not_using_index' */
DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1) & DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1) &
......
...@@ -1379,6 +1379,10 @@ class Sys_var_flagset: public Sys_var_typelib ...@@ -1379,6 +1379,10 @@ class Sys_var_flagset: public Sys_var_typelib
Backing store: ulonglong Backing store: ulonglong
*/ */
static const LEX_CSTRING all_clex_str= {STRING_WITH_LEN("all")};
class Sys_var_set: public Sys_var_typelib class Sys_var_set: public Sys_var_typelib
{ {
public: public:
...@@ -1438,6 +1442,13 @@ class Sys_var_set: public Sys_var_typelib ...@@ -1438,6 +1442,13 @@ class Sys_var_set: public Sys_var_typelib
var->save_result.ulonglong_value= var->save_result.ulonglong_value=
find_set(&typelib, res->ptr(), res->length(), NULL, find_set(&typelib, res->ptr(), res->length(), NULL,
&error, &error_len, &not_used); &error, &error_len, &not_used);
if (error_len &&
!my_charset_latin1.strnncollsp(res->ptr(), res->length(),
all_clex_str.str, all_clex_str.length))
{
var->save_result.ulonglong_value= ((1ULL << (typelib.count)) -1);
error_len= 0;
}
/* /*
note, we only issue an error if error_len > 0. note, we only issue an error if error_len > 0.
That is even while empty (zero-length) values are considered That is even while empty (zero-length) values are considered
......
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